diff --git a/crm/doctype/enquiry/enquiry.js b/crm/doctype/enquiry/enquiry.js
index a8c8ea2..2eddafa 100644
--- a/crm/doctype/enquiry/enquiry.js
+++ b/crm/doctype/enquiry/enquiry.js
@@ -42,15 +42,16 @@
       hide_field(['customer', 'customer_address', 'contact_person', 'customer_name', 'contact_display', 'customer_group']);
     }
   } 
-  
-  if(doc.enquiry_from == 'Lead' && doc.lead) {
-    cur_frm.cscript.lead(doc,cdt,cdn);
-  } 
 
   // setup fetch
   cur_frm.cscript.set_fetch();
 }
 
+cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
+	if(doc.enquiry_from == 'Lead' && doc.lead) {
+	 	cur_frm.cscript.lead(doc,cdt,cdn);
+	}
+}
 
 // fetch
 // ===============================================================
diff --git a/crm/doctype/quotation/quotation.js b/crm/doctype/quotation/quotation.js
index bdf6781..f21df25 100644
--- a/crm/doctype/quotation/quotation.js
+++ b/crm/doctype/quotation/quotation.js
@@ -21,11 +21,6 @@
   //if(!doc.price_list_name && sys_defaults.price_list_name) set_multiple(cdt,cdn,{price_list_name:sys_defaults.price_list_name});
   if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company});
   if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year});
-
-  // load default charges
-  if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length) cur_frm.cscript.load_taxes(doc, cdt, cdn);
-
-  if(doc.__islocal==1){  cur_frm.cscript.price_list_name(doc, cdt, cdn);}
   
   if(doc.quotation_to) {
     if(doc.quotation_to == 'Customer') {
@@ -37,6 +32,12 @@
   }
 }
 
+cur_frm.cscript.onload_post_render = function(doc, dt, dn) {
+  // load default charges
+  if(doc.__islocal && !getchildren('RV Tax Detail', doc.name, 'other_charges', doc.doctype).length) 
+    cur_frm.cscript.load_taxes(doc, cdt, cdn);
+}
+
 // hide - unhide fields based on lead or customer..
 // =======================================================================================================================
 cur_frm.cscript.lead_cust_show = function(doc,cdt,cdn){
diff --git a/material_management/doctype/purchase_receipt/purchase_receipt.js b/material_management/doctype/purchase_receipt/purchase_receipt.js
index da06321..e060e3c 100644
--- a/material_management/doctype/purchase_receipt/purchase_receipt.js
+++ b/material_management/doctype/purchase_receipt/purchase_receipt.js
@@ -13,10 +13,6 @@
   if (!doc.posting_date) doc.posting_date = dateutil.obj_to_str(new Date());
   if (!doc.transaction_date) doc.transaction_date = dateutil.obj_to_str(new Date());
   if (!doc.status) doc.status = 'Draft';
-
-  if(doc.__islocal){ 
-    cur_frm.cscript.get_default_schedule_date(doc);
-  }  
   
   if(doc.__islocal){
     hide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
@@ -26,6 +22,12 @@
   
 }
 
+cur_frm.cscript.onload_post_render = function(doc, dt, dn) {
+	if(doc.__islocal){ 
+		cur_frm.cscript.get_default_schedule_date(doc);
+	}	
+}
+
 //========================== Refresh ===============================================================
 cur_frm.cscript.refresh = function(doc, cdt, cdn) { 
 
diff --git a/material_management/doctype/stock_ledger/stock_ledger.py b/material_management/doctype/stock_ledger/stock_ledger.py
index a52dae7..e67afa6 100644
--- a/material_management/doctype/stock_ledger/stock_ledger.py
+++ b/material_management/doctype/stock_ledger/stock_ledger.py
@@ -235,3 +235,10 @@
 		sle_obj.validate()
 		sle.save(new = 1)
 		return sle.name
+		
+	def repost(self):
+		"""
+		Repost everything!
+		"""
+		for wh in sql("select name from tabWarehouse"):
+			get_obj('Warehouse', wh[0]).repost_stock()
diff --git a/patches/patch.py b/patches/patch.py
index 768f7cb..f129482 100644
--- a/patches/patch.py
+++ b/patches/patch.py
@@ -1,6 +1,6 @@
 # REMEMBER to update this
 # ========================
-last_patch = 293
+last_patch = 294
 
 #-------------------------------------------
 
@@ -1167,3 +1167,10 @@
 	elif patch_no == 293:
 		sql("delete from tabDocField where parent='Account' and fieldname='address'")
 		reload_doc('accounts', 'doctype', 'account')
+	elif patch_no == 294:
+		# new account profile fix
+		ul = sql("select name from tabProfile where ifnull(name,'') not in ('Administrator', 'Guest', '')")
+		# if one user and one user has no roles
+		if len(ul)==1 and not sql("select parent from tabUserRole where role='System Manager' and parent=%s", ul[0][0]):
+			get_obj('Setup Control').add_roles(Document('Profile', ul[0][0]))
+		
diff --git a/setup/doctype/sales_person/sales_person.py b/setup/doctype/sales_person/sales_person.py
index f085376..04a40bd 100644
--- a/setup/doctype/sales_person/sales_person.py
+++ b/setup/doctype/sales_person/sales_person.py
@@ -6,6 +6,7 @@
 from webnotes.model.code import get_obj
 from webnotes import session, form, is_testing, msgprint, errprint
 
+
 sql = webnotes.conn.sql
 convert_to_lists = webnotes.conn.convert_to_lists
 	
@@ -36,7 +37,7 @@
 
 
   def validate(self): 
-
+	from webnotes.utils import flt
     for d in getlist(self.doclist, 'target_details'):
       if not flt(d.target_qty) and not flt(d.target_amount):
         msgprint("Either target qty or target amount is mandatory.")
diff --git a/setup/doctype/setup_control/setup_control.py b/setup/doctype/setup_control/setup_control.py
index 9712860..dee01b2 100644
--- a/setup/doctype/setup_control/setup_control.py
+++ b/setup/doctype/setup_control/setup_control.py
@@ -18,160 +18,164 @@
 
 
 class DocType:
-  def __init__(self, d, dl):
-    self.doc, self.doclist = d, dl
-  
-  #Default Naming Series
-  #---------------------------------------------------
-  def naming_series(self):
-    ns = [['TDS Payment', 'TDSP'], ['Payable Voucher', 'BILL'], ['Journal Voucher', 'JV'], ['Receivable Voucher', 'INV'], ['Lead', 'Lead'], ['Indent', 'IDT'], ['Enquiry', 'Enquiry'], ['Purchase Order', 'PO'], ['Quotation', 'QTN'], ['Purchase Receipt', 'GRN'], ['Stock Entry', 'STE'], ['Sales Order', 'SO'], ['Delivery Note', 'DN'], ['Employee', 'EMP/']]
-    for r in ns: 
-      rec = Document('Naming Series')
-      rec.select_doc_for_series = r[0]
-      rec.new_series = r[1]
-      rec_obj = get_obj(doc=rec)
-      rec_obj.add_series()
+	def __init__(self, d, dl):
+		self.doc, self.doclist = d, dl
+	
+	#Default Naming Series
+	#---------------------------------------------------
+	def naming_series(self):
+		ns = [['TDS Payment', 'TDSP'], ['Payable Voucher', 'BILL'], ['Journal Voucher', 'JV'], ['Receivable Voucher', 'INV'], ['Lead', 'Lead'], ['Indent', 'IDT'], ['Enquiry', 'Enquiry'], ['Purchase Order', 'PO'], ['Quotation', 'QTN'], ['Purchase Receipt', 'GRN'], ['Stock Entry', 'STE'], ['Sales Order', 'SO'], ['Delivery Note', 'DN'], ['Employee', 'EMP/']]
+		for r in ns: 
+			rec = Document('Naming Series')
+			rec.select_doc_for_series = r[0]
+			rec.new_series = r[1]
+			rec_obj = get_obj(doc=rec)
+			rec_obj.add_series()
 
-  # set account details
-  #-----------------------
-  def set_account_details(self, args):
-    args = eval(args)
-    
-    self.set_cp_defaults(args['company_name'], args['industry'], args['time_zone'], args['country'], args['account_name'])
-    self.create_profile(args['user'], args['first_name'], args['last_name'])  
-    self.update_client_control()
-    
-  
-  # Account Setup
-  # ---------------
-  def setup_account(self, args):
-    company_name, comp_abbr, fy_start, currency = eval(args)
-    curr_fiscal_year,fy_start_date = self.get_fy_details(fy_start)
-    self.currency = currency
-    
-    # Fiscal Year
-    master_dict = {'Fiscal Year':{'year':curr_fiscal_year,
-                                  'year_start_date':fy_start_date}}
-    self.create_records(master_dict)
-    
-    # Company
-    master_dict = {'Company':{'company_name':company_name,
-                              'abbr':comp_abbr                              
-                              }}
-    self.create_records(master_dict)
-    
-    def_args = {'current_fiscal_year':curr_fiscal_year,
-                'default_currency': currency,
-                'default_company':company_name,
-                'default_valuation_method':'FIFO',
-                'date_format':'dd-mm-yyyy',
-                'default_currency_format':'Lacs',
-                'so_required':'No',
-                'dn_required':'No',
-                'po_required':'No',
-                'pr_required':'No',
-                'emp_created_by':'Naming Series',
-                'cust_master_name':'Customer Name', 
-                'supp_master_name':'Supplier Name'}
+	# set account details
+	#-----------------------
+	def set_account_details(self, args):
+		args = eval(args)
+		
+		self.set_cp_defaults(args['company_name'], args['industry'], args['time_zone'], args['country'], args['account_name'])
+		self.create_profile(args['user'], args['first_name'], args['last_name'])	
+		self.update_client_control()
+		
+	
+	# Account Setup
+	# ---------------
+	def setup_account(self, args):
+		company_name, comp_abbr, fy_start, currency = eval(args)
+		curr_fiscal_year,fy_start_date = self.get_fy_details(fy_start)
+		self.currency = currency
+		
+		# Fiscal Year
+		master_dict = {'Fiscal Year':{'year':curr_fiscal_year,
+																	'year_start_date':fy_start_date}}
+		self.create_records(master_dict)
+		
+		# Company
+		master_dict = {'Company':{'company_name':company_name,
+															'abbr':comp_abbr															
+															}}
+		self.create_records(master_dict)
+		
+		def_args = {'current_fiscal_year':curr_fiscal_year,
+								'default_currency': currency,
+								'default_company':company_name,
+								'default_valuation_method':'FIFO',
+								'date_format':'dd-mm-yyyy',
+								'default_currency_format':'Lacs',
+								'so_required':'No',
+								'dn_required':'No',
+								'po_required':'No',
+								'pr_required':'No',
+								'emp_created_by':'Naming Series',
+								'cust_master_name':'Customer Name', 
+								'supp_master_name':'Supplier Name'}
 
-    # Set 
-    self.set_defaults(def_args)
+		# Set 
+		self.set_defaults(def_args)
 
-    # Set Registration Complete
-    set_default('registration_complete','1')
+		# Set Registration Complete
+		set_default('registration_complete','1')
 
-    import webnotes.utils
-    return webnotes.utils.get_defaults()
+		import webnotes.utils
+		return webnotes.utils.get_defaults()
 
-    
-  # Get Fiscal year Details
-  # ------------------------
-  def get_fy_details(self, fy_start):
-    st = {'1st Jan':'01-01','1st Apr':'04-01','1st Jul':'07-01', '1st Oct': '10-01'}
-    curr_year = getdate(nowdate()).year
-    if cint(getdate(nowdate()).month) < cint((st[fy_start].split('-'))[0]):
-      curr_year = getdate(nowdate()).year - 1
-    stdt = cstr(curr_year)+'-'+cstr(st[fy_start])
-    #eddt = sql("select DATE_FORMAT(DATE_SUB(DATE_ADD('%s', INTERVAL 1 YEAR), INTERVAL 1 DAY),'%%d-%%m-%%Y')" % (stdt.split('-')[2]+ '-' + stdt.split('-')[1] + '-' + stdt.split('-')[0]))
-    if(fy_start == '1st Jan'):
-      fy = cstr(getdate(nowdate()).year)
-    else:
-      fy = cstr(curr_year) + '-' + cstr(curr_year+1)
-    return fy,stdt
+		
+	# Get Fiscal year Details
+	# ------------------------
+	def get_fy_details(self, fy_start):
+		st = {'1st Jan':'01-01','1st Apr':'04-01','1st Jul':'07-01', '1st Oct': '10-01'}
+		curr_year = getdate(nowdate()).year
+		if cint(getdate(nowdate()).month) < cint((st[fy_start].split('-'))[0]):
+			curr_year = getdate(nowdate()).year - 1
+		stdt = cstr(curr_year)+'-'+cstr(st[fy_start])
+		#eddt = sql("select DATE_FORMAT(DATE_SUB(DATE_ADD('%s', INTERVAL 1 YEAR), INTERVAL 1 DAY),'%%d-%%m-%%Y')" % (stdt.split('-')[2]+ '-' + stdt.split('-')[1] + '-' + stdt.split('-')[0]))
+		if(fy_start == '1st Jan'):
+			fy = cstr(getdate(nowdate()).year)
+		else:
+			fy = cstr(curr_year) + '-' + cstr(curr_year+1)
+		return fy,stdt
 
 
-  # Create Company and Fiscal Year
-  # ------------------------------- 
-  def create_records(self, master_dict):
-    for d in master_dict.keys():
-      rec = Document(d)
-      for fn in master_dict[d].keys():
-        rec.fields[fn] = master_dict[d][fn]
-      # add blank fields
-      for fn in rec.fields:
-        if fn not in master_dict[d].keys()+['name','owner','doctype']:
-          rec.fields[fn] = ''
-      rec_obj = get_obj(doc=rec)
-      rec_obj.doc.save(1)
-      if hasattr(rec_obj, 'on_update'):
-        rec_obj.on_update()
+	# Create Company and Fiscal Year
+	# ------------------------------- 
+	def create_records(self, master_dict):
+		for d in master_dict.keys():
+			rec = Document(d)
+			for fn in master_dict[d].keys():
+				rec.fields[fn] = master_dict[d][fn]
+			# add blank fields
+			for fn in rec.fields:
+				if fn not in master_dict[d].keys()+['name','owner','doctype']:
+					rec.fields[fn] = ''
+			rec_obj = get_obj(doc=rec)
+			rec_obj.doc.save(1)
+			if hasattr(rec_obj, 'on_update'):
+				rec_obj.on_update()
 
 
-  # Set System Defaults
-  # --------------------
-  def set_defaults(self, def_args):
-    ma_obj = get_obj('Manage Account','Manage Account')
-    for d in def_args.keys():
-      ma_obj.doc.fields[d] = def_args[d]
-    ma_obj.doc.save()
-    ma_obj.update_cp()
+	# Set System Defaults
+	# --------------------
+	def set_defaults(self, def_args):
+		ma_obj = get_obj('Manage Account','Manage Account')
+		for d in def_args.keys():
+			ma_obj.doc.fields[d] = def_args[d]
+		ma_obj.doc.save()
+		ma_obj.update_cp()
 
 
-  # Set Control Panel Defaults
-  # --------------------------
-  def set_cp_defaults(self, cname, industry, timezone, country, acc_name):
-    cp = Document('Control Panel','Control Panel')
-    cp.account_id = acc_name
-    cp.company_name = cname
-    cp.industry = industry
-    cp.time_zone = timezone
-    cp.country = country
-    cp.client_name = '<div style="padding:4px; font-size:20px;">'+cname+'</div>'
-    cp.save()
-      
-  # Create Profile
-  # --------------
-  def create_profile(self, user_email, user_fname, user_lname):
-    roles_list = ['System Manager','Sales Manager','Sales User','Purchase Manager','Purchase User','Material Manager','Material User','Accounts Manager','Accounts User','HR Manager','HR User','Production Manager','Production User','Sales Master Manager','Purchase Master Manager','Material Master Manager','Quality Manager','Maintenance User','Maintenance Manager']
-    pr = Document('Profile')
-    pr.first_name = user_fname
-    pr.last_name = user_lname
-    pr.email = user_email
-    pr.enabled = 1
-    pr.save(1)
-    for r in roles_list:
-      d = addchild(pr, 'userroles', 'UserRole', 1)
-      d.role = r
-      d.save()
-    # Add roles to Administrator profile
-    pr_obj = get_obj('Profile','Administrator')
-    for r in roles_list:
-      d = addchild(pr_obj.doc,'userroles', 'UserRole', 1)
-      d.role = r
-      d.save()
-  
-  # Update WN ERP Client Control
-  # -----------------------------
-  def update_client_control(self):
-    cl = Document('WN ERP Client Control','WN ERP Client Control')
-    cl.account_start_date = nowdate()
-    cl.total_users = 1
-    cl.is_trial_account = 1
-    cl.save()
+	# Set Control Panel Defaults
+	# --------------------------
+	def set_cp_defaults(self, cname, industry, timezone, country, acc_name):
+		cp = Document('Control Panel','Control Panel')
+		cp.account_id = acc_name
+		cp.company_name = cname
+		cp.industry = industry
+		cp.time_zone = timezone
+		cp.country = country
+		cp.client_name = '<div style="padding:4px; font-size:20px;">'+cname+'</div>'
+		cp.save()
+			
+	# Create Profile
+	# --------------
+	def create_profile(self, user_email, user_fname, user_lname):
+		pr = Document('Profile')
+		pr.first_name = user_fname
+		pr.last_name = user_lname
+		pr.email = user_email
+		pr.enabled = 1
+		pr.save(1)
+		self.add_roles(pr)
+	
+	def add_roles(self, pr):
+		roles_list = ['System Manager','Sales Manager','Sales User','Purchase Manager','Purchase User','Material Manager','Material User','Accounts Manager','Accounts User','HR Manager','HR User','Production Manager','Production User','Sales Master Manager','Purchase Master Manager','Material Master Manager','Quality Manager','Maintenance User','Maintenance Manager']
+		for r in roles_list:
+			d = addchild(pr, 'userroles', 'UserRole', 1)
+			d.role = r
+			d.save(1)
 
-  # Sync DB
-  # -------
-  def sync_db(arg=''):
-    import webnotes.model.db_schema
-    sql("delete from `tabDocType Update Register`")
-    webnotes.model.db_schema.sync_all()
\ No newline at end of file
+		# Add roles to Administrator profile
+		pr_obj = get_obj('Profile','Administrator')
+		for r in roles_list:
+			d = addchild(pr_obj.doc,'userroles', 'UserRole', 1)
+			d.role = r
+			d.save(1)
+	
+	# Update WN ERP Client Control
+	# -----------------------------
+	def update_client_control(self):
+		cl = Document('WN ERP Client Control','WN ERP Client Control')
+		cl.account_start_date = nowdate()
+		cl.total_users = 1
+		cl.is_trial_account = 1
+		cl.save()
+
+	# Sync DB
+	# -------
+	def sync_db(arg=''):
+		import webnotes.model.db_schema
+		sql("delete from `tabDocType Update Register`")
+		webnotes.model.db_schema.sync_all()
\ No newline at end of file
diff --git a/srm/doctype/indent/indent.js b/srm/doctype/indent/indent.js
index a2e1614..8d7ffb1 100644
--- a/srm/doctype/indent/indent.js
+++ b/srm/doctype/indent/indent.js
@@ -9,10 +9,13 @@
   if (!doc.transaction_date) doc.transaction_date = dateutil.obj_to_str(new Date())
   if (!doc.status) doc.status = 'Draft';
   
+}
+
+cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
   // second call
   if(doc.__islocal){ 
     cur_frm.cscript.get_item_defaults(doc);
-  }
+  }	
 }
 
 cur_frm.cscript.get_item_defaults = function(doc) {
diff --git a/srm/doctype/purchase_order/purchase_order.js b/srm/doctype/purchase_order/purchase_order.js
index cbc0d3a..5714126 100644
--- a/srm/doctype/purchase_order/purchase_order.js
+++ b/srm/doctype/purchase_order/purchase_order.js
@@ -15,16 +15,18 @@
   if(!doc.currency) doc.currency = sys_defaults.currency;
   if(!doc.status) set_multiple(cdt,cdn,{status:'Draft'});
   if(!doc.transaction_date) set_multiple(cdt,cdn,{transaction_date:get_today()});
-    
-  if(doc.__islocal){ 
-    cur_frm.cscript.get_default_schedule_date(doc);
-  }
   
   if(doc.__islocal){
     hide_field(['supplier_name','supplier_address','contact_person','address_display','contact_display','contact_mobile','contact_email']);
   }
 }
 
+cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
+  if(doc.__islocal){ 
+    cur_frm.cscript.get_default_schedule_date(doc);
+  }	
+}
+
 // ================================== Refresh ==========================================
 cur_frm.cscript.refresh = function(doc, cdt, cdn) { 
 
