[minor] repost future gl entries only for current voucher items
diff --git a/accounts/doctype/pos_setting/pos_setting.js b/accounts/doctype/pos_setting/pos_setting.js
index 18f555b..641b3ef 100755
--- a/accounts/doctype/pos_setting/pos_setting.js
+++ b/accounts/doctype/pos_setting/pos_setting.js
@@ -70,5 +70,5 @@
 }
 
 cur_frm.fields_dict.user.get_query = function(doc,cdt,cdn) {
-	return{	query:"controllers.queries.profile_query"}
+	return{	query:"core.doctype.profile.profile.profile_query"}
 }
diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js
index dd53c7f..16e1195 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/accounts/doctype/sales_invoice/sales_invoice.js
@@ -80,7 +80,6 @@
 						source_doctype: "Delivery Note",
 						get_query: function() {
 							var filters = {
-								docstatus: 1,
 								company: cur_frm.doc.company
 							};
 							if(cur_frm.doc.customer) filters["customer"] = cur_frm.doc.customer;
diff --git a/controllers/queries.py b/controllers/queries.py
index 0e23d5c..02c992b 100644
--- a/controllers/queries.py
+++ b/controllers/queries.py
@@ -3,6 +3,7 @@
 
 from __future__ import unicode_literals
 import webnotes
+from webnotes.widgets.reportview import get_match_cond
 
 def get_filters_cond(doctype, filters, conditions):
 	if filters:
@@ -22,34 +23,6 @@
 		cond = ''
 	return cond
 
-def get_match_cond(doctype, searchfield = 'name'):
-	from webnotes.widgets.reportview import build_match_conditions
-	cond = build_match_conditions(doctype)
-
-	if cond:
-		cond = ' and ' + cond
-	else:
-		cond = ''
-	return cond
-
- # searches for enabled profiles
-def profile_query(doctype, txt, searchfield, start, page_len, filters):
-	return webnotes.conn.sql("""select name, concat_ws(' ', first_name, middle_name, last_name) 
-		from `tabProfile` 
-		where ifnull(enabled, 0)=1 
-			and docstatus < 2 
-			and name not in ('Administrator', 'Guest') 
-			and (%(key)s like "%(txt)s" 
-				or concat_ws(' ', first_name, middle_name, last_name) like "%(txt)s") 
-			%(mcond)s
-		order by 
-			case when name like "%(txt)s" then 0 else 1 end, 
-			case when concat_ws(' ', first_name, middle_name, last_name) like "%(txt)s" 
-				then 0 else 1 end, 
-			name asc 
-		limit %(start)s, %(page_len)s""" % {'key': searchfield, 'txt': "%%%s%%" % txt,  
-		'mcond':get_match_cond(doctype, searchfield), 'start': start, 'page_len': page_len})
-
  # searches for active employees
 def employee_query(doctype, txt, searchfield, start, page_len, filters):
 	return webnotes.conn.sql("""select name, employee_name from `tabEmployee` 
@@ -196,10 +169,12 @@
 def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, filters):
 	return webnotes.conn.sql("""select `tabDelivery Note`.name, `tabDelivery Note`.customer_name
 		from `tabDelivery Note` 
-		where `tabDelivery Note`.`%(key)s` like %(txt)s %(fcond)s and
+		where `tabDelivery Note`.`%(key)s` like %(txt)s and 
+			`tabDelivery Note`.docstatus = 1 %(fcond)s and
 			(ifnull((select sum(qty) from `tabDelivery Note Item` where 
 					`tabDelivery Note Item`.parent=`tabDelivery Note`.name), 0) >
 				ifnull((select sum(qty) from `tabSales Invoice Item` where 
+					`tabSales Invoice Item`.docstatus = 1 and
 					`tabSales Invoice Item`.delivery_note=`tabDelivery Note`.name), 0))
 			%(mcond)s order by `tabDelivery Note`.`%(key)s` asc
 			limit %(start)s, %(page_len)s""" % {
diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py
index fc4997e..9adefb0 100644
--- a/controllers/stock_controller.py
+++ b/controllers/stock_controller.py
@@ -14,11 +14,11 @@
 	def make_gl_entries(self):
 		if not cint(webnotes.defaults.get_global_default("auto_accounting_for_stock")):
 			return
-		
+
 		if self.doc.docstatus==1:
-			gl_entries = self.get_gl_entries_for_stock()
+			gl_entries = self.get_gl_entries_for_stock()			
 			make_gl_entries(gl_entries)
-		else:
+		else:	
 			delete_gl_entries(voucher_type=self.doc.doctype, voucher_no=self.doc.name)
 		
 		self.update_gl_entries_after()
@@ -117,15 +117,19 @@
 		
 	def get_future_stock_vouchers(self):
 		future_stock_vouchers = []
-		item_codes = webnotes.conn.sql_list("""select distinct item_code 
-			from `tabStock Ledger Entry`
-			where voucher_type=%s and voucher_no=%s""", (self.doc.doctype, self.doc.name))
+		
+		if hasattr(self, "fname"):
+			item_list = [d.item_code for d in self.doclist.get({"parentfield": self.fname})]
+			condition = ''.join(['and item_code in (\'', '\', \''.join(item_list) ,'\')'])
+		else:
+			condition = ""
 		
 		for d in webnotes.conn.sql("""select distinct sle.voucher_type, sle.voucher_no 
 			from `tabStock Ledger Entry` sle
-			where timestamp(sle.posting_date, sle.posting_time) >= timestamp(%s, %s)
-			order by timestamp(sle.posting_date, sle.posting_time) asc, name asc""",
-			(self.doc.posting_date, self.doc.posting_time), as_dict=True):
+			where timestamp(sle.posting_date, sle.posting_time) >= timestamp(%s, %s) %s
+			order by timestamp(sle.posting_date, sle.posting_time) asc, name asc""" % 
+			('%s', '%s', condition), (self.doc.posting_date, self.doc.posting_time), 
+			as_dict=True):
 				future_stock_vouchers.append([d.voucher_type, d.voucher_no])
 		
 		return future_stock_vouchers
diff --git a/docs/dev/custom_script_examples/docs.dev.custom_script.calculate.md b/docs/dev/custom_script_examples/docs.dev.custom_script.calculate.md
new file mode 100644
index 0000000..6744e2b
--- /dev/null
+++ b/docs/dev/custom_script_examples/docs.dev.custom_script.calculate.md
@@ -0,0 +1,24 @@
+---
+{
+	"_label": "Calculate Incentive for Sales Team"
+}
+---
+Can be used in any Sales Transaction with **Sales Team** Table:
+
+
+	cur_frm.cscript.custom_validate = function(doc) {
+	    // calculate incentives for each person on the deal
+	    total_incentive = 0
+	    $.each(wn.model.get("Sales Team", {parent:doc.name}), function(i, d) {
+
+	        // calculate incentive
+	        var incentive_percent = 2;
+	        if(doc.grand_total > 400) incentive_percent = 4;
+
+	        // actual incentive
+	        d.incentives = flt(doc.grand_total) * incentive_percent / 100;
+	        total_incentive += flt(d.incentives)
+	    });
+
+	    doc.total_incentive = total_incentive;
+	}
\ No newline at end of file
diff --git a/docs/dev/custom_script_examples/docs.dev.custom_script.fetch.md b/docs/dev/custom_script_examples/docs.dev.custom_script.fetch.md
new file mode 100644
index 0000000..d0414fb
--- /dev/null
+++ b/docs/dev/custom_script_examples/docs.dev.custom_script.fetch.md
@@ -0,0 +1,20 @@
+---
+{
+	"_label": "Custom Script: Fetch Values from Master"
+}
+---
+To pull a value of a link on selection, use the `add_fetch` method.
+
+	add_fetch(link_fieldname, source_fieldname, target_fieldname)
+
+### Example
+
+You create Custom Field **VAT ID** (`vat_id`) in **Customer** and **Sales Invoice** and want to make sure this value gets updated every time you select a Customer in a Sales Invoice.
+
+Then in the Sales Invoice Custom Script, add this line:
+
+	cur_frm.add_fetch('customer','vat_id','vat_id')
+	
+
+---
+See: [How to create a custom script](!docs.dev.custom_script.html)	
\ No newline at end of file
diff --git a/docs/dev/custom_script_examples/docs.dev.custom_script.item_code.md b/docs/dev/custom_script_examples/docs.dev.custom_script.item_code.md
new file mode 100644
index 0000000..22e75c9
--- /dev/null
+++ b/docs/dev/custom_script_examples/docs.dev.custom_script.item_code.md
@@ -0,0 +1,35 @@
+---
+{
+	"_label": "Generate Item Code based on Custom Logic"
+}
+---
+Add this in the Custom Script of **Item**, so that the new Item Code is generated just before the a new Item is saved.
+
+	cur_frm.cscript.custom_validate = function(doc) {
+	    // clear item_code (name is from item_code)
+	    doc.item_code = "";
+
+	    // first 2 characters based on item_group
+	    switch(doc.item_group) {
+	        case "Test A":
+	            doc.item_code = "TA";
+	            break;
+	        case "Test B":
+	            doc.item_code = "TB";
+	            break;
+	        default:
+	            doc.item_code = "XX";
+	    }
+
+	    // add next 2 characters based on brand
+	    switch(doc.brand) {
+	        case "Brand A":
+	            doc.item_code += "BA";
+	            break;
+	        case "Brand B":
+	            doc.item_code += "BB";
+	            break;
+	        default:
+	            doc.item_code += "BX";
+	    }
+	}
\ No newline at end of file
diff --git a/docs/dev/custom_script_examples/docs.dev.custom_script.read_only.md b/docs/dev/custom_script_examples/docs.dev.custom_script.read_only.md
new file mode 100644
index 0000000..9da3e85
--- /dev/null
+++ b/docs/dev/custom_script_examples/docs.dev.custom_script.read_only.md
@@ -0,0 +1,13 @@
+---
+{
+	"_label": "Make an Item read-only after Saving"
+}
+---
+Use the method `cur_frm.set_df_property` to update the field's display.
+
+In this script we also use the `__islocal` property of the doc to check if the document has been saved atleast once or is never saved. If `__islocal` is `1`, then the document has never been saved.
+
+	cur_frm.cscript.custom_refresh = function(doc) {
+	    // use the __islocal value of doc, to check if the doc is saved or not
+	    cur_frm.set_df_property("myfield", "read_only", doc.__islocal ? 0 : 1);
+	}
\ No newline at end of file
diff --git a/docs/dev/custom_script_examples/docs.dev.custom_script.validate.md b/docs/dev/custom_script_examples/docs.dev.custom_script.validate.md
new file mode 100644
index 0000000..a22851c
--- /dev/null
+++ b/docs/dev/custom_script_examples/docs.dev.custom_script.validate.md
@@ -0,0 +1,12 @@
+---
+{
+	"_label": "Date Validation: Do not allow past dates in a date field"
+}
+---
+
+	cur_frm.cscript.custom_validate = function(doc) {
+	    if (doc.from_date < get_today()) {
+	        msgprint("You can not select past date in From Date");
+	        validated = false;
+	    }
+	}
\ No newline at end of file
diff --git a/docs/dev/custom_script_examples/docs.dev.custom_script.validate1.md b/docs/dev/custom_script_examples/docs.dev.custom_script.validate1.md
new file mode 100644
index 0000000..b12c61f
--- /dev/null
+++ b/docs/dev/custom_script_examples/docs.dev.custom_script.validate1.md
@@ -0,0 +1,12 @@
+---
+{
+	"_label": "Restrict Purpose of Stock Entry"
+}
+---
+
+	cur_frm.cscript.custom_validate = function(doc) {
+	    if(user=="user1@example.com" && doc.purpose!="Material Receipt") {
+	        msgprint("You are only allowed Material Receipt");
+	        validated = false;
+	    }
+	}
\ No newline at end of file
diff --git a/docs/dev/custom_script_examples/docs.dev.custom_script.validate2.md b/docs/dev/custom_script_examples/docs.dev.custom_script.validate2.md
new file mode 100644
index 0000000..05d662e
--- /dev/null
+++ b/docs/dev/custom_script_examples/docs.dev.custom_script.validate2.md
@@ -0,0 +1,22 @@
+---
+{
+	"_label": "Restrict User Based on Child Record (Warehouse)"
+}
+---
+
+	// restrict certain warehouse to Material Manager 
+	cur_frm.cscript.custom_validate = function(doc) {
+	    if(user_roles.indexOf("Material Manager")==-1) {
+
+	        var restricted_in_source = wn.model.get("Stock Entry Detail", 
+	            {parent:cur_frm.doc.name, s_warehouse:"Restricted"});
+
+	        var restricted_in_target = wn.model.get("Stock Entry Detail", 
+	            {parent:cur_frm.doc.name, t_warehouse:"Restricted"})
+
+	        if(restricted_in_source.length || restricted_in_target.length) {
+	            msgprint("Only Material Manager can make entry in Restricted Warehouse");
+	            validated = false;
+	        }
+	    }
+	}
\ No newline at end of file
diff --git a/docs/dev/custom_script_examples/docs.dev.custom_script.validate3.md b/docs/dev/custom_script_examples/docs.dev.custom_script.validate3.md
new file mode 100644
index 0000000..629f1c1
--- /dev/null
+++ b/docs/dev/custom_script_examples/docs.dev.custom_script.validate3.md
@@ -0,0 +1,17 @@
+---
+{
+	"_label": "Restrict Cancel Rights based on Certain Order Value"
+}
+---
+Add a handler to `custom_before_cancel` event:
+
+	cur_frm.cscript.custom_before_cancel = function(doc) {
+	    if (user_roles.indexOf("Accounts User")!=-1 && user_roles.indexOf("Accounts Manager")==-1
+	            && user_roles.indexOf("System Manager")==-1) {
+	        if (flt(doc.grand_total) > 10000) {
+	            msgprint("You can not cancel this transaction, because grand total \
+	                is greater than 10000");
+	            validated = false;
+	        }
+	    }
+	}
diff --git a/docs/dev/docs.dev.client_script.md b/docs/dev/docs.dev.client_script.md
deleted file mode 100644
index fc82f9d..0000000
--- a/docs/dev/docs.dev.client_script.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-{
-	"_label": "Client Scripts: Custoimzing ERPNext"
-	
-}
----
-
-	
-	
-	
diff --git a/docs/dev/docs.dev.custom_script.md b/docs/dev/docs.dev.custom_script.md
new file mode 100644
index 0000000..ad50637
--- /dev/null
+++ b/docs/dev/docs.dev.custom_script.md
@@ -0,0 +1,31 @@
+---
+{
+	"_label": "Custom Script Examples",
+	"_toc": [
+		"docs.dev.custom_script.fetch",
+		"docs.dev.custom_script.validate",
+		"docs.dev.custom_script.validate1",
+		"docs.dev.custom_script.validate2",
+		"docs.dev.custom_script.validate3",
+		"docs.dev.custom_script.read_only",
+		"docs.dev.custom_script.calculate",
+		"docs.dev.custom_script.item_code"
+	]
+}
+---
+### How to Create a Custom Script
+
+Create a Custom Script (you must have System Manager role for this):
+
+1. Got to: Setup > Custom Script > New Custom Script
+1. Select the DocType in which you want to add the Custom Script
+
+---
+### Notes
+
+1. Server Custom Scripts are only available for the Administrator.
+1. Client Custom Scripts are in Javascript and Server Custom Scripts are in Python.
+1. For testing, make sure to go to Tools > Clear Cache and refresh after updating a Custom Script.
+
+	
+	
diff --git a/docs/dev/docs.dev.md b/docs/dev/docs.dev.md
index 285f176..15afea8 100644
--- a/docs/dev/docs.dev.md
+++ b/docs/dev/docs.dev.md
@@ -6,7 +6,7 @@
 		"docs.dev.quickstart",
 		"docs.dev.framework",
 		"docs.dev.modules",
-		"docs.dev.client_script",
+		"docs.dev.custom_script",
 		"docs.dev.api",
 		"docs.dev.translate",
 		"docs.dev.docs"
diff --git a/hr/doctype/employee/employee.js b/hr/doctype/employee/employee.js
index 9ee7c61..05aec3e 100644
--- a/hr/doctype/employee/employee.js
+++ b/hr/doctype/employee/employee.js
@@ -6,7 +6,7 @@
 	setup: function() {
 		this.setup_leave_approver_select();
 		this.frm.fields_dict.user_id.get_query = function(doc,cdt,cdn) {
-				return { query:"controllers.queries.profile_query"} }
+				return { query:"core.doctype.profile.profile.profile_query"} }
 		this.frm.fields_dict.reports_to.get_query = function(doc,cdt,cdn) {	
 			return{	query:"controllers.queries.employee_query"}	}
 	},
diff --git a/hr/doctype/expense_claim/expense_claim.js b/hr/doctype/expense_claim/expense_claim.js
index ad3dace..65c5579 100644
--- a/hr/doctype/expense_claim/expense_claim.js
+++ b/hr/doctype/expense_claim/expense_claim.js
@@ -27,8 +27,8 @@
 				var d1 = wn.model.add_child(jv, 'Journal Voucher Detail', 'entries');
 				d1.credit = cur_frm.doc.total_sanctioned_amount;
 				if(r.message) {
-					d1.account = r.message[0].account;
-					d1.balance = r.message[0].balance;
+					d1.account = r.message.account;
+					d1.balance = r.message.balance;
 				}
 
 				loaddoc('Journal Voucher', jv.name);
diff --git a/patches/patch_list.py b/patches/patch_list.py
index 9e087c1..a916b6d 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -261,6 +261,7 @@
 	"execute:webnotes.bean('Style Settings').save() #2013-08-20",
 	"patches.september_2013.p01_fix_buying_amount_gl_entries",
 	"patches.september_2013.p01_update_communication",
+	"patches.september_2013.p02_fix_serial_no_status",
 	"patches.august_2013.p06_deprecate_is_cancelled",
 	"execute:webnotes.delete_doc('DocType', 'Budget Control')",
 ]
\ No newline at end of file
diff --git a/patches/september_2013/p02_fix_serial_no_status.py b/patches/september_2013/p02_fix_serial_no_status.py
new file mode 100644
index 0000000..714cd7a
--- /dev/null
+++ b/patches/september_2013/p02_fix_serial_no_status.py
@@ -0,0 +1,30 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute():
+	stock_entries = webnotes.conn.sql("""select ste_item.serial_no, ste.name 
+		from `tabStock Entry Detail` ste_item, `tabStock Entry` ste
+		where ste.name = ste_item.parent
+		and ifnull(ste_item.serial_no, '') != '' 
+		and ste.purpose='Material Transfer'
+		and ste.modified>='2013-08-14'
+		order by ste.posting_date desc, ste.posting_time desc, ste.name desc""", as_dict=1)
+		
+	for d in stock_entries:
+		serial_nos = d.serial_no.split("\n")
+		for sr in serial_nos:
+			serial_no = sr.strip()
+			if serial_no:
+				serial_bean = webnotes.bean("Serial No", serial_no)
+				if serial_bean.doc.status == "Not Available":
+					latest_sle = webnotes.conn.sql("""select voucher_no from `tabStock Ledger Entry`
+						where item_code=%s and warehouse=%s and serial_no like %s 
+						order by name desc limit 1""", (serial_bean.doc.item_code, 
+							serial_bean.doc.warehouse, "%%%s%%" % serial_no))
+					
+					if latest_sle and latest_sle[0][0] == d.name:
+						serial_bean.doc.status = "Available"
+						serial_bean.save()
\ No newline at end of file
diff --git a/public/js/queries.js b/public/js/queries.js
index fbd2947..d0346e0 100644
--- a/public/js/queries.js
+++ b/public/js/queries.js
@@ -5,7 +5,7 @@
 wn.provide("erpnext.queries");
 $.extend(erpnext.queries, {
 	profile: function() {
-		return { query: "controllers.queries.profile_query" };
+		return { query: "core.doctype.profile.profile.profile_query" };
 	},
 	
 	lead: function() {
diff --git a/selling/doctype/customer/customer.py b/selling/doctype/customer/customer.py
index cb19d4f..fb3c006 100644
--- a/selling/doctype/customer/customer.py
+++ b/selling/doctype/customer/customer.py
@@ -40,8 +40,7 @@
 	
 	def validate_values(self):
 		if webnotes.defaults.get_global_default('cust_master_name') == 'Naming Series' and not self.doc.naming_series:
-			msgprint("Series is Mandatory.")
-			raise Exception
+			webnotes.throw("Series is Mandatory.", webnotes.MandatoryError)
 
 	def validate(self):
 		self.validate_values()
diff --git a/selling/doctype/lead/lead.js b/selling/doctype/lead/lead.js
index 9a86b22..a3ae783 100644
--- a/selling/doctype/lead/lead.js
+++ b/selling/doctype/lead/lead.js
@@ -14,12 +14,12 @@
 	onload: function() {
 		if(cur_frm.fields_dict.lead_owner.df.options.match(/^Profile/)) {
 			cur_frm.fields_dict.lead_owner.get_query = function(doc,cdt,cdn) {
-				return { query:"controllers.queries.profile_query" } }
+				return { query:"core.doctype.profile.profile.profile_query" } }
 		}
 
 		if(cur_frm.fields_dict.contact_by.df.options.match(/^Profile/)) {
 			cur_frm.fields_dict.contact_by.get_query = function(doc,cdt,cdn) {
-				return { query:"controllers.queries.profile_query" } }
+				return { query:"core.doctype.profile.profile.profile_query" } }
 		}
 
 		if(in_list(user_roles,'System Manager')) {
diff --git a/selling/doctype/quotation/quotation.py b/selling/doctype/quotation/quotation.py
index c1b529c..588d8d6 100644
--- a/selling/doctype/quotation/quotation.py
+++ b/selling/doctype/quotation/quotation.py
@@ -7,7 +7,7 @@
 from webnotes.utils import cstr, getdate
 from webnotes.model.bean import getlist
 from webnotes.model.code import get_obj
-from webnotes import msgprint
+from webnotes import _, msgprint
 
 sql = webnotes.conn.sql
 	
@@ -278,3 +278,7 @@
 					return customer
 				else:
 					raise e
+			except webnotes.MandatoryError:
+				from webnotes.utils import get_url_to_form
+				webnotes.throw(_("Before proceeding, please create Customer from Lead") + \
+					(" - %s" % get_url_to_form("Lead", lead_name)))
diff --git a/selling/utils.py b/selling/utils.py
index 53ebbee..ca99512 100644
--- a/selling/utils.py
+++ b/selling/utils.py
@@ -161,7 +161,7 @@
 		FROM `tabItem Group` AS node, `tabItem Group` AS parent 
 		WHERE parent.lft <= node.lft and parent.rgt >= node.rgt and node.name = %s
 		GROUP BY parent.name 
-		ORDER BY parent.lft desc""", item_group)]
+		ORDER BY parent.lft desc""", (item_group,))]
 		
 	discount = 0
 	for d in parent_item_groups:
diff --git a/setup/doctype/authorization_rule/authorization_rule.js b/setup/doctype/authorization_rule/authorization_rule.js
index 02747a0..00f5260 100644
--- a/setup/doctype/authorization_rule/authorization_rule.js
+++ b/setup/doctype/authorization_rule/authorization_rule.js
@@ -69,10 +69,10 @@
 
 
 cur_frm.fields_dict.system_user.get_query = function(doc,cdt,cdn) {
-  return{ query:"controllers.queries.profile_query" } }
+  return{ query:"core.doctype.profile.profile.profile_query" } }
 
 cur_frm.fields_dict.approving_user.get_query = function(doc,cdt,cdn) {
-  return{ query:"controllers.queries.profile_query" } }
+  return{ query:"core.doctype.profile.profile.profile_query" } }
 
 cur_frm.fields_dict['approving_role'].get_query = cur_frm.fields_dict['system_role'].get_query;
 
diff --git a/startup/boot.py b/startup/boot.py
index 79f0a7b..ce446e9 100644
--- a/startup/boot.py
+++ b/startup/boot.py
@@ -16,7 +16,9 @@
 
 	if webnotes.session['user']!='Guest':
 		bootinfo['letter_heads'] = get_letter_heads()
-
+		
+		load_country_and_currency(bootinfo)
+		
 		import webnotes.model.doctype
 		bootinfo['notification_settings'] = webnotes.doc("Notification Control", 
 			"Notification Control").get_values()
@@ -36,7 +38,15 @@
 
 		bootinfo['docs'] += webnotes.conn.sql("""select name, default_currency, cost_center
             from `tabCompany`""", as_dict=1, update={"doctype":":Company"})
-			
+
+def load_country_and_currency(bootinfo):
+	if bootinfo.control_panel.country and \
+		webnotes.conn.exists("Country", bootinfo.control_panel.country):
+		bootinfo["docs"] += [webnotes.doc("Country", bootinfo.control_panel.country)]
+		
+	bootinfo["docs"] += webnotes.conn.sql("""select * from tabCurrency
+		where ifnull(enabled,0)=1""", as_dict=1, update={"doctype":":Currency"})
+
 def get_letter_heads():
 	"""load letter heads with startup"""
 	import webnotes
diff --git a/startup/event_handlers.py b/startup/event_handlers.py
index e807797..fa08962 100644
--- a/startup/event_handlers.py
+++ b/startup/event_handlers.py
@@ -64,6 +64,12 @@
 	webnotes.response['message'] = 'Account Expired'
 	raise webnotes.AuthenticationError
 
+def on_build():
+	from website.helpers.make_web_include_files import make
+	make()
+	
+	from home.page.latest_updates import latest_updates
+	latest_updates.make()
 
 def comment_added(doc):
 	"""add comment to feed"""
diff --git a/stock/doctype/purchase_receipt/test_purchase_receipt.py b/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 9bb1495..6161511 100644
--- a/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -117,9 +117,6 @@
 
 		self.assertFalse(webnotes.conn.get_value("Serial No", pr.doclist[1].serial_no, 
 			"warehouse"))
-
-		self.assertEqual(webnotes.conn.get_value("Serial No", pr.doclist[1].serial_no, 
-			"status"), "Not Available")
 			
 def get_gl_entries(voucher_type, voucher_no):
 	return webnotes.conn.sql("""select account, debit, credit
diff --git a/stock/doctype/serial_no/serial_no.py b/stock/doctype/serial_no/serial_no.py
index 86c37b5..1feab02 100644
--- a/stock/doctype/serial_no/serial_no.py
+++ b/stock/doctype/serial_no/serial_no.py
@@ -52,9 +52,7 @@
 				webnotes.throw(_("Item Code cannot be changed for Serial No."), SerialNoCannotCannotChangeError)
 			if not self.via_stock_ledger and warehouse != self.doc.warehouse:
 				webnotes.throw(_("Warehouse cannot be changed for Serial No."), SerialNoCannotCannotChangeError)
-			
-		if not self.doc.warehouse and self.doc.status=="Available":
-			self.doc.status = "Not Available"
+	
 
 	def validate_item(self):
 		"""
@@ -94,4 +92,4 @@
 				serial_nos = map(lambda i: i==old and new or i, item[1].split('\n'))
 				webnotes.conn.sql("""update `tab%s` set serial_no = %s 
 					where name=%s""" % (dt[0], '%s', '%s'),
-					('\n'.join(serial_nos), item[0]))
\ No newline at end of file
+					('\n'.join(serial_nos), item[0]))
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index a692db5..b1fbe81 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -316,7 +316,7 @@
 	def update_stock_ledger(self):
 		sl_entries = []			
 		for d in getlist(self.doclist, 'mtn_details'):
-			if cstr(d.s_warehouse):
+			if cstr(d.s_warehouse) and self.doc.docstatus == 1:
 				sl_entries.append(self.get_sl_entries(d, {
 					"warehouse": cstr(d.s_warehouse),
 					"actual_qty": -flt(d.transfer_qty),
@@ -329,6 +329,16 @@
 					"actual_qty": flt(d.transfer_qty),
 					"incoming_rate": flt(d.incoming_rate)
 				}))
+			
+			# On cancellation, make stock ledger entry for 
+			# target warehouse first, to update serial no values properly
+			
+			if cstr(d.s_warehouse) and self.doc.docstatus == 2:
+				sl_entries.append(self.get_sl_entries(d, {
+					"warehouse": cstr(d.s_warehouse),
+					"actual_qty": -flt(d.transfer_qty),
+					"incoming_rate": 0
+				}))
 				
 		self.make_sl_entries(sl_entries, self.doc.amended_from and 'Yes' or 'No')
 
diff --git a/stock/doctype/stock_entry/test_stock_entry.py b/stock/doctype/stock_entry/test_stock_entry.py
index 5c7ce21..b6626f2 100644
--- a/stock/doctype/stock_entry/test_stock_entry.py
+++ b/stock/doctype/stock_entry/test_stock_entry.py
@@ -700,6 +700,9 @@
 		self.assertTrue(webnotes.conn.exists("Serial No", "ABCD"))
 		self.assertTrue(webnotes.conn.exists("Serial No", "EFGH"))
 		
+		se.cancel()
+		self.assertFalse(webnotes.conn.get_value("Serial No", "ABCD", "warehouse"))
+		
 	def test_serial_no_not_exists(self):
 		self._clear_stock_account_balance()
 		se = webnotes.bean(copy=test_records[0])
@@ -755,6 +758,9 @@
 		se.insert()
 		se.submit()
 		self.assertTrue(webnotes.conn.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse 1 - _TC")
+		
+		se.cancel()
+		self.assertTrue(webnotes.conn.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse - _TC")
 
 	def test_serial_warehouse_error(self):
 		self._clear_stock_account_balance()
@@ -778,7 +784,6 @@
 		
 		serial_no = get_serial_nos(se.doclist[1].serial_no)[0]
 		self.assertFalse(webnotes.conn.get_value("Serial No", serial_no, "warehouse"))
-		self.assertTrue(webnotes.conn.get_value("Serial No", serial_no, "status"), "Not Available")
 
 def make_serialized_item():
 	se = webnotes.bean(copy=test_records[0])
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index 3b10ae4..3088e83 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -124,13 +124,14 @@
 
 						if self.doc.actual_qty < 0:
 							if sr.doc.warehouse!=self.doc.warehouse:
-								webnotes.throw(_("Warehouse does not belong to Item") + \
-									(": %s (%s)" % (self.doc.item_code, serial_no)), SerialNoWarehouseError)
+								webnotes.throw(_("Serial No") + ": " + serial_no + 
+									_(" does not belong to Warehouse") + ": " + self.doc.warehouse, 
+									SerialNoWarehouseError)
 								
 							if self.doc.voucher_type in ("Delivery Note", "Sales Invoice") \
 								and sr.doc.status != "Available":
-								webnotes.throw(_("Serial No status must be 'Available' to Deliver") + \
-									": " + serial_no, SerialNoStatusError)
+								webnotes.throw(_("Serial No status must be 'Available' to Deliver") 
+									+ ": " + serial_no, SerialNoStatusError)
 								
 									
 							sr.doc.warehouse = None