diff --git a/css/all-app.css b/css/all-app.css
index 77fea0b..dec09ee 100644
--- a/css/all-app.css
+++ b/css/all-app.css
@@ -1186,7 +1186,6 @@
 	font-size: 11px;
 	color: #666;
 }
-
 /*
  *	lib/css/bootstrap/headings.css
  *//* heading from bootstrap */
@@ -2089,12 +2088,6 @@
   right: 13px;
 }
 
-/*extra size menus for recent*/
-.dropdown-menu#toolbar-recent, .dropdown-menu#toolbar-options, .dropdown-menu#toolbar-help{
-	width: 260px !important;
-	max-width: 260px !important;
-}
-
 /* ajax spinner */
 .navbar #spinner {
 	display: block;
@@ -2108,6 +2101,7 @@
 .navbar-inner {
 	padding: 0px 20px;
 }
+
 /*
  *	lib/css/bootstrap/dropdown.css
  */.dropdown {
@@ -2844,11 +2838,41 @@
 .navbar-new-comments {
 	margin: -3px 0px;
 	padding: 2px;
-	font-size: 14px;
-	color: #fff;
-	background-color: #B00D07;
 	min-width: 20px;
 	text-align: center;
 	display: inline-block;
 	border-radius: 2px;
+	color: #999999;
+	background-color: #333131;
+}
+
+.navbar-new-comments:hover,
+.navbar-new-comments:active,
+.navbar-new-comments:focus {
+	color: #fff;
+}
+
+
+.navbar-new-comments-true {
+	color: #fff;
+	background-color: #B00D07;
+}
+
+.navbar-icon-home {
+	vertical-align: middle;
+	opacity:0.4;
+	Filter:alpha(opacity=40); /* For IE8 and earlier */
+}
+
+.navbar-icon-home:hover,
+.navbar-icon-home:focus,
+.navbar-icon-home:active {
+	opacity:1;
+	Filter:alpha(opacity=100); /* For IE8 and earlier */
+}
+
+/*extra size menus for recent*/
+.dropdown-menu#toolbar-recent, .dropdown-menu#toolbar-options, .dropdown-menu#toolbar-help{
+	min-width: 160px !important;
+	max-width: 260px !important;
 }
diff --git a/css/all-web.css b/css/all-web.css
index 04cfd36..ec9fff2 100644
--- a/css/all-web.css
+++ b/css/all-web.css
@@ -1316,12 +1316,6 @@
   right: 13px;
 }
 
-/*extra size menus for recent*/
-.dropdown-menu#toolbar-recent, .dropdown-menu#toolbar-options, .dropdown-menu#toolbar-help{
-	width: 260px !important;
-	max-width: 260px !important;
-}
-
 /* ajax spinner */
 .navbar #spinner {
 	display: block;
@@ -1335,6 +1329,7 @@
 .navbar-inner {
 	padding: 0px 20px;
 }
+
 /*
  *	lib/css/bootstrap/dropdown.css
  */.dropdown {
@@ -1651,13 +1646,43 @@
 .navbar-new-comments {
 	margin: -3px 0px;
 	padding: 2px;
-	font-size: 14px;
-	color: #fff;
-	background-color: #B00D07;
 	min-width: 20px;
 	text-align: center;
 	display: inline-block;
 	border-radius: 2px;
+	color: #999999;
+	background-color: #333131;
+}
+
+.navbar-new-comments:hover,
+.navbar-new-comments:active,
+.navbar-new-comments:focus {
+	color: #fff;
+}
+
+
+.navbar-new-comments-true {
+	color: #fff;
+	background-color: #B00D07;
+}
+
+.navbar-icon-home {
+	vertical-align: middle;
+	opacity:0.4;
+	Filter:alpha(opacity=40); /* For IE8 and earlier */
+}
+
+.navbar-icon-home:hover,
+.navbar-icon-home:focus,
+.navbar-icon-home:active {
+	opacity:1;
+	Filter:alpha(opacity=100); /* For IE8 and earlier */
+}
+
+/*extra size menus for recent*/
+.dropdown-menu#toolbar-recent, .dropdown-menu#toolbar-options, .dropdown-menu#toolbar-help{
+	min-width: 160px !important;
+	max-width: 260px !important;
 }
 
 /*
diff --git a/erpnext/home/page/desktop/desktop.js b/erpnext/home/page/desktop/desktop.js
index 9400cfe..e2a8d53 100644
--- a/erpnext/home/page/desktop/desktop.js
+++ b/erpnext/home/page/desktop/desktop.js
@@ -78,7 +78,7 @@
 }
 
 erpnext.desktop.show_pending_notifications = function() {
-	$('#messages a:first').prepend('<div id="msg_count" class="circle">\
+	$('#messages a:first').prepend('<div id="msg_count" class="circle" title="Unread Messages">\
 		<span class="circle-text"></span></div>');
 	$('#msg_count').toggle(false);
 	update_messages();
diff --git a/erpnext/setup/page/permission_engine/permission_engine.html b/erpnext/setup/page/permission_engine/permission_engine.html
index 1b9cab2..7831447 100644
--- a/erpnext/setup/page/permission_engine/permission_engine.html
+++ b/erpnext/setup/page/permission_engine/permission_engine.html
@@ -1,4 +1,8 @@
 <div class="layout_wrapper">
 <div id="pe_header"></div>
 <div id="perm_engine_div" style="margin: 16px;"></div>
-</div>
\ No newline at end of file
+<div id="submittable_warning" class='help-box' style='display: None'>
+	One of the Roles has <b>Submit</b> permission. 
+	You will have to <b>Cancel</b> and then <b>Amend</b> a submitted Document for making changes.
+</div>
+</div>
diff --git a/erpnext/setup/page/permission_engine/permission_engine.js b/erpnext/setup/page/permission_engine/permission_engine.js
index fc24410..1d77e51 100644
--- a/erpnext/setup/page/permission_engine/permission_engine.js
+++ b/erpnext/setup/page/permission_engine/permission_engine.js
@@ -15,399 +15,423 @@
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 pscript['onload_Permission Engine'] = function() {
-  // header and toolbar
-  var h = new PageHeader('pe_header','Permissions Manager','Set specific permissions for Roles')
-  
-  if(!pscript.perm_engine) pscript.perm_engine = new pscript.PermEngine();
+	// header and toolbar
+	var h = new PageHeader('pe_header','Permissions Manager','Set specific permissions for Roles')
+	
+	if(!pscript.perm_engine) pscript.perm_engine = new pscript.PermEngine();
 }
 
 
 pscript.PermEngine = function() {
-  // create UI elements
-  this.wrapper = $i('perm_engine_div');
-  
-  this.head = $a(this.wrapper, 'div');
-  this.body = $a(this.wrapper, 'div');
-  this.footer = $a(this.wrapper, 'div');
+	// create UI elements
+	this.wrapper = $i('perm_engine_div');
+	
+	this.head = $a(this.wrapper, 'div');
+	this.body = $a(this.wrapper, 'div');
+	this.footer = $a(this.wrapper, 'div');
 
-  var lab = $a(this.body,'div', '', {backgroundColor:'#FFD', padding:'8px', margin:'16px 0px'});
-  lab.innerHTML = 'Please select the item for which you want to set permissions';
-  
-  this.make_head();
-  this.load_options();
+	var lab = $a(this.body,'div', '', {backgroundColor:'#FFD', padding:'8px', margin:'16px 0px'});
+	lab.innerHTML = 'Please select the item for which you want to set permissions';
+	
+	this.make_head();
+	this.load_options();
 }
 
 
 // Make Head
 // -------------
 pscript.PermEngine.prototype.make_head = function() {
-  var me = this;
-  
-  var make_select = function(label) {
-    var w = $a(me.head, 'div', '', {margin:'8px 0px'});
-    var t = make_table(w,1,2,'300px',['50%','50%']);
-    $td(t,0,0).innerHTML = label;
-    var s = $a($td(t,0,1),'select','',{width:'140px'});
-    s.wrapper = w;
-    return s;
-  }
-  
-  var make_button = function(label, parent, green) {
-  	return $btn(parent, label, null, {margin:'8px 0px', display:'none'}, (green ? 'green' : null));
-  }
-  
-  
-  // Set Permissions for
-  this.type_select = make_select('Set Permissions For');
-  this.type_select.onchange = function() {
-  	me.get_permissions();
-  }
-    
-  // Update Button
-  this.add_button = make_button('+ Add A New Rule', this.head, 0);
-  this.add_button.onclick = function() {
-    me.add_permission();
-  }
+	var me = this;
+	
+	var make_select = function(label) {
+		var w = $a(me.head, 'div', '', {margin:'8px 0px'});
+		var t = make_table(w,1,2,'300px',['50%','50%']);
+		$td(t,0,0).innerHTML = label;
+		var s = $a($td(t,0,1),'select','',{width:'140px'});
+		s.wrapper = w;
+		return s;
+	}
+	
+	var make_button = function(label, parent, green) {
+		return $btn(parent, label, null, {margin:'8px 0px', display:'none'}, (green ? 'green' : null));
+	}
+	
+	
+	// Set Permissions for
+	this.type_select = make_select('Set Permissions For');
+	this.type_select.onchange = function() {
+		me.get_permissions();
+	}
+		
+	// Update Button
+	this.add_button = make_button('+ Add A New Rule', this.head, 0);
+	this.add_button.onclick = function() {
+		me.add_permission();
+	}
 
-  // Update Button
-  this.update_button = make_button('Update', this.footer, 1);
-  this.update_button.onclick = function() {
-    me.update_permissions();
-  }
+	// Update Button
+	this.update_button = make_button('Update', this.footer, 1);
+	this.update_button.onclick = function() {
+		me.update_permissions();
+	}
 }
 
 // Add Permissions
 // -----------------
 pscript.PermEngine.prototype.add_permission = function() {
-  var me = this;
-  if(!this.add_permission_dialog) {
-  	
-  	// dialog
-    var d = new Dialog(400,400,'Add Permission');
-    d.make_body([['Select','Role'],['Select','Level'],['Button','Add']])
+	var me = this;
+	if(!this.add_permission_dialog) {
+		
+		// dialog
+		var d = new Dialog(400,400,'Add Permission');
+		d.make_body([['Select','Role'],['Select','Level'],['Button','Add']])
 
-    add_sel_options(d.widgets['Role'], this.roles, '');
-    add_sel_options(d.widgets['Level'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 0);
+		add_sel_options(d.widgets['Role'], this.roles, '');
+		add_sel_options(d.widgets['Level'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 0);
 
-    // add
-    d.widgets['Add'].onclick = function() {
-      if(!sel_val(d.widgets['Role'])) {
-        msgprint('Please select Role'); return;
-      }
-      var callback = function(r, rt) {
-      	// reload
-        me.get_permissions();
-        d.hide();
-      }
-      $c_obj('Permission Control','add_permission',JSON.stringify([sel_val(me.type_select), sel_val(d.widgets['Role']), sel_val(d.widgets['Level'])]), callback);
-    }
+		// add
+		d.widgets['Add'].onclick = function() {
+			if(!sel_val(d.widgets['Role'])) {
+				msgprint('Please select Role'); return;
+			}
+			var callback = function(r, rt) {
+				// reload
+				me.get_permissions();
+				d.hide();
+			}
+			$c_obj('Permission Control','add_permission',JSON.stringify([sel_val(me.type_select), sel_val(d.widgets['Role']), sel_val(d.widgets['Level'])]), callback);
+		}
 
-    this.add_permission_dialog = d;
-  }
-  this.add_permission_dialog.show();
+		this.add_permission_dialog = d;
+	}
+	this.add_permission_dialog.show();
 }
 
 
 // Hide Fields
 // -----------------
 pscript.PermEngine.prototype.hide_fields = function() {
-  $dh(this.role_select.wrapper);
-  this.type_select.disabled = false;
-  this.body.innerHTML = '';
+	$dh(this.role_select.wrapper);
+	this.type_select.disabled = false;
+	this.body.innerHTML = '';
 }
 
 
 // Load Roles And Modules
 // -----------------------
 pscript.PermEngine.prototype.load_options = function() {
-  var me = this;
-  $dh(me.update_button);
-  $dh(me.add_button);
+	var me = this;
+	$dh(me.update_button);
+	$dh(me.add_button);
 
-  $c_obj('Permission Control','get_doctype_list','', function(r,rt) {    
-    me.roles = r.message.roles;
-    
-    // Type
-    empty_select(me.type_select);
-    add_sel_options(me.type_select,add_lists([''], r.message.doctypes));
-    
-  });
+	$c_obj('Permission Control','get_doctype_list','', function(r,rt) {		
+		me.roles = r.message.roles;
+		
+		// Type
+		empty_select(me.type_select);
+		add_sel_options(me.type_select,add_lists([''], r.message.doctypes));
+		
+	});
 }
 
 
 // Get DocType and Permissions related to module
 // --------------------------------------------------
 pscript.PermEngine.prototype.get_permissions = function() {
-  var me = this;
-  
-  if(!sel_val(me.type_select)) {
-  	msgprint('Please select a type first!'); return;
-  }
-  
-  $c_obj('Permission Control','get_permissions',sel_val(me.type_select), function(r,rt) {    
-     // Get permissions
-    if(r.message.perms.length)me.get_results(r.message);
-    else me.body.innerHTML = '<div style = "color : red; margin:8px 0px;">No Records Found</div>'
-  });
+	var me = this;
+	
+	if(!sel_val(me.type_select)) {
+		msgprint('Please select a type first!'); return;
+	}
+	
+	$c_obj('Permission Control','get_permissions',sel_val(me.type_select), function(r,rt) {		
+		 // Get permissions
+		if(r.message.perms.length) {
+			me.get_results(r.message);
+		}
+		else me.body.innerHTML = '<div style = "color : red; margin:8px 0px;">No Records Found</div>'
+		pscript.show_submittable();
+	});
 }
 
 // Get Results
 // ------------------
 pscript.PermEngine.prototype.get_results = function(r){
-  var perms = r.perms;
-  var me = this;
-  var doctype = sel_val(me.type_select);
-  
-  // show update button
-  $ds(me.update_button);
-  $ds(me.add_button);
+	var perms = r.perms;
+	var me = this;
+	var doctype = sel_val(me.type_select);
+	
+	// show update button
+	$ds(me.update_button);
+	$ds(me.add_button);
 
-  this.body.innerHTML = ''
-  pscript.all_checkboxes = [];
-  pscript.all_matches = [];
-  
-  var head = $a(this.body, 'h3'); head.innerHTML = 'Rules for ' + doctype;        
-  var permt = make_table(me.body, perms.length+1,9,'80%',[],{border:'1px solid #AAA', padding:'3px', verticalAlign:'middle', height:'30px'});
-    
-  // Create Grid for particular DocType
-  // ------------------------------------
-    
-  // Columns
-  var col_labels = ['Role','Level','Read','Write','Create','Submit','Cancel','Amend','Restrict By']
-  for(var n = 0; n < col_labels.length; n++){
-  	$y($td(permt,0,n), {backgroundColor:'#DDD', width:(n==0?'30%':(n==8?'21%':'7%'))})
-    $td(permt,0,n).innerHTML = col_labels[n];
-    $td(permt,0,n).fieldname = col_labels[n].toLowerCase();
-  }
-    
-  // Rows for Column Level / Role
-  for(var j = 0; j < perms.length; j++){
-    var plevel = $a($td(permt,j+1,1), 'span', 'link_type');
-    plevel.innerHTML = perms[j].permlevel;
-    plevel.doctype = doctype;
-    plevel.value = perms[j].permlevel;
-    plevel.onclick = function() {me.get_fields(this.doctype, this.value)}
+	this.body.innerHTML = ''
+	pscript.all_checkboxes = [];
+	pscript.all_matches = [];
+	
+	var head = $a(this.body, 'h3'); head.innerHTML = 'Rules for ' + doctype;				
+	var permt = make_table(me.body, perms.length+1,9,'80%',[],{border:'1px solid #AAA', padding:'3px', verticalAlign:'middle', height:'30px'});
+		
+	// Create Grid for particular DocType
+	// ------------------------------------
+		
+	// Columns
+	var col_labels = ['Role','Level','Read','Write','Create','Submit','Cancel','Amend','Restrict By']
+	for(var n = 0; n < col_labels.length; n++){
+		$y($td(permt,0,n), {backgroundColor:'#DDD', width:(n==0?'30%':(n==8?'21%':'7%'))})
+		$td(permt,0,n).innerHTML = col_labels[n];
+		$td(permt,0,n).fieldname = col_labels[n].toLowerCase();
+	}
+		
+	// Rows for Column Level / Role
+	for(var j = 0; j < perms.length; j++){
+		var plevel = $a($td(permt,j+1,1), 'span', 'link_type');
+		plevel.innerHTML = perms[j].permlevel;
+		plevel.doctype = doctype;
+		plevel.value = perms[j].permlevel;
+		plevel.onclick = function() {me.get_fields(this.doctype, this.value)}
 
-    // role
-    $td(permt,j+1,0).innerHTML = perms[j].role;
+		// role
+		$td(permt,j+1,0).innerHTML = perms[j].role;
 
-  }  
-    
-  // Get values
-  for(var l = 0; l < perms.length; l++){
-    for(var m = 0; m < 6; m++){                             // (read,write,create,submit,cancel,amend) 
-      var chk = $a_input($td(permt,l+1,m+2), 'checkbox');
-      var val = perms[l][$td(permt,0,m+2).fieldname];
-      if(val == 1) chk.checked = 1;
-      else chk.checked = 0;
-      chk.doctype = doctype;
-      chk.permlevel = perms[l].permlevel; chk.perm_type = col_labels[m+2].toLowerCase(); chk.role = perms[l].role;
-      pscript.all_checkboxes.push(chk);
-    }
-  }
-  
-  // add selects for match
-  me.add_match_select(r, perms, permt, doctype);
+	}	
+		
+	// Get values
+	for(var l = 0; l < perms.length; l++){
+		for(var m = 0; m < 6; m++){														 // (read,write,create,submit,cancel,amend) 
+			var chk = $a_input($td(permt,l+1,m+2), 'checkbox');
+			var val = perms[l][$td(permt,0,m+2).fieldname];
+			if(val == 1) chk.checked = 1;
+			else chk.checked = 0;
+
+			if(m==3) { chk.onclick = pscript.show_submittable }
+
+			chk.doctype = doctype;
+			chk.permlevel = perms[l].permlevel; chk.perm_type = col_labels[m+2].toLowerCase(); chk.role = perms[l].role;
+			pscript.all_checkboxes.push(chk);
+		}
+	}
+	
+	// add selects for match
+	me.add_match_select(r, perms, permt, doctype);
 }
 
+// Show submittable warning
+pscript.show_submittable = function() {
+	var submittable = 0;
+	for(i in pscript.all_checkboxes) {
+		c = pscript.all_checkboxes[i];
+		if(c.perm_type=='submit' && c.checked) {
+			submittable = 1;
+			break;
+		}
+	}
+	if(submittable) {
+		$('#submittable_warning').toggle(true);
+	} else {
+		$('#submittable_warning').toggle(false);
+	}
+}
+
+
 // render selects for match
 // --------------------------------------------
 
 pscript.PermEngine.prototype.add_match_select = function(r, perms, permt, doctype) {
-  var me = this;
-  
-  // add select for match
-  for(var i=0; i<perms.length; i++) {
-    if(perms[i].permlevel==0) {
-      // select
-      var sel = $a($td(permt,i+1,8),'select','',{width:'100%'});
-      add_sel_options(sel, r.fields);
-      sel.details = perms[i]; sel.details.parent = doctype;
-      sel.onchange = function() { 
-      	if(sel_val(this) && sel_val(this)!='owner') $ds(this.div); 
-      	else $dh(this.div); }
-      
-      // link
-      var div = $a($td(permt,i+1,8),'div','link_type',{marginTop: '2px', fontSize:'10px', display:'none'});
-      div.onclick = function() { this.details.match = sel_val(this.sel); me.show_match_dialog(this.details); }
-      div.innerHTML = 'Set Users / Roles';
-      div.details = perms[i];
-      sel.div = div; div.sel = sel;
+	var me = this;
+	
+	// add select for match
+	for(var i=0; i<perms.length; i++) {
+		if(perms[i].permlevel==0) {
+			// select
+			var sel = $a($td(permt,i+1,8),'select','',{width:'100%'});
+			add_sel_options(sel, r.fields);
+			sel.details = perms[i]; sel.details.parent = doctype;
+			sel.onchange = function() { 
+				if(sel_val(this) && sel_val(this)!='owner') $ds(this.div); 
+				else $dh(this.div); }
+			
+			// link
+			var div = $a($td(permt,i+1,8),'div','link_type',{marginTop: '2px', fontSize:'10px', display:'none'});
+			div.onclick = function() { this.details.match = sel_val(this.sel); me.show_match_dialog(this.details); }
+			div.innerHTML = 'Set Users / Roles';
+			div.details = perms[i];
+			sel.div = div; div.sel = sel;
 
-      // set the value
-      if(perms[i].match) { sel.value = perms[i].match; $ds(div); }
-      
-      pscript.all_matches.push(sel);
-    }
-  }
+			// set the value
+			if(perms[i].match) { sel.value = perms[i].match; $ds(div); }
+			
+			pscript.all_matches.push(sel);
+		}
+	}
 }
 
 // match users Dialog
 // =======================================================
 
 pscript.PermEngine.prototype.show_match_dialog=function(details) {
-  if(!this.match_defaults_dialog) {
-    var d = new Dialog(750, 500, 'Permission Applies To');
-    d.make_body([['HTML','Body']]);
-    var w = d.widgets['Body'];
-    $y(w,{height:'350px', overflow:'auto'});
-    this.match_defaults_dialog = d;
-  }
-  
-  // dialog
-  this.match_defaults_dialog.show();
-  
-  // render the rules
-  var me = this;
-  var callback = function(r,rt) {
-  	me.render_match_dialog(r, details);
-  }
-  // load the rules
-  $c_obj('Permission Control','get_defaults', details.match + '~~~' + (this.profiles ? 'No' : 'Yes'), callback); 
+	if(!this.match_defaults_dialog) {
+		var d = new Dialog(750, 500, 'Permission Applies To');
+		d.make_body([['HTML','Body']]);
+		var w = d.widgets['Body'];
+		$y(w,{height:'350px', overflow:'auto'});
+		this.match_defaults_dialog = d;
+	}
+	
+	// dialog
+	this.match_defaults_dialog.show();
+	
+	// render the rules
+	var me = this;
+	var callback = function(r,rt) {
+		me.render_match_dialog(r, details);
+	}
+	// load the rules
+	$c_obj('Permission Control','get_defaults', details.match + '~~~' + (this.profiles ? 'No' : 'Yes'), callback); 
 }
 
 // --------------------------------------------
 
 pscript.PermEngine.prototype.render_match_dialog=function(r, details) {
-  var d = this.match_defaults_dialog;
-  var w = d.widgets['Body'];
-  w.innerHTML = '<div style="background-color:#FFD; padding: 4px; color: #440; margin-bottom:16px">Please Note: Any action will also affect other permissions with similar rules!</div>'
-  
-  // header
-  var t=make_table($a(w,'div','',{borderBottom:'1px solid #AAA'}),1,3,'90%',['40%','40%','20%'],{fontWeight:'bold', padding:'3px', fontSize:'14px'});
-  $td(t,0,0).innerHTML = 'Who?'; $td(t,0,1).innerHTML = 'Is allowed if '+details.match+' equals';
-  
-  // existing defaults
-  var dl = r.message.dl; this.options = r.message.ol;
-  if(!this.profiles) {
-    this.profiles = r.message.pl;
-  }
-  
-  for(var i=0; i<dl.length; i++) {
-    new MatchDefaultValue(this, w, dl[i], details.match);
-  }
-  
-  this.add_new_match_row(details.match);
+	var d = this.match_defaults_dialog;
+	var w = d.widgets['Body'];
+	w.innerHTML = '<div style="background-color:#FFD; padding: 4px; color: #440; margin-bottom:16px">Please Note: Any action will also affect other permissions with similar rules!</div>'
+	
+	// header
+	var t=make_table($a(w,'div','',{borderBottom:'1px solid #AAA'}),1,3,'90%',['40%','40%','20%'],{fontWeight:'bold', padding:'3px', fontSize:'14px'});
+	$td(t,0,0).innerHTML = 'Who?'; $td(t,0,1).innerHTML = 'Is allowed if '+details.match+' equals';
+	
+	// existing defaults
+	var dl = r.message.dl; this.options = r.message.ol;
+	if(!this.profiles) {
+		this.profiles = r.message.pl;
+	}
+	
+	for(var i=0; i<dl.length; i++) {
+		new MatchDefaultValue(this, w, dl[i], details.match);
+	}
+	
+	this.add_new_match_row(details.match);
 }
 
 pscript.PermEngine.prototype.add_new_match_row = function(fieldname) {
-  // add new default
-  new MatchDefaultValue(this, this.match_defaults_dialog.widgets['Body'], null, fieldname, 1);
-}  
-  
+	// add new default
+	new MatchDefaultValue(this, this.match_defaults_dialog.widgets['Body'], null, fieldname, 1);
+}	
+	
 // --------------------------------------------
 
 MatchDefaultValue = function(pe, parent, details, fieldname, editable) {
-  this.pe = pe;
-  this.wrapper = $a(parent, 'div', '', {margin:'4px'});
-  this.clear();
-  this.details = details;
-  this.fieldname = fieldname;
-  this.render(editable);
+	this.pe = pe;
+	this.wrapper = $a(parent, 'div', '', {margin:'4px'});
+	this.clear();
+	this.details = details;
+	this.fieldname = fieldname;
+	this.render(editable);
 }
 
 
 // --------------------------------------------
 
 MatchDefaultValue.prototype.clear = function() {
-  this.wrapper.innerHTML = '';
-  this.tab = make_table(this.wrapper, 1, 3, '90%', ['40%','40%','20%'], {verticalAlign:'middle', padding:'3px'});
+	this.wrapper.innerHTML = '';
+	this.tab = make_table(this.wrapper, 1, 3, '90%', ['40%','40%','20%'], {verticalAlign:'middle', padding:'3px'});
 }
 
 // --------------------------------------------
 
 MatchDefaultValue.prototype.render = function(editable) {
 
-  if(editable) {
-  	this.render_editable();
-  } else {
-    this.render_static();
-  }
+	if(editable) {
+		this.render_editable();
+	} else {
+		this.render_static();
+	}
 }
 
 // --------------------------------------------
 
 MatchDefaultValue.prototype.render_editable = function() {
-  var me = this;
+	var me = this;
 
-  // profile or role
-  this.profile_or_role = $a($td(this.tab,0,0), 'select', '', {width:'60px', marginRight:'8px'});
-  add_sel_options(this.profile_or_role,['Profile', 'Role'], 'Profile');
-  this.profile_or_role.onchange = function() {
-    if(sel_val(this)=='Profile') { $di(me.profile_sel); $dh(me.role_sel); }
-    else { $dh(me.profile_sel); $di(me.role_sel); }
-  }
+	// profile or role
+	this.profile_or_role = $a($td(this.tab,0,0), 'select', '', {width:'60px', marginRight:'8px'});
+	add_sel_options(this.profile_or_role,['Profile', 'Role'], 'Profile');
+	this.profile_or_role.onchange = function() {
+		if(sel_val(this)=='Profile') { $di(me.profile_sel); $dh(me.role_sel); }
+		else { $dh(me.profile_sel); $di(me.role_sel); }
+	}
 
-  // role sel
-  this.role_sel = $a($td(this.tab,0,0), 'select', '', {width:'100px',display:'none'});
-  add_sel_options(this.role_sel,this.pe.roles);
-  
-  // profile sel
-  this.profile_sel = $a($td(this.tab,0,0), 'select', '', {width:'100px'});
-  add_sel_options(this.profile_sel,this.pe.profiles);
+	// role sel
+	this.role_sel = $a($td(this.tab,0,0), 'select', '', {width:'100px',display:'none'});
+	add_sel_options(this.role_sel,this.pe.roles);
+	
+	// profile sel
+	this.profile_sel = $a($td(this.tab,0,0), 'select', '', {width:'100px'});
+	add_sel_options(this.profile_sel,this.pe.profiles);
 
-  // options sel
-  this.options_sel = $a($td(this.tab,0,1), 'select', '', {width:'120px'});
-  add_sel_options(this.options_sel,this.pe.options);
+	// options sel
+	this.options_sel = $a($td(this.tab,0,1), 'select', '', {width:'120px'});
+	add_sel_options(this.options_sel,this.pe.options);
 
-   // add
-  var span = $a($td(this.tab,0,2),'span','link_type',{marginLeft:'8px'});
-  span.innerHTML = 'Add'
-  span.onclick = function() { me.save(); }
+	 // add
+	var span = $a($td(this.tab,0,2),'span','link_type',{marginLeft:'8px'});
+	span.innerHTML = 'Add'
+	span.onclick = function() { me.save(); }
 }
 
 // --------------------------------------------
 
 MatchDefaultValue.prototype.render_static = function() {
-  var me = this;
-  
-  $td(this.tab,0,0).innerHTML = this.details.parenttype;
-  $td(this.tab,0,0).innerHTML += '&nbsp;' + this.details.parent;
-  $td(this.tab,0,1).innerHTML = this.details.defvalue;
+	var me = this;
+	
+	$td(this.tab,0,0).innerHTML = this.details.parenttype;
+	$td(this.tab,0,0).innerHTML += '&nbsp;' + this.details.parent;
+	$td(this.tab,0,1).innerHTML = this.details.defvalue;
 
-   // delete
-  var span = $a($td(this.tab,0,2),'span','link_type',{marginLeft:'8px'});
-  span.innerHTML = 'Cancel'
-  span.onclick = function() { me.delete_def(); }
+	 // delete
+	var span = $a($td(this.tab,0,2),'span','link_type',{marginLeft:'8px'});
+	span.innerHTML = 'Cancel'
+	span.onclick = function() { me.delete_def(); }
 }
 
 // --------------------------------------------
 
 MatchDefaultValue.prototype.delete_def = function() {	
-  var me = this;
-  this.wrapper.innerHTML = '<div style="color: #888; padding: 3px;">Deleting...</div>';
-  var callback = function(r,rt) {
-  	$dh(me.wrapper);
-    if(r.exc) msgprint('There were errors!')
-  }
-  $c_obj('Permission Control','delete_default'
-    ,[this.details.parent, this.fieldname, this.details.defvalue].join('~~~')
-    ,callback)
+	var me = this;
+	this.wrapper.innerHTML = '<div style="color: #888; padding: 3px;">Deleting...</div>';
+	var callback = function(r,rt) {
+		$dh(me.wrapper);
+		if(r.exc) msgprint('There were errors!')
+	}
+	$c_obj('Permission Control','delete_default'
+		,[this.details.parent, this.fieldname, this.details.defvalue].join('~~~')
+		,callback)
 }
 
 // --------------------------------------------
 
 MatchDefaultValue.prototype.save = function() {
-  var me= this;
-  
-  var callback = function(r,rt) {
-    me.details = r.message;
-    me.clear();
-    me.render();
-    me.pe.add_new_match_row(me.fieldname);
-  }
-  	
-  // values
-  if(sel_val(this.profile_or_role)=='Profile') { var parent = sel_val(this.profile_sel); var parenttype = 'Profile'; }
-  else { var parent = sel_val(this.role_sel); var parenttype = 'Role'; }
+	var me= this;
+	
+	var callback = function(r,rt) {
+		me.details = r.message;
+		me.clear();
+		me.render();
+		me.pe.add_new_match_row(me.fieldname);
+	}
+		
+	// values
+	if(sel_val(this.profile_or_role)=='Profile') { var parent = sel_val(this.profile_sel); var parenttype = 'Profile'; }
+	else { var parent = sel_val(this.role_sel); var parenttype = 'Role'; }
 
-  if(!sel_val(this.options_sel) || !parent) { msgprint("Please select all values"); return; }
-  	
-  $c_obj('Permission Control','add_default'
-    ,[parent, parenttype, this.fieldname, sel_val(this.options_sel)].join('~~~')
-    ,callback);
-      
-  this.wrapper.innerHTML = '<div style="color: #888; padding: 3px;">Adding...</div>';
+	if(!sel_val(this.options_sel) || !parent) { msgprint("Please select all values"); return; }
+		
+	$c_obj('Permission Control','add_default'
+		,[parent, parenttype, this.fieldname, sel_val(this.options_sel)].join('~~~')
+		,callback);
+			
+	this.wrapper.innerHTML = '<div style="color: #888; padding: 3px;">Adding...</div>';
 }
 
 
@@ -415,36 +439,36 @@
 // =======================================================
 
 pscript.PermEngine.prototype.make_fields_dialog=function(){
-  if(!pscript.get_field_dialog) {
-    pscript.get_field_dialog = new Dialog(750,500,'Fields');
-    pscript.get_field_dialog.make_body([['HTML','Fields','<div id="perm_engine_get_fields"></div>'],['Button','OK']]);
-  }
-  else $i('perm_engine_get_fields').innerHTML = '';
+	if(!pscript.get_field_dialog) {
+		pscript.get_field_dialog = new Dialog(750,500,'Fields');
+		pscript.get_field_dialog.make_body([['HTML','Fields','<div id="perm_engine_get_fields"></div>'],['Button','OK']]);
+	}
+	else $i('perm_engine_get_fields').innerHTML = '';
 }
 
 // Get Fields
 // --------------------
 pscript.PermEngine.prototype.get_fields = function(dt, permlevel) {
-  var me = this;
-  var callback = function(r,rt){
-    // Get Parent DocType Fields
-    var parent_fields_dict = r.message.parent_fields_dict;
-    
-    // Get Child Table Fields if any
-    var table_fields_dict = r.message.table_fields_dict;
-    
-    // Make Fields Dialog Box
-    me.make_fields_dialog();
-    
-    me.make_fields_table(dt, parent_fields_dict, table_fields_dict, permlevel);
-    
-    pscript.get_field_dialog.show();
-    pscript.get_field_dialog.widgets['OK'].onclick=function(){
-      pscript.get_field_dialog.hide();
-    }
-  }
-  var args = "{'dt':'"+dt+"','permlevel':"+permlevel+"}"
-  $c_obj('Permission Control','get_fields', args, callback);
+	var me = this;
+	var callback = function(r,rt){
+		// Get Parent DocType Fields
+		var parent_fields_dict = r.message.parent_fields_dict;
+		
+		// Get Child Table Fields if any
+		var table_fields_dict = r.message.table_fields_dict;
+		
+		// Make Fields Dialog Box
+		me.make_fields_dialog();
+		
+		me.make_fields_table(dt, parent_fields_dict, table_fields_dict, permlevel);
+		
+		pscript.get_field_dialog.show();
+		pscript.get_field_dialog.widgets['OK'].onclick=function(){
+			pscript.get_field_dialog.hide();
+		}
+	}
+	var args = "{'dt':'"+dt+"','permlevel':"+permlevel+"}"
+	$c_obj('Permission Control','get_fields', args, callback);
 }
 
 
@@ -452,90 +476,90 @@
 // Make Table of Fields for Dialog Box
 // --------------------------------------
 pscript.PermEngine.prototype.make_fields_table = function(dt, parent_fields_dict, table_fields_dict, permlevel) {
-  
-  var make_grid = function(table, fields_dict) {
-    var col_labels = ['Label','Fieldtype','Fieldname','Options'];
-    for(var n = 0; n < col_labels.length; n++){
-      $a_input(($td(table,0,n)), 'data');
-      $td(table,0,n).innerHTML = '<b>'+col_labels[n]+'</b>';
-      $td(table,0,n).fieldname = col_labels[n].toLowerCase();
-    }
-    
-    // Add values
-    for(var i = 0; i < keys(fields_dict).length; i++){
-      for(var j = 0; j < 4; j++){
-        $a_input(($td(table,i+1,j)), 'data');
-        $td(table,i+1,j).innerHTML = cstr(fields_dict[i][$td(table,0,j).fieldname])
-      }
-    }
-  }
+	
+	var make_grid = function(table, fields_dict) {
+		var col_labels = ['Label','Fieldtype','Fieldname','Options'];
+		for(var n = 0; n < col_labels.length; n++){
+			$a_input(($td(table,0,n)), 'data');
+			$td(table,0,n).innerHTML = '<b>'+col_labels[n]+'</b>';
+			$td(table,0,n).fieldname = col_labels[n].toLowerCase();
+		}
+		
+		// Add values
+		for(var i = 0; i < keys(fields_dict).length; i++){
+			for(var j = 0; j < 4; j++){
+				$a_input(($td(table,i+1,j)), 'data');
+				$td(table,i+1,j).innerHTML = cstr(fields_dict[i][$td(table,0,j).fieldname])
+			}
+		}
+	}
 
-  
-  $i('perm_engine_get_fields').innerHTML = '<b>'+ dt + ' Fields at Level '+ permlevel +':</b><br><br>';
-  var parent_field_table = make_table('perm_engine_get_fields',keys(parent_fields_dict).length+1, 4,'100%',['25%','25%','25%','25%'],{border:'1px solid #AAA',padding:'2px'});
-  make_grid(parent_field_table, parent_fields_dict);
-  
-  child_tables = keys(table_fields_dict)
-  if(child_tables.length > 0){
-    for(var k = 0; k < child_tables.length; k++){
-      var tab_fields_det = table_fields_dict[child_tables[k]];
-      if(keys(tab_fields_det).length > 0){
-        $i('perm_engine_get_fields').innerHTML += '<br><b>'+ child_tables[k] + ' Fields at Level '+ permlevel +':</b><br><br>'
-        var child_field_table = make_table('perm_engine_get_fields',keys(tab_fields_det).length+1, 4,'100%',['25%','25%','25%','25%'],{border:'1px solid #AAA',padding:'2px'});
-        make_grid(child_field_table, tab_fields_det);
-      }
-    }
-  }
+	
+	$i('perm_engine_get_fields').innerHTML = '<b>'+ dt + ' Fields at Level '+ permlevel +':</b><br><br>';
+	var parent_field_table = make_table('perm_engine_get_fields',keys(parent_fields_dict).length+1, 4,'100%',['25%','25%','25%','25%'],{border:'1px solid #AAA',padding:'2px'});
+	make_grid(parent_field_table, parent_fields_dict);
+	
+	child_tables = keys(table_fields_dict)
+	if(child_tables.length > 0){
+		for(var k = 0; k < child_tables.length; k++){
+			var tab_fields_det = table_fields_dict[child_tables[k]];
+			if(keys(tab_fields_det).length > 0){
+				$i('perm_engine_get_fields').innerHTML += '<br><b>'+ child_tables[k] + ' Fields at Level '+ permlevel +':</b><br><br>'
+				var child_field_table = make_table('perm_engine_get_fields',keys(tab_fields_det).length+1, 4,'100%',['25%','25%','25%','25%'],{border:'1px solid #AAA',padding:'2px'});
+				make_grid(child_field_table, tab_fields_det);
+			}
+		}
+	}
 }
 
 
 // Update Permissions
 // -----------------------
 pscript.PermEngine.prototype.update_permissions = function() {
-  var me = this;
-  var out = {};
+	var me = this;
+	var out = {};
 
-  var add_to_out = function(doctype, permlevel, role, key, value) {
-    if(!out[doctype]) out[doctype] = {};
-    if(!out[doctype][permlevel]) out[doctype][permlevel] = {};
-    if(!out[doctype][permlevel][role]) out[doctype][permlevel][role] = {};
-    out[doctype][permlevel][role][key] = value; 
-  }
+	var add_to_out = function(doctype, permlevel, role, key, value) {
+		if(!out[doctype]) out[doctype] = {};
+		if(!out[doctype][permlevel]) out[doctype][permlevel] = {};
+		if(!out[doctype][permlevel][role]) out[doctype][permlevel][role] = {};
+		out[doctype][permlevel][role][key] = value; 
+	}
 
-  // check boxes
-  for(i in pscript.all_checkboxes) {
-    c = pscript.all_checkboxes[i];
-    add_to_out(c.doctype, c.permlevel, c.role, c.perm_type, c.checked ? 1 : 0);
-  }
-
-  // matches
-  for(var i=0; i<pscript.all_matches.length; i++) {
-  	var s = pscript.all_matches[i];
-    if(sel_val(s))
-      add_to_out(s.details.parent, s.details.permlevel, s.details.role, 'match', sel_val(s));
-  }
-  
-  var args = "{'perm_dict': "+JSON.stringify(out)+"}"
-  $c_obj('Permission Control','update_permissions', args, function(r,rt) {});
+	// check boxes
+	for(i in pscript.all_checkboxes) {
+		c = pscript.all_checkboxes[i];
+		add_to_out(c.doctype, c.permlevel, c.role, c.perm_type, c.checked ? 1 : 0);
+	}
+	
+	// matches
+	for(var i=0; i<pscript.all_matches.length; i++) {
+		var s = pscript.all_matches[i];
+		if(sel_val(s))
+			add_to_out(s.details.parent, s.details.permlevel, s.details.role, 'match', sel_val(s));
+	}
+	
+	var args = "{'perm_dict': "+JSON.stringify(out)+"}"
+	$c_obj('Permission Control','update_permissions', args, function(r,rt) {});
 }
 
 
 // Update Page Roles
 // ----------------------
 pscript.PermEngine.prototype.update_page_roles = function() {
-  var me = this;
-  var out = {};
-  for(i in pscript.all_pg_checkboxes) {
-    c = pscript.all_pg_checkboxes[i];
-    out[c.page_name] = c.checked ? 1 : 0
-  }
-  var args = "{'page_role_dict': "+JSON.stringify(out)+", 'role': '"+sel_val(me.role_select)+"'}"
-  $c_obj('Permission Control','update_page_role', args, function(r,rt) {});
+	var me = this;
+	var out = {};
+	for(i in pscript.all_pg_checkboxes) {
+		c = pscript.all_pg_checkboxes[i];
+		out[c.page_name] = c.checked ? 1 : 0
+	}
+	var args = "{'page_role_dict': "+JSON.stringify(out)+", 'role': '"+sel_val(me.role_select)+"'}"
+	$c_obj('Permission Control','update_page_role', args, function(r,rt) {});
 }
 
 // Reset Permission Engine
 // -------------------------
 pscript.PermEngine.prototype.reset_perm_engine = function(){
-  this.type_select.selectedIndex = 0;
-  this.load_options();
+	this.type_select.selectedIndex = 0;
+	this.load_options();
 }
diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py
index 8a8791c..5f0cc23 100644
--- a/erpnext/startup/event_handlers.py
+++ b/erpnext/startup/event_handlers.py
@@ -84,7 +84,6 @@
 		
 	else:	
 		bootinfo['letter_heads'] = get_letter_heads()
-		bootinfo['user_fullnames'] = get_fullnames()
 
 		import webnotes.model.doctype
 		bootinfo['docs'] += webnotes.model.doctype.get('Event')
@@ -96,18 +95,6 @@
 		where ifnull(disabled,0)=0""")
 	return dict(ret)
 
-def get_fullnames():
-	"""map of user fullnames"""
-	ret = dict(webnotes.conn.sql("""select name, 
-		concat(ifnull(first_name, ''), 
-			if(ifnull(first_name, '')!='', ' ', ''), ifnull(last_name, ''))
-		from tabProfile where ifnull(enabled, 0)=1"""))
-	for key in ret:
-		if not ret[key]:
-			ret[key] = key
-	
-	return ret
-
 def login_as(login_manager):
 	"""
 		Login as functionality -- allows signin from signin.erpnext.com
diff --git a/erpnext/startup/startup.css b/erpnext/startup/startup.css
index 6410ccc..27fda48 100644
--- a/erpnext/startup/startup.css
+++ b/erpnext/startup/startup.css
@@ -42,11 +42,41 @@
 .navbar-new-comments {
 	margin: -3px 0px;
 	padding: 2px;
-	font-size: 14px;
-	color: #fff;
-	background-color: #B00D07;
 	min-width: 20px;
 	text-align: center;
 	display: inline-block;
 	border-radius: 2px;
+	color: #999999;
+	background-color: #333131;
+}
+
+.navbar-new-comments:hover,
+.navbar-new-comments:active,
+.navbar-new-comments:focus {
+	color: #fff;
+}
+
+
+.navbar-new-comments-true {
+	color: #fff;
+	background-color: #B00D07;
+}
+
+.navbar-icon-home {
+	vertical-align: middle;
+	opacity:0.4;
+	Filter:alpha(opacity=40); /* For IE8 and earlier */
+}
+
+.navbar-icon-home:hover,
+.navbar-icon-home:focus,
+.navbar-icon-home:active {
+	opacity:1;
+	Filter:alpha(opacity=100); /* For IE8 and earlier */
+}
+
+/*extra size menus for recent*/
+.dropdown-menu#toolbar-recent, .dropdown-menu#toolbar-options, .dropdown-menu#toolbar-help{
+	min-width: 160px !important;
+	max-width: 260px !important;
 }
diff --git a/erpnext/startup/toolbar.js b/erpnext/startup/toolbar.js
index 57a5707..c73d54e 100644
--- a/erpnext/startup/toolbar.js
+++ b/erpnext/startup/toolbar.js
@@ -27,11 +27,11 @@
 	$('#toolbar-user').append('<li><a href="#My Company">Team / Messages</a></li>');
 
 
-	$('.navbar .pull-right').prepend('\
-		<li><a href="#" id="toolbar-new-comments"></a></li>');
+	$('.navbar .pull-right').append('\
+		<li><a href="#!My%20Company" title="Unread Messages"><span class="navbar-new-comments"></span></a></li>');
 
 	// help
-	$('.navbar .pull-right').append('<li class="dropdown">\
+	$('.navbar .pull-right').prepend('<li class="dropdown">\
 		<a class="dropdown-toggle" data-toggle="dropdown" href="#" \
 			onclick="return false;">Help<b class="caret"></b></a>\
 		<ul class="dropdown-menu" id="toolbar-help">\
@@ -53,18 +53,18 @@
 
 	$.extend(page_body.wntoolbar, {
 		set_new_comments: function(new_comments) {
-			var navbar_nc = $('#toolbar-new-comments');
+			var navbar_nc = $('.navbar-new-comments');
 			if(new_comments && new_comments.length>0) {
-				navbar_nc.html('<span class="navbar-new-comments">' + new_comments.length + '</span>');
-				navbar_nc.click(function() { loadpage('My Company'); });
+				navbar_nc.text(new_comments.length);
+				navbar_nc.addClass('navbar-new-comments-true')
 				$.each(new_comments, function(i, v) {
 					var msg = 'New Message: ' + (v[1].length<=100 ? v[1] : (v[1].substr(0, 100) + "..."));
 					var id = v[0].replace('/', '-');
 					if(!$('#' + id)[0]) { show_alert(msg, id); }
 				})
 			} else {
-				navbar_nc.html('');
-				navbar_nc.click(function() { return false; });
+				navbar_nc.removeClass('navbar-new-comments-true');
+				navbar_nc.text(0);
 			}
 		}
 	});
@@ -89,7 +89,7 @@
 			<li class="divider"></li>\
 			<li><a href="#!Setup" data-module="Setup">Setup</a></li>\
 		</ul>\
-		</li>').insertAfter('li[data-name="navbar-home"]');
+		</li>').prependTo('.navbar .nav:first');
 	$('.navbar .nav:first')	
 }
 
diff --git a/erpnext/support/doctype/support_ticket/support_ticket.css b/erpnext/support/doctype/support_ticket/support_ticket.css
new file mode 100644
index 0000000..8d563a7
--- /dev/null
+++ b/erpnext/support/doctype/support_ticket/support_ticket.css
@@ -0,0 +1,8 @@
+.support-ticket-wrapper {
+	margin-top: 10px;
+}
+
+.support-ticket-title {
+	padding: 5px;
+	border-bottom: 1px solid black;
+}
diff --git a/js/all-app.js b/js/all-app.js
index d9129db..b6cf87c 100644
--- a/js/all-app.js
+++ b/js/all-app.js
Binary files differ
diff --git a/js/all-web.js b/js/all-web.js
index 3dd2c62..53cb33a 100644
--- a/js/all-web.js
+++ b/js/all-web.js
@@ -279,7 +279,7 @@
 if(sel_val)s.inp.value=sel_val;return;}
 if(s.inp)s=s.inp;for(var i=0,len=list.length;i<len;i++){var o=new Option(list[i],list[i],false,(list[i]==sel_val?true:false));if(o_style)$y(o,o_style);s.options[s.options.length]=o;}}
 function cint(v,def){v=v+'';v=lstrip(v,['0']);v=parseInt(v);if(isNaN(v))v=def?def:0;return v;}
-function validate_email(id){if(strip(id).search("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")==-1)return 0;else return 1;}
+function validate_email(id){if(strip(id.toLowerCase()).search("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")==-1)return 0;else return 1;}
 function validate_spl_chars(txt){if(txt.search(/^[a-zA-Z0-9_\- ]*$/)==-1)return 1;else return 0;}
 function d2h(d){return cint(d).toString(16);}
 function h2d(h){return parseInt(h,16);}
@@ -1035,7 +1035,7 @@
  *	js/app.js
  */
 wn.app={name:'ERPNext',license:'GNU/GPL - Usage Condition: All "erpnext" branding must be kept as it is',source:'https://github.com/webnotes/erpnext',publisher:'Web Notes Technologies Pvt Ltd, Mumbai',copyright:'&copy; Web Notes Technologies Pvt Ltd',version:'2.'+window._version_number}
-wn.modules_path='erpnext';wn.settings.no_history=true;$(document).bind('ready',function(){startup();});$(document).bind('toolbar_setup',function(){$('.brand').html('<b>erp</b>next');})
+wn.modules_path='erpnext';wn.settings.no_history=true;$(document).bind('ready',function(){startup();});$(document).bind('toolbar_setup',function(){$('.brand').html('<b>erp</b>next&nbsp;<i class="icon-home icon-white navbar-icon-home" ></i>');})
 /*
  *	erpnext/startup/startup.js
  */
diff --git a/js/app.js b/js/app.js
index 3e6fa5b..67f900f 100644
--- a/js/app.js
+++ b/js/app.js
@@ -31,5 +31,5 @@
 });
 
 $(document).bind('toolbar_setup', function() {
-	$('.brand').html('<b>erp</b>next');	
-})
\ No newline at end of file
+	$('.brand').html('<b>erp</b>next&nbsp;<i class="icon-home icon-white navbar-icon-home" ></i>');	
+})
diff --git a/version.num b/version.num
index fc67739..ddc27b0 100644
--- a/version.num
+++ b/version.num
@@ -1 +1 @@
-719
\ No newline at end of file
+739
\ No newline at end of file
