diff --git a/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.py b/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.py
index dc7d57b..7d6ce34 100644
--- a/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.py
+++ b/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.py
@@ -12,17 +12,17 @@
 		if not (self.bank_account and self.from_date and self.to_date):
 			msgprint("Bank Account, From Date and To Date are Mandatory")
 			return
-	
-		dl = frappe.db.sql("""select t1.name, t1.cheque_no, t1.cheque_date, t2.debit, 
-				t2.credit, t1.posting_date, t2.against_account 
-			from 
-				`tabJournal Voucher` t1, `tabJournal Voucher Detail` t2 
-			where 
-				t2.parent = t1.name and t2.account = %s 
-				and (clearance_date is null or clearance_date = '0000-00-00' or clearance_date = '') 
-				and t1.posting_date >= %s and t1.posting_date <= %s and t1.docstatus=1""", 
+
+		dl = frappe.db.sql("""select t1.name, t1.cheque_no, t1.cheque_date, t2.debit,
+				t2.credit, t1.posting_date, t2.against_account
+			from
+				`tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
+			where
+				t2.parent = t1.name and t2.account = %s
+				and (clearance_date is null or clearance_date = '0000-00-00' or clearance_date = '')
+				and t1.posting_date >= %s and t1.posting_date <= %s and t1.docstatus=1""",
 				(self.bank_account, self.from_date, self.to_date))
-		
+
 		self.set('entries', [])
 		self.total_amount = 0.0
 
@@ -43,13 +43,13 @@
 			if d.clearance_date:
 				if d.cheque_date and getdate(d.clearance_date) < getdate(d.cheque_date):
 					frappe.throw("Clearance Date can not be before Cheque Date (Row #%s)" % d.idx)
-					
+
 				frappe.db.set_value("Journal Voucher", d.voucher_id, "clearance_date", d.clearance_date)
-				frappe.db.sql("""update `tabJournal Voucher` set clearance_date = %s, modified = %s 
+				frappe.db.sql("""update `tabJournal Voucher` set clearance_date = %s, modified = %s
 					where name=%s""", (d.clearance_date, nowdate(), d.voucher_id))
 				vouchers.append(d.voucher_id)
 
 		if vouchers:
-			msgprint("Clearance Date updated in %s" % ", ".join(vouchers))
+			msgprint("Clearance Date updated in: {0}".format(", ".join(vouchers)))
 		else:
-			msgprint(_("Clearance Date not mentioned"))
\ No newline at end of file
+			msgprint(_("Clearance Date not mentioned"))
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py
index d79bbcc..71ebe6c 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.py
+++ b/erpnext/accounts/doctype/cost_center/cost_center.py
@@ -10,33 +10,33 @@
 
 class CostCenter(NestedSet):
 	nsm_parent_field = 'parent_cost_center'
-	
+
 	def autoname(self):
 		self.name = self.cost_center_name.strip() + ' - ' + \
 			frappe.db.get_value("Company", self.company, "abbr")
-		
+
 	def validate_mandatory(self):
 		if not self.group_or_ledger:
-			msgprint("Please select Group or Ledger value", raise_exception=1)
-			
+			msgprint(_("Please select Group or Ledger value"), raise_exception=1)
+
 		if self.cost_center_name != self.company and not self.parent_cost_center:
-			msgprint("Please enter parent cost center", raise_exception=1)
+			msgprint(_("Please enter parent cost center"), raise_exception=1)
 		elif self.cost_center_name == self.company and self.parent_cost_center:
 			msgprint(_("Root cannot have a parent cost center"), raise_exception=1)
-		
+
 	def convert_group_to_ledger(self):
 		if self.check_if_child_exists():
-			msgprint("Cost Center: %s has existing child. You can not convert this cost center to ledger" % (self.name), raise_exception=1)
+			msgprint(_("Cannot convert Cost Center to ledger as it has child nodes"), raise_exception=1)
 		elif self.check_gle_exists():
-			msgprint("Cost Center with existing transaction can not be converted to ledger.", raise_exception=1)
+			msgprint(_("Cost Center with existing transactions can not be converted to ledger"), raise_exception=1)
 		else:
 			self.group_or_ledger = 'Ledger'
 			self.save()
 			return 1
-			
+
 	def convert_ledger_to_group(self):
 		if self.check_gle_exists():
-			msgprint("Cost Center with existing transaction can not be converted to group.", raise_exception=1)
+			msgprint(_("Cost Center with existing transactions can not be converted to group"), raise_exception=1)
 		else:
 			self.group_or_ledger = 'Group'
 			self.save()
@@ -44,7 +44,7 @@
 
 	def check_gle_exists(self):
 		return frappe.db.get_value("GL Entry", {"cost_center": self.name})
-		
+
 	def check_if_child_exists(self):
 		return frappe.db.sql("select name from `tabCost Center` where \
 			parent_cost_center = %s and docstatus != 2", self.name)
@@ -53,11 +53,11 @@
 		check_acc_list = []
 		for d in self.get('budget_details'):
 			if self.group_or_ledger=="Group":
-				msgprint("Budget cannot be set for Group Cost Centers", raise_exception=1)
-				
+				msgprint(_("Budget cannot be set for Group Cost Centers"), raise_exception=1)
+
 			if [d.account, d.fiscal_year] in check_acc_list:
-				msgprint("Account " + d.account + "has been entered more than once for fiscal year " + d.fiscal_year, raise_exception=1)
-			else: 
+				msgprint(_("Account {0} has been entered more than once for fiscal year {1}").format(d.account, d.fiscal_year), raise_exception=1)
+			else:
 				check_acc_list.append([d.account, d.fiscal_year])
 
 	def validate(self):
@@ -65,25 +65,25 @@
 			Cost Center name must be unique
 		"""
 		if (self.get("__islocal") or not self.name) and frappe.db.sql("select name from `tabCost Center` where cost_center_name = %s and company=%s", (self.cost_center_name, self.company)):
-			msgprint("Cost Center Name already exists, please rename", raise_exception=1)
-			
+			msgprint(_("Cost Center Name already exists"), raise_exception=1)
+
 		self.validate_mandatory()
 		self.validate_budget_details()
-		
+
 	def before_rename(self, olddn, newdn, merge=False):
 		# Add company abbr if not provided
 		from erpnext.setup.doctype.company.company import get_name_with_abbr
 		new_cost_center = get_name_with_abbr(newdn, self.company)
-		
+
 		# Validate properties before merging
 		super(CostCenter, self).before_rename(olddn, new_cost_center, merge, "group_or_ledger")
-		
+
 		return new_cost_center
-		
+
 	def after_rename(self, olddn, newdn, merge=False):
 		if not merge:
-			frappe.db.set_value("Cost Center", newdn, "cost_center_name", 
+			frappe.db.set_value("Cost Center", newdn, "cost_center_name",
 				" - ".join(newdn.split(" - ")[:-1]))
 		else:
 			super(CostCenter, self).after_rename(olddn, newdn, merge)
-			
+
diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
index 6e72c9a..14461ff 100644
--- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
+++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
@@ -9,19 +9,18 @@
 from frappe.model.document import Document
 
 class FiscalYear(Document):
-		
+
 	def set_as_default(self):
 		frappe.db.set_value("Global Defaults", None, "current_fiscal_year", self.name)
 		frappe.get_doc("Global Defaults").on_update()
-		
+
 		# clear cache
 		frappe.clear_cache()
-		
-		msgprint(self.name + _(""" is now the default Fiscal Year. \
-			Please refresh your browser for the change to take effect."""))
+
+		msgprint(_("{0} is now the default Fiscal Year. Please refresh your browser for the change to take effect.").format(self.name))
 
 	def validate(self):
-		year_start_end_dates = frappe.db.sql("""select year_start_date, year_end_date 
+		year_start_end_dates = frappe.db.sql("""select year_start_date, year_end_date
 			from `tabFiscal Year` where name=%s""", (self.name))
 
 		if year_start_end_dates:
@@ -36,10 +35,10 @@
 		if (getdate(self.year_end_date) - getdate(self.year_start_date)).days > 366:
 			frappe.throw(_("Year Start Date and Year End Date are not within Fiscal Year."))
 
-		year_start_end_dates = frappe.db.sql("""select name, year_start_date, year_end_date 
+		year_start_end_dates = frappe.db.sql("""select name, year_start_date, year_end_date
 			from `tabFiscal Year` where name!=%s""", (self.name))
 
 		for fiscal_year, ysd, yed in year_start_end_dates:
 			if (getdate(self.year_start_date) == ysd and getdate(self.year_end_date) == yed) \
 				and (not frappe.flags.in_test):
-					frappe.throw(_("Year Start Date and Year End Date are already set in Fiscal Year: ") + fiscal_year)
\ No newline at end of file
+					frappe.throw(_("Year Start Date and Year End Date are already set in Fiscal Year: ") + fiscal_year)
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
index f11589b..b586a2c 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
@@ -57,17 +57,16 @@
 	def validate_debit_credit(self):
 		for d in self.get('entries'):
 			if d.debit and d.credit:
-				msgprint("You cannot credit and debit same account at the same time.",
-				 	raise_exception=1)
+				msgprint(_("You cannot credit and debit same account at the same time."), raise_exception=1)
 
 	def validate_cheque_info(self):
 		if self.voucher_type in ['Bank Voucher']:
 			if not self.cheque_no or not self.cheque_date:
-				msgprint("Reference No & Reference Date is required for %s" %
-				self.voucher_type, raise_exception=1)
+				msgprint(_("Reference No & Reference Date is required for {0}").format(self.voucher_type),
+					raise_exception=1)
 
 		if self.cheque_date and not self.cheque_no:
-			msgprint("Reference No is mandatory if you entered Reference Date", raise_exception=1)
+			msgprint(_("Reference No is mandatory if you entered Reference Date"), raise_exception=1)
 
 	def validate_entries_for_advance(self):
 		for d in self.get('entries'):
@@ -76,19 +75,17 @@
 				master_type = frappe.db.get_value("Account", d.account, "master_type")
 				if (master_type == 'Customer' and flt(d.credit) > 0) or \
 						(master_type == 'Supplier' and flt(d.debit) > 0):
-					msgprint("Message: Please check Is Advance as 'Yes' against \
-						Account %s if this is an advance entry." % d.account)
+					msgprint(_("Please check 'Is Advance' against Account {0} if this is an advance entry.").format(d.account))
 
 	def validate_against_jv(self):
 		for d in self.get('entries'):
 			if d.against_jv:
 				if d.against_jv == self.name:
-					msgprint("You can not enter current voucher in 'Against JV' column",
-						raise_exception=1)
+					msgprint(_("You can not enter current voucher in 'Against Journal Voucher' column"), raise_exception=1)
 				elif not frappe.db.sql("""select name from `tabJournal Voucher Detail`
 						where account = %s and docstatus = 1 and parent = %s""",
 						(d.account, d.against_jv)):
-					msgprint("Against JV: %s is not valid." % d.against_jv, raise_exception=1)
+					msgprint(_("Journal Voucher {0} does not have account {1}.").format(d.against_jv, d.account), raise_exception=1)
 
 	def set_against_account(self):
 		# Debit = Credit
@@ -104,8 +101,8 @@
 		self.total_credit = credit
 
 		if abs(self.total_debit-self.total_credit) > 0.001:
-			msgprint("Debit must be equal to Credit. The difference is %s" %
-			 	(self.total_debit-self.total_credit), raise_exception=1)
+			msgprint(_("Debit must equal Credit. The difference is {0}").format(self.total_debit-self.total_credit),
+				raise_exception=1)
 
 		# update against account
 		for d in self.get('entries'):
@@ -116,10 +113,9 @@
 		r = []
 		if self.cheque_no:
 			if self.cheque_date:
-				r.append('Via Reference #%s dated %s' %
-					(self.cheque_no, formatdate(self.cheque_date)))
+				r.append(_('Reference #{0} dated {1}').fomrat(self.cheque_no, formatdate(self.cheque_date)))
 			else :
-				msgprint("Please enter Reference date", raise_exception=1)
+				msgprint(_("Please enter Reference date"), raise_exception=1)
 
 		for d in self.get('entries'):
 			if d.against_invoice and d.credit:
@@ -137,12 +133,12 @@
 						bill_no[0][1] and formatdate(bill_no[0][1].strftime('%Y-%m-%d')) or ''))
 
 		if self.user_remark:
-			r.append("User Remark : %s"%self.user_remark)
+			r.append(_("Note: {0}").format(self.user_remark))
 
 		if r:
 			self.remark = ("\n").join(r)
 		else:
-			frappe.msgprint("User Remarks is mandatory", raise_exception=1)
+			frappe.msgprint(_("User Remarks is mandatory"), raise_exception=1)
 
 	def set_aging_date(self):
 		if self.is_opening != 'Yes':
@@ -158,7 +154,7 @@
 
 			# If customer/supplier account, aging date is mandatory
 			if exists and not self.aging_date:
-				msgprint("Aging Date is mandatory for opening entry", raise_exception=1)
+				msgprint(_("Aging Date is mandatory for opening entry"), raise_exception=1)
 			else:
 				self.aging_date = self.posting_date
 
@@ -195,8 +191,8 @@
 			credit_days = self.get_credit_days_for(d.account)
 			# Check credit days
 			if credit_days > 0 and not self.get_authorized_user() and cint(date_diff) > credit_days:
-				msgprint("Credit Not Allowed: Cannot allow a check that is dated \
-					more than %s days after the posting date" % credit_days, raise_exception=1)
+				msgprint(_("Maximum allowed credit is {0} days after posting date").format(credit_days),
+					raise_exception=1)
 
 	def get_credit_days_for(self, ac):
 		if not self.credit_days_for.has_key(ac):
@@ -272,7 +268,7 @@
 
 	def get_balance(self):
 		if not self.get('entries'):
-			msgprint("Please enter atleast 1 entry in 'GL Entries' table")
+			msgprint(_("'Entries' cannot be empty"), raise_exception=True)
 		else:
 			flag, self.total_debit, self.total_credit = 0, 0, 0
 			diff = flt(self.difference, 2)
@@ -390,7 +386,7 @@
 	jv.company = doc.company
 	jv.fiscal_year = doc.fiscal_year
 
-	d1 = jv.append("entries")
+	jv.append("entries")
 	d2 = jv.append("entries")
 
 	if bank_account:
diff --git a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
index cff24e1..f845138 100644
--- a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
+++ b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
@@ -12,23 +12,23 @@
 
 class PaymenttoInvoiceMatchingTool(Document):
 	def get_voucher_details(self):
-		total_amount = frappe.db.sql("""select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0)) 
-			from `tabGL Entry` 
-			where voucher_type = %s and voucher_no = %s 
+		total_amount = frappe.db.sql("""select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))
+			from `tabGL Entry`
+			where voucher_type = %s and voucher_no = %s
 			and account = %s""", (self.voucher_type, self.voucher_no, self.account))
-			
+
 		total_amount = total_amount and flt(total_amount[0][0]) or 0
 		reconciled_payment = frappe.db.sql("""
-			select abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))) from `tabGL Entry` where 
+			select abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))) from `tabGL Entry` where
 			against_voucher = %s and voucher_no != %s
 			and account = %s""", (self.voucher_no, self.voucher_no, self.account))
-			
+
 		reconciled_payment = reconciled_payment and flt(reconciled_payment[0][0]) or 0
 		ret = {
-			'total_amount': total_amount,	
+			'total_amount': total_amount,
 			'pending_amt_to_reconcile': total_amount - reconciled_payment
 		}
-		
+
 		return ret
 
 	def get_payment_entries(self):
@@ -37,16 +37,16 @@
 			Payment entry will be decided based on account type (Dr/Cr)
 		"""
 
-		self.set('ir_payment_details', [])		
+		self.set('ir_payment_details', [])
 		gle = self.get_gl_entries()
 		self.create_payment_table(gle)
 
 	def get_gl_entries(self):
 		self.validate_mandatory()
-		
+
 		cond = self.from_date and " and t1.posting_date >= '" + self.from_date + "'" or ""
 		cond += self.to_date and " and t1.posting_date <= '" + self.to_date + "'"or ""
-		
+
 		if self.amt_greater_than:
 			cond += ' and abs(ifnull(t2.debit, 0) - ifnull(t2.credit, 0)) >= ' + \
 				self.amt_greater_than
@@ -55,13 +55,13 @@
 				self.amt_less_than
 
 		gle = frappe.db.sql("""
-			select t1.name as voucher_no, t1.posting_date, t1.total_debit as total_amt, 
+			select t1.name as voucher_no, t1.posting_date, t1.total_debit as total_amt,
 			 	abs(sum(ifnull(t2.credit, 0)) - sum(ifnull(t2.debit, 0))) as amt_due, t1.remark,
 			 	t2.against_account, t2.name as voucher_detail_no
 			from `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
 			where t1.name = t2.parent and t1.docstatus = 1 and t2.account = %s
-			and ifnull(t2.against_voucher, '')='' and ifnull(t2.against_invoice, '')='' 
-			and ifnull(t2.against_jv, '')='' and t1.name != %s %s group by t1.name, t2.name """ % 
+			and ifnull(t2.against_voucher, '')='' and ifnull(t2.against_invoice, '')=''
+			and ifnull(t2.against_jv, '')='' and t1.name != %s %s group by t1.name, t2.name """ %
 			('%s', '%s', cond), (self.account, self.voucher_no), as_dict=1)
 
 		return gle
@@ -76,11 +76,11 @@
 			ch.against_account = d.get('against_account')
 			ch.remarks = d.get('remark')
 			ch.voucher_detail_no = d.get('voucher_detail_no')
-			
+
 	def validate_mandatory(self):
 		if not self.account:
-			msgprint("Please select Account first", raise_exception=1)
-	
+			msgprint(_("Please select Account first"), raise_exception=1)
+
 	def reconcile(self):
 		"""
 			Links booking and payment voucher
@@ -88,59 +88,59 @@
 			2. split into multiple rows if partially adjusted, assign against voucher
 			3. submit payment voucher
 		"""
-		if not self.voucher_no or not frappe.db.sql("""select name from `tab%s` 
+		if not self.voucher_no or not frappe.db.sql("""select name from `tab%s`
 				where name = %s""" % (self.voucher_type, '%s'), self.voucher_no):
 			frappe.throw(_("Please select valid Voucher No to proceed"))
-		
+
 		lst = []
 		for d in self.get('ir_payment_details'):
 			if flt(d.amt_to_be_reconciled) > 0:
 				args = {
 					'voucher_no' : d.voucher_no,
-					'voucher_detail_no' : d.voucher_detail_no, 
-					'against_voucher_type' : self.voucher_type, 
+					'voucher_detail_no' : d.voucher_detail_no,
+					'against_voucher_type' : self.voucher_type,
 					'against_voucher'  : self.voucher_no,
-					'account' : self.account, 
-					'is_advance' : 'No', 
-					# 'dr_or_cr' :  self.account_type=='debit' and 'credit' or 'debit', 
+					'account' : self.account,
+					'is_advance' : 'No',
+					# 'dr_or_cr' :  self.account_type=='debit' and 'credit' or 'debit',
 					'unadjusted_amt' : flt(d.amt_due),
 					'allocated_amt' : flt(d.amt_to_be_reconciled)
 				}
-			
+
 				lst.append(args)
-		
+
 		if lst:
 			from erpnext.accounts.utils import reconcile_against_document
 			reconcile_against_document(lst)
-			msgprint("Successfully allocated.")
+			msgprint(_("Successfully allocated"))
 		else:
-			msgprint("No amount allocated.", raise_exception=1)
+			msgprint(_("No amount allocated"), raise_exception=1)
 
 def gl_entry_details(doctype, txt, searchfield, start, page_len, filters):
 	from erpnext.controllers.queries import get_match_cond
-	return frappe.db.sql("""select gle.voucher_no, gle.posting_date, 
+	return frappe.db.sql("""select gle.voucher_no, gle.posting_date,
 		gle.debit, gle.credit from `tabGL Entry` gle
-	    where gle.account = '%(acc)s' 
+	    where gle.account = '%(acc)s'
 	    	and gle.voucher_type = '%(dt)s'
-			and gle.voucher_no like '%(txt)s'  
-	    	and (ifnull(gle.against_voucher, '') = '' 
-	    		or ifnull(gle.against_voucher, '') = gle.voucher_no ) 
-	   		and (select ifnull(abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))), 0) 
-				from `tabGL Entry` 
+			and gle.voucher_no like '%(txt)s'
+	    	and (ifnull(gle.against_voucher, '') = ''
+	    		or ifnull(gle.against_voucher, '') = gle.voucher_no )
+	   		and (select ifnull(abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))), 0)
+				from `tabGL Entry`
 	        	where account = '%(acc)s'
-				and against_voucher_type = '%(dt)s' 
-	        	and against_voucher = gle.voucher_no 
-	        	and voucher_no != gle.voucher_no) 
-					!= abs(ifnull(gle.debit, 0) - ifnull(gle.credit, 0)) 
-			and if(gle.voucher_type='Sales Invoice', ifnull((select is_pos from `tabSales Invoice` 
+				and against_voucher_type = '%(dt)s'
+	        	and against_voucher = gle.voucher_no
+	        	and voucher_no != gle.voucher_no)
+					!= abs(ifnull(gle.debit, 0) - ifnull(gle.credit, 0))
+			and if(gle.voucher_type='Sales Invoice', ifnull((select is_pos from `tabSales Invoice`
 				where name=gle.voucher_no), 0), 0)=0
 			%(mcond)s
-	    ORDER BY gle.posting_date desc, gle.voucher_no desc 
+	    ORDER BY gle.posting_date desc, gle.voucher_no desc
 	    limit %(start)s, %(page_len)s""" % {
-			"dt":filters["dt"], 
-			"acc":filters["acc"], 
-			'mcond':get_match_cond(doctype), 
-			'txt': "%%%s%%" % txt, 
-			"start": start, 
+			"dt":filters["dt"],
+			"acc":filters["acc"],
+			'mcond':get_match_cond(doctype),
+			'txt': "%%%s%%" % txt,
+			"start": start,
 			"page_len": page_len
 		})
diff --git a/erpnext/accounts/doctype/pos_setting/pos_setting.py b/erpnext/accounts/doctype/pos_setting/pos_setting.py
index f7fdd31..383400f 100755
--- a/erpnext/accounts/doctype/pos_setting/pos_setting.py
+++ b/erpnext/accounts/doctype/pos_setting/pos_setting.py
@@ -16,18 +16,18 @@
 		self.check_for_duplicate()
 		self.validate_expense_account()
 		self.validate_all_link_fields()
-		
+
 	def check_for_duplicate(self):
-		res = frappe.db.sql("""select name, user from `tabPOS Setting` 
-			where ifnull(user, '') = %s and name != %s and company = %s""", 
+		res = frappe.db.sql("""select name, user from `tabPOS Setting`
+			where ifnull(user, '') = %s and name != %s and company = %s""",
 			(self.user, self.name, self.company))
 		if res:
 			if res[0][1]:
-				msgprint("POS Setting '%s' already created for user: '%s' and company: '%s'" % 
-					(res[0][0], res[0][1], self.company), raise_exception=1)
+				msgprint(_("POS Setting {0} already created for user: {1} and company {2}").format(res[0][0],
+					res[0][1], self.company), raise_exception=1)
 			else:
-				msgprint("Global POS Setting already created - %s for this company: '%s'" % 
-					(res[0][0], self.company), raise_exception=1)
+				msgprint(_("Global POS Setting {0} already created for company {1}").format(res[0][0],
+					self.company), raise_exception=1)
 
 	def validate_expense_account(self):
 		if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) \
@@ -35,13 +35,13 @@
 			msgprint(_("Expense Account is mandatory"), raise_exception=1)
 
 	def validate_all_link_fields(self):
-		accounts = {"Account": [self.cash_bank_account, self.income_account, 
-			self.expense_account], "Cost Center": [self.cost_center], 
+		accounts = {"Account": [self.cash_bank_account, self.income_account,
+			self.expense_account], "Cost Center": [self.cost_center],
 			"Warehouse": [self.warehouse]}
-		
+
 		for link_dt, dn_list in accounts.items():
 			for link_dn in dn_list:
-				if link_dn and not frappe.db.exists({"doctype": link_dt, 
+				if link_dn and not frappe.db.exists({"doctype": link_dt,
 						"company": self.company, "name": link_dn}):
 					frappe.throw(link_dn +_(" does not belong to ") + self.company)
 
@@ -53,17 +53,17 @@
 
 	def set_defaults(self, include_current_pos=True):
 		frappe.defaults.clear_default("is_pos")
-		
+
 		if not include_current_pos:
 			condition = " where name != '%s'" % self.name.replace("'", "\'")
 		else:
 			condition = ""
 
-		pos_view_users = frappe.db.sql_list("""select user 
+		pos_view_users = frappe.db.sql_list("""select user
 			from `tabPOS Setting` {0}""".format(condition))
-		
+
 		for user in pos_view_users:
 			if user:
 				frappe.defaults.set_user_default("is_pos", 1, user)
 			else:
-				frappe.defaults.set_global_default("is_pos", 1)
\ No newline at end of file
+				frappe.defaults.set_global_default("is_pos", 1)
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 8860a78..ea74fd6 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -6,7 +6,7 @@
 
 from frappe.utils import cint, cstr, flt, formatdate
 
-from frappe import msgprint, _
+from frappe import msgprint, _, throw
 from erpnext.setup.utils import get_company_currency
 
 import frappe.defaults
@@ -73,22 +73,15 @@
 	def check_active_purchase_items(self):
 		for d in self.get('entries'):
 			if d.item_code:		# extra condn coz item_code is not mandatory in PV
-				valid_item = frappe.db.sql("select docstatus,is_purchase_item from tabItem where name = %s",d.item_code)
-				if valid_item[0][0] == 2:
-					msgprint("Item : '%s' is Inactive, you can restore it from Trash" %(d.item_code))
-					raise Exception
-				if not valid_item[0][1] == 'Yes':
-					msgprint("Item : '%s' is not Purchase Item"%(d.item_code))
-					raise Exception
+				if frappe.db.get_value("Item", d.item_code, "is_purchase_item") != 'Yes':
+					msgprint(_("Item {0} is not Purchase Item").format(d.item_code), raise_exception=True)
 
 	def check_conversion_rate(self):
 		default_currency = get_company_currency(self.company)
 		if not default_currency:
-			msgprint('Message: Please enter default currency in Company Master')
-			raise Exception
+			throw(_('Please enter default currency in Company Master'))
 		if (self.currency == default_currency and flt(self.conversion_rate) != 1.00) or not self.conversion_rate or (self.currency != default_currency and flt(self.conversion_rate) == 1.00):
-			msgprint("Message: Please Enter Appropriate Conversion Rate.")
-			raise Exception
+			throw(_("Conversion rate cannot be 0 or 1"))
 
 	def validate_bill_no(self):
 		if self.bill_no and self.bill_no.lower().strip() \
@@ -97,13 +90,12 @@
 				where bill_no = %s and credit_to = %s and docstatus = 1 and name != %s""",
 				(self.bill_no, self.credit_to, self.name))
 			if b_no and cstr(b_no[0][2]) == cstr(self.is_opening):
-				msgprint("Please check you have already booked expense against Bill No. %s \
-					in Purchase Invoice %s" % (cstr(b_no[0][0]), cstr(b_no[0][1])),
-					raise_exception=1)
+				throw(_("Bill No {0} already booked in Purchase Invoice {1}").format(cstr(b_no[0][0]),
+					cstr(b_no[0][1])))
 
 			if not self.remarks and self.bill_date:
-				self.remarks = (self.remarks or '') + "\n" + ("Against Bill %s dated %s"
-					% (self.bill_no, formatdate(self.bill_date)))
+				self.remarks = (self.remarks or '') + "\n" \
+					+ _("Against Bill %s dated %s").format(self.bill_no, formatdate(self.bill_date))
 
 		if not self.remarks:
 			self.remarks = "No Remarks"
@@ -130,7 +122,7 @@
 				check_list.append(d.purchase_order)
 				stopped = frappe.db.sql("select name from `tabPurchase Order` where status = 'Stopped' and name = %s", d.purchase_order)
 				if stopped:
-					msgprint("One cannot do any transaction against 'Purchase Order' : %s, it's status is 'Stopped'" % (d.purhcase_order))
+					throw(_("Purchase Order {0} is 'Stopped'").format(d.purchase_order))
 					raise Exception
 
 	def validate_with_previous_doc(self):
@@ -176,7 +168,7 @@
 		if self.is_opening != 'Yes':
 			self.aging_date = self.posting_date
 		elif not self.aging_date:
-			msgprint("Aging Date is mandatory for opening entry")
+			msgprint(_("Ageing date is mandatory for opening entry"))
 			raise Exception
 
 	def set_against_expense_account(self):
@@ -199,8 +191,7 @@
 					against_accounts.append(stock_not_billed_account)
 
 			elif not item.expense_account:
-				msgprint(_("Expense account is mandatory for item") + ": " +
-					(item.item_code or item.item_name), raise_exception=1)
+				throw(_("Expense account is mandatory for item {0}").format(item.item_code or item.item_name))
 
 			elif item.expense_account not in against_accounts:
 				# if no auto_accounting_for_stock or not a stock item
@@ -212,19 +203,18 @@
 		if frappe.db.get_value("Buying Settings", None, "po_required") == 'Yes':
 			 for d in self.get('entries'):
 				 if not d.purchase_order:
-					 msgprint("Purchse Order No. required against item %s"%d.item_code)
-					 raise Exception
+					 throw(_("Purchse Order number required for Item {0}").format(d.item_code))
 
 	def pr_required(self):
 		if frappe.db.get_value("Buying Settings", None, "pr_required") == 'Yes':
 			 for d in self.get('entries'):
 				 if not d.purchase_receipt:
-					 msgprint("Purchase Receipt No. required against item %s"%d.item_code)
+					 throw(_("Purchase Receipt number required for Item {0}").format(d.item_code))
 					 raise Exception
 
 	def validate_write_off_account(self):
 		if self.write_off_amount and not self.write_off_account:
-			msgprint("Please enter Write Off Account", raise_exception=1)
+			throw(_("Please enter Write Off Account"))
 
 	def check_prev_docstatus(self):
 		for d in self.get('entries'):
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 3b09090..5d42459 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -6,9 +6,9 @@
 import frappe.defaults
 
 from frappe.utils import add_days, cint, cstr, date_diff, flt, getdate, nowdate, \
-	get_first_day, get_last_day, comma_and
+	get_first_day, get_last_day
 from frappe.model.naming import make_autoname
-from frappe import _, msgprint
+from frappe import _, msgprint, throw
 
 from erpnext.accounts.party import get_party_account, get_due_date
 from erpnext.controllers.stock_controller import update_gl_entries_after
@@ -165,8 +165,7 @@
 			if d.time_log_batch:
 				status = frappe.db.get_value("Time Log Batch", d.time_log_batch, "status")
 				if status!="Submitted":
-					frappe.msgprint(_("Time Log Batch status must be 'Submitted'") + ":" + d.time_log_batch,
-						raise_exception=True)
+					frappe.throw(_("Time Log Batch {0} must be 'Submitted'").format(d.time_log_batch))
 
 	def set_pos_fields(self, for_validate=False):
 		"""Set retail related fields from pos settings"""
@@ -263,10 +262,8 @@
 				where name = %s and (ifnull(end_of_life,'')='' or end_of_life > now())""", d.item_code)
 			acc =	frappe.db.sql("""select account_type from `tabAccount`
 				where name = %s and docstatus != 2""", d.income_account)
-			if not acc:
-				msgprint("Account: "+d.income_account+" does not exist in the system", raise_exception=True)
-			elif item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset':
-				msgprint("Please select income head with account type 'Fixed Asset' as Item %s is an asset item" % d.item_code, raise_exception=True)
+			if item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset':
+				msgprint(_("Account {0} must be of type 'Fixed Asset' as Item {1} is an Asset Item").format(d.item_code), raise_exception=True)
 
 	def validate_with_previous_doc(self):
 		super(SalesInvoice, self).validate_with_previous_doc(self.tname, {
@@ -302,7 +299,7 @@
 		if self.is_opening != 'Yes':
 			self.aging_date = self.posting_date
 		elif not self.aging_date:
-			msgprint("Aging Date is mandatory for opening entry")
+			msgprint(_("Ageing Date is mandatory for opening entry"))
 			raise Exception
 
 
@@ -327,7 +324,7 @@
 				for d in self.get('entries'):
 					if frappe.db.get_value('Item', d.item_code, 'is_stock_item') == 'Yes' \
 						and not d.get(i.lower().replace(' ','_')):
-						msgprint("%s is mandatory for stock item which is not mentioed against item: %s"%(i,d.item_code), raise_exception=1)
+						msgprint(_("{0} is mandatory for Item {1}").format(i,d.item_code), raise_exception=1)
 
 
 	def validate_proj_cust(self):
@@ -337,34 +334,32 @@
 				where name = %s and (customer = %s or
 					ifnull(customer,'')='')""", (self.project_name, self.customer))
 			if not res:
-				msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in that project."%(self.customer,self.project_name))
+				msgprint(_("Customer {0} does not belong to project {1}").format(self.customer,self.project_name))
 				raise Exception
 
 	def validate_pos(self):
 		if not self.cash_bank_account and flt(self.paid_amount):
-			msgprint("Cash/Bank Account is mandatory for POS, for making payment entry")
+			msgprint(_("Cash or Bank Account is mandatory for making payment entry"))
 			raise Exception
 		if flt(self.paid_amount) + flt(self.write_off_amount) \
 				- flt(self.grand_total) > 1/(10**(self.precision("grand_total") + 1)):
-			frappe.throw(_("""(Paid amount + Write Off Amount) can not be \
-				greater than Grand Total"""))
+			frappe.throw(_("""Paid amount + Write Off Amount can not be greater than Grand Total"""))
 
 
 	def validate_item_code(self):
 		for d in self.get('entries'):
 			if not d.item_code:
-				msgprint("Please enter Item Code at line no : %s to update stock or remove check from Update Stock in Basic Info Tab." % (d.idx),
-				raise_exception=True)
+				msgprint(_("Item Code required at Row No {0}").format(d.idx), raise_exception=True)
 
 	def validate_delivery_note(self):
 		for d in self.get("entries"):
 			if d.delivery_note:
-				msgprint("""Stock update can not be made against Delivery Note""", raise_exception=1)
+				msgprint(_("Stock cannot be updated against Delivery Note {0}").format(d.delivery_note), raise_exception=1)
 
 
 	def validate_write_off_account(self):
 		if flt(self.write_off_amount) and not self.write_off_account:
-			msgprint("Please enter Write Off Account", raise_exception=1)
+			msgprint(_("Please enter Write Off Account"), raise_exception=1)
 
 
 	def validate_c_form(self):
@@ -396,9 +391,9 @@
 			ps = frappe.db.sql("""select name, warehouse from `tabPOS Setting`
 				where ifnull(user,'') = '' and company = %s""", self.company)
 			if not ps:
-				msgprint("To make POS entry, please create POS Setting from Accounts --> POS Setting page and refresh the system.", raise_exception=True)
+				msgprint(_("POS Setting required to make POS Entry"), raise_exception=True)
 			elif not ps[0][1]:
-				msgprint("Please enter warehouse in POS Setting")
+				msgprint(_("Warehouse required in POS Setting"))
 			else:
 				w = ps[0][1]
 		return w
@@ -426,7 +421,7 @@
 				else:
 					# show message that the amount is not paid
 					frappe.db.set(self,'paid_amount',0)
-					frappe.msgprint("Note: Payment Entry will not be created since 'Cash/Bank Account' was not specified.")
+					frappe.msgprint(_("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified"))
 		else:
 			frappe.db.set(self,'paid_amount',0)
 
@@ -436,15 +431,15 @@
 				submitted = frappe.db.sql("""select name from `tabSales Order`
 					where docstatus = 1 and name = %s""", d.sales_order)
 				if not submitted:
-					msgprint("Sales Order : "+ cstr(d.sales_order) +" is not submitted")
-					raise Exception , "Validation Error."
+					msgprint(_("Sales Order {0} is not submitted").format(d.sales_order))
+					raise Exception
 
 			if d.delivery_note:
 				submitted = frappe.db.sql("""select name from `tabDelivery Note`
 					where docstatus = 1 and name = %s""", d.delivery_note)
 				if not submitted:
-					msgprint("Delivery Note : "+ cstr(d.delivery_note) +" is not submitted")
-					raise Exception , "Validation Error."
+					msgprint(_("Delivery Note {0} is not submitted").format(d.delivery_note))
+					raise Exception
 
 	def update_stock_ledger(self):
 		sl_entries = []
@@ -594,15 +589,12 @@
 			self.validate_notification_email_id()
 
 			if not self.recurring_type:
-				msgprint(_("Please select: ") + self.meta.get_label("recurring_type"),
+				msgprint(_("Please select {0}").format(self.meta.get_label("recurring_type")),
 				raise_exception=1)
 
 			elif not (self.invoice_period_from_date and \
 					self.invoice_period_to_date):
-				msgprint(comma_and([self.meta.get_label("invoice_period_from_date"),
-					self.meta.get_label("invoice_period_to_date")])
-					+ _(": Mandatory for a Recurring Invoice."),
-					raise_exception=True)
+				throw(_("Invoice Period From and Invoice Period To dates mandatory for recurring invoice"))
 
 	def convert_to_recurring(self):
 		if self.convert_into_recurring_invoice:
@@ -625,20 +617,15 @@
 			from frappe.utils import validate_email_add
 			for email in email_list:
 				if not validate_email_add(email):
-					msgprint(self.meta.get_label("notification_email_address") \
-						+ " - " + _("Invalid Email Address") + ": \"%s\"" % email,
-						raise_exception=1)
+					throw(_("{0} is an invalid email address in 'Notification Email Address'").format(email))
 
 		else:
-			msgprint("Notification Email Addresses not specified for recurring invoice",
-				raise_exception=1)
+			throw(_("'Notification Email Addresses' not specified for recurring invoice"))
 
 	def set_next_date(self):
 		""" Set next date on which auto invoice will be created"""
 		if not self.repeat_on_day_of_month:
-			msgprint("""Please enter 'Repeat on Day of Month' field value.
-				The day of the month on which auto invoice
-				will be generated e.g. 05, 28 etc.""", raise_exception=1)
+			msgprint(_("Please enter 'Repeat on Day of Month' field value"), raise_exception=1)
 
 		next_date = get_next_date(self.posting_date,
 			month_map[self.recurring_type], cint(self.repeat_on_day_of_month))
@@ -765,7 +752,7 @@
 def get_bank_cash_account(mode_of_payment):
 	val = frappe.db.get_value("Mode of Payment", mode_of_payment, "default_account")
 	if not val:
-		frappe.msgprint("Default Bank / Cash Account not set in Mode of Payment: %s. Please add a Default Account in Mode of Payment master." % mode_of_payment)
+		frappe.msgprint(_("Please set default Cash or Bank account in Mode of Payment {0}").format(mode_of_payment))
 	return {
 		"cash_bank_account": val
 	}
diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
index 3cef992..55b7ed6 100644
--- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
+++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
@@ -5,7 +5,7 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe import _, msgprint
+from frappe import _, msgprint, throw
 from frappe.utils import flt, fmt_money
 from frappe.model.controller import DocListController
 from erpnext.setup.utils import get_company_currency
@@ -15,36 +15,34 @@
 class ManyBlankToValuesError(frappe.ValidationError): pass
 
 class ShippingRule(DocListController):
-		
+
 	def validate(self):
 		self.validate_value("calculate_based_on", "in", ["Net Total", "Net Weight"])
 		self.shipping_rule_conditions = self.get("shipping_rule_conditions")
 		self.validate_from_to_values()
 		self.sort_shipping_rule_conditions()
 		self.validate_overlapping_shipping_rule_conditions()
-		
+
 	def validate_from_to_values(self):
 		zero_to_values = []
-		
+
 		for d in self.get("shipping_rule_conditions"):
 			self.round_floats_in(d)
-			
+
 			# values cannot be negative
 			self.validate_value("from_value", ">=", 0.0, d)
 			self.validate_value("to_value", ">=", 0.0, d)
-			
+
 			if not d.to_value:
 				zero_to_values.append(d)
 			elif d.from_value >= d.to_value:
-				msgprint(_("Error") + ": " + _("Row") + " # %d: " % d.idx + 
-					_("From Value should be less than To Value"),
-					raise_exception=FromGreaterThanToError)
-		
+				throw(_("From value must be less than to value in row {0}").format(d.idx), FromGreaterThanToError)
+
 		# check if more than two or more rows has To Value = 0
 		if len(zero_to_values) >= 2:
-			msgprint(_('''There can only be one Shipping Rule Condition with 0 or blank value for "To Value"'''),
-				raise_exception=ManyBlankToValuesError)
-				
+			throw(_('There can only be one Shipping Rule Condition with 0 or blank value for "To Value"'),
+				ManyBlankToValuesError)
+
 	def sort_shipping_rule_conditions(self):
 		"""Sort Shipping Rule Conditions based on increasing From Value"""
 		self.shipping_rules_conditions = sorted(self.shipping_rule_conditions, key=lambda d: flt(d.from_value))
@@ -61,7 +59,7 @@
 			"""
 			separate = (x1 <= x2 <= y1 <= y2) or (y1 <= y2 <= x1 <= x2)
 			return (not separate)
-		
+
 		overlaps = []
 		for i in xrange(0, len(self.shipping_rule_conditions)):
 			for j in xrange(i+1, len(self.shipping_rule_conditions)):
@@ -72,13 +70,13 @@
 					range_b = (d2.from_value, d2.to_value or d2.from_value)
 					if overlap_exists_between(range_a, range_b):
 						overlaps.append([d1, d2])
-		
+
 		if overlaps:
 			company_currency = get_company_currency(self.company)
-			msgprint(_("Error") + ": " + _("Overlapping Conditions found between") + ":")
+			msgprint(_("Overlapping conditions found between:"))
 			messages = []
 			for d1, d2 in overlaps:
-				messages.append("%s-%s = %s " % (d1.from_value, d1.to_value, fmt_money(d1.shipping_amount, currency=company_currency)) + 
+				messages.append("%s-%s = %s " % (d1.from_value, d1.to_value, fmt_money(d1.shipping_amount, currency=company_currency)) +
 					_("and") + " %s-%s = %s" % (d2.from_value, d2.to_value, fmt_money(d2.shipping_amount, currency=company_currency)))
-					  	
-			msgprint("\n".join(messages), raise_exception=OverlappingConditionError)
\ No newline at end of file
+
+			msgprint("\n".join(messages), raise_exception=OverlappingConditionError)
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 6cabf1d..ae21099 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -180,4 +180,4 @@
 			"report_type": "Balance Sheet"
 		}).insert(ignore_permissions=True)
 
-		frappe.msgprint(_("Account Created") + ": " + account.name)
+		frappe.msgprint(_("Account Created: {0}").format(account.name))
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index e317e11..a2224d8 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -5,7 +5,7 @@
 
 import frappe
 from frappe.utils import nowdate, cstr, flt, now, getdate, add_months
-from frappe import msgprint, throw, _
+from frappe import throw, _
 from frappe.utils import formatdate
 from erpnext.utilities import build_filter_conditions
 
@@ -29,9 +29,7 @@
 		from `tabFiscal Year` where %s order by year_start_date desc""" % cond)
 
 	if not fy:
-		error_msg = """%s %s not in any Fiscal Year""" % (label, formatdate(date))
-		error_msg = """{msg}: {date}""".format(msg=_("Fiscal Year does not exist for date"),
-			date=formatdate(date))
+		error_msg = _("""{0} {1} not in any Fiscal Year""").format(label, formatdate(date))
 		if verbose: frappe.msgprint(error_msg)
 		raise FiscalYearError, error_msg
 
@@ -40,12 +38,7 @@
 def validate_fiscal_year(date, fiscal_year, label="Date"):
 	years = [f[0] for f in get_fiscal_years(date, label=label)]
 	if fiscal_year not in years:
-		throw(("%(label)s '%(posting_date)s': " + _("not within Fiscal Year") + \
-			": '%(fiscal_year)s'") % {
-				"label": label,
-				"posting_date": formatdate(date),
-				"fiscal_year": fiscal_year
-			})
+		throw(_("{0} '{1}' not in Fiscal Year {2}").format(label, formatdate(date), fiscal_year))
 
 @frappe.whitelist()
 def get_balance_on(account=None, date=None):
@@ -62,7 +55,7 @@
 
 	try:
 		year_start_date = get_fiscal_year(date, verbose=0)[1]
-	except FiscalYearError, e:
+	except FiscalYearError:
 		if getdate(date) > getdate(nowdate()):
 			# if fiscal year not found and the date is greater than today
 			# get fiscal year for today's date and its corresponding year start date
@@ -232,9 +225,7 @@
 			and voucher_no != ifnull(against_voucher, '')""",
 			(now(), frappe.session.user, ref_type, ref_no))
 
-		frappe.msgprint("{msg} {linked_jv}".format(msg = _("""Following linked Journal Vouchers \
-			made against this transaction has been unlinked. You can link them again with other \
-			transactions via Payment Reconciliation Tool."""), linked_jv="\n".join(linked_jv)))
+		frappe.msgprint(_("Following Journal Vouchers Unlinked: {0}".format("\n".join(linked_jv))))
 
 
 @frappe.whitelist()
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index d39f6b6..02170ff 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.utils import cstr, flt
-from frappe import msgprint
+from frappe import msgprint, _
 from erpnext.controllers.buying_controller import BuyingController
 
 class PurchaseOrder(BuyingController):
@@ -128,8 +128,8 @@
 		date_diff = frappe.db.sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.modified)))
 
 		if date_diff and date_diff[0][0]:
-			msgprint(cstr(self.doctype) +" => "+ cstr(self.name) +" has been modified. Please Refresh. ")
-			raise Exception
+			msgprint(_("{0} {1} has been modified. Please refresh").format(self.doctype, self.name),
+				raise_exception=True)
 
 	def update_status(self, status):
 		self.check_modified_date()
@@ -140,7 +140,7 @@
 		self.update_bin(is_submit = (status == 'Submitted') and 1 or 0, is_stopped = 1)
 
 		# step 3:=> Acknowledge user
-		msgprint(self.doctype + ": " + self.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)))
+		msgprint(_("Status of {0} {1} is now {2}").format(self.doctype, self.name, status))
 
 	def on_submit(self):
 		purchase_controller = frappe.get_doc("Purchase Common")
@@ -163,12 +163,12 @@
 		pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Receipt', docname = self.name, detail_doctype = 'Purchase Receipt Item')
 
 		# Check if Purchase Invoice has been submitted against current Purchase Order
-		submitted = frappe.db.sql("""select t1.name
+		submitted = frappe.db.sql_list("""select t1.name
 			from `tabPurchase Invoice` t1,`tabPurchase Invoice Item` t2
 			where t1.name = t2.parent and t2.purchase_order = %s and t1.docstatus = 1""",
 			self.name)
 		if submitted:
-			msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !")
+			msgprint(_("Purchase Invoice {0} is already submitted").format(", ".join(submitted)))
 			raise Exception
 
 		frappe.db.set(self,'status','Cancelled')
diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py
index 7c9236f..6828845 100644
--- a/erpnext/buying/doctype/supplier/supplier.py
+++ b/erpnext/buying/doctype/supplier/supplier.py
@@ -55,7 +55,7 @@
 		#validation for Naming Series mandatory field...
 		if frappe.defaults.get_global_default('supp_master_name') == 'Naming Series':
 			if not self.naming_series:
-				msgprint("Series is Mandatory.", raise_exception=1)
+				msgprint(_("Series is mandatory"), raise_exception=1)
 
 	def get_contacts(self,nm):
 		if nm:
@@ -106,7 +106,7 @@
 @frappe.whitelist()
 def get_dashboard_info(supplier):
 	if not frappe.has_permission("Supplier", "read", supplier):
-		frappe.msgprint("No Permission", raise_exception=True)
+		frappe.throw(_("No permission"))
 
 	out = {}
 	for doctype in ["Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"]:
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 3caed03..137bf50 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -417,8 +417,7 @@
 				ref_amt = flt(frappe.db.get_value(ref_dt + " Item",
 					item.get(item_ref_dn), based_on), self.precision(based_on, item))
 				if not ref_amt:
-					frappe.msgprint(_("As amount for item") + ": " + item.item_code + _(" in ") +
-						ref_dt + _(" is zero, system will not check for over-billed"))
+					frappe.msgprint(_("Warning: System will not check overbilling since amount for Item {0} in {1} is zero").format(item.item_code, ref_dt))
 				else:
 					already_billed = frappe.db.sql("""select sum(%s) from `tab%s`
 						where %s=%s and docstatus=1 and parent != %s""" %
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index 3bde28b..6a6da74 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -14,22 +14,22 @@
 	def onload_post_render(self):
 		# contact, address, item details
 		self.set_missing_values()
-	
+
 	def validate(self):
 		super(BuyingController, self).validate()
 		if getattr(self, "supplier", None) and not self.supplier_name:
-			self.supplier_name = frappe.db.get_value("Supplier", 
+			self.supplier_name = frappe.db.get_value("Supplier",
 				self.supplier, "supplier_name")
 		self.is_item_table_empty()
 		self.validate_stock_or_nonstock_items()
 		self.validate_warehouse()
-		
+
 	def set_missing_values(self, for_validate=False):
 		super(BuyingController, self).set_missing_values(for_validate)
 
 		self.set_supplier_from_item_default()
 		self.set_price_list_currency("Buying")
-		
+
 		# set contact and address details for supplier, if they are not mentioned
 		if getattr(self, "supplier", None):
 			self.update_if_missing(get_party_details(self.supplier, party_type="Supplier"))
@@ -45,24 +45,24 @@
 				if supplier:
 					self.supplier = supplier
 					break
-					
+
 	def validate_warehouse(self):
 		from erpnext.stock.utils import validate_warehouse_company
-		
-		warehouses = list(set([d.warehouse for d in 
+
+		warehouses = list(set([d.warehouse for d in
 			self.get(self.fname) if getattr(d, "warehouse", None)]))
-				
+
 		for w in warehouses:
 			validate_warehouse_company(w, self.company)
 
 	def validate_stock_or_nonstock_items(self):
 		if not self.get_stock_items():
-			tax_for_valuation = [d.account_head for d in 
-				self.get("other_charges") 
+			tax_for_valuation = [d.account_head for d in
+				self.get("other_charges")
 				if d.category in ["Valuation", "Valuation and Total"]]
 			if tax_for_valuation:
-				frappe.msgprint(_("""Tax Category can not be 'Valuation' or 'Valuation and Total' as all items are non-stock items"""), raise_exception=1)
-			
+				frappe.throw(_("Tax Category can not be 'Valuation' or 'Valuation and Total' as all items are non-stock items"))
+
 	def set_total_in_words(self):
 		from frappe.utils import money_in_words
 		company_currency = get_company_currency(self.company)
@@ -71,12 +71,12 @@
 		if self.meta.get_field("in_words_import"):
 			self.in_words_import = money_in_words(self.grand_total_import,
 		 		self.currency)
-		
+
 	def calculate_taxes_and_totals(self):
 		self.other_fname = "other_charges"
 		super(BuyingController, self).calculate_taxes_and_totals()
 		self.calculate_total_advance("Purchase Invoice", "advance_allocation_details")
-		
+
 	def calculate_item_values(self):
 		for item in self.item_doclist:
 			self.round_floats_in(item)
@@ -86,7 +86,7 @@
 			elif not item.rate:
 				item.rate = flt(item.price_list_rate * (1.0 - (item.discount_percentage / 100.0)),
 					self.precision("rate", item))
-						
+
 			item.amount = flt(item.rate * item.qty,
 				self.precision("amount", item))
 			item.item_tax_amount = 0.0;
@@ -94,19 +94,19 @@
 			self._set_in_company_currency(item, "amount", "base_amount")
 			self._set_in_company_currency(item, "price_list_rate", "base_price_list_rate")
 			self._set_in_company_currency(item, "rate", "base_rate")
-			
-			
+
+
 	def calculate_net_total(self):
 		self.net_total = self.net_total_import = 0.0
 
 		for item in self.item_doclist:
 			self.net_total += item.base_amount
 			self.net_total_import += item.amount
-			
+
 		self.round_floats_in(self, ["net_total", "net_total_import"])
-		
+
 	def calculate_totals(self):
-		self.grand_total = flt(self.tax_doclist[-1].total if self.tax_doclist 
+		self.grand_total = flt(self.tax_doclist[-1].total if self.tax_doclist
 			else self.net_total, self.precision("grand_total"))
 		self.grand_total_import = flt(self.grand_total / self.conversion_rate,
 			self.precision("grand_total_import"))
@@ -116,28 +116,28 @@
 
 		if self.meta.get_field("rounded_total"):
 			self.rounded_total = _round(self.grand_total)
-		
+
 		if self.meta.get_field("rounded_total_import"):
 			self.rounded_total_import = _round(self.grand_total_import)
-				
+
 		if self.meta.get_field("other_charges_added"):
-			self.other_charges_added = flt(sum([flt(d.tax_amount) for d in self.tax_doclist 
-				if d.add_deduct_tax=="Add" and d.category in ["Valuation and Total", "Total"]]), 
+			self.other_charges_added = flt(sum([flt(d.tax_amount) for d in self.tax_doclist
+				if d.add_deduct_tax=="Add" and d.category in ["Valuation and Total", "Total"]]),
 				self.precision("other_charges_added"))
-				
+
 		if self.meta.get_field("other_charges_deducted"):
-			self.other_charges_deducted = flt(sum([flt(d.tax_amount) for d in self.tax_doclist 
-				if d.add_deduct_tax=="Deduct" and d.category in ["Valuation and Total", "Total"]]), 
+			self.other_charges_deducted = flt(sum([flt(d.tax_amount) for d in self.tax_doclist
+				if d.add_deduct_tax=="Deduct" and d.category in ["Valuation and Total", "Total"]]),
 				self.precision("other_charges_deducted"))
-				
+
 		if self.meta.get_field("other_charges_added_import"):
-			self.other_charges_added_import = flt(self.other_charges_added / 
+			self.other_charges_added_import = flt(self.other_charges_added /
 				self.conversion_rate, self.precision("other_charges_added_import"))
-				
+
 		if self.meta.get_field("other_charges_deducted_import"):
-			self.other_charges_deducted_import = flt(self.other_charges_deducted / 
+			self.other_charges_deducted_import = flt(self.other_charges_deducted /
 				self.conversion_rate, self.precision("other_charges_deducted_import"))
-			
+
 	def calculate_outstanding_amount(self):
 		if self.doctype == "Purchase Invoice" and self.docstatus == 0:
 			self.total_advance = flt(self.total_advance,
@@ -146,17 +146,17 @@
 				self.precision("write_off_amount")), self.precision("total_amount_to_pay"))
 			self.outstanding_amount = flt(self.total_amount_to_pay - self.total_advance,
 				self.precision("outstanding_amount"))
-			
+
 	# update valuation rate
 	def update_valuation_rate(self, parentfield):
 		"""
 			item_tax_amount is the total tax amount applied on that item
-			stored for valuation 
-			
+			stored for valuation
+
 			TODO: rename item_tax_amount to valuation_tax_amount
 		"""
 		stock_items = self.get_stock_items()
-		
+
 		stock_items_qty, stock_items_amount = 0, 0
 		last_stock_item_idx = 1
 		for d in self.get(parentfield):
@@ -164,47 +164,45 @@
 				stock_items_qty += flt(d.qty)
 				stock_items_amount += flt(d.base_amount)
 				last_stock_item_idx = d.idx
-			
-		total_valuation_amount = sum([flt(d.tax_amount) for d in 
-			self.get("other_charges") 
+
+		total_valuation_amount = sum([flt(d.tax_amount) for d in
+			self.get("other_charges")
 			if d.category in ["Valuation", "Valuation and Total"]])
-			
-		
+
+
 		valuation_amount_adjustment = total_valuation_amount
 		for i, item in enumerate(self.get(parentfield)):
 			if item.item_code and item.qty and item.item_code in stock_items:
 				item_proportion = flt(item.base_amount) / stock_items_amount if stock_items_amount \
 					else flt(item.qty) / stock_items_qty
-				
+
 				if i == (last_stock_item_idx - 1):
-					item.item_tax_amount = flt(valuation_amount_adjustment, 
+					item.item_tax_amount = flt(valuation_amount_adjustment,
 						self.precision("item_tax_amount", item))
 				else:
-					item.item_tax_amount = flt(item_proportion * total_valuation_amount, 
+					item.item_tax_amount = flt(item_proportion * total_valuation_amount,
 						self.precision("item_tax_amount", item))
 					valuation_amount_adjustment -= item.item_tax_amount
 
 				self.round_floats_in(item)
-				
+
 				item.conversion_factor = item.conversion_factor or flt(frappe.db.get_value(
-					"UOM Conversion Detail", {"parent": item.item_code, "uom": item.uom}, 
+					"UOM Conversion Detail", {"parent": item.item_code, "uom": item.uom},
 					"conversion_factor")) or 1
 				qty_in_stock_uom = flt(item.qty * item.conversion_factor)
 				item.valuation_rate = ((item.base_amount + item.item_tax_amount + item.rm_supp_cost)
 					/ qty_in_stock_uom)
 			else:
 				item.valuation_rate = 0.0
-				
+
 	def validate_for_subcontracting(self):
 		if not self.is_subcontracted and self.sub_contracted_items:
-			frappe.msgprint(_("""Please enter whether %s is made for subcontracting or purchasing,
-			 	in 'Is Subcontracted' field""" % self.doctype), raise_exception=1)
-			
+			frappe.throw(_("Please enter 'Is Subcontracted' as Yes or No"))
+
 		if self.doctype == "Purchase Receipt" and self.is_subcontracted=="Yes" \
 			and not self.supplier_warehouse:
-				frappe.msgprint(_("Supplier Warehouse mandatory subcontracted purchase receipt"), 
-					raise_exception=1)
-										
+				frappe.throw(_("Supplier Warehouse mandatory for sub-contracted Purchase Receipt"))
+
 	def update_raw_materials_supplied(self, raw_material_table):
 		self.set(raw_material_table, [])
 		if self.is_subcontracted=="Yes":
@@ -234,30 +232,30 @@
 					"consumed_qty": required_qty,
 					"description": item.description,
 				})
-				
+
 			self.append(raw_material_table, rm_doclist)
-			
+
 			raw_materials_cost += required_qty * flt(item.rate)
-			
+
 		if self.doctype == "Purchase Receipt":
 			d.rm_supp_cost = raw_materials_cost
 
 	def get_items_from_default_bom(self, item_code):
-		bom_items = frappe.db.sql("""select t2.item_code, t2.qty_consumed_per_unit, 
-			t2.rate, t2.stock_uom, t2.name, t2.description 
-			from `tabBOM` t1, `tabBOM Item` t2 
-			where t2.parent = t1.name and t1.item = %s and t1.is_default = 1 
+		bom_items = frappe.db.sql("""select t2.item_code, t2.qty_consumed_per_unit,
+			t2.rate, t2.stock_uom, t2.name, t2.description
+			from `tabBOM` t1, `tabBOM Item` t2
+			where t2.parent = t1.name and t1.item = %s and t1.is_default = 1
 			and t1.docstatus = 1 and t1.is_active = 1""", item_code, as_dict=1)
 		if not bom_items:
-			msgprint(_("No default BOM exists for item: ") + item_code, raise_exception=1)
-		
+			msgprint(_("No default BOM exists for Item {0}").format(item_code), raise_exception=1)
+
 		return bom_items
 
 	@property
 	def sub_contracted_items(self):
 		if not hasattr(self, "_sub_contracted_items"):
 			self._sub_contracted_items = []
-			item_codes = list(set(item.item_code for item in 
+			item_codes = list(set(item.item_code for item in
 				self.get(self.fname)))
 			if item_codes:
 				self._sub_contracted_items = [r[0] for r in frappe.db.sql("""select name
@@ -265,12 +263,12 @@
 					(", ".join((["%s"]*len(item_codes))),), item_codes)]
 
 		return self._sub_contracted_items
-		
+
 	@property
 	def purchase_items(self):
 		if not hasattr(self, "_purchase_items"):
 			self._purchase_items = []
-			item_codes = list(set(item.item_code for item in 
+			item_codes = list(set(item.item_code for item in
 				self.get(self.fname)))
 			if item_codes:
 				self._purchase_items = [r[0] for r in frappe.db.sql("""select name
@@ -282,4 +280,4 @@
 
 	def is_item_table_empty(self):
 		if not len(self.get(self.fname)):
-			frappe.throw(_("Item table can not be blank"))
\ No newline at end of file
+			frappe.throw(_("Item table can not be blank"))
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index 3f78fe6..b13fea2 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -3,9 +3,9 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe.utils import cint, flt, comma_or, _round, cstr
+from frappe.utils import cint, flt, _round, cstr
 from erpnext.setup.utils import get_company_currency
-from frappe import msgprint, _
+from frappe import _, throw
 
 from erpnext.controllers.stock_controller import StockController
 
@@ -233,8 +233,7 @@
 		if self.meta.get_field("commission_rate"):
 			self.round_floats_in(self, ["net_total", "commission_rate"])
 			if self.commission_rate > 100.0:
-				msgprint(_(self.meta.get_label("commission_rate")) + " " +
-					_("cannot be greater than 100"), raise_exception=True)
+				throw(_("Commission rate cannot be greater than 100"))
 
 			self.total_commission = flt(self.net_total * self.commission_rate / 100.0,
 				self.precision("total_commission"))
@@ -252,17 +251,14 @@
 			total += sales_person.allocated_percentage
 
 		if sales_team and total != 100.0:
-			msgprint(_("Total") + " " +
-				_(self.meta.get_label("allocated_percentage", parentfield="sales_team")) +
-				" " + _("should be 100%"), raise_exception=True)
+			throw(_("Total allocated percentage for sales team should be 100"))
 
 	def validate_order_type(self):
 		valid_types = ["Sales", "Maintenance", "Shopping Cart"]
 		if not self.order_type:
 			self.order_type = "Sales"
 		elif self.order_type not in valid_types:
-			msgprint(_(self.meta.get_label("order_type")) + " " +
-				_("must be one of") + ": " + comma_or(valid_types), raise_exception=True)
+			throw(_("Order Type must be one of {1}").comma_or(valid_types))
 
 	def check_credit(self, grand_total):
 		customer_account = frappe.db.get_value("Account", {"company": self.company,
diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py
index 0fceebf..4ccdbda 100644
--- a/erpnext/controllers/status_updater.py
+++ b/erpnext/controllers/status_updater.py
@@ -3,8 +3,8 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe.utils import flt, cstr
-from frappe import msgprint
+from frappe.utils import flt
+from frappe import msgprint, _, throw
 
 from frappe.model.controller import DocListController
 
@@ -129,19 +129,13 @@
 						item['target_ref_field'] = args['target_ref_field'].replace('_', ' ')
 
 						if not item[args['target_ref_field']]:
-							msgprint("""As %(target_ref_field)s for item: %(item_code)s in \
-							%(parenttype)s: %(parent)s is zero, system will not check \
-							over-delivery or over-billed""" % item)
+							msgprint(_("Note: System will not check over-delivery and over-booking for Item {0} as quantity or amount is 0").format(item.item_code))
 						elif args.get('no_tolerance'):
 							item['reduce_by'] = item[args['target_field']] - \
 								item[args['target_ref_field']]
 							if item['reduce_by'] > .01:
-								msgprint("""
-									Row #%(idx)s: Max %(target_ref_field)s allowed for <b>Item \
-									%(item_code)s</b> against <b>%(parenttype)s %(parent)s</b> \
-									is <b>""" % item + cstr(item[args['target_ref_field']]) +
-									 """</b>.<br>You must reduce the %(target_ref_field)s by \
-									%(reduce_by)s""" % item, raise_exception=1)
+								msgprint(_("Allowance for over-delivery / over-billing crossed for Item {0}").format(item.item_code))
+								throw(_("{0} must be less than or equal to {1}").format(_(item.target_ref_field), item[args["target_ref_field"]]))
 
 						else:
 							self.check_overflow_with_tolerance(item, args)
@@ -161,18 +155,8 @@
 			item['max_allowed'] = flt(item[args['target_ref_field']] * (100+tolerance)/100)
 			item['reduce_by'] = item[args['target_field']] - item['max_allowed']
 
-			msgprint("""
-				Row #%(idx)s: Max %(target_ref_field)s allowed for <b>Item %(item_code)s</b> \
-				against <b>%(parenttype)s %(parent)s</b> is <b>%(max_allowed)s</b>.
-
-				If you want to increase your overflow tolerance, please increase tolerance %% in \
-				Global Defaults or Item master.
-
-				Or, you must reduce the %(target_ref_field)s by %(reduce_by)s
-
-				Also, please check if the order item has already been billed in the Sales Order""" %
-				item, raise_exception=1)
-
+			msgprint(_("Allowance for over-delivery / over-billing crossed for Item {0}").format(item["item_code"]))
+			throw(_("{0} must be less than or equal to {1}").format(_(item["target_ref_field"]), item[args["max_allowed"]]))
 
 	def update_qty(self, change_modified=True):
 		"""
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index 6aeb940..b783924 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -65,7 +65,7 @@
 						warehouse_with_no_account.append(sle.warehouse)
 
 		if warehouse_with_no_account:
-			msgprint(_("No accounting entries for following warehouses") + ": \n" +
+			msgprint(_("No accounting entries for the following warehouses") + ": \n" +
 				"\n".join(warehouse_with_no_account))
 
 		return process_gl_map(gl_list)
@@ -231,12 +231,10 @@
 
 	def check_expense_account(self, item):
 		if item.meta.get_field("expense_account") and not item.expense_account:
-			msgprint(_("""Expense/Difference account is mandatory for item: """) + item.item_code,
-				raise_exception=1)
+			frappe.throw(_("Expense or Difference account is mandatory for Item {0}").format(item.item_code))
 
 		if item.meta.get_field("expense_account") and not item.cost_center:
-			msgprint(_("""Cost Center is mandatory for item: """) + item.item_code,
-				raise_exception=1)
+			frappe.throw(_("""Cost Center is mandatory for item {0}""").format(item.item_code))
 
 	def get_sl_entries(self, d, args):
 		sl_dict = {
diff --git a/erpnext/controllers/trends.py b/erpnext/controllers/trends.py
index fa2e2ae..2c3483c 100644
--- a/erpnext/controllers/trends.py
+++ b/erpnext/controllers/trends.py
@@ -3,12 +3,12 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe.utils import add_days, add_months, cstr, getdate
+from frappe.utils import getdate
 from frappe import _
 
 def get_columns(filters, trans):
 	validate_filters(filters)
-	
+
 	# get conditions for based_on filter cond
 	based_on_details = based_wise_colums_query(filters.get("based_on"), trans)
 	# get conditions for periodic filter cond
@@ -17,11 +17,11 @@
 	group_by_cols = group_wise_column(filters.get("group_by"))
 
 	columns = based_on_details["based_on_cols"] + period_cols + ["Total(Qty):Float:120", "Total(Amt):Currency:120"]
-	if group_by_cols:	
+	if group_by_cols:
 		columns = based_on_details["based_on_cols"] + group_by_cols + period_cols + \
-			["Total(Qty):Float:120", "Total(Amt):Currency:120"] 
+			["Total(Qty):Float:120", "Total(Amt):Currency:120"]
 
-	conditions = {"based_on_select": based_on_details["based_on_select"], "period_wise_select": period_select, 
+	conditions = {"based_on_select": based_on_details["based_on_select"], "period_wise_select": period_select,
 		"columns": columns, "group_by": based_on_details["based_on_group_by"], "grbc": group_by_cols, "trans": trans,
 		"addl_tables": based_on_details["addl_tables"]}
 
@@ -30,16 +30,16 @@
 def validate_filters(filters):
 	for f in ["Fiscal Year", "Based On", "Period", "Company"]:
 		if not filters.get(f.lower().replace(" ", "_")):
-			frappe.msgprint(f + _(" is mandatory"), raise_exception=1)
-	
+			frappe.throw(_("{0} is mandatory").format(f))
+
 	if filters.get("based_on") == filters.get("group_by"):
-		frappe.msgprint("'Based On' and 'Group By' can not be same", raise_exception=1)
+		frappe.throw(_("'Based On' and 'Group By' can not be same"))
 
 def get_data(filters, conditions):
 	data = []
 	inc, cond= '',''
 	query_details =  conditions["based_on_select"] + conditions["period_wise_select"]
-	
+
 	if conditions["based_on_select"] in ["t1.project_name,", "t2.project_name,"]:
 		cond = 'and '+ conditions["based_on_select"][:-1] +' IS Not NULL'
 
@@ -59,55 +59,55 @@
 		else :
 			inc = 1
 		data1 = frappe.db.sql(""" select %s from `tab%s` t1, `tab%s Item` t2 %s
-					where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s and 
-					t1.docstatus = 1 %s 
-					group by %s 
-				""" % (query_details,  conditions["trans"],  conditions["trans"], conditions["addl_tables"], "%s", 
-					"%s", cond, conditions["group_by"]), (filters.get("company"), 
+					where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s and
+					t1.docstatus = 1 %s
+					group by %s
+				""" % (query_details,  conditions["trans"],  conditions["trans"], conditions["addl_tables"], "%s",
+					"%s", cond, conditions["group_by"]), (filters.get("company"),
 					filters["fiscal_year"]),as_list=1)
 
 		for d in range(len(data1)):
 			#to add blanck column
 			dt = data1[d]
-			dt.insert(ind,'')  
+			dt.insert(ind,'')
 			data.append(dt)
 
 			#to get distinct value of col specified by group_by in filter
 			row = frappe.db.sql("""select DISTINCT(%s) from `tab%s` t1, `tab%s Item` t2 %s
-						where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s 
-						and t1.docstatus = 1 and %s = %s 
-					""" % 
-					(sel_col,  conditions["trans"],  conditions["trans"], conditions["addl_tables"], 
+						where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s
+						and t1.docstatus = 1 and %s = %s
+					""" %
+					(sel_col,  conditions["trans"],  conditions["trans"], conditions["addl_tables"],
 						"%s", "%s", conditions["group_by"], "%s"),
 					(filters.get("company"), filters.get("fiscal_year"), data1[d][0]), as_list=1)
 
 			for i in range(len(row)):
 				des = ['' for q in range(len(conditions["columns"]))]
-				
-				#get data for group_by filter 
+
+				#get data for group_by filter
 				row1 = frappe.db.sql(""" select %s , %s from `tab%s` t1, `tab%s Item` t2 %s
-							where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s 
-							and t1.docstatus = 1 and %s = %s and %s = %s 
-						""" % 
-						(sel_col, conditions["period_wise_select"], conditions["trans"], 
-						 	conditions["trans"], conditions["addl_tables"], "%s", "%s", sel_col, 
-							"%s", conditions["group_by"], "%s"), 
-						(filters.get("company"), filters.get("fiscal_year"), row[i][0], 
+							where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s
+							and t1.docstatus = 1 and %s = %s and %s = %s
+						""" %
+						(sel_col, conditions["period_wise_select"], conditions["trans"],
+						 	conditions["trans"], conditions["addl_tables"], "%s", "%s", sel_col,
+							"%s", conditions["group_by"], "%s"),
+						(filters.get("company"), filters.get("fiscal_year"), row[i][0],
 							data1[d][0]), as_list=1)
 
 				des[ind] = row[i]
-				for j in range(1,len(conditions["columns"])-inc):	
+				for j in range(1,len(conditions["columns"])-inc):
 					des[j+inc] = row1[0][j]
-					
+
 				data.append(des)
 	else:
 		data = frappe.db.sql(""" select %s from `tab%s` t1, `tab%s Item` t2 %s
-					where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s and 
-					t1.docstatus = 1 %s 
-					group by %s	
-				""" % 
-				(query_details, conditions["trans"], conditions["trans"], conditions["addl_tables"], 
-					"%s", "%s", cond,conditions["group_by"]), 
+					where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s and
+					t1.docstatus = 1 %s
+					group by %s
+				""" %
+				(query_details, conditions["trans"], conditions["trans"], conditions["addl_tables"],
+					"%s", "%s", cond,conditions["group_by"]),
 				(filters.get("company"), filters.get("fiscal_year")), as_list=1)
 
 	return data
@@ -124,13 +124,13 @@
 		trans_date = 'posting_date'
 	else:
 		trans_date = 'transaction_date'
-	
+
 	if filters.get("period") != 'Yearly':
 		for dt in bet_dates:
 			get_period_wise_columns(dt, filters.get("period"), pwc)
 			query_details = get_period_wise_query(dt, trans_date, query_details)
 	else:
-		pwc = [filters.get("fiscal_year") + " (Qty):Float:120", 
+		pwc = [filters.get("fiscal_year") + " (Qty):Float:120",
 			filters.get("fiscal_year") + " (Amt):Currency:120"]
 		query_details = " SUM(t2.qty), SUM(t1.grand_total),"
 
@@ -139,14 +139,14 @@
 
 def get_period_wise_columns(bet_dates, period, pwc):
 	if period == 'Monthly':
-		pwc += [get_mon(bet_dates[0]) + " (Qty):Float:120", 
+		pwc += [get_mon(bet_dates[0]) + " (Qty):Float:120",
 			get_mon(bet_dates[0]) + " (Amt):Currency:120"]
 	else:
-		pwc += [get_mon(bet_dates[0]) + "-" + get_mon(bet_dates[1]) + " (Qty):Float:120", 
+		pwc += [get_mon(bet_dates[0]) + "-" + get_mon(bet_dates[1]) + " (Qty):Float:120",
 			get_mon(bet_dates[0]) + "-" + get_mon(bet_dates[1]) + " (Amt):Currency:120"]
 
 def get_period_wise_query(bet_dates, trans_date, query_details):
-	query_details += """SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.qty, NULL)), 
+	query_details += """SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.qty, NULL)),
 					SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t1.grand_total, NULL)),
 				""" % {"trans_date": trans_date, "sd": bet_dates[0],"ed": bet_dates[1]}
 	return query_details
@@ -156,7 +156,7 @@
 	from dateutil.relativedelta import relativedelta
 
 	if not year_start_date:
-		year_start_date, year_end_date = frappe.db.get_value("Fiscal Year", 
+		year_start_date, year_end_date = frappe.db.get_value("Fiscal Year",
 			fiscal_year, ["year_start_date", "year_end_date"])
 
 	increment = {
@@ -197,13 +197,13 @@
 	# based_on_cols, based_on_select, based_on_group_by, addl_tables
 	if based_on == "Item":
 		based_on_details["based_on_cols"] = ["Item:Link/Item:120", "Item Name:Data:120"]
-		based_on_details["based_on_select"] = "t2.item_code, t2.item_name," 
+		based_on_details["based_on_select"] = "t2.item_code, t2.item_name,"
 		based_on_details["based_on_group_by"] = 't2.item_code'
 		based_on_details["addl_tables"] = ''
 
 	elif based_on == "Item Group":
 		based_on_details["based_on_cols"] = ["Item Group:Link/Item Group:120"]
-		based_on_details["based_on_select"] = "t2.item_group," 
+		based_on_details["based_on_select"] = "t2.item_group,"
 		based_on_details["based_on_group_by"] = 't2.item_group'
 		based_on_details["addl_tables"] = ''
 
@@ -224,7 +224,7 @@
 		based_on_details["based_on_select"] = "t1.supplier, t3.supplier_type,"
 		based_on_details["based_on_group_by"] = 't1.supplier'
 		based_on_details["addl_tables"] = ',`tabSupplier` t3'
-	
+
 	elif based_on == 'Supplier Type':
 		based_on_details["based_on_cols"] = ["Supplier Type:Link/Supplier Type:140"]
 		based_on_details["based_on_select"] = "t3.supplier_type,"
@@ -249,7 +249,7 @@
 			based_on_details["based_on_group_by"] = 't2.project_name'
 			based_on_details["addl_tables"] = ''
 		else:
-			frappe.msgprint("Project-wise data is not available for Quotation", raise_exception=1)
+			frappe.throw(_("Project-wise data is not available for Quotation"))
 
 	return based_on_details
 
@@ -257,4 +257,4 @@
 	if group_by:
 		return [group_by+":Link/"+group_by+":120"]
 	else:
-		return []
\ No newline at end of file
+		return []
diff --git a/erpnext/hr/doctype/appraisal/appraisal.py b/erpnext/hr/doctype/appraisal/appraisal.py
index 1f7f255..090ba20 100644
--- a/erpnext/hr/doctype/appraisal/appraisal.py
+++ b/erpnext/hr/doctype/appraisal/appraisal.py
@@ -22,22 +22,22 @@
 	def get_employee_name(self):
 		self.employee_name = frappe.db.get_value("Employee", self.employee, "employee_name")
 		return self.employee_name
-		
+
 	def validate_dates(self):
 		if getdate(self.start_date) > getdate(self.end_date):
 			frappe.throw(_("End Date can not be less than Start Date"))
-	
+
 	def validate_existing_appraisal(self):
-		chk = frappe.db.sql("""select name from `tabAppraisal` where employee=%s 
-			and (status='Submitted' or status='Completed') 
-			and ((start_date>=%s and start_date<=%s) 
+		chk = frappe.db.sql("""select name from `tabAppraisal` where employee=%s
+			and (status='Submitted' or status='Completed')
+			and ((start_date>=%s and start_date<=%s)
 			or (end_date>=%s and end_date<=%s))""",
 			(self.employee,self.start_date,self.end_date,self.start_date,self.end_date))
 		if chk:
 			frappe.throw("You have already created Appraisal "\
 				+cstr(chk[0][0])+" in the current date range for employee "\
 				+cstr(self.employee_name))
-	
+
 	def calculate_total(self):
 		total, total_w  = 0, 0
 		for d in self.get('appraisal_details'):
@@ -47,30 +47,29 @@
 			total_w += flt(d.per_weightage)
 
 		if int(total_w) != 100:
-			msgprint("Total weightage assigned should be 100%. It is :" + str(total_w) + "%", 
-				raise_exception=1)
+			frappe.throw(_("Total weightage assigned should be 100%. It is {0}").format(str(total_w) + "%"))
 
 		if frappe.db.get_value("Employee", self.employee, "user_id") != \
 				frappe.session.user and total == 0:
-			msgprint("Total can't be zero. You must atleast give some points!", raise_exception=1)
+			frappe.throw(_("Total cannot be zero"))
 
 		self.total_score = total
-			
+
 	def on_submit(self):
 		frappe.db.set(self, 'status', 'Submitted')
-	
-	def on_cancel(self): 
+
+	def on_cancel(self):
 		frappe.db.set(self, 'status', 'Cancelled')
 
 @frappe.whitelist()
 def fetch_appraisal_template(source_name, target_doc=None):
 	target_doc = get_mapped_doc("Appraisal Template", source_name, {
 		"Appraisal Template": {
-			"doctype": "Appraisal", 
-		}, 
+			"doctype": "Appraisal",
+		},
 		"Appraisal Template Goal": {
-			"doctype": "Appraisal Goal", 
+			"doctype": "Appraisal Goal",
 		}
 	}, target_doc)
 
-	return target_doc
\ No newline at end of file
+	return target_doc
diff --git a/erpnext/hr/doctype/appraisal_template/appraisal_template.py b/erpnext/hr/doctype/appraisal_template/appraisal_template.py
index 930d509..1f753d0 100644
--- a/erpnext/hr/doctype/appraisal_template/appraisal_template.py
+++ b/erpnext/hr/doctype/appraisal_template/appraisal_template.py
@@ -12,8 +12,6 @@
 		self.total_points = 0
 		for d in self.get("kra_sheet"):
 			self.total_points += int(d.per_weightage or 0)
-		
+
 		if int(self.total_points) != 100:
-			frappe.msgprint(_("Total (sum of) points distribution for all goals should be 100.") \
-				+ " " + _("Not") + " " + str(self.total_points),
-				raise_exception=True)
\ No newline at end of file
+			frappe.throw(_("Total points for all goals should be 100. It is {0}").format(self.total_points))
diff --git a/erpnext/hr/doctype/attendance/attendance.py b/erpnext/hr/doctype/attendance/attendance.py
index 8c1c3f0..ea9f271 100644
--- a/erpnext/hr/doctype/attendance/attendance.py
+++ b/erpnext/hr/doctype/attendance/attendance.py
@@ -5,44 +5,41 @@
 import frappe
 
 from frappe.utils import getdate, nowdate
-from frappe import msgprint, _
+from frappe import _
 from frappe.model.document import Document
 
 class Attendance(Document):
-	def validate_duplicate_record(self):	 
-		res = frappe.db.sql("""select name from `tabAttendance` where employee = %s and att_date = %s 
-			and name != %s and docstatus = 1""", 
+	def validate_duplicate_record(self):
+		res = frappe.db.sql("""select name from `tabAttendance` where employee = %s and att_date = %s
+			and name != %s and docstatus = 1""",
 			(self.employee, self.att_date, self.name))
 		if res:
-			msgprint(_("Attendance for the employee: ") + self.employee + 
-				_(" already marked"), raise_exception=1)
-			
+			frappe.throw(_("Attendance for employee {0} is already marked").format(self.employee))
+
 	def check_leave_record(self):
 		if self.status == 'Present':
-			leave = frappe.db.sql("""select name from `tabLeave Application` 
-				where employee = %s and %s between from_date and to_date and status = 'Approved' 
+			leave = frappe.db.sql("""select name from `tabLeave Application`
+				where employee = %s and %s between from_date and to_date and status = 'Approved'
 				and docstatus = 1""", (self.employee, self.att_date))
-			
+
 			if leave:
-				frappe.msgprint(_("Employee: ") + self.employee + _(" was on leave on ")
-					+ self.att_date + _(". You can not mark his attendance as 'Present'"), 
-					raise_exception=1)
-	
+				frappe.throw(_("Employee {0} was on leave on {1}. Cannot mark attendance.").format(self.employee,
+					self.att_date))
+
 	def validate_fiscal_year(self):
 		from erpnext.accounts.utils import validate_fiscal_year
 		validate_fiscal_year(self.att_date, self.fiscal_year)
-	
+
 	def validate_att_date(self):
 		if getdate(self.att_date) > getdate(nowdate()):
-			msgprint(_("Attendance can not be marked for future dates"), raise_exception=1)
+			frappe.throw(_("Attendance can not be marked for future dates"))
 
 	def validate_employee(self):
 		emp = frappe.db.sql("select name from `tabEmployee` where name = %s and status = 'Active'",
 		 	self.employee)
 		if not emp:
-			msgprint(_("Employee: ") + self.employee + 
-				_(" not active or does not exists in the system"), raise_exception=1)
-			
+			frappe.throw(_("Employee {0} is not active or does not exist").format(self.employee))
+
 	def validate(self):
 		from erpnext.utilities import validate_status
 		validate_status(self.status, ["Present", "Absent", "Half Day"])
@@ -50,9 +47,9 @@
 		self.validate_att_date()
 		self.validate_duplicate_record()
 		self.check_leave_record()
-		
+
 	def on_update(self):
-		# this is done because sometimes user entered wrong employee name 
+		# this is done because sometimes user entered wrong employee name
 		# while uploading employee attendance
 		employee_name = frappe.db.get_value("Employee", self.employee, "employee_name")
-		frappe.db.set(self, 'employee_name', employee_name)
\ No newline at end of file
+		frappe.db.set(self, 'employee_name', employee_name)
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.py b/erpnext/hr/doctype/expense_claim/expense_claim.py
index d95be6b..8250e51 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.py
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.py
@@ -3,25 +3,22 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe import msgprint
+from frappe import _
 from frappe.model.document import Document
 
 class ExpenseClaim(Document):
-
 	def validate(self):
 		self.validate_fiscal_year()
 		self.validate_exp_details()
-			
+
 	def on_submit(self):
 		if self.approval_status=="Draft":
-			frappe.msgprint("""Please set Approval Status to 'Approved' or \
-				'Rejected' before submitting""", raise_exception=1)
-	
+			frappe.throw(_("""Approval Status must be 'Approved' or 'Rejected'"""))
+
 	def validate_fiscal_year(self):
 		from erpnext.accounts.utils import validate_fiscal_year
 		validate_fiscal_year(self.posting_date, self.fiscal_year, "Posting Date")
-			
+
 	def validate_exp_details(self):
 		if not self.get('expense_voucher_details'):
-			msgprint("Please add expense voucher details")
-			raise Exception
+			frappe.throw(_("Please add expense voucher details"))
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list.py b/erpnext/hr/doctype/holiday_list/holiday_list.py
index ec15604..496c930 100644
--- a/erpnext/hr/doctype/holiday_list/holiday_list.py
+++ b/erpnext/hr/doctype/holiday_list/holiday_list.py
@@ -4,20 +4,19 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe.utils import add_days, add_years, cint, getdate
+from frappe.utils import cint
 from frappe.model.naming import make_autoname
-from frappe import msgprint, throw, _
-import datetime
+from frappe import throw, _
 
 from frappe.model.document import Document
 
 class HolidayList(Document):
 	def autoname(self):
 		self.name = make_autoname(self.fiscal_year + "/" + self.holiday_list_name + "/.###")
-		
+
 	def validate(self):
 		self.update_default_holiday_list()
-	
+
 	def get_weekly_off_dates(self):
 		self.validate_values()
 		yr_start_date, yr_end_date = self.get_fy_start_end_dates()
@@ -42,24 +41,24 @@
 	def get_weekly_off_date_list(self, year_start_date, year_end_date):
 		from frappe.utils import getdate
 		year_start_date, year_end_date = getdate(year_start_date), getdate(year_end_date)
-		
+
 		from dateutil import relativedelta
 		from datetime import timedelta
 		import calendar
-		
+
 		date_list = []
 		weekday = getattr(calendar, (self.weekly_off).upper())
 		reference_date = year_start_date + relativedelta.relativedelta(weekday=weekday)
-			
+
 		while reference_date <= year_end_date:
 			date_list.append(reference_date)
 			reference_date += timedelta(days=7)
-		
+
 		return date_list
-	
+
 	def clear_table(self):
 		self.set('holiday_list_details', [])
 
 	def update_default_holiday_list(self):
-		frappe.db.sql("""update `tabHoliday List` set is_default = 0 
+		frappe.db.sql("""update `tabHoliday List` set is_default = 0
 			where ifnull(is_default, 0) = 1 and fiscal_year = %s""", (self.fiscal_year,))
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
index f16f615..cbb6426 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -4,67 +4,46 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.utils import cint, flt
-from frappe import msgprint
-	
+from frappe import _
+
 from frappe.model.document import Document
 
 class LeaveAllocation(Document):
 	def validate(self):
 		self.validate_new_leaves_allocated_value()
 		self.check_existing_leave_allocation()
-		self.validate_new_leaves_allocated()
-		
+
 	def on_update_after_submit(self):
 		self.validate_new_leaves_allocated_value()
-		self.validate_new_leaves_allocated()
 
 	def on_update(self):
 		self.get_total_allocated_leaves()
-		
+
 	def on_cancel(self):
 		self.check_for_leave_application()
-		
+
 	def validate_new_leaves_allocated_value(self):
 		"""validate that leave allocation is in multiples of 0.5"""
 		if flt(self.new_leaves_allocated) % 0.5:
-			guess = round(flt(self.new_leaves_allocated) * 2.0) / 2.0
-			
-			msgprint("""New Leaves Allocated should be a multiple of 0.5.
-				Perhaps you should enter %s or %s""" % (guess, guess + 0.5),
-				raise_exception=1)
-		
+			frappe.throw(_("Leaves must be allocated in multiples of 0.5"))
+
 	def check_existing_leave_allocation(self):
 		"""check whether leave for same type is already allocated or not"""
 		leave_allocation = frappe.db.sql("""select name from `tabLeave Allocation`
 			where employee=%s and leave_type=%s and fiscal_year=%s and docstatus=1""",
 			(self.employee, self.leave_type, self.fiscal_year))
 		if leave_allocation:
-			msgprint("""%s is already allocated to Employee: %s for Fiscal Year: %s.
-				Please refere Leave Allocation: \
-				<a href="#Form/Leave Allocation/%s">%s</a>""" % \
-				(self.leave_type, self.employee, self.fiscal_year,
-				leave_allocation[0][0], leave_allocation[0][0]), raise_exception=1)
-			
-	def validate_new_leaves_allocated(self):
-		"""check if Total Leaves Allocated >= Leave Applications"""
-		self.total_leaves_allocated = flt(self.carry_forwarded_leaves) + \
-			flt(self.new_leaves_allocated)
-		leaves_applied = self.get_leaves_applied(self.fiscal_year)
-		if leaves_applied > self.total_leaves_allocated:
-			expected_new_leaves = flt(self.new_leaves_allocated) + \
-				(leaves_applied - self.total_leaves_allocated)
-			msgprint("""Employee: %s has already applied for %s leaves.
-				Hence, New Leaves Allocated should be atleast %s""" % \
-				(self.employee, leaves_applied, expected_new_leaves),
-				raise_exception=1)
-		
+			frappe.msgprint(_("Leaves for type {0} already allocated for Employee {1} for Fiscal Year {0}").format(self.leave_type,
+				self.employee, self.fiscal_year))
+			frappe.throw('<a href="#Form/Leave Allocation/{0}">{0}</a>'.format(leave_allocation[0][0]))
+
 	def get_leave_bal(self, prev_fyear):
 		return self.get_leaves_allocated(prev_fyear) - self.get_leaves_applied(prev_fyear)
-		
+
 	def get_leaves_applied(self, fiscal_year):
 		leaves_applied = frappe.db.sql("""select SUM(ifnull(total_leave_days, 0))
 			from `tabLeave Application` where employee=%s and leave_type=%s
-			and fiscal_year=%s and docstatus=1""", 
+			and fiscal_year=%s and docstatus=1""",
 			(self.employee, self.leave_type, fiscal_year))
 		return leaves_applied and flt(leaves_applied[0][0]) or 0
 
@@ -74,7 +53,7 @@
 			and fiscal_year=%s and docstatus=1 and name!=%s""",
 			(self.employee, self.leave_type, fiscal_year, self.name))
 		return leaves_allocated and flt(leaves_allocated[0][0]) or 0
-	
+
 	def allow_carry_forward(self):
 		"""check whether carry forward is allowed or not for this leave type"""
 		cf = frappe.db.sql("""select is_carry_forward from `tabLeave Type` where name = %s""",
@@ -82,15 +61,14 @@
 		cf = cf and cint(cf[0][0]) or 0
 		if not cf:
 			frappe.db.set(self,'carry_forward',0)
-			msgprint("Sorry! You cannot carry forward %s" % (self.leave_type),
-				raise_exception=1)
+			frappe.throw("Cannot carry forward {0}".format(self.leave_type))
 
 	def get_carry_forwarded_leaves(self):
 		if self.carry_forward:
 			self.allow_carry_forward()
-		prev_fiscal_year = frappe.db.sql("""select name from `tabFiscal Year` 
-			where year_start_date = (select date_add(year_start_date, interval -1 year) 
-				from `tabFiscal Year` where name=%s) 
+		prev_fiscal_year = frappe.db.sql("""select name from `tabFiscal Year`
+			where year_start_date = (select date_add(year_start_date, interval -1 year)
+				from `tabFiscal Year` where name=%s)
 			order by name desc limit 1""", self.fiscal_year)
 		prev_fiscal_year = prev_fiscal_year and prev_fiscal_year[0][0] or ''
 		prev_bal = 0
@@ -112,10 +90,7 @@
 			where employee=%s and leave_type=%s and fiscal_year=%s and docstatus=1""",
 			(self.employee, self.leave_type, self.fiscal_year))
 		if exists:
-			msgprint("""Cannot cancel this Leave Allocation as \
-				Employee : %s has already applied for %s. 
-				Please check Leave Application: \
-				<a href="#Form/Leave Application/%s">%s</a>""" % \
-				(self.employee, self.leave_type, exists[0][0], exists[0][0]))
-			raise Exception
+			frappe.msgprint(_("Cannot cancel because Employee {0} is already approved for {1}").format(self.employee,
+				self.leave_type))
+			frappe.throw('<a href="#Form/Leave Application/{0}">{0}</a>'.format(exists[0][0]))
 
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 5de3495..1262911 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -13,7 +13,7 @@
 class OverlapError(frappe.ValidationError): pass
 class InvalidLeaveApproverError(frappe.ValidationError): pass
 class LeaveApproverIdentityError(frappe.ValidationError): pass
-	
+
 from frappe.model.controller import DocListController
 class LeaveApplication(DocListController):
 	def setup(self):
@@ -21,7 +21,7 @@
 			self.previous_doc = frappe.db.get_value(self.doctype, self.name, "*", as_dict=True)
 		else:
 			self.previous_doc = None
-		
+
 	def validate(self):
 		self.validate_to_date()
 		self.validate_balance_leaves()
@@ -30,7 +30,7 @@
 		self.show_block_day_warning()
 		self.validate_block_days()
 		self.validate_leave_approver()
-		
+
 	def on_update(self):
 		if (not self.previous_doc and self.leave_approver) or (self.previous_doc and \
 				self.status == "Open" and self.previous_doc.leave_approver != self.leave_approver):
@@ -40,25 +40,24 @@
 				self.previous_doc.status == "Open" and self.status == "Rejected":
 			# notify employee about rejection
 			self.notify_employee(self.status)
-	
+
 	def on_submit(self):
 		if self.status != "Approved":
-			frappe.msgprint("""Only Leave Applications with status 'Approved' can be Submitted.""",
-				raise_exception=True)
+			frappe.throw(_("Only Leave Applications with status 'Approved' can be submitted"))
 
 		# notify leave applier about approval
 		self.notify_employee(self.status)
-				
+
 	def on_cancel(self):
 		# notify leave applier about cancellation
 		self.notify_employee("cancelled")
 
 	def show_block_day_warning(self):
-		from erpnext.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates		
+		from erpnext.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
 
-		block_dates = get_applicable_block_dates(self.from_date, self.to_date, 
+		block_dates = get_applicable_block_dates(self.from_date, self.to_date,
 			self.employee, self.company, all_lists=True)
-			
+
 		if block_dates:
 			frappe.msgprint(_("Warning: Leave application contains following block dates") + ":")
 			for d in block_dates:
@@ -67,20 +66,20 @@
 	def validate_block_days(self):
 		from erpnext.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
 
-		block_dates = get_applicable_block_dates(self.from_date, self.to_date, 
+		block_dates = get_applicable_block_dates(self.from_date, self.to_date,
 			self.employee, self.company)
-			
+
 		if block_dates:
 			if self.status == "Approved":
-				frappe.msgprint(_("Cannot approve leave as you are not authorized to approve leaves on Block Dates."))
+				frappe.msgprint(_("Cannot approve leave as you are not authorized to approve leaves on Block Dates"))
 				raise LeaveDayBlockedError
-			
+
 	def get_holidays(self):
-		tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2, `tabEmployee` e1 
-			where e1.name = %s and h1.parent = h2.name and e1.holiday_list = h2.name 
+		tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2, `tabEmployee` e1
+			where e1.name = %s and h1.parent = h2.name and e1.holiday_list = h2.name
 			and h1.holiday_date between %s and %s""", (self.employee, self.from_date, self.to_date))
 		if not tot_hol:
-			tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2 
+			tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2
 				where h1.parent = h2.name and h1.holiday_date between %s and %s
 				and ifnull(h2.is_default,0) = 1 and h2.fiscal_year = %s""",
 				(self.from_date, self.to_date, self.fiscal_year))
@@ -100,17 +99,15 @@
 	def validate_to_date(self):
 		if self.from_date and self.to_date and \
 				(getdate(self.to_date) < getdate(self.from_date)):
-			msgprint("To date cannot be before from date")
-			raise Exception
-			
+			frappe.throw(_("To date cannot be before from date"))
+
 	def validate_balance_leaves(self):
 		if self.from_date and self.to_date:
 			self.total_leave_days = self.get_total_leave_days()["total_leave_days"]
-			
+
 			if self.total_leave_days == 0:
-				msgprint(_("The day(s) on which you are applying for leave coincide with holiday(s). You need not apply for leave."),
-					raise_exception=1)
-			
+				frappe.throw(_("The day(s) on which you are applying for leave are holiday. You need not apply for leave."))
+
 			if not is_lwp(self.leave_type):
 				self.leave_balance = get_leave_balance(self.employee,
 					self.leave_type, self.fiscal_year)["leave_balance"]
@@ -118,94 +115,96 @@
 				if self.status != "Rejected" \
 						and self.leave_balance - self.total_leave_days < 0:
 					#check if this leave type allow the remaining balance to be in negative. If yes then warn the user and continue to save else warn the user and don't save.
-					msgprint("There is not enough leave balance for Leave Type: %s" % \
-						(self.leave_type,), 
-						raise_exception=not(frappe.db.get_value("Leave Type", self.leave_type,"allow_negative") or None))
-					
+					if frappe.db.get_value("Leave Type", self.leave_type, "allow_negative"):
+						frappe.msgprint(_("Note: There is not enough leave balance for Leave Type {0}").format(self.leave_type))
+					else:
+						frappe.throw(_("There is not enough leave balance for Leave Type {0}").format(self.leave_type))
+
+
 	def validate_leave_overlap(self):
 		if not self.name:
 			self.name = "New Leave Application"
-			
-		for d in frappe.db.sql("""select name, leave_type, posting_date, 
-			from_date, to_date 
-			from `tabLeave Application` 
-			where 
+
+		for d in frappe.db.sql("""select name, leave_type, posting_date,
+			from_date, to_date
+			from `tabLeave Application`
+			where
 			employee = %(employee)s
 			and docstatus < 2
 			and status in ("Open", "Approved")
-			and (from_date between %(from_date)s and %(to_date)s 
+			and (from_date between %(from_date)s and %(to_date)s
 				or to_date between %(from_date)s and %(to_date)s
 				or %(from_date)s between from_date and to_date)
 			and name != %(name)s""", self.as_dict(), as_dict = 1):
- 
-			msgprint("Employee : %s has already applied for %s between %s and %s on %s. Please refer Leave Application : <a href=\"#Form/Leave Application/%s\">%s</a>" % (self.employee, cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date']), formatdate(d['posting_date']), d['name'], d['name']), raise_exception = OverlapError)
+
+			frappe.msgprint(_("Employee {0} has already applied for {1} between {2} and {3}").format(self.employee,
+				cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date'])))
+			frappe.throw('<a href="#Form/Leave Application/{0}">{0}</a>'.format(d["name"]), OverlapError)
 
 	def validate_max_days(self):
 		max_days = frappe.db.get_value("Leave Type", self.leave_type, "max_days_allowed")
 		if max_days and self.total_leave_days > max_days:
-			frappe.throw("Sorry ! You cannot apply for %s for more than %s days" % 
+			frappe.throw("Sorry ! You cannot apply for %s for more than %s days" %
 				(self.leave_type, max_days))
-			
+
 	def validate_leave_approver(self):
 		employee = frappe.get_doc("Employee", self.employee)
-		leave_approvers = [l.leave_approver for l in 
+		leave_approvers = [l.leave_approver for l in
 			employee.get("employee_leave_approvers")]
-			
+
 		if len(leave_approvers) and self.leave_approver not in leave_approvers:
-			msgprint(("[" + _("For Employee") + ' "' + self.employee + '"] ' 
-				+ _("Leave Approver can be one of") + ": "
-				+ comma_or(leave_approvers)), raise_exception=InvalidLeaveApproverError)
-		
-		elif self.leave_approver and not frappe.db.sql("""select name from `tabUserRole` 
+			frappe.throw(_("Leave approver must be one of {0}").format(comma_or(leave_approvers)), InvalidLeaveApproverError)
+
+		elif self.leave_approver and not frappe.db.sql("""select name from `tabUserRole`
 			where parent=%s and role='Leave Approver'""", self.leave_approver):
-				msgprint(get_fullname(self.leave_approver) + ": " \
-					+ _("does not have role 'Leave Approver'"), raise_exception=InvalidLeaveApproverError)
-					
+			frappe.throw(_("{0} must have role 'Leave Approver'").format(get_fullname(self.leave_approver)),
+				InvalidLeaveApproverError)
+
 		elif self.docstatus==1 and len(leave_approvers) and self.leave_approver != frappe.session.user:
 			msgprint(_("Only the selected Leave Approver can submit this Leave Application"),
 				raise_exception=LeaveApproverIdentityError)
-			
+
 	def notify_employee(self, status):
 		employee = frappe.get_doc("Employee", self.employee)
 		if not employee.user_id:
 			return
-			
+
 		def _get_message(url=False):
 			if url:
 				name = get_url_to_form(self.doctype, self.name)
 			else:
 				name = self.name
-				
+
 			return (_("Leave Application") + ": %s - %s") % (name, _(status))
-		
+
 		self.notify({
 			# for post in messages
 			"message": _get_message(url=True),
 			"message_to": employee.user_id,
 			"subject": _get_message(),
 		})
-		
+
 	def notify_leave_approver(self):
 		employee = frappe.get_doc("Employee", self.employee)
-		
+
 		def _get_message(url=False):
 			name = self.name
 			employee_name = cstr(employee.employee_name)
 			if url:
 				name = get_url_to_form(self.doctype, self.name)
 				employee_name = get_url_to_form("Employee", self.employee, label=employee_name)
-			
+
 			return (_("New Leave Application") + ": %s - " + _("Employee") + ": %s") % (name, employee_name)
-		
+
 		self.notify({
 			# for post in messages
 			"message": _get_message(url=True),
 			"message_to": self.leave_approver,
-			
+
 			# for email
 			"subject": _get_message()
 		})
-		
+
 	def notify(self, args):
 		args = frappe._dict(args)
 		from frappe.core.page.messages.messages import post
@@ -213,62 +212,62 @@
 			"notify": cint(self.follow_via_email)})
 
 @frappe.whitelist()
-def get_leave_balance(employee, leave_type, fiscal_year):	
-	leave_all = frappe.db.sql("""select total_leaves_allocated 
+def get_leave_balance(employee, leave_type, fiscal_year):
+	leave_all = frappe.db.sql("""select total_leaves_allocated
 		from `tabLeave Allocation` where employee = %s and leave_type = %s
-		and fiscal_year = %s and docstatus = 1""", (employee, 
+		and fiscal_year = %s and docstatus = 1""", (employee,
 			leave_type, fiscal_year))
-	
+
 	leave_all = leave_all and flt(leave_all[0][0]) or 0
-	
-	leave_app = frappe.db.sql("""select SUM(total_leave_days) 
-		from `tabLeave Application` 
+
+	leave_app = frappe.db.sql("""select SUM(total_leave_days)
+		from `tabLeave Application`
 		where employee = %s and leave_type = %s and fiscal_year = %s
 		and status="Approved" and docstatus = 1""", (employee, leave_type, fiscal_year))
 	leave_app = leave_app and flt(leave_app[0][0]) or 0
-	
+
 	ret = {'leave_balance': leave_all - leave_app}
 	return ret
 
 def is_lwp(leave_type):
 	lwp = frappe.db.sql("select is_lwp from `tabLeave Type` where name = %s", leave_type)
 	return lwp and cint(lwp[0][0]) or 0
-	
+
 @frappe.whitelist()
 def get_events(start, end):
 	events = []
 	employee = frappe.db.get_default("employee", frappe.session.user)
 	company = frappe.db.get_default("company", frappe.session.user)
-	
+
 	from frappe.widgets.reportview import build_match_conditions
 	match_conditions = build_match_conditions("Leave Application")
-	
+
 	# show department leaves for employee
 	if "Employee" in frappe.get_roles():
 		add_department_leaves(events, start, end, employee, company)
 
 	add_leaves(events, start, end, employee, company, match_conditions)
-	
+
 	add_block_dates(events, start, end, employee, company)
 	add_holidays(events, start, end, employee, company)
-	
+
 	return events
-	
+
 def add_department_leaves(events, start, end, employee, company):
 	department = frappe.db.get_value("Employee", employee, "department")
-	
+
 	if not department:
 		return
-	
+
 	# department leaves
 	department_employees = frappe.db.sql_list("""select name from tabEmployee where department=%s
 		and company=%s""", (department, company))
-	
+
 	match_conditions = "employee in (\"%s\")" % '", "'.join(department_employees)
 	add_leaves(events, start, end, employee, company, match_conditions=match_conditions)
-			
+
 def add_leaves(events, start, end, employee, company, match_conditions=None):
-	query = """select name, from_date, to_date, employee_name, half_day, 
+	query = """select name, from_date, to_date, employee_name, half_day,
 		status, employee, docstatus
 		from `tabLeave Application` where
 		(from_date between %s and %s or to_date between %s and %s)
@@ -276,7 +275,7 @@
 		and status!="Rejected" """
 	if match_conditions:
 		query += " and " + match_conditions
-	
+
 	for d in frappe.db.sql(query, (start, end, start, end), as_dict=True):
 		e = {
 			"name": d.name,
@@ -311,9 +310,9 @@
 	applicable_holiday_list = frappe.db.get_value("Employee", employee, "holiday_list")
 	if not applicable_holiday_list:
 		return
-	
+
 	for holiday in frappe.db.sql("""select name, holiday_date, description
-		from `tabHoliday` where parent=%s and holiday_date between %s and %s""", 
+		from `tabHoliday` where parent=%s and holiday_date between %s and %s""",
 		(applicable_holiday_list, start, end), as_dict=True):
 			events.append({
 				"doctype": "Holiday",
@@ -325,24 +324,24 @@
 @frappe.whitelist()
 def query_for_permitted_employees(doctype, txt, searchfield, start, page_len, filters):
 	txt = "%" + cstr(txt) + "%"
-	
+
 	if "Leave Approver" in frappe.user.get_roles():
 		user = frappe.session.user.replace('"', '\"')
 		condition = """and (exists(select ela.name from `tabEmployee Leave Approver` ela
-				where ela.parent=`tabEmployee`.name and ela.leave_approver= "%s") or 
-			not exists(select ela.name from `tabEmployee Leave Approver` ela 
+				where ela.parent=`tabEmployee`.name and ela.leave_approver= "%s") or
+			not exists(select ela.name from `tabEmployee Leave Approver` ela
 				where ela.parent=`tabEmployee`.name)
 			or user_id = "%s")""" % (user, user)
 	else:
 		from frappe.widgets.reportview import build_match_conditions
 		condition = build_match_conditions("Employee")
 		condition = ("and " + condition) if condition else ""
-	
+
 	return frappe.db.sql("""select name, employee_name from `tabEmployee`
 		where status = 'Active' and docstatus < 2 and
 		(`%s` like %s or employee_name like %s) %s
 		order by
 		case when name like %s then 0 else 1 end,
 		case when employee_name like %s then 0 else 1 end,
-		name limit %s, %s""" % tuple([searchfield] + ["%s"]*2 + [condition] + ["%s"]*4), 
+		name limit %s, %s""" % tuple([searchfield] + ["%s"]*2 + [condition] + ["%s"]*4),
 		(txt, txt, txt, txt, start, page_len))
diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
index 4a8795a..d3a21fa 100644
--- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
+++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
@@ -4,16 +4,16 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe.utils import cint, cstr, flt, nowdate
+from frappe.utils import cint, cstr, flt, nowdate, comma_and
 from frappe import msgprint, _
 
-	
+
 
 
 from frappe.model.document import Document
 
 class LeaveControlPanel(Document):
-	def get_employees(self):		
+	def get_employees(self):
 		lst1 = [[self.employee_type,"employment_type"],[self.branch,"branch"],[self.designation,"designation"],[self.department, "department"],[self.grade,"grade"]]
 		condition = "where "
 		flag = 0
@@ -26,7 +26,7 @@
 				flag = 1
 		emp_query = "select name from `tabEmployee` "
 		if flag == 1:
-			emp_query += condition 
+			emp_query += condition
 		e = frappe.db.sql(emp_query)
 		return e
 
@@ -41,7 +41,7 @@
 		employees = self.get_employees()
 		if not employees:
 			frappe.throw(_("No employee found"))
-			
+
 		for d in self.get_employees():
 			try:
 				la = frappe.get_doc('Leave Allocation')
@@ -59,4 +59,4 @@
 			except:
 				pass
 		if leave_allocated_for:
-			msgprint("Leaves Allocated Successfully for " + ", ".join(leave_allocated_for))
+			msgprint(_("Leaves Allocated Successfully for {0}").format(comma_and(leave_allocated_for)))
diff --git a/erpnext/hr/doctype/salary_manager/salary_manager.py b/erpnext/hr/doctype/salary_manager/salary_manager.py
index 05d73c7..e73bd69 100644
--- a/erpnext/hr/doctype/salary_manager/salary_manager.py
+++ b/erpnext/hr/doctype/salary_manager/salary_manager.py
@@ -4,57 +4,56 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.utils import cint, flt
-from frappe import msgprint
+from frappe import _
 
 from frappe.model.document import Document
 
 class SalaryManager(Document):
-		
+
 	def get_emp_list(self):
 		"""
-			Returns list of active employees based on selected criteria 
-			and for which salary structure exists		
+			Returns list of active employees based on selected criteria
+			and for which salary structure exists
 		"""
-		
+
 		cond = self.get_filter_condition()
 		cond += self.get_joining_releiving_condition()
-		
+
 		emp_list = frappe.db.sql("""
 			select t1.name
-			from `tabEmployee` t1, `tabSalary Structure` t2 
-			where t1.docstatus!=2 and t2.docstatus != 2 
+			from `tabEmployee` t1, `tabSalary Structure` t2
+			where t1.docstatus!=2 and t2.docstatus != 2
 			and t1.name = t2.employee
 		%s """% cond)
 
 		return emp_list
-		
-		
+
+
 	def get_filter_condition(self):
 		self.check_mandatory()
-		
+
 		cond = ''
 		for f in ['company', 'branch', 'department', 'designation', 'grade']:
 			if self.get(f):
-				cond += " and t1." + f + " = '" + self.get(f).replace("'", "\'") + "'"		
-		
+				cond += " and t1." + f + " = '" + self.get(f).replace("'", "\'") + "'"
+
 		return cond
 
-		
+
 	def get_joining_releiving_condition(self):
 		m = self.get_month_details(self.fiscal_year, self.month)
 		cond = """
-			and ifnull(t1.date_of_joining, '0000-00-00') <= '%(month_end_date)s' 
-			and ifnull(t1.relieving_date, '2199-12-31') >= '%(month_start_date)s' 
+			and ifnull(t1.date_of_joining, '0000-00-00') <= '%(month_end_date)s'
+			and ifnull(t1.relieving_date, '2199-12-31') >= '%(month_start_date)s'
 		""" % m
 		return cond
-		
-		
+
+
 	def check_mandatory(self):
 		for f in ['company', 'month', 'fiscal_year']:
 			if not self.get(f):
-				msgprint("Please select %s to proceed" % f, raise_exception=1)
-		
-	
+				frappe.throw(_("Please set {0}").format(f))
+
 	def get_month_details(self, year, month):
 		ysd = frappe.db.get_value("Fiscal Year", year, "year_start_date")
 		if ysd:
@@ -67,22 +66,22 @@
 			month_days = cint(calendar.monthrange(cint(msd.year) ,cint(month))[1]) # days in month
 			med = datetime.date(msd.year, cint(month), month_days) # month end date
 			return {
-				'year': msd.year, 
-				'month_start_date': msd, 
-				'month_end_date': med, 
+				'year': msd.year,
+				'month_start_date': msd,
+				'month_end_date': med,
 				'month_days': month_days
 			}
 
 	def create_sal_slip(self):
 		"""
 			Creates salary slip for selected employees if already not created
-		
+
 		"""
-		
+
 		emp_list = self.get_emp_list()
 		ss_list = []
 		for emp in emp_list:
-			if not frappe.db.sql("""select name from `tabSalary Slip` 
+			if not frappe.db.sql("""select name from `tabSalary Slip`
 					where docstatus!= 2 and employee = %s and month = %s and fiscal_year = %s and company = %s
 					""", (emp[0], self.month, self.fiscal_year, self.company)):
 				ss = frappe.get_doc({
@@ -95,18 +94,18 @@
 				})
 				ss.insert()
 				ss_list.append(ss.name)
-		
+
 		return self.create_log(ss_list)
-	
-		
+
+
 	def create_log(self, ss_list):
 		log = "<b>No employee for the above selected criteria OR salary slip already created</b>"
 		if ss_list:
 			log = "<b>Created Salary Slip has been created: </b>\
 			<br><br>%s" % '<br>'.join(ss_list)
 		return log
-	
-				
+
+
 	def get_sal_slip_list(self):
 		"""
 			Returns list of salary slips based on selected criteria
@@ -114,17 +113,17 @@
 		"""
 		cond = self.get_filter_condition()
 		ss_list = frappe.db.sql("""
-			select t1.name from `tabSalary Slip` t1 
+			select t1.name from `tabSalary Slip` t1
 			where t1.docstatus = 0 and month = %s and fiscal_year = %s %s
 		""" % ('%s', '%s', cond), (self.month, self.fiscal_year))
 		return ss_list
-			
-				
+
+
 	def submit_salary_slip(self):
 		"""
 			Submit all salary slips based on selected criteria
 		"""
-		ss_list = self.get_sal_slip_list()		
+		ss_list = self.get_sal_slip_list()
 		not_submitted_ss = []
 		for ss in ss_list:
 			ss_obj = frappe.get_doc("Salary Slip",ss[0])
@@ -132,31 +131,31 @@
 				frappe.db.set(ss_obj, 'email_check', cint(self.send_mail))
 				if cint(self.send_email) == 1:
 					ss_obj.send_mail_funct()
-					
+
 				frappe.db.set(ss_obj, 'docstatus', 1)
 			except Exception,e:
 				not_submitted_ss.append(ss[0])
-				msgprint(e)
+				frappe.msgprint(e)
 				continue
-				
+
 		return self.create_submit_log(ss_list, not_submitted_ss)
-		
-		
+
+
 	def create_submit_log(self, all_ss, not_submitted_ss):
 		log = ''
 		if not all_ss:
 			log = "No salary slip found to submit for the above selected criteria"
 		else:
 			all_ss = [d[0] for d in all_ss]
-			
-		submitted_ss = list(set(all_ss) - set(not_submitted_ss))		
+
+		submitted_ss = list(set(all_ss) - set(not_submitted_ss))
 		if submitted_ss:
 			mail_sent_msg = self.send_email and " (Mail has been sent to the employee)" or ""
 			log = """
 			<b>Submitted Salary Slips%s:</b>\
 			<br><br> %s <br><br>
 			""" % (mail_sent_msg, '<br>'.join(submitted_ss))
-			
+
 		if not_submitted_ss:
 			log += """
 				<b>Not Submitted Salary Slips: </b>\
@@ -167,33 +166,33 @@
 				send mail, uncheck 'Send Email' checkbox. <br>\
 				Then try to submit Salary Slip again.
 			"""% ('<br>'.join(not_submitted_ss))
-		return log	
-			
-			
+		return log
+
+
 	def get_total_salary(self):
 		"""
 			Get total salary amount from submitted salary slip based on selected criteria
 		"""
 		cond = self.get_filter_condition()
 		tot = frappe.db.sql("""
-			select sum(rounded_total) from `tabSalary Slip` t1 
+			select sum(rounded_total) from `tabSalary Slip` t1
 			where t1.docstatus = 1 and month = %s and fiscal_year = %s %s
 		""" % ('%s', '%s', cond), (self.month, self.fiscal_year))
-		
+
 		return flt(tot[0][0])
-	
-		
+
+
 	def get_acc_details(self):
 		"""
 			get default bank account,default salary acount from company
 		"""
 		amt = self.get_total_salary()
-		default_bank_account = frappe.db.get_value("Company", self.company, 
+		default_bank_account = frappe.db.get_value("Company", self.company,
 			"default_bank_account")
 		if not default_bank_account:
-			msgprint("You can set Default Bank Account in Company master.")
+			frappe.msgprint(_("You can set Default Bank Account in Company master"))
 
 		return {
 			'default_bank_account' : default_bank_account,
 			'amount' : amt
-		}
\ No newline at end of file
+		}
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index 8c34037..12733e3 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -10,12 +10,12 @@
 from frappe import msgprint, _
 from erpnext.setup.utils import get_company_currency
 
-	
+
 from erpnext.utilities.transaction_base import TransactionBase
 
 class SalarySlip(TransactionBase):
 	def autoname(self):
-		self.name = make_autoname('Sal Slip/' +self.employee + '/.#####') 
+		self.name = make_autoname('Sal Slip/' +self.employee + '/.#####')
 
 	def get_emp_and_leave_details(self):
 		if self.employee:
@@ -25,19 +25,19 @@
 				self.pull_sal_struct(struct)
 
 	def check_sal_struct(self):
-		struct = frappe.db.sql("""select name from `tabSalary Structure` 
+		struct = frappe.db.sql("""select name from `tabSalary Structure`
 			where employee=%s and is_active = 'Yes'""", self.employee)
 		if not struct:
-			msgprint("Please create Salary Structure for employee '%s'" % self.employee)
+			msgprint(_("Please create Salary Structure for employee {0}").format(self.employee))
 			self.employee = None
 		return struct and struct[0][0] or ''
 
 	def pull_sal_struct(self, struct):
 		from erpnext.hr.doctype.salary_structure.salary_structure import get_mapped_doc
 		self.update(get_mapped_doc(struct, self))
-		
+
 	def pull_emp_details(self):
-		emp = frappe.db.get_value("Employee", self.employee, 
+		emp = frappe.db.get_value("Employee", self.employee,
 			["bank_name", "bank_ac_no", "esic_card_no", "pf_number"], as_dict=1)
 		if emp:
 			self.bank_name = emp.bank_name
@@ -50,39 +50,36 @@
 			self.fiscal_year = frappe.get_default("fiscal_year")
 		if not self.month:
 			self.month = "%02d" % getdate(nowdate()).month
-			
+
 		m = frappe.get_doc('Salary Manager').get_month_details(self.fiscal_year, self.month)
 		holidays = self.get_holidays_for_employee(m)
-		
+
 		if not cint(frappe.db.get_value("HR Settings", "HR Settings",
 			"include_holidays_in_total_working_days")):
 				m["month_days"] -= len(holidays)
 				if m["month_days"] < 0:
-					msgprint(_("Bummer! There are more holidays than working days this month."),
-						raise_exception=True)
-			
+					frappe.throw(_("There are more holidays than working days this month."))
+
 		if not lwp:
 			lwp = self.calculate_lwp(holidays, m)
 		self.total_days_in_month = m['month_days']
 		self.leave_without_pay = lwp
 		payment_days = flt(self.get_payment_days(m)) - flt(lwp)
 		self.payment_days = payment_days > 0 and payment_days or 0
-		
+
 
 	def get_payment_days(self, m):
 		payment_days = m['month_days']
 		emp = frappe.db.sql("select date_of_joining, relieving_date from `tabEmployee` \
 			where name = %s", self.employee, as_dict=1)[0]
-			
+
 		if emp['relieving_date']:
 			if getdate(emp['relieving_date']) > m['month_start_date'] and \
 				getdate(emp['relieving_date']) < m['month_end_date']:
 					payment_days = getdate(emp['relieving_date']).day
 			elif getdate(emp['relieving_date']) < m['month_start_date']:
-				frappe.msgprint(_("Relieving Date of employee is ") + cstr(emp['relieving_date']
-					+ _(". Please set status of the employee as 'Left'")), raise_exception=1)
-				
-			
+				frappe.throw(_("Employee relieved on {0} must be set as 'Left'").format(emp["relieving_date"]))
+
 		if emp['date_of_joining']:
 			if getdate(emp['date_of_joining']) > m['month_start_date'] and \
 				getdate(emp['date_of_joining']) < m['month_end_date']:
@@ -91,19 +88,19 @@
 				payment_days = 0
 
 		return payment_days
-		
+
 	def get_holidays_for_employee(self, m):
-		holidays = frappe.db.sql("""select t1.holiday_date 
-			from `tabHoliday` t1, tabEmployee t2 
-			where t1.parent = t2.holiday_list and t2.name = %s 
-			and t1.holiday_date between %s and %s""", 
+		holidays = frappe.db.sql("""select t1.holiday_date
+			from `tabHoliday` t1, tabEmployee t2
+			where t1.parent = t2.holiday_list and t2.name = %s
+			and t1.holiday_date between %s and %s""",
 			(self.employee, m['month_start_date'], m['month_end_date']))
 		if not holidays:
-			holidays = frappe.db.sql("""select t1.holiday_date 
-				from `tabHoliday` t1, `tabHoliday List` t2 
-				where t1.parent = t2.name and ifnull(t2.is_default, 0) = 1 
+			holidays = frappe.db.sql("""select t1.holiday_date
+				from `tabHoliday` t1, `tabHoliday List` t2
+				where t1.parent = t2.name and ifnull(t2.is_default, 0) = 1
 				and t2.fiscal_year = %s
-				and t1.holiday_date between %s and %s""", (self.fiscal_year, 
+				and t1.holiday_date between %s and %s""", (self.fiscal_year,
 					m['month_start_date'], m['month_end_date']))
 		holidays = [cstr(i[0]) for i in holidays]
 		return holidays
@@ -115,10 +112,10 @@
 			if dt not in holidays:
 				leave = frappe.db.sql("""
 					select t1.name, t1.half_day
-					from `tabLeave Application` t1, `tabLeave Type` t2 
-					where t2.name = t1.leave_type 
-					and ifnull(t2.is_lwp, 0) = 1 
-					and t1.docstatus = 1 
+					from `tabLeave Application` t1, `tabLeave Type` t2
+					where t2.name = t1.leave_type
+					and ifnull(t2.is_lwp, 0) = 1
+					and t1.docstatus = 1
 					and t1.employee = %s
 					and %s between from_date and to_date
 				""", (self.employee, dt))
@@ -127,21 +124,19 @@
 		return lwp
 
 	def check_existing(self):
-		ret_exist = frappe.db.sql("""select name from `tabSalary Slip` 
-			where month = %s and fiscal_year = %s and docstatus != 2 
-			and employee = %s and name != %s""", 
+		ret_exist = frappe.db.sql("""select name from `tabSalary Slip`
+			where month = %s and fiscal_year = %s and docstatus != 2
+			and employee = %s and name != %s""",
 			(self.month, self.fiscal_year, self.employee, self.name))
 		if ret_exist:
 			self.employee = ''
-			msgprint("Salary Slip of employee '%s' already created for this month" 
-				% self.employee, raise_exception=1)
-
+			frappe.throw("Salary Slip of employee {0} already created for this month".format(self.employee))
 
 	def validate(self):
 		from frappe.utils import money_in_words
 		self.check_existing()
-		
-		if not (len(self.get("earning_details")) or 
+
+		if not (len(self.get("earning_details")) or
 			len(self.get("deduction_details"))):
 				self.get_emp_and_leave_details()
 		else:
@@ -149,7 +144,7 @@
 
 		if not self.net_pay:
 			self.calculate_net_pay()
-			
+
 		company_currency = get_company_currency(self.company)
 		self.total_in_words = money_in_words(self.rounded_total, company_currency)
 
@@ -164,46 +159,46 @@
 			else:
 				d.e_modified_amount = d.e_amount
 			self.gross_pay += flt(d.e_modified_amount)
-	
+
 	def calculate_ded_total(self):
 		self.total_deduction = 0
 		for d in self.get('deduction_details'):
 			if cint(d.d_depends_on_lwp) == 1:
-				d.d_modified_amount = _round(flt(d.d_amount) * flt(self.payment_days) 
+				d.d_modified_amount = _round(flt(d.d_amount) * flt(self.payment_days)
 					/ cint(self.total_days_in_month), 2)
 			elif not self.payment_days:
 				d.d_modified_amount = 0
 			else:
 				d.d_modified_amount = d.d_amount
-			
+
 			self.total_deduction += flt(d.d_modified_amount)
-				
+
 	def calculate_net_pay(self):
 		self.calculate_earning_total()
 		self.calculate_ded_total()
 		self.net_pay = flt(self.gross_pay) - flt(self.total_deduction)
-		self.rounded_total = _round(self.net_pay)		
+		self.rounded_total = _round(self.net_pay)
 
 	def on_submit(self):
-		if(self.email_check == 1):			
+		if(self.email_check == 1):
 			self.send_mail_funct()
-			
 
-	def send_mail_funct(self):	 
+
+	def send_mail_funct(self):
 		from frappe.utils.email_lib import sendmail
 		receiver = frappe.db.get_value("Employee", self.employee, "company_email")
 		if receiver:
 			subj = 'Salary Slip - ' + cstr(self.month) +'/'+cstr(self.fiscal_year)
-			earn_ret=frappe.db.sql("""select e_type, e_modified_amount from `tabSalary Slip Earning` 
+			earn_ret=frappe.db.sql("""select e_type, e_modified_amount from `tabSalary Slip Earning`
 				where parent = %s""", self.name)
-			ded_ret=frappe.db.sql("""select d_type, d_modified_amount from `tabSalary Slip Deduction` 
+			ded_ret=frappe.db.sql("""select d_type, d_modified_amount from `tabSalary Slip Deduction`
 				where parent = %s""", self.name)
-		 
+
 			earn_table = ''
 			ded_table = ''
-			if earn_ret:			
+			if earn_ret:
 				earn_table += "<table cellspacing=5px cellpadding=5px width='100%%'>"
-				
+
 				for e in earn_ret:
 					if not e[1]:
 						earn_table += '<tr><td>%s</td><td align="right">0.00</td></tr>' % cstr(e[0])
@@ -211,11 +206,11 @@
 						earn_table += '<tr><td>%s</td><td align="right">%s</td></tr>' \
 							% (cstr(e[0]), cstr(e[1]))
 				earn_table += '</table>'
-			
+
 			if ded_ret:
-			
+
 				ded_table += "<table cellspacing=5px cellpadding=5px width='100%%'>"
-				
+
 				for d in ded_ret:
 					if not d[1]:
 						ded_table +='<tr><td">%s</td><td align="right">0.00</td></tr>' % cstr(d[0])
@@ -223,10 +218,10 @@
 						ded_table +='<tr><td>%s</td><td align="right">%s</td></tr>' \
 							% (cstr(d[0]), cstr(d[1]))
 				ded_table += '</table>'
-			
-			letter_head = frappe.db.get_value("Letter Head", {"is_default": 1, "disabled": 0}, 
+
+			letter_head = frappe.db.get_value("Letter Head", {"is_default": 1, "disabled": 0},
 				"content")
-			
+
 			msg = '''<div> %s <br>
 			<table cellspacing= "5" cellpadding="5"  width = "100%%">
 				<tr>
@@ -248,15 +243,15 @@
 					<td width = "50%%">Designation : %s</td>
 					<td width = "50%%">Grade : %s</td>
 				</tr>
-				<tr>				
+				<tr>
 					<td width = "50%%">Bank Account No. : %s</td>
 					<td  width = "50%%">Bank Name : %s</td>
-				
+
 				</tr>
 				<tr>
 					<td  width = "50%%">Arrear Amount : <b>%s</b></td>
 					<td  width = "50%%">Payment days : %s</td>
-				
+
 				</tr>
 			</table>
 			<table border="1px solid #CCC" width="100%%" cellpadding="0px" cellspacing="0px">
@@ -287,14 +282,14 @@
 					<td width='25%%'><b>Net Pay(in words) : </td>
 					<td colspan = '3' width = '50%%'>%s</b></td>
 				</tr>
-			</table></div>''' % (cstr(letter_head), cstr(self.employee), 
-				cstr(self.employee_name), cstr(self.month), cstr(self.fiscal_year), 
-				cstr(self.department), cstr(self.branch), cstr(self.designation), 
-				cstr(self.grade), cstr(self.bank_account_no), cstr(self.bank_name), 
-				cstr(self.arrear_amount), cstr(self.payment_days), earn_table, ded_table, 
-				cstr(flt(self.gross_pay)), cstr(flt(self.total_deduction)), 
+			</table></div>''' % (cstr(letter_head), cstr(self.employee),
+				cstr(self.employee_name), cstr(self.month), cstr(self.fiscal_year),
+				cstr(self.department), cstr(self.branch), cstr(self.designation),
+				cstr(self.grade), cstr(self.bank_account_no), cstr(self.bank_name),
+				cstr(self.arrear_amount), cstr(self.payment_days), earn_table, ded_table,
+				cstr(flt(self.gross_pay)), cstr(flt(self.total_deduction)),
 				cstr(flt(self.net_pay)), cstr(self.total_in_words))
 
 			sendmail([receiver], subject=subj, msg = msg)
 		else:
-			msgprint("Company Email ID not found, hence mail not sent")
+			msgprint(_("Company Email ID not found, hence mail not sent"))
diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.py b/erpnext/hr/doctype/salary_structure/salary_structure.py
index 2bbc99b..6843644 100644
--- a/erpnext/hr/doctype/salary_structure/salary_structure.py
+++ b/erpnext/hr/doctype/salary_structure/salary_structure.py
@@ -6,7 +6,7 @@
 
 from frappe.utils import cstr, flt
 from frappe.model.naming import make_autoname
-from frappe import msgprint, _
+from frappe import _
 
 
 from frappe.model.document import Document
@@ -17,7 +17,7 @@
 
 	def get_employee_details(self):
 		ret = {}
-		det = frappe.db.sql("""select employee_name, branch, designation, department, grade 
+		det = frappe.db.sql("""select employee_name, branch, designation, department, grade
 			from `tabEmployee` where name = %s""", self.employee)
 		if det:
 			ret = {
@@ -31,7 +31,7 @@
 		return ret
 
 	def get_ss_values(self,employee):
-		basic_info = frappe.db.sql("""select bank_name, bank_ac_no, esic_card_no, pf_number 
+		basic_info = frappe.db.sql("""select bank_name, bank_ac_no, esic_card_no, pf_number
 			from `tabEmployee` where name =%s""", employee)
 		ret = {'bank_name': basic_info and basic_info[0][0] or '',
 			'bank_ac_no': basic_info and basic_info[0][1] or '',
@@ -49,33 +49,32 @@
 			elif(tab_fname == 'deduction_details'):
 				child.d_type = cstr(li[0])
 				child.d_modified_amt = 0
-			 
-	def make_earn_ded_table(self):					 
+
+	def make_earn_ded_table(self):
 		self.make_table('Earning Type','earning_details','Salary Structure Earning')
 		self.make_table('Deduction Type','deduction_details', 'Salary Structure Deduction')
 
 	def check_existing(self):
-		ret = frappe.db.sql("""select name from `tabSalary Structure` where is_active = 'Yes' 
+		ret = frappe.db.sql("""select name from `tabSalary Structure` where is_active = 'Yes'
 			and employee = %s and name!=%s""", (self.employee,self.name))
 		if ret and self.is_active=='Yes':
-			msgprint(_("""Another Salary Structure '%s' is active for employee '%s'. Please make its status 'Inactive' to proceed.""") % 
-				(cstr(ret), self.employee), raise_exception=1)
+			frappe.throw(_("Another Salary Structure {0} is active for employee {0}. Please make its status 'Inactive' to proceed.").format(cstr(ret), self.employee))
 
 	def validate_amount(self):
 		if flt(self.net_pay) < 0:
-			msgprint(_("Net pay can not be negative"), raise_exception=1)
+			frappe.throw(_("Net pay cannot be negative"))
 
-	def validate(self):	 
+	def validate(self):
 		self.check_existing()
 		self.validate_amount()
-		
+
 @frappe.whitelist()
 def make_salary_slip(source_name, target_doc=None):
 	return get_mapped_doc(source_name, target_doc).as_dict()
-	
+
 def get_mapped_doc(source_name, target_doc=None):
 	from frappe.model.mapper import get_mapped_doc
-	
+
 	def postprocess(source, target):
 		sal_slip = frappe.get_doc(target)
 		sal_slip.run_method("pull_emp_details")
@@ -84,24 +83,24 @@
 
 	doc = get_mapped_doc("Salary Structure", source_name, {
 		"Salary Structure": {
-			"doctype": "Salary Slip", 
+			"doctype": "Salary Slip",
 			"field_map": {
 				"total_earning": "gross_pay"
 			}
-		}, 
+		},
 		"Salary Structure Deduction": {
-			"doctype": "Salary Slip Deduction", 
+			"doctype": "Salary Slip Deduction",
 			"field_map": [
 				["depend_on_lwp", "d_depends_on_lwp"],
 				["d_modified_amt", "d_amount"],
 				["d_modified_amt", "d_modified_amount"]
 			],
 			"add_if_empty": True
-		}, 
+		},
 		"Salary Structure Earning": {
-			"doctype": "Salary Slip Earning", 
+			"doctype": "Salary Slip Earning",
 			"field_map": [
-				["depend_on_lwp", "e_depends_on_lwp"], 
+				["depend_on_lwp", "e_depends_on_lwp"],
 				["modified_value", "e_modified_amount"],
 				["modified_value", "e_amount"]
 			],
diff --git a/erpnext/hr/doctype/upload_attendance/upload_attendance.py b/erpnext/hr/doctype/upload_attendance/upload_attendance.py
index 1ba31e9..af86eb9 100644
--- a/erpnext/hr/doctype/upload_attendance/upload_attendance.py
+++ b/erpnext/hr/doctype/upload_attendance/upload_attendance.py
@@ -6,7 +6,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.utils import cstr, add_days, date_diff
-from frappe import msgprint, _
+from frappe import _
 from frappe.utils.datautils import UnicodeWriter
 from frappe.model.document import Document
 
@@ -17,32 +17,32 @@
 def get_template():
 	if not frappe.has_permission("Attendance", "create"):
 		raise frappe.PermissionError
-	
+
 	args = frappe.local.form_dict
 
 	w = UnicodeWriter()
 	w = add_header(w)
-	
+
 	w = add_data(w, args)
 
 	# write out response as a type csv
 	frappe.response['result'] = cstr(w.getvalue())
 	frappe.response['type'] = 'csv'
 	frappe.response['doctype'] = "Attendance"
-	
+
 def add_header(w):
 	status = ", ".join((frappe.get_meta("Attendance").get_field("status").options or "").strip().split("\n"))
 	w.writerow(["Notes:"])
 	w.writerow(["Please do not change the template headings"])
 	w.writerow(["Status should be one of these values: " + status])
 	w.writerow(["If you are overwriting existing attendance records, 'ID' column mandatory"])
-	w.writerow(["ID", "Employee", "Employee Name", "Date", "Status", 
+	w.writerow(["ID", "Employee", "Employee Name", "Date", "Status",
 		"Fiscal Year", "Company", "Naming Series"])
 	return w
-	
+
 def add_data(w, args):
 	from erpnext.accounts.utils import get_fiscal_year
-	
+
 	dates = get_dates(args)
 	employees = get_active_employees()
 	existing_attendance_records = get_existing_attendance_records(args)
@@ -54,9 +54,9 @@
 					existing_attendance = existing_attendance_records[tuple([date, employee.name])]
 			row = [
 				existing_attendance and existing_attendance.name or "",
-				employee.name, employee.employee_name, date, 
+				employee.name, employee.employee_name, date,
 				existing_attendance and existing_attendance.status or "",
-				get_fiscal_year(date)[0], employee.company, 
+				get_fiscal_year(date)[0], employee.company,
 				existing_attendance and existing_attendance.naming_series or get_naming_series(),
 			]
 			w.writerow(row)
@@ -67,28 +67,27 @@
 	no_of_days = date_diff(add_days(args["to_date"], 1), args["from_date"])
 	dates = [add_days(args["from_date"], i) for i in range(0, no_of_days)]
 	return dates
-	
+
 def get_active_employees():
-	employees = frappe.db.sql("""select name, employee_name, company 
+	employees = frappe.db.sql("""select name, employee_name, company
 		from tabEmployee where docstatus < 2 and status = 'Active'""", as_dict=1)
 	return employees
-	
+
 def get_existing_attendance_records(args):
-	attendance = frappe.db.sql("""select name, att_date, employee, status, naming_series 
-		from `tabAttendance` where att_date between %s and %s and docstatus < 2""", 
+	attendance = frappe.db.sql("""select name, att_date, employee, status, naming_series
+		from `tabAttendance` where att_date between %s and %s and docstatus < 2""",
 		(args["from_date"], args["to_date"]), as_dict=1)
-		
+
 	existing_attendance = {}
 	for att in attendance:
 		existing_attendance[tuple([att.att_date, att.employee])] = att
-	
+
 	return existing_attendance
-	
+
 def get_naming_series():
 	series = frappe.get_meta("Attendance").get_field("naming_series").options.strip().split("\n")
 	if not series:
-		msgprint("""Please create naming series for Attendance \
-			through Setup -> Numbering Series.""", raise_exception=1)
+		frappe.throw(_("Please setup numbering series for Attendance via Setup > Numbering Series"))
 	return series[0]
 
 
@@ -96,10 +95,10 @@
 def upload():
 	if not frappe.has_permission("Attendance", "create"):
 		raise frappe.PermissionError
-	
+
 	from frappe.utils.datautils import read_csv_content_from_uploaded_file
 	from frappe.modules import scrub
-	
+
 	rows = read_csv_content_from_uploaded_file()
 	if not rows:
 		msg = [_("Please select a csv file")]
@@ -109,10 +108,9 @@
 	columns[3] = "att_date"
 	ret = []
 	error = False
-	
+
 	from frappe.utils.datautils import check_record, import_doc
-	doctype_dl = frappe.get_meta("Attendance")
-	
+
 	for i, row in enumerate(rows[5:]):
 		if not row: continue
 		row_idx = i + 5
@@ -120,18 +118,18 @@
 		d["doctype"] = "Attendance"
 		if d.name:
 			d["docstatus"] = frappe.db.get_value("Attendance", d.name, "docstatus")
-			
+
 		try:
 			check_record(d)
 			ret.append(import_doc(d, "Attendance", 1, row_idx, submit=True))
 		except Exception, e:
 			error = True
-			ret.append('Error for row (#%d) %s : %s' % (row_idx, 
+			ret.append('Error for row (#%d) %s : %s' % (row_idx,
 				len(row)>1 and row[1] or "", cstr(e)))
 			frappe.errprint(frappe.get_traceback())
 
 	if error:
-		frappe.db.rollback()		
+		frappe.db.rollback()
 	else:
 		frappe.db.commit()
 	return {"messages": ret, "error": error}
diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py
index fc9e7a2..87a9e0b 100644
--- a/erpnext/hr/utils.py
+++ b/erpnext/hr/utils.py
@@ -10,8 +10,8 @@
 	roles = [r[0] for r in frappe.db.sql("""select distinct parent from `tabUserRole`
 		where role='Leave Approver'""")]
 	if not roles:
-		frappe.msgprint(_("No Leave Approvers. Please assign 'Leave Approver' Role to atleast one user."))
-		
+		frappe.msgprint(_("No Leave Approvers. Please assign 'Leave Approver' Role to atleast one user"))
+
 	return roles
 
 
@@ -20,6 +20,5 @@
 	roles = [r[0] for r in frappe.db.sql("""select distinct parent from `tabUserRole`
 		where role='Expense Approver'""")]
 	if not roles:
-		frappe.msgprint("No Expense Approvers. Please assign 'Expense Approver' \
-			Role to atleast one user.")
+		frappe.msgprint(_("No Expense Approvers. Please assign 'Expense Approver' Role to atleast one user"))
 	return roles
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 206c963..40218ce 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -5,10 +5,7 @@
 import frappe
 from frappe.utils import cint, cstr, flt, now, nowdate
 
-from frappe import msgprint, _
-
-
-
+from frappe import _
 from frappe.model.document import Document
 
 class BOM(Document):
@@ -64,11 +61,7 @@
 
 	def validate_rm_item(self, item):
 		if item[0]['name'] == self.item:
-			msgprint("Item_code: %s in materials tab cannot be same as FG Item",
-				item[0]['name'], raise_exception=1)
-
-		if not item or item[0]['docstatus'] == 2:
-			msgprint("Item %s does not exist in system" % item[0]['item_code'], raise_exception = 1)
+			frappe.throw(_("Raw material cannot be same as main Item"))
 
 	def set_bom_material_details(self):
 		for item in self.get("bom_materials"):
@@ -188,12 +181,10 @@
 		""" Validate main FG item"""
 		item = self.get_item_det(self.item)
 		if not item:
-			msgprint("Item %s does not exists in the system or expired." %
-				self.item, raise_exception = 1)
+			frappe.throw(_("Item {0} does not exists in the system or has expired").format(self.item))
 		elif item[0]['is_manufactured_item'] != 'Yes' \
 				and item[0]['is_sub_contracted_item'] != 'Yes':
-			msgprint("""As Item: %s is not a manufactured / sub-contracted item, \
-				you can not make BOM for it""" % self.item, raise_exception = 1)
+			frappe.throw(_("Item {0} must be manufactured or sub-contracted").format(self.item))
 		else:
 			ret = frappe.db.get_value("Item", self.item, ["description", "stock_uom"])
 			self.description = ret[0]
@@ -204,8 +195,7 @@
 		self.op = []
 		for d in self.get('bom_operations'):
 			if cstr(d.operation_no) in self.op:
-				msgprint("Operation no: %s is repeated in Operations Table" %
-					d.operation_no, raise_exception=1)
+				frappe.throw(_("Operation {0} is repeated in Operations Table").format(d.operation_no))
 			else:
 				# add operation in op list
 				self.op.append(cstr(d.operation_no))
@@ -216,26 +206,20 @@
 		for m in self.get('bom_materials'):
 			# check if operation no not in op table
 			if self.with_operations and cstr(m.operation_no) not in self.op:
-				msgprint("""Operation no: %s against item: %s at row no: %s \
-					is not present at Operations table""" %
-					(m.operation_no, m.item_code, m.idx), raise_exception = 1)
+				frappe.throw(_("Operation {0} not present in Operations Table").format(m.operation_no))
 
 			item = self.get_item_det(m.item_code)
 			if item[0]['is_manufactured_item'] == 'Yes':
 				if not m.bom_no:
-					msgprint("Please enter BOM No aginst item: %s at row no: %s" %
-						(m.item_code, m.idx), raise_exception=1)
+					frappe.throw(_("BOM number is required for manufactured Item {0} in row {1}").format(m.item, m.idx))
 				else:
 					self.validate_bom_no(m.item_code, m.bom_no, m.idx)
 
 			elif m.bom_no:
-				msgprint("""As Item %s is not a manufactured / sub-contracted item, \
-					you can not enter BOM against it (Row No: %s).""" %
-					(m.item_code, m.idx), raise_exception = 1)
+				frappe.throw(_("BOM number not allowed for non-manufactured Item {0} in row {1}").format(m.item_code, m.idx))
 
 			if flt(m.qty) <= 0:
-				msgprint("Please enter qty against raw material: %s at row no: %s" %
-					(m.item_code, m.idx), raise_exception = 1)
+				frappe.throw(_("Quantity required for Item {0} in row {1}").format(m.item_code, m.idx))
 
 			self.check_if_item_repeated(m.item_code, m.operation_no, check_list)
 
@@ -245,14 +229,11 @@
 			and is_active=1 and docstatus=1""",
 			(bom_no, item), as_dict =1)
 		if not bom:
-			msgprint("""Incorrect BOM No: %s against item: %s at row no: %s.
-				It may be inactive or not submitted or does not belong to this item.""" %
-				(bom_no, item, idx), raise_exception = 1)
+			frappe.throw(_("BOM {0} for Item {1} in row {2} is inactive or not submitted").format(bom_no, item, idx))
 
 	def check_if_item_repeated(self, item, op, check_list):
 		if [cstr(item), cstr(op)] in check_list:
-			msgprint(_("Item") + " %s " % (item,) + _("has been entered atleast twice")
-				+ (cstr(op) and _(" against same operation") or ""), raise_exception=1)
+			frappe.throw(_("Item {0} has been entered multiple times against same operation").format(item))
 		else:
 			check_list.append([cstr(item), cstr(op)])
 
@@ -268,8 +249,7 @@
 				count = count + 1
 				for b in boms:
 					if b[0] == self.name:
-						msgprint("""Recursion Occured => '%s' cannot be '%s' of '%s'.
-							""" % (cstr(b[0]), cstr(d[2]), self.name), raise_exception = 1)
+						frappe.throw(_("BOM recursion: {0} cannot be parent or child of {2}").format(b[0], self.name))
 					if b[0]:
 						bom_list.append(b[0])
 
@@ -389,12 +369,9 @@
 					and docstatus = 1 and is_active = 1)""", self.name)
 
 			if act_pbom and act_pbom[0][0]:
-				action = self.docstatus < 2 and _("deactivate") or _("cancel")
-				msgprint(_("Cannot ") + action + _(": It is linked to other active BOM(s)"),
-					raise_exception=1)
+				frappe.throw(_("Cannot deactive or cancle BOM as it is linked with other BOMs"))
 
 def get_bom_items_as_dict(bom, qty=1, fetch_exploded=1):
-	import json
 	item_dict = {}
 
 	query = """select
diff --git a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
index b772fcb..63030b5 100644
--- a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
+++ b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
@@ -4,8 +4,8 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.utils import cstr, flt
-from frappe import msgprint, _
-	
+from frappe import _
+
 from frappe.model.document import Document
 
 class BOMReplaceTool(Document):
@@ -17,22 +17,22 @@
 		for bom in bom_list:
 			bom_obj = frappe.get_doc("BOM", bom)
 			updated_bom = bom_obj.update_cost_and_exploded_items(updated_bom)
-			
+
 		frappe.msgprint(_("BOM replaced"))
 
 	def validate_bom(self):
 		if cstr(self.current_bom) == cstr(self.new_bom):
-			msgprint("Current BOM and New BOM can not be same", raise_exception=1)
-	
+			frappe.throw(_("Current BOM and New BOM can not be same"))
+
 	def update_new_bom(self):
-		current_bom_unitcost = frappe.db.sql("""select total_cost/quantity 
+		current_bom_unitcost = frappe.db.sql("""select total_cost/quantity
 			from `tabBOM` where name = %s""", self.current_bom)
 		current_bom_unitcost = current_bom_unitcost and flt(current_bom_unitcost[0][0]) or 0
-		frappe.db.sql("""update `tabBOM Item` set bom_no=%s, 
-			rate=%s, amount=qty*%s where bom_no = %s and docstatus < 2""", 
+		frappe.db.sql("""update `tabBOM Item` set bom_no=%s,
+			rate=%s, amount=qty*%s where bom_no = %s and docstatus < 2""",
 			(self.new_bom, current_bom_unitcost, current_bom_unitcost, self.current_bom))
-				
+
 	def get_parent_boms(self):
-		return [d[0] for d in frappe.db.sql("""select distinct parent 
+		return [d[0] for d in frappe.db.sql("""select distinct parent
 			from `tabBOM Item` where ifnull(bom_no, '') = %s and docstatus < 2""",
-			self.new_bom)]
\ No newline at end of file
+			self.new_bom)]
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index af92413..78270e5 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -16,31 +16,31 @@
 	def validate(self):
 		if self.docstatus == 0:
 			self.status = "Draft"
-			
+
 		from erpnext.utilities import validate_status
-		validate_status(self.status, ["Draft", "Submitted", "Stopped", 
+		validate_status(self.status, ["Draft", "Submitted", "Stopped",
 			"In Process", "Completed", "Cancelled"])
 
 		self.validate_bom_no()
 		self.validate_sales_order()
 		self.validate_warehouse()
-		
+
 		from erpnext.utilities.transaction_base import validate_uom_is_integer
 		validate_uom_is_integer(self, "stock_uom", ["qty", "produced_qty"])
-		
+
 	def validate_bom_no(self):
 		if self.bom_no:
-			bom = frappe.db.sql("""select name from `tabBOM` where name=%s and docstatus=1 
+			bom = frappe.db.sql("""select name from `tabBOM` where name=%s and docstatus=1
 				and is_active=1 and item=%s"""
 				, (self.bom_no, self.production_item), as_dict =1)
 			if not bom:
-				frappe.throw("""Incorrect BOM: %s entered. 
-					May be BOM not exists or inactive or not submitted 
+				frappe.throw("""Incorrect BOM: %s entered.
+					May be BOM not exists or inactive or not submitted
 					or for some other item.""" % cstr(self.bom_no))
-					
+
 	def validate_sales_order(self):
 		if self.sales_order:
-			so = frappe.db.sql("""select name, delivery_date from `tabSales Order` 
+			so = frappe.db.sql("""select name, delivery_date from `tabSales Order`
 				where name=%s and docstatus = 1""", self.sales_order, as_dict=1)[0]
 
 			if not so.name:
@@ -48,39 +48,39 @@
 
 			if not self.expected_delivery_date:
 				self.expected_delivery_date = so.delivery_date
-			
+
 			self.validate_production_order_against_so()
-			
+
 	def validate_warehouse(self):
 		from erpnext.stock.utils import validate_warehouse_company
-		
+
 		for w in [self.fg_warehouse, self.wip_warehouse]:
 			validate_warehouse_company(w, self.company)
-	
+
 	def validate_production_order_against_so(self):
 		# already ordered qty
 		ordered_qty_against_so = frappe.db.sql("""select sum(qty) from `tabProduction Order`
-			where production_item = %s and sales_order = %s and docstatus < 2 and name != %s""", 
+			where production_item = %s and sales_order = %s and docstatus < 2 and name != %s""",
 			(self.production_item, self.sales_order, self.name))[0][0]
 
 		total_qty = flt(ordered_qty_against_so) + flt(self.qty)
-		
+
 		# get qty from Sales Order Item table
-		so_item_qty = frappe.db.sql("""select sum(qty) from `tabSales Order Item` 
-			where parent = %s and item_code = %s""", 
+		so_item_qty = frappe.db.sql("""select sum(qty) from `tabSales Order Item`
+			where parent = %s and item_code = %s""",
 			(self.sales_order, self.production_item))[0][0]
 		# get qty from Packing Item table
-		dnpi_qty = frappe.db.sql("""select sum(qty) from `tabPacked Item` 
-			where parent = %s and parenttype = 'Sales Order' and item_code = %s""", 
+		dnpi_qty = frappe.db.sql("""select sum(qty) from `tabPacked Item`
+			where parent = %s and parenttype = 'Sales Order' and item_code = %s""",
 			(self.sales_order, self.production_item))[0][0]
 		# total qty in SO
 		so_qty = flt(so_item_qty) + flt(dnpi_qty)
-				
+
 		if total_qty > so_qty:
-			frappe.throw(_("Total production order qty for item") + ": " + 
-				cstr(self.production_item) + _(" against sales order") + ": " + 
-				cstr(self.sales_order) + _(" will be ") + cstr(total_qty) + ", " + 
-				_("which is greater than sales order qty ") + "(" + cstr(so_qty) + ")" + 
+			frappe.throw(_("Total production order qty for item") + ": " +
+				cstr(self.production_item) + _(" against sales order") + ": " +
+				cstr(self.sales_order) + _(" will be ") + cstr(total_qty) + ", " +
+				_("which is greater than sales order qty ") + "(" + cstr(so_qty) + ")" +
 				_("Please reduce qty."), exc=OverProductionError)
 
 	def stop_unstop(self, status):
@@ -88,7 +88,7 @@
 		self.update_status(status)
 		qty = (flt(self.qty)-flt(self.produced_qty)) * ((status == 'Stopped') and -1 or 1)
 		self.update_planned_qty(qty)
-		msgprint("Production Order has been %s" % status)
+		frappe.msgprint(_("Production Order status is {0}").format(status))
 
 
 	def update_status(self, status):
@@ -108,14 +108,14 @@
 			frappe.throw(_("WIP Warehouse required before Submit"))
 		frappe.db.set(self,'status', 'Submitted')
 		self.update_planned_qty(self.qty)
-		
+
 
 	def on_cancel(self):
 		# Check whether any stock entry exists against this Production Order
-		stock_entry = frappe.db.sql("""select name from `tabStock Entry` 
+		stock_entry = frappe.db.sql("""select name from `tabStock Entry`
 			where production_order = %s and docstatus = 1""", self.name)
 		if stock_entry:
-			frappe.throw("""Submitted Stock Entry %s exists against this production order. 
+			frappe.throw("""Submitted Stock Entry %s exists against this production order.
 				Hence can not be cancelled.""" % stock_entry[0][0])
 
 		frappe.db.set(self,'status', 'Cancelled')
@@ -132,27 +132,27 @@
 		from erpnext.stock.utils import update_bin
 		update_bin(args)
 
-@frappe.whitelist()	
+@frappe.whitelist()
 def get_item_details(item):
 	res = frappe.db.sql("""select stock_uom, description
 		from `tabItem` where (ifnull(end_of_life, "")="" or end_of_life > now())
 		and name=%s""", item, as_dict=1)
-	
+
 	if not res:
 		return {}
-		
+
 	res = res[0]
-	bom = frappe.db.sql("""select name from `tabBOM` where item=%s 
+	bom = frappe.db.sql("""select name from `tabBOM` where item=%s
 		and ifnull(is_default, 0)=1""", item)
 	if bom:
 		res.bom_no = bom[0][0]
-		
+
 	return res
 
 @frappe.whitelist()
 def make_stock_entry(production_order_id, purpose):
 	production_order = frappe.get_doc("Production Order", production_order_id)
-		
+
 	stock_entry = frappe.new_doc("Stock Entry")
 	stock_entry.purpose = purpose
 	stock_entry.production_order = production_order_id
@@ -160,12 +160,12 @@
 	stock_entry.bom_no = production_order.bom_no
 	stock_entry.use_multi_level_bom = production_order.use_multi_level_bom
 	stock_entry.fg_completed_qty = flt(production_order.qty) - flt(production_order.produced_qty)
-	
+
 	if purpose=="Material Transfer":
 		stock_entry.to_warehouse = production_order.wip_warehouse
 	else:
 		stock_entry.from_warehouse = production_order.wip_warehouse
 		stock_entry.to_warehouse = production_order.fg_warehouse
-		
+
 	stock_entry.run_method("get_items")
 	return stock_entry.as_dict()
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index e3fe7c3..5556fbe 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -3,7 +3,7 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe.utils import cstr, flt, cint, nowdate, add_days
+from frappe.utils import cstr, flt, cint, nowdate, add_days, comma_and
 
 from frappe import msgprint, _
 
@@ -16,19 +16,19 @@
 
 	def get_so_details(self, so):
 		"""Pull other details from so"""
-		so = frappe.db.sql("""select transaction_date, customer, grand_total 
+		so = frappe.db.sql("""select transaction_date, customer, grand_total
 			from `tabSales Order` where name = %s""", so, as_dict = 1)
 		ret = {
 			'sales_order_date': so and so[0]['transaction_date'] or '',
 			'customer' : so[0]['customer'] or '',
 			'grand_total': so[0]['grand_total']
 		}
-		return ret	
-			
+		return ret
+
 	def get_item_details(self, item_code):
 		""" Pull other item details from item master"""
 
-		item = frappe.db.sql("""select description, stock_uom, default_bom 
+		item = frappe.db.sql("""select description, stock_uom, default_bom
 			from `tabItem` where name = %s""", item_code, as_dict =1)
 		ret = {
 			'description'	: item and item[0]['description'],
@@ -42,7 +42,7 @@
 
 	def clear_item_table(self):
 		self.set('pp_details', [])
-		
+
 	def validate_company(self):
 		if not self.company:
 			frappe.throw(_("Please enter Company"))
@@ -56,10 +56,10 @@
 			so_filter += ' and so.transaction_date <= "' + self.to_date + '"'
 		if self.customer:
 			so_filter += ' and so.customer = "' + self.customer + '"'
-			
+
 		if self.fg_item:
 			item_filter += ' and item.name = "' + self.fg_item + '"'
-		
+
 		open_so = frappe.db.sql("""
 			select distinct so.name, so.transaction_date, so.customer, so.grand_total
 			from `tabSales Order` so, `tabSales Order Item` so_item
@@ -68,15 +68,15 @@
 				and so.company = %s
 				and ifnull(so_item.qty, 0) > ifnull(so_item.delivered_qty, 0) %s
 				and (exists (select name from `tabItem` item where item.name=so_item.item_code
-					and (ifnull(item.is_pro_applicable, 'No') = 'Yes' 
+					and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
 						or ifnull(item.is_sub_contracted_item, 'No') = 'Yes') %s)
 					or exists (select name from `tabPacked Item` pi
 						where pi.parent = so.name and pi.parent_item = so_item.item_code
 							and exists (select name from `tabItem` item where item.name=pi.item_code
-								and (ifnull(item.is_pro_applicable, 'No') = 'Yes' 
+								and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
 									or ifnull(item.is_sub_contracted_item, 'No') = 'Yes') %s)))
 			""" % ('%s', so_filter, item_filter, item_filter), self.company, as_dict=1)
-		
+
 		self.add_so_in_table(open_so)
 
 	def add_so_in_table(self, open_so):
@@ -94,7 +94,7 @@
 
 	def get_items_from_so(self):
 		""" Pull items from Sales Order, only proction item
-			and subcontracted item will be pulled from Packing item 
+			and subcontracted item will be pulled from Packing item
 			and add items in the table
 		"""
 		items = self.get_items()
@@ -105,36 +105,36 @@
 		if not so_list:
 			msgprint(_("Please enter sales order in the above table"))
 			return []
-			
+
 		items = frappe.db.sql("""select distinct parent, item_code, warehouse,
 			(qty - ifnull(delivered_qty, 0)) as pending_qty
 			from `tabSales Order Item` so_item
 			where parent in (%s) and docstatus = 1 and ifnull(qty, 0) > ifnull(delivered_qty, 0)
 			and exists (select * from `tabItem` item where item.name=so_item.item_code
-				and (ifnull(item.is_pro_applicable, 'No') = 'Yes' 
+				and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
 					or ifnull(item.is_sub_contracted_item, 'No') = 'Yes'))""" % \
 			(", ".join(["%s"] * len(so_list))), tuple(so_list), as_dict=1)
-		
+
 		packed_items = frappe.db.sql("""select distinct pi.parent, pi.item_code, pi.warehouse as reserved_warhouse,
-			(((so_item.qty - ifnull(so_item.delivered_qty, 0)) * pi.qty) / so_item.qty) 
+			(((so_item.qty - ifnull(so_item.delivered_qty, 0)) * pi.qty) / so_item.qty)
 				as pending_qty
 			from `tabSales Order Item` so_item, `tabPacked Item` pi
-			where so_item.parent = pi.parent and so_item.docstatus = 1 
+			where so_item.parent = pi.parent and so_item.docstatus = 1
 			and pi.parent_item = so_item.item_code
 			and so_item.parent in (%s) and ifnull(so_item.qty, 0) > ifnull(so_item.delivered_qty, 0)
 			and exists (select * from `tabItem` item where item.name=pi.item_code
-				and (ifnull(item.is_pro_applicable, 'No') = 'Yes' 
+				and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
 					or ifnull(item.is_sub_contracted_item, 'No') = 'Yes'))""" % \
 			(", ".join(["%s"] * len(so_list))), tuple(so_list), as_dict=1)
 
 		return items + packed_items
-		
+
 
 	def add_items(self, items):
 		self.clear_item_table()
 
 		for p in items:
-			item_details = frappe.db.sql("""select description, stock_uom, default_bom 
+			item_details = frappe.db.sql("""select description, stock_uom, default_bom
 				from tabItem where name=%s""", p['item_code'])
 			pi = self.append('pp_details', {})
 			pi.sales_order				= p['parent']
@@ -145,27 +145,27 @@
 			pi.bom_no					= item_details and item_details[0][2] or ''
 			pi.so_pending_qty			= flt(p['pending_qty'])
 			pi.planned_qty				= flt(p['pending_qty'])
-	
+
 
 	def validate_data(self):
 		self.validate_company()
 		for d in self.get('pp_details'):
 			self.validate_bom_no(d)
 			if not flt(d.planned_qty):
-				frappe.throw("Please Enter Planned Qty for item: %s at row no: %s" % 
+				frappe.throw("Please Enter Planned Qty for item: %s at row no: %s" %
 					(d.item_code, d.idx))
-				
+
 	def validate_bom_no(self, d):
 		if not d.bom_no:
-			frappe.throw("Please enter bom no for item: %s at row no: %s" % 
+			frappe.throw("Please enter bom no for item: %s at row no: %s" %
 				(d.item_code, d.idx))
 		else:
-			bom = frappe.db.sql("""select name from `tabBOM` where name = %s and item = %s 
-				and docstatus = 1 and is_active = 1""", 
+			bom = frappe.db.sql("""select name from `tabBOM` where name = %s and item = %s
+				and docstatus = 1 and is_active = 1""",
 				(d.bom_no, d.item_code), as_dict = 1)
 			if not bom:
 				frappe.throw("""Incorrect BOM No: %s entered for item: %s at row no: %s
-					May be BOM is inactive or for other item or does not exists in the system""" % 
+					May be BOM is inactive or for other item or does not exists in the system""" %
 					(d.bom_no, d.item_doce, d.idx))
 
 	def raise_production_order(self):
@@ -180,9 +180,9 @@
 		if pro:
 			pro = ["""<a href="#Form/Production Order/%s" target="_blank">%s</a>""" % \
 				(p, p) for p in pro]
-			msgprint(_("Production Order(s) created:\n\n") + '\n'.join(pro))
+			msgprint(_("{0} created").format(comma_and(pro)))
 		else :
-			msgprint(_("No Production Order created."))
+			msgprint(_("No Production Orders created"))
 
 	def get_distinct_items_and_boms(self):
 		""" Club similar BOM and item for processing
@@ -191,7 +191,7 @@
 			}
 		"""
 		item_dict, bom_dict = {}, {}
-		for d in self.get("pp_details"):			
+		for d in self.get("pp_details"):
 			bom_dict.setdefault(d.bom_no, []).append([d.sales_order, flt(d.planned_qty)])
 			item_dict[(d.item_code, d.sales_order, d.warehouse)] = {
 				"production_item"	: d.item_code,
@@ -207,7 +207,7 @@
 				"status"			: "Draft",
 			}
 		return bom_dict, item_dict
-		
+
 	def create_production_order(self, items):
 		"""Create production order. Called from Production Planning Tool"""
 		from erpnext.manufacturing.doctype.production_order.production_order import OverProductionError
@@ -216,16 +216,16 @@
 		for key in items:
 			pro = frappe.new_doc("Production Order")
 			pro.update(items[key])
-			
+
 			frappe.flags.mute_messages = True
 			try:
 				pro.insert()
 				pro_list.append(pro.name)
-			except OverProductionError, e:
+			except OverProductionError:
 				pass
-				
+
 			frappe.flags.mute_messages = False
-			
+
 		return pro_list
 
 	def download_raw_materials(self):
@@ -236,41 +236,41 @@
 		return self.get_csv()
 
 	def get_raw_materials(self, bom_dict):
-		""" Get raw materials considering sub-assembly items 
+		""" Get raw materials considering sub-assembly items
 			{
 				"item_code": [qty_required, description, stock_uom, min_order_qty]
 			}
 		"""
 		item_list = []
-		
+
 		for bom, so_wise_qty in bom_dict.items():
 			bom_wise_item_details = {}
 			if self.use_multi_level_bom:
-				# get all raw materials with sub assembly childs					
-				for d in frappe.db.sql("""select fb.item_code, 
-					ifnull(sum(fb.qty_consumed_per_unit), 0) as qty, 
-					fb.description, fb.stock_uom, it.min_order_qty 
-					from `tabBOM Explosion Item` fb,`tabItem` it 
-					where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No' 
-					and ifnull(it.is_sub_contracted_item, 'No') = 'No' 
-					and fb.docstatus<2 and fb.parent=%s 
+				# get all raw materials with sub assembly childs
+				for d in frappe.db.sql("""select fb.item_code,
+					ifnull(sum(fb.qty_consumed_per_unit), 0) as qty,
+					fb.description, fb.stock_uom, it.min_order_qty
+					from `tabBOM Explosion Item` fb,`tabItem` it
+					where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No'
+					and ifnull(it.is_sub_contracted_item, 'No') = 'No'
+					and fb.docstatus<2 and fb.parent=%s
 					group by item_code, stock_uom""", bom, as_dict=1):
 						bom_wise_item_details.setdefault(d.item_code, d)
 			else:
-				# Get all raw materials considering SA items as raw materials, 
+				# Get all raw materials considering SA items as raw materials,
 				# so no childs of SA items
-				for d in frappe.db.sql("""select bom_item.item_code, 
-					ifnull(sum(bom_item.qty_consumed_per_unit), 0) as qty, 
-					bom_item.description, bom_item.stock_uom, item.min_order_qty 
-					from `tabBOM Item` bom_item, tabItem item 
-					where bom_item.parent = %s and bom_item.docstatus < 2 
-					and bom_item.item_code = item.name 
+				for d in frappe.db.sql("""select bom_item.item_code,
+					ifnull(sum(bom_item.qty_consumed_per_unit), 0) as qty,
+					bom_item.description, bom_item.stock_uom, item.min_order_qty
+					from `tabBOM Item` bom_item, tabItem item
+					where bom_item.parent = %s and bom_item.docstatus < 2
+					and bom_item.item_code = item.name
 					group by item_code""", bom, as_dict=1):
 						bom_wise_item_details.setdefault(d.item_code, d)
 
 			for item, item_details in bom_wise_item_details.items():
 				for so_qty in so_wise_qty:
-					item_list.append([item, flt(item_details.qty) * so_qty[1], item_details.description, 
+					item_list.append([item, flt(item_details.qty) * so_qty[1], item_details.description,
 						item_details.stock_uom, item_details.min_order_qty, so_qty[0]])
 
 			self.make_items_dict(item_list)
@@ -286,18 +286,18 @@
 			total_qty = sum([flt(d[0]) for d in self.item_dict[item]])
 			for item_details in self.item_dict[item]:
 				item_list.append([item, item_details[1], item_details[2], item_details[0]])
-				item_qty = frappe.db.sql("""select warehouse, indented_qty, ordered_qty, actual_qty 
+				item_qty = frappe.db.sql("""select warehouse, indented_qty, ordered_qty, actual_qty
 					from `tabBin` where item_code = %s""", item, as_dict=1)
 				i_qty, o_qty, a_qty = 0, 0, 0
 				for w in item_qty:
 					i_qty, o_qty, a_qty = i_qty + flt(w.indented_qty), o_qty + flt(w.ordered_qty), a_qty + flt(w.actual_qty)
-					item_list.append(['', '', '', '', w.warehouse, flt(w.indented_qty), 
+					item_list.append(['', '', '', '', w.warehouse, flt(w.indented_qty),
 						flt(w.ordered_qty), flt(w.actual_qty)])
 				if item_qty:
 					item_list.append(['', '', '', '', 'Total', i_qty, o_qty, a_qty])
 
 		return item_list
-		
+
 	def raise_purchase_request(self):
 		"""
 			Raise Material Request if projected qty is less than qty required
@@ -306,10 +306,10 @@
 		self.validate_data()
 		if not self.purchase_request_for_warehouse:
 			frappe.throw(_("Please enter Warehouse for which Material Request will be raised"))
-			
-		bom_dict = self.get_distinct_items_and_boms()[0]		
+
+		bom_dict = self.get_distinct_items_and_boms()[0]
 		self.get_raw_materials(bom_dict)
-		
+
 		if self.item_dict:
 			self.insert_purchase_request()
 
@@ -348,15 +348,15 @@
 				items_to_be_requested[item]["No Sales Order"] += requested_qty
 
 		return items_to_be_requested
-			
+
 	def get_projected_qty(self):
 		items = self.item_dict.keys()
-		item_projected_qty = frappe.db.sql("""select item_code, sum(projected_qty) 
-			from `tabBin` where item_code in (%s) group by item_code""" % 
+		item_projected_qty = frappe.db.sql("""select item_code, sum(projected_qty)
+			from `tabBin` where item_code in (%s) group by item_code""" %
 			(", ".join(["%s"]*len(items)),), tuple(items))
 
 		return dict(item_projected_qty)
-		
+
 	def insert_purchase_request(self):
 		items_to_be_requested = self.get_requested_items()
 
@@ -397,11 +397,10 @@
 				pr_doc.ignore_permissions = 1
 				pr_doc.submit()
 				purchase_request_list.append(pr_doc.name)
-			
+
 			if purchase_request_list:
 				pur_req = ["""<a href="#Form/Material Request/%s" target="_blank">%s</a>""" % \
 					(p, p) for p in purchase_request_list]
-				msgprint("Material Request(s) created: \n%s" % 
-					"\n".join(pur_req))
+				msgprint(_("Material Requests {0} created").format(comma_and(pur_req)))
 		else:
 			msgprint(_("Nothing to request"))
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 2225acd..bce9c52 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -5,13 +5,13 @@
 import frappe
 
 from frappe.utils import flt, getdate
-from frappe import msgprint
+from frappe import _
 from erpnext.utilities.transaction_base import delete_events
 
 from frappe.model.document import Document
 
 class Project(Document):
-	
+
 	def get_gross_profit(self):
 		pft, per_pft =0, 0
 		pft = flt(self.project_value) - flt(self.est_material_cost)
@@ -19,19 +19,18 @@
 		per_pft = (flt(pft) / flt(self.project_value)) * 100
 		ret = {'gross_margin_value': pft, 'per_gross_margin': per_pft}
 		return ret
-		
+
 	def validate(self):
 		"""validate start date before end date"""
 		if self.project_start_date and self.completion_date:
 			if getdate(self.completion_date) < getdate(self.project_start_date):
-				msgprint("Expected Completion Date can not be less than Project Start Date")
-				raise Exception
-				
+				frappe.throw(_("Expected Completion Date can not be less than Project Start Date"))
+
 	def on_update(self):
 		self.add_calendar_event()
-		
+
 	def update_percent_complete(self):
-		total = frappe.db.sql("""select count(*) from tabTask where project=%s""", 
+		total = frappe.db.sql("""select count(*) from tabTask where project=%s""",
 			self.name)[0][0]
 		if total:
 			completed = frappe.db.sql("""select count(*) from tabTask where
@@ -42,7 +41,7 @@
 	def add_calendar_event(self):
 		# delete any earlier event for this project
 		delete_events(self.doctype, self.name)
-		
+
 		# add events
 		for milestone in self.get("project_milestones"):
 			if milestone.milestone_date:
@@ -57,6 +56,6 @@
 					"ref_type": self.doctype,
 					"ref_name": self.name
 				}).insert()
-	
+
 	def on_trash(self):
 		delete_events(self.doctype, self.name)
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index a4dfb47..7fbaa45 100644
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -5,7 +5,7 @@
 import frappe, json
 
 from frappe.utils import getdate, today
-from frappe import msgprint
+from frappe import _
 
 
 from frappe.model.document import Document
@@ -15,32 +15,30 @@
 		return {
 			"project": self.project
 		}
-		
+
 	def get_customer_details(self):
 		cust = frappe.db.sql("select customer_name from `tabCustomer` where name=%s", self.customer)
 		if cust:
 			ret = {'customer_name': cust and cust[0][0] or ''}
 			return ret
-	
+
 	def validate(self):
 		if self.exp_start_date and self.exp_end_date and getdate(self.exp_start_date) > getdate(self.exp_end_date):
-			msgprint("'Expected Start Date' can not be greater than 'Expected End Date'")
-			raise Exception
-		
+			frappe.throw(_("'Expected Start Date' can not be greater than 'Expected End Date'"))
+
 		if self.act_start_date and self.act_end_date and getdate(self.act_start_date) > getdate(self.act_end_date):
-			msgprint("'Actual Start Date' can not be greater than 'Actual End Date'")
-			raise Exception
-			
+			frappe.throw(_("'Actual Start Date' can not be greater than 'Actual End Date'"))
+
 		self.update_status()
 
 	def update_status(self):
 		status = frappe.db.get_value("Task", self.name, "status")
 		if self.status=="Working" and status !="Working" and not self.act_start_date:
 			self.act_start_date = today()
-			
+
 		if self.status=="Closed" and status != "Closed" and not self.act_end_date:
 			self.act_end_date = today()
-			
+
 	def on_update(self):
 		"""update percent complete in project"""
 		if self.project:
@@ -55,14 +53,14 @@
 
 	conditions = build_match_conditions("Task")
 	conditions and (" and " + conditions) or ""
-	
+
 	if filters:
 		filters = json.loads(filters)
 		for key in filters:
 			if filters[key]:
 				conditions += " and " + key + ' = "' + filters[key].replace('"', '\"') + '"'
-	
-	data = frappe.db.sql("""select name, exp_start_date, exp_end_date, 
+
+	data = frappe.db.sql("""select name, exp_start_date, exp_end_date,
 		subject, status, project from `tabTask`
 		where ((exp_start_date between '%(start)s' and '%(end)s') \
 			or (exp_end_date between '%(start)s' and '%(end)s'))
@@ -79,7 +77,7 @@
 	return frappe.db.sql(""" select name from `tabProject`
 			where %(key)s like "%(txt)s"
 				%(mcond)s
-			order by name 
-			limit %(start)s, %(page_len)s """ % {'key': searchfield, 
+			order by name
+			limit %(start)s, %(page_len)s """ % {'key': searchfield,
 			'txt': "%%%s%%" % txt, 'mcond':get_match_cond(doctype),
-			'start': start, 'page_len': page_len})
\ No newline at end of file
+			'start': start, 'page_len': page_len})
diff --git a/erpnext/projects/doctype/time_log/time_log.py b/erpnext/projects/doctype/time_log/time_log.py
index f184db3..eb8afc7 100644
--- a/erpnext/projects/doctype/time_log/time_log.py
+++ b/erpnext/projects/doctype/time_log/time_log.py
@@ -6,7 +6,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import cstr
+from frappe.utils import cstr, comma_and
 
 
 class OverlapError(frappe.ValidationError): pass
@@ -14,12 +14,12 @@
 from frappe.model.document import Document
 
 class TimeLog(Document):
-		
+
 	def validate(self):
 		self.set_status()
 		self.validate_overlap()
 		self.calculate_total_hours()
-		
+
 	def calculate_total_hours(self):
 		from frappe.utils import time_diff_in_hours
 		self.hours = time_diff_in_hours(self.to_time, self.from_time)
@@ -30,36 +30,35 @@
 			1: "Submitted",
 			2: "Cancelled"
 		}[self.docstatus or 0]
-		
+
 		if self.time_log_batch:
 			self.status="Batched for Billing"
-			
+
 		if self.sales_invoice:
 			self.status="Billed"
-			
-	def validate_overlap(self):		
+
+	def validate_overlap(self):
 		existing = frappe.db.sql_list("""select name from `tabTime Log` where owner=%s and
 			(
-				(from_time between %s and %s) or 
-				(to_time between %s and %s) or 
-				(%s between from_time and to_time)) 
+				(from_time between %s and %s) or
+				(to_time between %s and %s) or
+				(%s between from_time and to_time))
 			and name!=%s
 			and ifnull(task, "")=%s
-			and docstatus < 2""", 
-			(self.owner, self.from_time, self.to_time, self.from_time, 
+			and docstatus < 2""",
+			(self.owner, self.from_time, self.to_time, self.from_time,
 				self.to_time, self.from_time, self.name or "No Name",
 				cstr(self.task)))
 
 		if existing:
-			frappe.msgprint(_("This Time Log conflicts with") + ":" + ', '.join(existing),
-				raise_exception=OverlapError)
-	
+			frappe.throw(_("This Time Log conflicts with {0}").format(comma_and(existing)), OverlapError)
+
 	def before_cancel(self):
 		self.set_status()
-	
+
 	def before_update_after_submit(self):
 		self.set_status()
-				
+
 @frappe.whitelist()
 def get_events(start, end):
 	from frappe.widgets.reportview import build_match_conditions
@@ -67,7 +66,7 @@
 		frappe.msgprint(_("No Permission"), raise_exception=1)
 
 	match = build_match_conditions("Time Log")
-	data = frappe.db.sql("""select name, from_time, to_time, 
+	data = frappe.db.sql("""select name, from_time, to_time,
 		activity_type, task, project from `tabTime Log`
 		where from_time between '%(start)s' and '%(end)s' or to_time between '%(start)s' and '%(end)s'
 		%(match)s""" % {
@@ -75,12 +74,12 @@
 			"end": end,
 			"match": match and (" and " + match) or ""
 		}, as_dict=True, update={"allDay": 0})
-		
+
 	for d in data:
 		d.title = d.name + ": " + (d.activity_type or "[Activity Type not set]")
 		if d.task:
 			d.title += " for Task: " + d.task
 		if d.project:
 			d.title += " for Project: " + d.project
-			
+
 	return data
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch.py b/erpnext/projects/doctype/time_log_batch/time_log_batch.py
index b8204e4..882ed99 100644
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch.py
+++ b/erpnext/projects/doctype/time_log_batch/time_log_batch.py
@@ -29,8 +29,7 @@
 
 	def validate_time_log_is_submitted(self, tl):
 		if tl.status != "Submitted" and self.docstatus == 0:
-			frappe.msgprint(_("Time Log must have status 'Submitted'") + \
-				" :" + tl.name + " (" + _(tl.status) + ")", raise_exception=True)
+			frappe.throw(_("Time Log {0} must be 'Submitted'").format(tl.name))
 
 	def set_status(self):
 		self.status = {
diff --git a/erpnext/selling/doctype/installation_note/installation_note.py b/erpnext/selling/doctype/installation_note/installation_note.py
index 1fa91cc..7d2d3d0 100644
--- a/erpnext/selling/doctype/installation_note/installation_note.py
+++ b/erpnext/selling/doctype/installation_note/installation_note.py
@@ -6,7 +6,7 @@
 
 from frappe.utils import cstr, getdate
 
-from frappe import msgprint
+from frappe import _
 from erpnext.stock.utils import get_valid_serial_nos
 
 from erpnext.utilities.transaction_base import TransactionBase
@@ -46,15 +46,14 @@
 	def is_serial_no_added(self, item_code, serial_no):
 		ar_required = frappe.db.get_value("Item", item_code, "has_serial_no")
 		if ar_required == 'Yes' and not serial_no:
-			msgprint("Serial No is mandatory for item: " + item_code, raise_exception=1)
+			frappe.throw(_("Serial No is mandatory for Item {0}").format(item_code))
 		elif ar_required != 'Yes' and cstr(serial_no).strip():
-			msgprint("If serial no required, please select 'Yes' in 'Has Serial No' in Item :" +
-				item_code, raise_exception=1)
+			frappe.throw(_("Item {0} is not a serialized Item").format(item_code))
 
 	def is_serial_no_exist(self, item_code, serial_no):
 		for x in serial_no:
 			if not frappe.db.exists("Serial No", x):
-				msgprint("Serial No " + x + " does not exist in the system", raise_exception=1)
+				frappe.throw(_("Serial No {0} does not exist").format(x))
 
 	def is_serial_no_installed(self,cur_s_no,item_code):
 		for x in cur_s_no:
@@ -62,8 +61,7 @@
 			status = status and status[0][0] or ''
 
 			if status == 'Installed':
-				msgprint("Item "+item_code+" with serial no. " + x + " already installed",
-					raise_exception=1)
+				frappe.throw(_("Item {0} with Serial No {1} is already installed").format(item_code, x))
 
 	def get_prevdoc_serial_no(self, prevdoc_detail_docname):
 		serial_nos = frappe.db.get_value("Delivery Note Item",
@@ -73,8 +71,7 @@
 	def is_serial_no_match(self, cur_s_no, prevdoc_s_no, prevdoc_docname):
 		for sr in cur_s_no:
 			if sr not in prevdoc_s_no:
-				msgprint("Serial No. " + sr + " is not matching with the Delivery Note " +
-					prevdoc_docname, raise_exception = 1)
+				frappe.throw(_("Serial No {0} does not belong to Delivery Note {1}").format(sr, prevdoc_docname))
 
 	def validate_serial_no(self):
 		cur_s_no, prevdoc_s_no, sr_list = [], [], []
@@ -95,12 +92,11 @@
 			if d.prevdoc_docname:
 				d_date = frappe.db.get_value("Delivery Note", d.prevdoc_docname, "posting_date")
 				if d_date > getdate(self.inst_date):
-					msgprint("Installation Date can not be before Delivery Date " + cstr(d_date) +
-						" for item "+d.item_code, raise_exception=1)
+					frappe.throw(_("Installation date cannot be before delivery date for Item {0}").format(d.item_code))
 
 	def check_item_table(self):
 		if not(self.get('installed_item_details')):
-			msgprint("Please fetch items from Delivery Note selected", raise_exception=1)
+			frappe.throw(_("Please pull items from Delivery Note"))
 
 	def on_update(self):
 		frappe.db.set(self, 'status', 'Draft')
diff --git a/erpnext/selling/doctype/lead/lead.py b/erpnext/selling/doctype/lead/lead.py
index 8163be3..c400e55 100644
--- a/erpnext/selling/doctype/lead/lead.py
+++ b/erpnext/selling/doctype/lead/lead.py
@@ -4,10 +4,10 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import cstr, validate_email_add, cint
+from frappe.utils import cstr, validate_email_add, cint, comma_and
 from frappe import session
 
-	
+
 from erpnext.controllers.selling_controller import SellingController
 
 class Lead(SellingController):
@@ -15,7 +15,7 @@
 		customer = frappe.db.get_value("Customer", {"lead_name": self.name})
 		if customer:
 			self.set("__is_customer", customer)
-	
+
 	def validate(self):
 		self._prev = frappe._dict({
 			"contact_date": frappe.db.get_value("Lead", self.name, "contact_date") if \
@@ -23,20 +23,20 @@
 			"contact_by": frappe.db.get_value("Lead", self.name, "contact_by") if \
 				(not cint(self.get("__islocal"))) else None,
 		})
-		
+
 		self.set_status()
-		
+
 		if self.source == 'Campaign' and not self.campaign_name and session['user'] != 'Guest':
 			frappe.throw("Please specify campaign name")
-		
+
 		if self.email_id:
 			if not validate_email_add(self.email_id):
 				frappe.throw('Please enter valid email id.')
-				
+
 	def on_update(self):
 		self.check_email_id_is_unique()
 		self.add_calendar_event()
-		
+
 	def add_calendar_event(self, opts=None, force=False):
 		super(Lead, self).add_calendar_event({
 			"owner": self.lead_owner,
@@ -48,22 +48,21 @@
 	def check_email_id_is_unique(self):
 		if self.email_id:
 			# validate email is unique
-			email_list = frappe.db.sql("""select name from tabLead where email_id=%s""", 
+			email_list = frappe.db.sql("""select name from tabLead where email_id=%s""",
 				self.email_id)
 			if len(email_list) > 1:
 				items = [e[0] for e in email_list if e[0]!=self.name]
-				frappe.msgprint(_("""Email Id must be unique, already exists for: """) + \
-					", ".join(items), raise_exception=True)
+				frappe.throw(_("Email id must be unique, already exists for {0}").format(comma_and(items)))
 
 	def on_trash(self):
 		frappe.db.sql("""update `tabSupport Ticket` set lead='' where lead=%s""",
 			self.name)
-		
+
 		self.delete_events()
-		
+
 	def has_customer(self):
 		return frappe.db.get_value("Customer", {"lead_name": self.name})
-		
+
 	def has_opportunity(self):
 		return frappe.db.get_value("Opportunity", {"lead": self.name, "docstatus": 1,
 			"status": ["!=", "Lost"]})
@@ -74,7 +73,7 @@
 
 def _make_customer(source_name, target_doc=None, ignore_permissions=False):
 	from frappe.model.mapper import get_mapped_doc
-	
+
 	def set_missing_values(source, target):
 		if source.company_name:
 			target.customer_type = "Company"
@@ -82,10 +81,10 @@
 		else:
 			target.customer_type = "Individual"
 			target.customer_name = source.lead_name
-			
+
 		target.customer_group = frappe.db.get_default("customer_group")
-			
-	doclist = get_mapped_doc("Lead", source_name, 
+
+	doclist = get_mapped_doc("Lead", source_name,
 		{"Lead": {
 			"doctype": "Customer",
 			"field_map": {
@@ -95,14 +94,14 @@
 				"fax": "fax_1"
 			}
 		}}, target_doc, set_missing_values, ignore_permissions=ignore_permissions)
-		
+
 	return doclist
-	
+
 @frappe.whitelist()
 def make_opportunity(source_name, target_doc=None):
 	from frappe.model.mapper import get_mapped_doc
-		
-	doclist = get_mapped_doc("Lead", source_name, 
+
+	doclist = get_mapped_doc("Lead", source_name,
 		{"Lead": {
 			"doctype": "Opportunity",
 			"field_map": {
@@ -115,19 +114,19 @@
 				"mobile_no": "contact_mobile"
 			}
 		}}, target_doc)
-		
+
 	return doclist
-	
+
 @frappe.whitelist()
 def get_lead_details(lead):
 	if not lead: return {}
-	
+
 	from erpnext.accounts.party import set_address_details
 	out = frappe._dict()
-	
+
 	lead_doc = frappe.get_doc("Lead", lead)
 	lead = lead_doc
-		
+
 	out.update({
 		"territory": lead.territory,
 		"customer_name": lead.company_name or lead.lead_name,
@@ -136,7 +135,7 @@
 		"contact_mobile": lead.mobile_no,
 		"contact_phone": lead.phone,
 	})
-	
+
 	set_address_details(out, lead, "Lead")
 
-	return out
\ No newline at end of file
+	return out
diff --git a/erpnext/selling/doctype/opportunity/opportunity.py b/erpnext/selling/doctype/opportunity/opportunity.py
index c87c983..9ba6e56 100644
--- a/erpnext/selling/doctype/opportunity/opportunity.py
+++ b/erpnext/selling/doctype/opportunity/opportunity.py
@@ -8,13 +8,13 @@
 
 from frappe import msgprint, _
 
-	
+
 from erpnext.utilities.transaction_base import TransactionBase
 
 class Opportunity(TransactionBase):
 	fname = 'enq_details'
 	tname = 'Opportunity Item'
-		
+
 	def get_item_details(self, item_code):
 		item = frappe.db.sql("""select item_name, stock_uom, description_html, description, item_group, brand
 			from `tabItem` where name = %s""", item_code, as_dict=1)
@@ -28,7 +28,7 @@
 		return ret
 
 	def get_cust_address(self,name):
-		details = frappe.db.sql("""select customer_name, address, territory, customer_group 
+		details = frappe.db.sql("""select customer_name, address, territory, customer_group
 			from `tabCustomer` where name = %s and docstatus != 2""", (name), as_dict = 1)
 		if details:
 			ret = {
@@ -39,28 +39,28 @@
 			}
 			# ********** get primary contact details (this is done separately coz. , in case there is no primary contact thn it would not be able to fetch customer details in case of join query)
 
-			contact_det = frappe.db.sql("""select contact_name, contact_no, email_id 
-				from `tabContact` where customer = %s and is_customer = 1 
+			contact_det = frappe.db.sql("""select contact_name, contact_no, email_id
+				from `tabContact` where customer = %s and is_customer = 1
 					and is_primary_contact = 'Yes' and docstatus != 2""", name, as_dict = 1)
 
 			ret['contact_person'] = contact_det and contact_det[0]['contact_name'] or ''
 			ret['contact_no']		 = contact_det and contact_det[0]['contact_no'] or ''
 			ret['email_id']			 = contact_det and contact_det[0]['email_id'] or ''
-		
+
 			return ret
 		else:
 			msgprint("Customer : %s does not exist in system." % (name))
 			raise Exception
-			
+
 	def on_update(self):
 		self.add_calendar_event()
 
 	def add_calendar_event(self, opts=None, force=False):
 		if not opts:
 			opts = frappe._dict()
-		
+
 		opts.description = ""
-		
+
 		if self.customer:
 			if self.contact_person:
 				opts.description = 'Contact '+cstr(self.contact_person)
@@ -71,23 +71,22 @@
 				opts.description = 'Contact '+cstr(self.contact_display)
 			else:
 				opts.description = 'Contact lead '+cstr(self.lead)
-				
+
 		opts.subject = opts.description
 		opts.description += '. By : ' + cstr(self.contact_by)
-		
+
 		if self.to_discuss:
 			opts.description += ' To Discuss : ' + cstr(self.to_discuss)
-		
+
 		super(Opportunity, self).add_calendar_event(opts, force)
 
 	def validate_item_details(self):
 		if not self.get('enquiry_details'):
-			msgprint("Please select items for which enquiry needs to be made")
-			raise Exception
+			frappe.throw(_("Items required"))
 
 	def validate_lead_cust(self):
 		if self.enquiry_from == 'Lead' and not self.lead:
-			msgprint("Lead Id is mandatory if 'Opportunity From' is selected as Lead", raise_exception=1)
+			frappe.throw(_("Lead must be set if Opportunity is made from Lead"))
 		elif self.enquiry_from == 'Customer' and not self.customer:
 			msgprint("Customer is mandatory if 'Opportunity From' is selected as Customer", raise_exception=1)
 
@@ -98,24 +97,24 @@
 			"contact_by": frappe.db.get_value("Opportunity", self.name, "contact_by") if \
 				(not cint(self.get("__islocal"))) else None,
 		})
-		
+
 		self.set_status()
 		self.validate_item_details()
 		self.validate_uom_is_integer("uom", "qty")
 		self.validate_lead_cust()
-		
+
 		from erpnext.accounts.utils import validate_fiscal_year
 		validate_fiscal_year(self.transaction_date, self.fiscal_year, "Opportunity Date")
 
 	def on_submit(self):
 		if self.lead:
 			frappe.get_doc("Lead", self.lead).set_status(update=True)
-	
+
 	def on_cancel(self):
 		if self.has_quotation():
 			frappe.throw(_("Cannot Cancel Opportunity as Quotation Exists"))
 		self.set_status(update=True)
-		
+
 	def declare_enquiry_lost(self,arg):
 		if not self.has_quotation():
 			frappe.db.set(self, 'status', 'Lost')
@@ -125,40 +124,40 @@
 
 	def on_trash(self):
 		self.delete_events()
-		
+
 	def has_quotation(self):
 		return frappe.db.get_value("Quotation Item", {"prevdoc_docname": self.name, "docstatus": 1})
-		
+
 @frappe.whitelist()
 def make_quotation(source_name, target_doc=None):
 	from frappe.model.mapper import get_mapped_doc
-	
+
 	def set_missing_values(source, target):
 		quotation = frappe.get_doc(target)
 		quotation.run_method("onload_post_render")
 		quotation.run_method("calculate_taxes_and_totals")
-	
+
 	doclist = get_mapped_doc("Opportunity", source_name, {
 		"Opportunity": {
-			"doctype": "Quotation", 
+			"doctype": "Quotation",
 			"field_map": {
-				"enquiry_from": "quotation_to", 
-				"enquiry_type": "order_type", 
-				"name": "enq_no", 
+				"enquiry_from": "quotation_to",
+				"enquiry_type": "order_type",
+				"name": "enq_no",
 			},
 			"validation": {
 				"docstatus": ["=", 1]
 			}
-		}, 
+		},
 		"Opportunity Item": {
-			"doctype": "Quotation Item", 
+			"doctype": "Quotation Item",
 			"field_map": {
-				"parent": "prevdoc_docname", 
-				"parenttype": "prevdoc_doctype", 
+				"parent": "prevdoc_docname",
+				"parenttype": "prevdoc_doctype",
 				"uom": "stock_uom"
 			},
 			"add_if_empty": True
 		}
 	}, target_doc, set_missing_values)
-		
-	return doclist
\ No newline at end of file
+
+	return doclist
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index d6ade9e..d7f58a7 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -5,7 +5,7 @@
 import frappe
 from frappe.utils import cstr
 
-from frappe import _, msgprint
+from frappe import _
 
 from erpnext.controllers.selling_controller import SellingController
 
@@ -20,31 +20,28 @@
 		chk_dupl_itm = []
 		for d in self.get('quotation_details'):
 			if [cstr(d.item_code),cstr(d.description)] in chk_dupl_itm:
-				msgprint("Item %s has been entered twice. Please change description atleast to continue" % d.item_code)
-				raise Exception
+				frappe.throw(_("Item {0} with same description entered twice").format(d.item_code))
 			else:
 				chk_dupl_itm.append([cstr(d.item_code),cstr(d.description)])
 
 	def validate_order_type(self):
 		super(Quotation, self).validate_order_type()
-		
+
 		if self.order_type in ['Maintenance', 'Service']:
 			for d in self.get('quotation_details'):
 				is_service_item = frappe.db.sql("select is_service_item from `tabItem` where name=%s", d.item_code)
 				is_service_item = is_service_item and is_service_item[0][0] or 'No'
-				
+
 				if is_service_item == 'No':
-					msgprint("You can not select non service item "+d.item_code+" in Maintenance Quotation")
-					raise Exception
+					frappe.throw(_("Item {0} must be Service Item").format(d.item_code))
 		else:
 			for d in self.get('quotation_details'):
 				is_sales_item = frappe.db.sql("select is_sales_item from `tabItem` where name=%s", d.item_code)
 				is_sales_item = is_sales_item and is_sales_item[0][0] or 'No'
-				
+
 				if is_sales_item == 'No':
-					msgprint("You can not select non sales item "+d.item_code+" in Sales Quotation")
-					raise Exception
-	
+					frappe.throw(_("Item {0} must be Sales Item").format(d.item_code))
+
 	def validate(self):
 		super(Quotation, self).validate()
 		self.set_status()
@@ -56,7 +53,7 @@
 		for opportunity in list(set([d.prevdoc_docname for d in self.get("quotation_details")])):
 			if opportunity:
 				frappe.get_doc("Opportunity", opportunity).set_status(update=True)
-	
+
 	def declare_order_lost(self, arg):
 		if not self.has_sales_order():
 			frappe.db.set(self, 'status', 'Lost')
@@ -64,26 +61,25 @@
 			self.update_opportunity()
 		else:
 			frappe.throw(_("Cannot set as Lost as Sales Order is made."))
-	
+
 	def check_item_table(self):
 		if not self.get('quotation_details'):
-			msgprint("Please enter item details")
-			raise Exception
-		
+			frappe.throw(_("Please enter item details"))
+
 	def on_submit(self):
 		self.check_item_table()
-		
+
 		# Check for Approving Authority
 		frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype, self.company, self.grand_total, self)
-			
+
 		#update enquiry status
 		self.update_opportunity()
-		
+
 	def on_cancel(self):
 		#update enquiry status
 		self.set_status()
 		self.update_opportunity()
-			
+
 	def print_other_charges(self,docname):
 		print_lst = []
 		for d in self.get('other_charges'):
@@ -92,51 +88,51 @@
 			lst1.append(d.total)
 			print_lst.append(lst1)
 		return print_lst
-		
-	
+
+
 @frappe.whitelist()
 def make_sales_order(source_name, target_doc=None):
 	return _make_sales_order(source_name, target_doc)
-	
+
 def _make_sales_order(source_name, target_doc=None, ignore_permissions=False):
 	from frappe.model.mapper import get_mapped_doc
-	
+
 	customer = _make_customer(source_name, ignore_permissions)
-	
+
 	def set_missing_values(source, target):
 		if customer:
 			target.customer = customer.name
 			target.customer_name = customer.customer_name
-			
+
 		si = frappe.get_doc(target)
 		si.ignore_permissions = ignore_permissions
 		si.run_method("onload_post_render")
-			
+
 	doclist = get_mapped_doc("Quotation", source_name, {
 			"Quotation": {
-				"doctype": "Sales Order", 
+				"doctype": "Sales Order",
 				"validation": {
 					"docstatus": ["=", 1]
 				}
-			}, 
+			},
 			"Quotation Item": {
-				"doctype": "Sales Order Item", 
+				"doctype": "Sales Order Item",
 				"field_map": {
 					"parent": "prevdoc_docname"
 				}
-			}, 
+			},
 			"Sales Taxes and Charges": {
 				"doctype": "Sales Taxes and Charges",
 				"add_if_empty": True
-			}, 
+			},
 			"Sales Team": {
 				"doctype": "Sales Team",
 				"add_if_empty": True
 			}
 		}, target_doc, set_missing_values, ignore_permissions=ignore_permissions)
-		
+
 	# postprocess: fetch shipping address, set missing values
-		
+
 	return doclist
 
 def _make_customer(source_name, ignore_permissions=False):
@@ -152,7 +148,7 @@
 			if quotation[1] == "Shopping Cart":
 				customer.customer_group = frappe.db.get_value("Shopping Cart Settings", None,
 					"default_customer_group")
-			
+
 			try:
 				customer.insert()
 				return customer
diff --git a/erpnext/selling/doctype/sales_bom/sales_bom.py b/erpnext/selling/doctype/sales_bom/sales_bom.py
index 5601d7f..724e009 100644
--- a/erpnext/selling/doctype/sales_bom/sales_bom.py
+++ b/erpnext/selling/doctype/sales_bom/sales_bom.py
@@ -4,6 +4,8 @@
 from __future__ import unicode_literals
 import frappe
 
+from frappe import _
+
 from frappe.model.document import Document
 
 class SalesBOM(Document):
@@ -11,7 +13,7 @@
 
 	def autoname(self):
 		self.name = self.new_item_code
-	
+
 	def validate(self):
 		self.validate_main_item()
 
@@ -22,23 +24,22 @@
 		"""main item must have Is Stock Item as No and Is Sales Item as Yes"""
 		if not frappe.db.sql("""select name from tabItem where name=%s and
 			ifnull(is_stock_item,'')='No' and ifnull(is_sales_item,'')='Yes'""", self.new_item_code):
-			frappe.msgprint("""Parent Item %s is either a Stock Item or a not a Sales Item""",
-				raise_exception=1)
+			frappe.throw(_("Parent Item {0} must be not Stock Item and must be a Sales Item").format(self.new_item_code))
 
 	def get_item_details(self, name):
-		det = frappe.db.sql("""select description, stock_uom from `tabItem` 
+		det = frappe.db.sql("""select description, stock_uom from `tabItem`
 			where name = %s""", name)
 		return {
-			'description' : det and det[0][0] or '', 
+			'description' : det and det[0][0] or '',
 			'uom': det and det[0][1] or ''
 		}
 
 def get_new_item_code(doctype, txt, searchfield, start, page_len, filters):
 	from erpnext.controllers.queries import get_match_cond
-	
-	return frappe.db.sql("""select name, item_name, description from tabItem 
+
+	return frappe.db.sql("""select name, item_name, description from tabItem
 		where is_stock_item="No" and is_sales_item="Yes"
 		and name not in (select name from `tabSales BOM`) and %s like %s
-		%s limit %s, %s""" % (searchfield, "%s", 
-		get_match_cond(doctype),"%s", "%s"), 
-		("%%%s%%" % txt, start, page_len))
\ No newline at end of file
+		%s limit %s, %s""" % (searchfield, "%s",
+		get_match_cond(doctype),"%s", "%s"),
+		("%%%s%%" % txt, start, page_len))
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 103144f..d4054dd 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -5,9 +5,9 @@
 import frappe
 import frappe.utils
 
-from frappe.utils import cstr, flt, getdate
+from frappe.utils import cstr, flt, getdate, comma_and
 
-from frappe import msgprint
+from frappe import _
 from frappe.model.mapper import get_mapped_doc
 
 from erpnext.controllers.selling_controller import SellingController
@@ -23,22 +23,19 @@
 		# validate transaction date v/s delivery date
 		if self.delivery_date:
 			if getdate(self.transaction_date) > getdate(self.delivery_date):
-				msgprint("Expected Delivery Date cannot be before Sales Order Date")
-				raise Exception
+				frappe.throw(_("Expected Delivery Date cannot be before Sales Order Date"))
 
 	def validate_po(self):
 		# validate p.o date v/s delivery date
 		if self.po_date and self.delivery_date and getdate(self.po_date) > getdate(self.delivery_date):
-			msgprint("Expected Delivery Date cannot be before Purchase Order Date")
-			raise Exception
+			frappe.throw(_("Expected Delivery Date cannot be before Purchase Order Date"))
 
 		if self.po_no and self.customer:
 			so = frappe.db.sql("select name from `tabSales Order` \
 				where ifnull(po_no, '') = %s and name != %s and docstatus < 2\
 				and customer = %s", (self.po_no, self.name, self.customer))
 			if so and so[0][0]:
-				msgprint("""Another Sales Order (%s) exists against same PO No and Customer.
-					Please be sure, you are not making duplicate entry.""" % so[0][0])
+				frappe.msgprint(_("Warning: Sales Order {0} already exists against same Purchase Order number").format(so[0][0]))
 
 	def validate_for_items(self):
 		check_list, flag = [], 0
@@ -49,16 +46,15 @@
 
 			if frappe.db.get_value("Item", d.item_code, "is_stock_item") == 'Yes':
 				if not d.warehouse:
-					msgprint("""Please enter Reserved Warehouse for item %s
-						as it is stock Item""" % d.item_code, raise_exception=1)
+					frappe.throw(_("Reserved warehouse required for stock item {0}").format(d.item_code))
 
 				if e in check_list:
-					msgprint("Item %s has been entered twice." % d.item_code)
+					frappe.throw(_("Item {0} has been entered twice").format(d.item_code))
 				else:
 					check_list.append(e)
 			else:
 				if f in chk_dupl_itm:
-					msgprint("Item %s has been entered twice." % d.item_code)
+					frappe.throw(_("Item {0} has been entered twice").format(d.item_code))
 				else:
 					chk_dupl_itm.append(f)
 
@@ -74,16 +70,14 @@
 			if d.prevdoc_docname:
 				res = frappe.db.sql("select name from `tabQuotation` where name=%s and order_type = %s", (d.prevdoc_docname, self.order_type))
 				if not res:
-					msgprint("""Order Type (%s) should be same in Quotation: %s \
-						and current Sales Order""" % (self.order_type, d.prevdoc_docname))
+					frappe.msgprint(_("Quotation {0} not of type {1}").format(d.prevdoc_docname, self.order_type))
 
 	def validate_order_type(self):
 		super(SalesOrder, self).validate_order_type()
 
 	def validate_delivery_date(self):
 		if self.order_type == 'Sales' and not self.delivery_date:
-			msgprint("Please enter 'Expected Delivery Date'")
-			raise Exception
+			frappe.throw(_("Please enter 'Expected Delivery Date'"))
 
 		self.validate_sales_mntc_quotation()
 
@@ -93,8 +87,7 @@
 				and (customer = %s or ifnull(customer,'')='')""",
 					(self.project_name, self.customer))
 			if not res:
-				msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.customer,self.project_name,self.project_name))
-				raise Exception
+				frappe.throw(_("Customer {0} does not belong to project {1}").format(self.customer, self.project_name))
 
 	def validate(self):
 		super(SalesOrder, self).validate()
@@ -169,8 +162,8 @@
 	def on_cancel(self):
 		# Cannot cancel stopped SO
 		if self.status == 'Stopped':
-			msgprint("Sales Order : '%s' cannot be cancelled as it is Stopped. Unstop it for any further transactions" %(self.name))
-			raise Exception
+			frappe.throw(_("Stopped order cannot be cancelled. Unstop to cancel."))
+
 		self.check_nextdoc_docstatus()
 		self.update_stock_ledger(update_stock = -1)
 
@@ -180,55 +173,56 @@
 
 	def check_nextdoc_docstatus(self):
 		# Checks Delivery Note
-		submit_dn = frappe.db.sql("select t1.name from `tabDelivery Note` t1,`tabDelivery Note Item` t2 where t1.name = t2.parent and t2.against_sales_order = %s and t1.docstatus = 1", self.name)
+		submit_dn = frappe.db.sql_list("""select t1.name from `tabDelivery Note` t1,`tabDelivery Note Item` t2
+			where t1.name = t2.parent and t2.against_sales_order = %s and t1.docstatus = 1""", self.name)
 		if submit_dn:
-			msgprint("Delivery Note : " + cstr(submit_dn[0][0]) + " has been submitted against " + cstr(self.doctype) + ". Please cancel Delivery Note : " + cstr(submit_dn[0][0]) + " first and then cancel "+ cstr(self.doctype), raise_exception = 1)
+			frappe.throw(_("Delivery Notes {0} must be cancelled before cancelling this Sales Order").format(comma_and(submit_dn)))
 
 		# Checks Sales Invoice
-		submit_rv = frappe.db.sql("""select t1.name
+		submit_rv = frappe.db.sql_list("""select t1.name
 			from `tabSales Invoice` t1,`tabSales Invoice Item` t2
 			where t1.name = t2.parent and t2.sales_order = %s and t1.docstatus = 1""",
 			self.name)
 		if submit_rv:
-			msgprint("Sales Invoice : " + cstr(submit_rv[0][0]) + " has already been submitted against " +cstr(self.doctype)+ ". Please cancel Sales Invoice : "+ cstr(submit_rv[0][0]) + " first and then cancel "+ cstr(self.doctype), raise_exception = 1)
+			frappe.throw(_("Sales Invoice {0} must be cancelled before cancelling this Sales Order").format(comma_and(submit_rv)))
 
 		#check maintenance schedule
-		submit_ms = frappe.db.sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1",self.name)
+		submit_ms = frappe.db.sql_list("""select t1.name from `tabMaintenance Schedule` t1,
+			`tabMaintenance Schedule Item` t2
+			where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1""", self.name)
 		if submit_ms:
-			msgprint("Maintenance Schedule : " + cstr(submit_ms[0][0]) + " has already been submitted against " +cstr(self.doctype)+ ". Please cancel Maintenance Schedule : "+ cstr(submit_ms[0][0]) + " first and then cancel "+ cstr(self.doctype), raise_exception = 1)
+			frappe.throw(_("Maintenance Schedule {0} must be cancelled before cancelling this Sales Order").format(comma_and(submit_ms)))
 
 		# check maintenance visit
-		submit_mv = frappe.db.sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1",self.name)
+		submit_mv = frappe.db.sql_list("""select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2
+			where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1""",self.name)
 		if submit_mv:
-			msgprint("Maintenance Visit : " + cstr(submit_mv[0][0]) + " has already been submitted against " +cstr(self.doctype)+ ". Please cancel Maintenance Visit : " + cstr(submit_mv[0][0]) + " first and then cancel "+ cstr(self.doctype), raise_exception = 1)
+			frappe.throw(_("Maintenance Visit {0} must be cancelled before cancelling this Sales Order").format(comma_and(submit_mv)))
 
 		# check production order
-		pro_order = frappe.db.sql("""select name from `tabProduction Order` where sales_order = %s and docstatus = 1""", self.name)
+		pro_order = frappe.db.sql_list("""select name from `tabProduction Order`
+			where sales_order = %s and docstatus = 1""", self.name)
 		if pro_order:
-			msgprint("""Production Order: %s exists against this sales order.
-				Please cancel production order first and then cancel this sales order""" %
-				pro_order[0][0], raise_exception=1)
+			frappe.throw(_("Production Order {0} must be cancelled before cancelling this Sales Order").format(comma_and(pro_order)))
 
 	def check_modified_date(self):
 		mod_db = frappe.db.get_value("Sales Order", self.name, "modified")
 		date_diff = frappe.db.sql("select TIMEDIFF('%s', '%s')" %
 			( mod_db, cstr(self.modified)))
 		if date_diff and date_diff[0][0]:
-			msgprint("%s: %s has been modified after you have opened. Please Refresh"
-				% (self.doctype, self.name), raise_exception=1)
+			frappe.throw(_("{0} {1} has been modified. Please Refresh").format(self.doctype, self.name))
 
 	def stop_sales_order(self):
 		self.check_modified_date()
 		self.update_stock_ledger(-1)
 		frappe.db.set(self, 'status', 'Stopped')
-		msgprint("""%s: %s has been Stopped. To make transactions against this Sales Order
-			you need to Unstop it.""" % (self.doctype, self.name))
+		frappe.msgprint(_("{0} {1} status is Stopped").format(self.doctype, self.name))
 
 	def unstop_sales_order(self):
 		self.check_modified_date()
 		self.update_stock_ledger(1)
 		frappe.db.set(self, 'status', 'Submitted')
-		msgprint("%s: %s has been Unstopped" % (self.doctype, self.name))
+		frappe.msgprint(_("{0} {1} status is Unstopped").format(self.doctype, self.name))
 
 
 	def update_stock_ledger(self, update_stock):
diff --git a/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py b/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py
index a5899f4..35cdf59 100644
--- a/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py
+++ b/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py
@@ -4,15 +4,16 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.utils import cint
+from frappe import _
 
 def execute(filters=None):
 	if not filters: filters ={}
 
 	days_since_last_order = filters.get("days_since_last_order")
 	if cint(days_since_last_order) <= 0:
-		frappe.msgprint("Please mention positive value in 'Days Since Last Order' field",raise_exception=1)
+		frappe.throw(_("'Days Since Last Order' must be greater than or equal to zero"))
 
-	columns = get_columns() 
+	columns = get_columns()
 	customers = get_so_details()
 
 	data = []
@@ -20,43 +21,43 @@
 		if cint(cust[8]) >= cint(days_since_last_order):
 			cust.insert(7,get_last_so_amt(cust[0]))
 			data.append(cust)
-	return columns, data 
+	return columns, data
 
 def get_so_details():
-	return frappe.db.sql("""select 
-			cust.name, 
-			cust.customer_name, 
-			cust.territory, 
-			cust.customer_group, 
-			count(distinct(so.name)) as 'num_of_order', 
+	return frappe.db.sql("""select
+			cust.name,
+			cust.customer_name,
+			cust.territory,
+			cust.customer_group,
+			count(distinct(so.name)) as 'num_of_order',
 			sum(net_total) as 'total_order_value',
-			sum(if(so.status = "Stopped", 
-				so.net_total * so.per_delivered/100, 
+			sum(if(so.status = "Stopped",
+				so.net_total * so.per_delivered/100,
 				so.net_total)) as 'total_order_considered',
-			max(so.transaction_date) as 'last_sales_order_date', 
-			DATEDIFF(CURDATE(), max(so.transaction_date)) as 'days_since_last_order' 
-		from `tabCustomer` cust, `tabSales Order` so  
+			max(so.transaction_date) as 'last_sales_order_date',
+			DATEDIFF(CURDATE(), max(so.transaction_date)) as 'days_since_last_order'
+		from `tabCustomer` cust, `tabSales Order` so
 		where cust.name = so.customer and so.docstatus = 1
 		group by cust.name
 		order by 'days_since_last_order' desc """,as_list=1)
 
 def get_last_so_amt(customer):
 	res =  frappe.db.sql("""select net_total from `tabSales Order`
-		where customer ='%(customer)s' and docstatus = 1 order by transaction_date desc 
+		where customer ='%(customer)s' and docstatus = 1 order by transaction_date desc
 		limit 1""" % {'customer':customer})
 
 	return res and res[0][0] or 0
 
 def get_columns():
 	return [
-		"Customer:Link/Customer:120", 
-		"Customer Name:Data:120", 
-		"Territory::120", 
+		"Customer:Link/Customer:120",
+		"Customer Name:Data:120",
+		"Territory::120",
 		"Customer Group::120",
-		"Number of Order::120", 
-		"Total Order Value:Currency:120", 
-		"Total Order Considered:Currency:160", 
+		"Number of Order::120",
+		"Total Order Value:Currency:120",
+		"Total Order Considered:Currency:160",
 		"Last Order Amount:Currency:160",
-		"Last Sales Order Date:Date:160", 
+		"Last Sales Order Date:Date:160",
 		"Days Since Last Order::160"
-	]
\ No newline at end of file
+	]
diff --git a/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py b/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py
index 2d7b3e3..b272a83 100644
--- a/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py
+++ b/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py
@@ -5,14 +5,12 @@
 import frappe
 from frappe import _, msgprint
 from frappe.utils import flt
-import time
 from erpnext.accounts.utils import get_fiscal_year
 from erpnext.controllers.trends import get_period_date_ranges, get_period_month_ranges
-from frappe.model.meta import get_field_precision
 
 def execute(filters=None):
 	if not filters: filters = {}
-	
+
 	columns = get_columns(filters)
 	period_month_ranges = get_period_month_ranges(filters["period"], filters["fiscal_year"])
 	sim_map = get_salesperson_item_month_map(filters)
@@ -37,7 +35,7 @@
 			data.append(row)
 
 	return columns, sorted(data, key=lambda x: (x[0], x[1]))
-	
+
 def get_columns(filters):
 	for fieldname in ["fiscal_year", "period", "target_on"]:
 		if not filters.get(fieldname):
@@ -55,26 +53,26 @@
 				label = label % (from_date.strftime("%b") + " - " + to_date.strftime("%b"))
 			else:
 				label = label % from_date.strftime("%b")
-			
+
 			columns.append(label+":Float:120")
 
-	return columns + ["Total Target:Float:120", "Total Achieved:Float:120", 
+	return columns + ["Total Target:Float:120", "Total Achieved:Float:120",
 		"Total Variance:Float:120"]
 
 #Get sales person & item group details
 def get_salesperson_details(filters):
-	return frappe.db.sql("""select sp.name, td.item_group, td.target_qty, 
-		td.target_amount, sp.distribution_id 
-		from `tabSales Person` sp, `tabTarget Detail` td 
-		where td.parent=sp.name and td.fiscal_year=%s order by sp.name""", 
+	return frappe.db.sql("""select sp.name, td.item_group, td.target_qty,
+		td.target_amount, sp.distribution_id
+		from `tabSales Person` sp, `tabTarget Detail` td
+		where td.parent=sp.name and td.fiscal_year=%s order by sp.name""",
 		(filters["fiscal_year"]), as_dict=1)
 
 #Get target distribution details of item group
 def get_target_distribution_details(filters):
 	target_details = {}
-	
-	for d in frappe.db.sql("""select bd.name, bdd.month, bdd.percentage_allocation 
-		from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd 
+
+	for d in frappe.db.sql("""select bd.name, bdd.month, bdd.percentage_allocation
+		from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd
 		where bdd.parent=bd.name and bd.fiscal_year=%s""", (filters["fiscal_year"]), as_dict=1):
 			target_details.setdefault(d.name, {}).setdefault(d.month, flt(d.percentage_allocation))
 
@@ -83,13 +81,13 @@
 #Get achieved details from sales order
 def get_achieved_details(filters):
 	start_date, end_date = get_fiscal_year(fiscal_year = filters["fiscal_year"])[1:]
-	
-	item_details = frappe.db.sql("""select soi.item_code, soi.qty, soi.base_amount, so.transaction_date, 
-		st.sales_person, MONTHNAME(so.transaction_date) as month_name 
-		from `tabSales Order Item` soi, `tabSales Order` so, `tabSales Team` st 
-		where soi.parent=so.name and so.docstatus=1 and 
-		st.parent=so.name and so.transaction_date>=%s and 
-		so.transaction_date<=%s""" % ('%s', '%s'), 
+
+	item_details = frappe.db.sql("""select soi.item_code, soi.qty, soi.base_amount, so.transaction_date,
+		st.sales_person, MONTHNAME(so.transaction_date) as month_name
+		from `tabSales Order Item` soi, `tabSales Order` so, `tabSales Team` st
+		where soi.parent=so.name and so.docstatus=1 and
+		st.parent=so.name and so.transaction_date>=%s and
+		so.transaction_date<=%s""" % ('%s', '%s'),
 		(start_date, end_date), as_dict=1)
 
 	item_actual_details = {}
@@ -117,7 +115,7 @@
 			tav_dict = sim_map[sd.name][sd.item_group][month]
 			month_percentage = tdd.get(sd.distribution_id, {}).get(month, 0) \
 				if sd.distribution_id else 100.0/12
-			
+
 			for ad in achieved_details.get(sd.name, {}).get(sd.item_group, []):
 				if (filters["target_on"] == "Quantity"):
 					tav_dict.target = flt(sd.target_qty) * month_percentage / 100
@@ -132,4 +130,4 @@
 	return sim_map
 
 def get_item_group(item_name):
-	return frappe.db.get_value("Item", item_name, "item_group")
\ No newline at end of file
+	return frappe.db.get_value("Item", item_name, "item_group")
diff --git a/erpnext/setup/doctype/authorization_control/authorization_control.py b/erpnext/setup/doctype/authorization_control/authorization_control.py
index 8a401f0..25d2de0 100644
--- a/erpnext/setup/doctype/authorization_control/authorization_control.py
+++ b/erpnext/setup/doctype/authorization_control/authorization_control.py
@@ -4,12 +4,11 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe.utils import cstr, flt, has_common, make_esc
+from frappe.utils import cstr, flt, has_common, make_esc, comma_or
 
-from frappe import session, msgprint
-from erpnext.setup.utils import get_company_currency
+from frappe import session, _
 
-	
+
 from erpnext.utilities.transaction_base import TransactionBase
 
 class AuthorizationControl(TransactionBase):
@@ -24,27 +23,18 @@
 			for x in det:
 				amt_list.append(flt(x[0]))
 			max_amount = max(amt_list)
-			
+
 			app_dtl = frappe.db.sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and company = %s %s" % ('%s', '%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on, company))
-			
+
 			if not app_dtl:
-				app_dtl = frappe.db.sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and ifnull(company,'') = '' %s" % ('%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on)) 
+				app_dtl = frappe.db.sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and ifnull(company,'') = '' %s" % ('%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on))
 			for d in app_dtl:
 				if(d[0]): appr_users.append(d[0])
 				if(d[1]): appr_roles.append(d[1])
-			
+
 			if not has_common(appr_roles, frappe.user.get_roles()) and not has_common(appr_users, [session['user']]):
-				msg, add_msg = '',''
-				if max_amount:
-					dcc = get_company_currency(self.company)
-					if based_on == 'Grand Total': msg = "since Grand Total exceeds %s. %s" % (dcc, flt(max_amount))
-					elif based_on == 'Itemwise Discount': msg = "since Discount exceeds %s for Item Code : %s" % (cstr(max_amount)+'%', item)
-					elif based_on == 'Average Discount' or based_on == 'Customerwise Discount': msg = "since Discount exceeds %s" % (cstr(max_amount)+'%')
-				
-				if appr_users: add_msg = "Users : "+cstr(appr_users)
-				if appr_roles: add_msg = "Roles : "+cstr(appr_roles)
-				if appr_users and appr_roles: add_msg = "Users : "+cstr(appr_users)+" or "+"Roles : "+cstr(appr_roles)
-				msgprint("You are not authorize to submit this %s %s. Please send for approval to %s" % (doctype_name, msg, add_msg))
+				frappe.msgprint(_("Not authroized since {0} exceeds limits").format(_(based_on)))
+				frappe.throw(_("Can be approved by {0}").format(comma_or(appr_roles + appr_users)))
 				raise Exception
 
 
@@ -64,12 +54,12 @@
 		if chk == 1:
 			if based_on == 'Itemwise Discount': add_cond2 += " and ifnull(master_name,'') = ''"
 			appr = frappe.db.sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and company = %s and docstatus != 2 %s %s" % ('%s', '%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on, company))
-			
+
 			if not appr:
 				appr = frappe.db.sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and ifnull(company,'') = '' and docstatus != 2 %s %s"% ('%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on))
 			self.get_appr_user_role(appr, doctype_name, total, based_on, cond+add_cond2, item, company)
-			
-			
+
+
 	# Bifurcate Authorization based on type
 	# --------------------------------------
 	def bifurcate_based_on_type(self, doctype_name, total, av_dis, based_on, doc_obj, val, company):
@@ -108,39 +98,39 @@
 		# Individual User
 		# ================
 		# Check for authorization set for individual user
-	 
+
 		based_on = [x[0] for x in frappe.db.sql("select distinct based_on from `tabAuthorization Rule` where transaction = %s and system_user = %s and (company = %s or ifnull(company,'')='') and docstatus != 2", (doctype_name, session['user'], company))]
 
 		for d in based_on:
 			self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 1, company)
-		
+
 		# Remove user specific rules from global authorization rules
 		for r in based_on:
 			if r in final_based_on and r != 'Itemwise Discount': final_based_on.remove(r)
-		
+
 		# Specific Role
 		# ===============
 		# Check for authorization set on particular roles
-		based_on = [x[0] for x in frappe.db.sql("""select based_on 
-			from `tabAuthorization Rule` 
-			where transaction = %s and system_role IN (%s) and based_on IN (%s) 
-			and (company = %s or ifnull(company,'')='') 
+		based_on = [x[0] for x in frappe.db.sql("""select based_on
+			from `tabAuthorization Rule`
+			where transaction = %s and system_role IN (%s) and based_on IN (%s)
+			and (company = %s or ifnull(company,'')='')
 			and docstatus != 2
 		""" % ('%s', "'"+"','".join(frappe.user.get_roles())+"'", "'"+"','".join(final_based_on)+"'", '%s'), (doctype_name, company))]
-		
+
 		for d in based_on:
 			self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 2, company)
-		
+
 		# Remove role specific rules from global authorization rules
 		for r in based_on:
 			if r in final_based_on and r != 'Itemwise Discount': final_based_on.remove(r)
-			
+
 		# Global Rule
 		# =============
 		# Check for global authorization
 		for g in final_based_on:
 			self.bifurcate_based_on_type(doctype_name, total, av_dis, g, doc_obj, 0, company)
-	
+
 	#========================================================================================================================
 	# payroll related check
 	def get_value_based_rule(self,doctype_name,employee,total_claimed_amount,company):
@@ -153,29 +143,29 @@
 			val_lst = [y[0] for y in val]
 		else:
 			val_lst.append(0)
-	
+
 		max_val = max(val_lst)
 		rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and company = %s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(value,0)= %s and docstatus!=2",(doctype_name,company,employee,employee,flt(max_val)), as_dict=1)
 		if not rule:
 			rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and ifnull(company,'') = '' and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(value,0)= %s and docstatus!=2",(doctype_name,employee,employee,flt(max_val)), as_dict=1)
 
 		return rule
-	
+
 	#---------------------------------------------------------------------------------------------------------------------
 	# related to payroll module only
 	def get_approver_name(self, doctype_name, total, doc_obj=''):
 		app_user=[]
 		app_specific_user =[]
 		rule ={}
-		
+
 		if doc_obj:
 			if doctype_name == 'Expense Claim':
 				rule = self.get_value_based_rule(doctype_name,doc_obj.employee,doc_obj.total_claimed_amount, doc_obj.company)
 			elif doctype_name == 'Appraisal':
-				rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and company = %s and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee, doc_obj.company),as_dict=1)				
+				rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and company = %s and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee, doc_obj.company),as_dict=1)
 				if not rule:
-					rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(company,'') = '' and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee),as_dict=1)				
-			
+					rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(company,'') = '' and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee),as_dict=1)
+
 			if rule:
 				for m in rule:
 					if m['to_emp'] or m['to_designation']:
@@ -186,7 +176,7 @@
 							for x in user_lst:
 								if not x in app_user:
 									app_user.append(x)
-			
+
 			if len(app_specific_user) >0:
 				return app_specific_user
 			else:
diff --git a/erpnext/setup/doctype/authorization_rule/authorization_rule.py b/erpnext/setup/doctype/authorization_rule/authorization_rule.py
index 1c6daf2..58fb231 100644
--- a/erpnext/setup/doctype/authorization_rule/authorization_rule.py
+++ b/erpnext/setup/doctype/authorization_rule/authorization_rule.py
@@ -4,8 +4,8 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe.utils import cint, cstr, flt, has_common
-from frappe import msgprint
+from frappe.utils import cstr, flt
+from frappe import _, msgprint
 
 from frappe.model.document import Document
 
@@ -13,75 +13,41 @@
 
 
 	def check_duplicate_entry(self):
-		exists = frappe.db.sql("""select name, docstatus from `tabAuthorization Rule` 
-			where transaction = %s and based_on = %s and system_user = %s 
-			and system_role = %s and approving_user = %s and approving_role = %s 
-			and to_emp =%s and to_designation=%s and name != %s""", 
-			(self.transaction, self.based_on, cstr(self.system_user), 
-				cstr(self.system_role), cstr(self.approving_user), 
-				cstr(self.approving_role), cstr(self.to_emp), 
+		exists = frappe.db.sql("""select name, docstatus from `tabAuthorization Rule`
+			where transaction = %s and based_on = %s and system_user = %s
+			and system_role = %s and approving_user = %s and approving_role = %s
+			and to_emp =%s and to_designation=%s and name != %s""",
+			(self.transaction, self.based_on, cstr(self.system_user),
+				cstr(self.system_role), cstr(self.approving_user),
+				cstr(self.approving_role), cstr(self.to_emp),
 				cstr(self.to_designation), self.name))
 		auth_exists = exists and exists[0][0] or ''
 		if auth_exists:
-			if cint(exists[0][1]) == 2:
-				msgprint("""Duplicate Entry. Please untrash Authorization Rule : %s \
-					from Recycle Bin""" % (auth_exists), raise_exception=1)
-			else:
-				msgprint("Duplicate Entry. Please check Authorization Rule : %s" % 
-					(auth_exists), raise_exception=1)
-
-
-	def validate_master_name(self):
-		if self.based_on == 'Customerwise Discount' and \
-				not frappe.db.sql("""select name from tabCustomer 
-					where name = %s and docstatus != 2""", (self.master_name)):
-			msgprint("Please select valid Customer Name for Customerwise Discount", 
-			 	raise_exception=1)
-		elif self.based_on == 'Itemwise Discount' and \
-				not frappe.db.sql("select name from tabItem where name = %s and docstatus != 2", 
-				 	(self.master_name)):
-			msgprint("Please select valid Item Name for Itemwise Discount", raise_exception=1)
-		elif (self.based_on == 'Grand Total' or \
-				self.based_on == 'Average Discount') and self.master_name:
-			msgprint("Please remove Customer/Item Name for %s." % 
-				self.based_on, raise_exception=1)
+			frappe.throw(_("Duplicate Entry. Please check Authorization Rule {0}").format(auth_exists))
 
 
 	def validate_rule(self):
 		if self.transaction != 'Appraisal':
 			if not self.approving_role and not self.approving_user:
-				msgprint("Please enter Approving Role or Approving User", raise_exception=1)
+				frappe.throw(_("Please enter Approving Role or Approving User"))
 			elif self.system_user and self.system_user == self.approving_user:
-				msgprint("Approving User cannot be same as user the rule is Applicable To (User)", 
-					raise_exception=1)
+				frappe.throw(_("Approving User cannot be same as user the rule is Applicable To"))
 			elif self.system_role and self.system_role == self.approving_role:
-				msgprint("Approving Role cannot be same as user the rule is \
-					Applicable To (Role).", raise_exception=1)
-			elif self.system_user and self.approving_role and \
-			 		has_common([self.approving_role], [x[0] for x in \
-					frappe.db.sql("select role from `tabUserRole` where parent = %s", \
-					 	(self.system_user))]):
-				msgprint("System User : %s is assigned role : %s. So rule does not make sense" % 
-				 	(self.system_user,self.approving_role), raise_exception=1)
+				frappe.throw(_("Approving Role cannot be same as role the rule is Applicable To"))
 			elif self.transaction in ['Purchase Order', 'Purchase Receipt', \
 					'Purchase Invoice', 'Stock Entry'] and self.based_on \
 					in ['Average Discount', 'Customerwise Discount', 'Itemwise Discount']:
-				msgprint("You cannot set authorization on basis of Discount for %s" % 
-				 	self.transaction, raise_exception=1)
+				frappe.throw(_("Cannot set authorization on basis of Discount for {0}").format(self.transaction))
 			elif self.based_on == 'Average Discount' and flt(self.value) > 100.00:
-				msgprint("Discount cannot given for more than 100%", raise_exception=1)
+				frappe.throw(_("Discount must be less than 100"))
 			elif self.based_on == 'Customerwise Discount' and not self.master_name:
-				msgprint("Please enter Customer Name for 'Customerwise Discount'", 
-				 	raise_exception=1)
+				frappe.throw(_("Customer required for 'Customerwise Discount'"))
 		else:
-			if self.transaction == 'Appraisal' and self.based_on != 'Not Applicable':
-				msgprint("Based on should be 'Not Applicable' while setting authorization rule\
-				 	for 'Appraisal'", raise_exception=1)
-
-
+			if self.transaction == 'Appraisal':
+				self.based_on = "Not Applicable"
 
 	def validate(self):
 		self.check_duplicate_entry()
 		self.validate_rule()
 		self.validate_master_name()
-		if not self.value: self.value = 0.0
\ No newline at end of file
+		if not self.value: self.value = 0.0
diff --git a/erpnext/setup/doctype/backup_manager/backup_googledrive.py b/erpnext/setup/doctype/backup_manager/backup_googledrive.py
index 0ea64ba..70bda35 100644
--- a/erpnext/setup/doctype/backup_manager/backup_googledrive.py
+++ b/erpnext/setup/doctype/backup_manager/backup_googledrive.py
@@ -20,7 +20,7 @@
 import frappe
 import oauth2client.client
 from frappe.utils import cstr
-from frappe import _, msgprint
+from frappe import _
 from apiclient.discovery import build
 from apiclient.http import MediaFileUpload
 
@@ -71,17 +71,17 @@
 	backup = new_backup()
 	path = os.path.join(frappe.local.site_path, "public", "backups")
 	filename = os.path.join(path, os.path.basename(backup.backup_path_db))
-	
+
 	# upload files to database folder
-	upload_files(filename, 'application/x-gzip', drive_service, 
+	upload_files(filename, 'application/x-gzip', drive_service,
 		frappe.db.get_value("Backup Manager", None, "database_folder_id"))
-	
+
 	# upload files to files folder
 	did_not_upload = []
 	error_log = []
-	
+
 	files_folder_id = frappe.db.get_value("Backup Manager", None, "files_folder_id")
-	
+
 	frappe.db.close()
 	path = os.path.join(frappe.local.site_path, "public", "files")
 	for filename in os.listdir(path):
@@ -94,7 +94,7 @@
 			mimetype = 'application/x-gzip'
 		else:
 			mimetype = mimetypes.types_map.get("." + ext) or "application/octet-stream"
-		
+
 		#Compare Local File with Server File
 	  	children = drive_service.children().list(folderId=files_folder_id).execute()
 	  	for child in children.get('items', []):
@@ -108,29 +108,28 @@
 			except Exception, e:
 				did_not_upload.append(filename)
 				error_log.append(cstr(e))
-	
+
 	frappe.connect()
 	return did_not_upload, list(set(error_log))
 
 def get_gdrive_flow():
 	from oauth2client.client import OAuth2WebServerFlow
 	from frappe import conf
-	
-	if not "gdrive_client_id" in conf:
-		frappe.msgprint(_("Please set Google Drive access keys in") + " conf.py", 
-		raise_exception=True)
 
-	flow = OAuth2WebServerFlow(conf.gdrive_client_id, conf.gdrive_client_secret, 
+	if not "gdrive_client_id" in conf:
+		frappe.throw(_("Please set Google Drive access keys in {0}"),format("site_config.json"))
+
+	flow = OAuth2WebServerFlow(conf.gdrive_client_id, conf.gdrive_client_secret,
 		"https://www.googleapis.com/auth/drive", 'urn:ietf:wg:oauth:2.0:oob')
 	return flow
-	
+
 @frappe.whitelist()
 def gdrive_callback(verification_code = None):
 	flow = get_gdrive_flow()
 	if verification_code:
 		credentials = flow.step2_exchange(verification_code)
 		allowed = 1
-		
+
 	# make folders to save id
 	http = httplib2.Http()
 	http = credentials.authorize(http)
@@ -145,7 +144,7 @@
 	final_credentials = credentials.to_json()
 	frappe.db.set_value("Backup Manager", "Backup Manager", "gdrive_credentials", final_credentials)
 
-	frappe.msgprint("Updated")
+	frappe.msgprint(_("Updated"))
 
 def create_erpnext_folder(service):
 	if not frappe.db:
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index 7355bd2..6526832 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -3,9 +3,9 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe import _, msgprint
+from frappe import _
 
-from frappe.utils import cstr, cint
+from frappe.utils import cint
 import frappe.defaults
 
 
@@ -13,10 +13,10 @@
 
 class Company(Document):
 
-		
+
 	def onload(self):
 		self.set("__transactions_exist", self.check_if_transactions_exist())
-		
+
 	def check_if_transactions_exist(self):
 		exists = False
 		for doctype in ["Sales Invoice", "Delivery Note", "Sales Order", "Quotation",
@@ -25,31 +25,30 @@
 					limit 1""" % (doctype, "%s"), self.name):
 						exists = True
 						break
-		
+
 		return exists
-		
+
 	def validate(self):
 		if self.get('__islocal') and len(self.abbr) > 5:
-			frappe.msgprint("Abbreviation cannot have more than 5 characters",
-				raise_exception=1)
-				
+			frappe.throw(_("Abbreviation cannot have more than 5 characters"))
+
 		self.previous_default_currency = frappe.db.get_value("Company", self.name, "default_currency")
 		if self.default_currency and self.previous_default_currency and \
 			self.default_currency != self.previous_default_currency and \
 			self.check_if_transactions_exist():
-				msgprint(_("Sorry! You cannot change company's default currency, because there are existing transactions against it. You will need to cancel those transactions if you want to change the default currency."), raise_exception=True)
+				frappe.throw(_("Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency."))
 
 	def on_update(self):
-		if not frappe.db.sql("""select name from tabAccount 
+		if not frappe.db.sql("""select name from tabAccount
 			where company=%s and docstatus<2 limit 1""", self.name):
 			self.create_default_accounts()
 			self.create_default_warehouses()
 			self.create_default_web_page()
-		
-		if not frappe.db.get_value("Cost Center", {"group_or_ledger": "Ledger", 
+
+		if not frappe.db.get_value("Cost Center", {"group_or_ledger": "Ledger",
 				"company": self.name}):
 			self.create_default_cost_center()
-			
+
 		self.set_default_accounts()
 
 		if self.default_currency:
@@ -58,7 +57,7 @@
 	def create_default_warehouses(self):
 		for whname in ("Stores", "Work In Progress", "Finished Goods"):
 			if not frappe.db.exists("Warehouse", whname + " - " + self.abbr):
-				stock_group = frappe.db.get_value("Account", {"account_type": "Stock", 
+				stock_group = frappe.db.get_value("Account", {"account_type": "Stock",
 					"group_or_ledger": "Group"})
 				if stock_group:
 					frappe.get_doc({
@@ -67,7 +66,7 @@
 						"company": self.name,
 						"create_account_under": stock_group
 					}).insert()
-			
+
 	def create_default_web_page(self):
 		if not frappe.db.get_value("Website Settings", None, "home_page") and \
 				not frappe.db.sql("select name from tabCompany where name!=%s", self.name):
@@ -80,7 +79,7 @@
 					"description": "Standard Home Page for " + self.name,
 					"main_section": webfile.read() % self.as_dict()
 				}).insert()
-			
+
 				# update in home page in settings
 				website_settings = frappe.get_doc("Website Settings", "Website Settings")
 				website_settings.home_page = webpage.name
@@ -109,7 +108,7 @@
 			self.create_standard_accounts()
 			frappe.db.set(self, "receivables_group", "Accounts Receivable - " + self.abbr)
 			frappe.db.set(self, "payables_group", "Accounts Payable - " + self.abbr)
-			
+
 	def import_chart_of_account(self):
 		chart = frappe.get_doc("Chart of Accounts", self.chart_of_accounts)
 		chart.create_accounts(self.name)
@@ -120,7 +119,7 @@
 			"freeze_account": "No",
 			"master_type": "",
 		})
-		
+
 		for d in self.fld_dict.keys():
 			account.set(d, (d == 'parent_account' and lst[self.fld_dict[d]]) and lst[self.fld_dict[d]] +' - '+ self.abbr or lst[self.fld_dict[d]])
 		account.insert()
@@ -128,17 +127,17 @@
 	def set_default_accounts(self):
 		def _set_default_accounts(accounts):
 			for field, account_type in accounts.items():
-				account = frappe.db.get_value("Account", {"account_type": account_type, 
+				account = frappe.db.get_value("Account", {"account_type": account_type,
 					"group_or_ledger": "Ledger", "company": self.name})
 
 				if account and not self.get(field):
 					frappe.db.set(self, field, account)
-			
+
 		_set_default_accounts({
 			"default_cash_account": "Cash",
 			"default_bank_account": "Bank"
 		})
-		
+
 		if cint(frappe.db.get_value("Accounts Settings", None, "auto_accounting_for_stock")):
 			_set_default_accounts({
 				"stock_received_but_not_billed": "Stock Received But Not Billed",
@@ -153,9 +152,9 @@
 				'company':self.name,
 				'group_or_ledger':'Group',
 				'parent_cost_center':''
-			}, 
+			},
 			{
-				'cost_center_name':'Main', 
+				'cost_center_name':'Main',
 				'company':self.name,
 				'group_or_ledger':'Ledger',
 				'parent_cost_center':self.name + ' - ' + self.abbr
@@ -165,11 +164,11 @@
 			cc.update({"doctype": "Cost Center"})
 			cc_doc = frappe.get_doc(cc)
 			cc_doc.ignore_permissions = True
-		
+
 			if cc.get("cost_center_name") == self.name:
 				cc_doc.ignore_mandatory = True
 			cc_doc.insert()
-			
+
 		frappe.db.set(self, "cost_center", "Main - " + self.abbr)
 
 	def on_trash(self):
@@ -180,33 +179,33 @@
 		if not rec:
 			#delete tabAccount
 			frappe.db.sql("delete from `tabAccount` where company = %s order by lft desc, rgt desc", self.name)
-			
+
 			#delete cost center child table - budget detail
 			frappe.db.sql("delete bd.* from `tabBudget Detail` bd, `tabCost Center` cc where bd.parent = cc.name and cc.company = %s", self.name)
 			#delete cost center
 			frappe.db.sql("delete from `tabCost Center` WHERE company = %s order by lft desc, rgt desc", self.name)
-			
+
 		if not frappe.db.get_value("Stock Ledger Entry", {"company": self.name}):
 			frappe.db.sql("""delete from `tabWarehouse` where company=%s""", self.name)
-			
+
 		frappe.defaults.clear_default("company", value=self.name)
-			
+
 		frappe.db.sql("""update `tabSingles` set value=""
-			where doctype='Global Defaults' and field='default_company' 
+			where doctype='Global Defaults' and field='default_company'
 			and value=%s""", self.name)
-			
+
 	def before_rename(self, olddn, newdn, merge=False):
 		if merge:
 			frappe.throw(_("Sorry, companies cannot be merged"))
-	
+
 	def after_rename(self, olddn, newdn, merge=False):
 		frappe.db.set(self, "company_name", newdn)
 
-		frappe.db.sql("""update `tabDefaultValue` set defvalue=%s 
+		frappe.db.sql("""update `tabDefaultValue` set defvalue=%s
 			where defkey='Company' and defvalue=%s""", (newdn, olddn))
 
 		frappe.defaults.clear_cache()
-		
+
 	def create_standard_accounts(self):
 		self.fld_dict = {
 			'account_name': 0,
@@ -217,7 +216,7 @@
 			'company': 5,
 			'tax_rate': 6
 		}
-		
+
 		acc_list_common = [
 			['Application of Funds (Assets)','','Group','','Balance Sheet',self.name,''],
 				['Current Assets','Application of Funds (Assets)','Group','','Balance Sheet',self.name,''],
@@ -282,7 +281,7 @@
 				['Current Liabilities','Source of Funds (Liabilities)','Group','','Balance Sheet',self.name,''],
 					['Accounts Payable','Current Liabilities','Group','','Balance Sheet',self.name,''],
 					['Stock Liabilities','Current Liabilities','Group','','Balance Sheet',self.name,''],
-						['Stock Received But Not Billed', 'Stock Liabilities', 'Ledger', 'Stock Received But Not Billed', 'Balance Sheet', self.name, ''],					
+						['Stock Received But Not Billed', 'Stock Liabilities', 'Ledger', 'Stock Received But Not Billed', 'Balance Sheet', self.name, ''],
 					['Duties and Taxes','Current Liabilities','Group','','Balance Sheet',self.name,''],
 					['Loans (Liabilities)','Current Liabilities','Group','','Balance Sheet',self.name,''],
 						['Secured Loans','Loans (Liabilities)','Group','','Balance Sheet',self.name,''],
@@ -291,7 +290,7 @@
 				['Temporary Accounts (Liabilities)','Source of Funds (Liabilities)','Group','','Balance Sheet',self.name,''],
 					['Temporary Account (Liabilities)','Temporary Accounts (Liabilities)','Ledger','','Balance Sheet',self.name,'']
 		]
-		
+
 		acc_list_india = [
 			['CENVAT Capital Goods','Tax Assets','Ledger','Chargeable','Balance Sheet',self.name,''],
 			['CENVAT','Tax Assets','Ledger','Chargeable','Balance Sheet',self.name,''],
@@ -342,23 +341,23 @@
 @frappe.whitelist()
 def replace_abbr(company, old, new):
 	frappe.db.set_value("Company", company, "abbr", new)
-	
+
 	def _rename_record(dt):
 		for d in frappe.db.sql("select name from `tab%s` where company=%s" % (dt, '%s'), company):
 			parts = d[0].split(" - ")
 			if parts[-1].lower() == old.lower():
 				name_without_abbr = " - ".join(parts[:-1])
 				frappe.rename_doc(dt, d[0], name_without_abbr + " - " + new)
-		
+
 	for dt in ["Account", "Cost Center", "Warehouse"]:
 		_rename_record(dt)
 		frappe.db.commit()
 
 def get_name_with_abbr(name, company):
-	company_abbr = frappe.db.get_value("Company", company, "abbr")		
+	company_abbr = frappe.db.get_value("Company", company, "abbr")
 	parts = name.split(" - ")
 
 	if parts[-1].lower() != company_abbr.lower():
 		parts.append(company_abbr)
-			
+
 	return " - ".join(parts)
diff --git a/erpnext/setup/doctype/currency_exchange/currency_exchange.py b/erpnext/setup/doctype/currency_exchange/currency_exchange.py
index e22f035..c15c215 100644
--- a/erpnext/setup/doctype/currency_exchange/currency_exchange.py
+++ b/erpnext/setup/doctype/currency_exchange/currency_exchange.py
@@ -5,16 +5,16 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe import _, msgprint
+from frappe import _
 from frappe.model.controller import DocListController
 
 class CurrencyExchange(DocListController):
-		
+
 	def autoname(self):
 		self.name = self.from_currency + "-" + self.to_currency
-		
+
 	def validate(self):
 		self.validate_value("exchange_rate", ">", 0)
-		
+
 		if self.from_currency == self.to_currency:
-			msgprint(_("From Currency and To Currency cannot be same"), raise_exception=True)
\ No newline at end of file
+			frappe.throw(_("From Currency and To Currency cannot be same"))
diff --git a/erpnext/setup/doctype/customer_group/customer_group.py b/erpnext/setup/doctype/customer_group/customer_group.py
index 11a15fa..0eefebe 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.py
+++ b/erpnext/setup/doctype/customer_group/customer_group.py
@@ -3,45 +3,20 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe import msgprint
+from frappe import _
 
-	
+
 from frappe.utils.nestedset import NestedSet
 class CustomerGroup(NestedSet):
 	nsm_parent_field = 'parent_customer_group';
 
-	def validate(self): 
-		if frappe.db.sql("select name from `tabCustomer Group` where name = %s and docstatus = 2", 
-		 		(self.customer_group_name)):
-			msgprint("""Another %s record is trashed. 
-				To untrash please go to Setup -> Recycle Bin.""" % 
-				(self.customer_group_name), raise_exception = 1)		
-
 	def on_update(self):
 		self.validate_name_with_customer()
 		super(CustomerGroup, self).on_update()
 		self.validate_one_root()
-		
+
 	def validate_name_with_customer(self):
 		if frappe.db.exists("Customer", self.name):
-			frappe.msgprint("An Customer exists with same name (%s), \
-				please change the Customer Group name or rename the Customer" % 
+			frappe.msgprint(_("An Customer exists with same name (%s), \
+				please change the Customer Group name or rename the Customer") %
 				self.name, raise_exception=1)
-
-	def on_trash(self):
-		cust = frappe.db.sql("select name from `tabCustomer` where ifnull(customer_group, '') = %s", 
-		 	self.name)
-		cust = [d[0] for d in cust]
-		if cust:
-			msgprint("""Customer Group: %s can not be trashed/deleted \
-				because it is used in customer: %s. 
-				To trash/delete this, remove/change customer group in customer master""" %
-				(self.name, cust or ''), raise_exception=1)
-
-		if frappe.db.sql("select name from `tabCustomer Group` where parent_customer_group = %s \
-				and docstatus != 2", self.name):
-			msgprint("Child customer group exists for this customer group. \
-				You can not trash/cancel/delete this customer group.", raise_exception=1)
-
-		# rebuild tree
-		super(CustomerGroup, self).on_trash()
diff --git a/erpnext/setup/doctype/global_defaults/global_defaults.py b/erpnext/setup/doctype/global_defaults/global_defaults.py
index 93d75a1..90861de 100644
--- a/erpnext/setup/doctype/global_defaults/global_defaults.py
+++ b/erpnext/setup/doctype/global_defaults/global_defaults.py
@@ -4,6 +4,7 @@
 from __future__ import unicode_literals
 """Global Defaults"""
 import frappe
+from frappe import _
 import frappe.defaults
 from frappe.utils import cint
 
@@ -25,17 +26,17 @@
 from frappe.model.document import Document
 
 class GlobalDefaults(Document):
-		
+
 	def on_update(self):
 		"""update defaults"""
 		self.validate_session_expiry()
 		self.set_country_and_timezone()
-		
+
 		for key in keydict:
 			frappe.db.set_default(key, self.get(keydict[key], ''))
-			
+
 		# update year start date and year end date from fiscal_year
-		year_start_end_date = frappe.db.sql("""select year_start_date, year_end_date 
+		year_start_end_date = frappe.db.sql("""select year_start_date, year_end_date
 			from `tabFiscal Year` where name=%s""", self.current_fiscal_year)
 
 		ysd = year_start_end_date[0][0] or ''
@@ -44,20 +45,19 @@
 		if ysd and yed:
 			frappe.db.set_default('year_start_date', ysd.strftime('%Y-%m-%d'))
 			frappe.db.set_default('year_end_date', yed.strftime('%Y-%m-%d'))
-		
+
 		# enable default currency
 		if self.default_currency:
 			frappe.db.set_value("Currency", self.default_currency, "enabled", 1)
-		
+
 		# clear cache
 		frappe.clear_cache()
-	
+
 	def validate_session_expiry(self):
 		if self.session_expiry:
 			parts = self.session_expiry.split(":")
 			if len(parts)!=2 or not (cint(parts[0]) or cint(parts[1])):
-				frappe.msgprint("""Session Expiry must be in format hh:mm""",
-					raise_exception=1)
+				frappe.throw(_("Session Expiry must be in format {0}").format("hh:mm"))
 
 	def set_country_and_timezone(self):
 		frappe.db.set_default("country", self.country)
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index 4b0dc11..700e39a 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -34,5 +34,4 @@
 
 	def validate_name_with_item(self):
 		if frappe.db.exists("Item", self.name):
-			frappe.msgprint("An item exists with same name (%s), please change the \
-				item group name or rename the item" % self.name, raise_exception=1)
+			frappe.throw(frappe._("An item exists with same name ({0}), please change the item group name or rename the item").format(self.name))
diff --git a/erpnext/setup/doctype/jobs_email_settings/jobs_email_settings.py b/erpnext/setup/doctype/jobs_email_settings/jobs_email_settings.py
index 94874f2..5d8bab8 100644
--- a/erpnext/setup/doctype/jobs_email_settings/jobs_email_settings.py
+++ b/erpnext/setup/doctype/jobs_email_settings/jobs_email_settings.py
@@ -11,10 +11,9 @@
 from frappe.model.document import Document
 
 class JobsEmailSettings(Document):
-		
+
 	def validate(self):
 		if cint(self.extract_emails) and not (self.email_id and self.host and \
 			self.username and self.password):
-			
-			frappe.msgprint(_("""Host, Email and Password required if emails are to be pulled"""),
-				raise_exception=True)
\ No newline at end of file
+
+			frappe.throw(_("""Host, Email and Password required if emails are to be pulled"""))
diff --git a/erpnext/setup/doctype/notification_control/notification_control.py b/erpnext/setup/doctype/notification_control/notification_control.py
index 87674ec..1e57ad5 100644
--- a/erpnext/setup/doctype/notification_control/notification_control.py
+++ b/erpnext/setup/doctype/notification_control/notification_control.py
@@ -4,8 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe import msgprint
-
+from frappe import _
 
 from frappe.model.document import Document
 
@@ -18,5 +17,5 @@
 	def set_message(self, arg = ''):
 		fn = self.select_transaction.lower().replace(' ', '_') + '_message'
 		frappe.db.set(self, fn, self.custom_message)
-		msgprint("Custom Message for %s updated!" % self.select_transaction)
+		frappe.msgprint(_("Message updated"))
 
diff --git a/erpnext/setup/doctype/territory/territory.py b/erpnext/setup/doctype/territory/territory.py
index 83eae91..890e778 100644
--- a/erpnext/setup/doctype/territory/territory.py
+++ b/erpnext/setup/doctype/territory/territory.py
@@ -6,17 +6,17 @@
 
 
 from frappe.utils import flt
+from frappe import _
 
 from frappe.utils.nestedset import NestedSet
-	
+
 class Territory(NestedSet):
 	nsm_parent_field = 'parent_territory'
 
-	def validate(self): 
+	def validate(self):
 		for d in self.get('target_details'):
 			if not flt(d.target_qty) and not flt(d.target_amount):
-				msgprint("Either target qty or target amount is mandatory.")
-				raise Exception
+				frappe.throw(_("Either target qty or target amount is mandatory"))
 
 	def on_update(self):
 		super(Territory, self).on_update()
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index 0bd614f..63d18d2 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -13,33 +13,29 @@
 	if not currency:
 		throw(_('Please specify Default Currency in Company Master \
 			and Global Defaults'))
-		
+
 	return currency
 
 def get_root_of(doctype):
 	"""Get root element of a DocType with a tree structure"""
-	result = frappe.db.sql_list("""select name from `tab%s` 
-		where lft=1 and rgt=(select max(rgt) from `tab%s` where docstatus < 2)""" % 
+	result = frappe.db.sql_list("""select name from `tab%s`
+		where lft=1 and rgt=(select max(rgt) from `tab%s` where docstatus < 2)""" %
 		(doctype, doctype))
 	return result[0] if result else None
-	
+
 def get_ancestors_of(doctype, name):
 	"""Get ancestor elements of a DocType with a tree structure"""
 	lft, rgt = frappe.db.get_value(doctype, name, ["lft", "rgt"])
-	result = frappe.db.sql_list("""select name from `tab%s` 
+	result = frappe.db.sql_list("""select name from `tab%s`
 		where lft<%s and rgt>%s order by lft desc""" % (doctype, "%s", "%s"), (lft, rgt))
 	return result or []
 
 @frappe.whitelist()
 def get_price_list_currency(price_list):
-	price_list_currency = frappe.db.get_value("Price List", {"name": price_list, 
+	price_list_currency = frappe.db.get_value("Price List", {"name": price_list,
 		"enabled": 1}, "currency")
 
 	if not price_list_currency:
-		throw("{message}: {price_list} {disabled}".format(**{
-			"message": _("Price List"),
-			"price_list": price_list,
-			"disabled": _("is disabled.")
-		}))
+		throw(_("Price List {0} is disabled").format(price_list))
 	else:
-		return {"price_list_currency": price_list_currency}
\ No newline at end of file
+		return {"price_list_currency": price_list_currency}
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index e91c36d..95882c6 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe.utils import cstr, flt, cint
+from frappe.utils import flt, cint
 
 from frappe import msgprint, _
 import frappe.defaults
@@ -54,9 +54,7 @@
 		if frappe.db.get_value("Selling Settings", None, 'so_required') == 'Yes':
 			 for d in self.get('delivery_note_details'):
 				 if not d.against_sales_order:
-					 msgprint("Sales Order No. required against item %s"%d.item_code)
-					 raise Exception
-
+					 frappe.throw(_("Sales Order required for Item {0}").format(d.item_code))
 
 	def validate(self):
 		super(DeliveryNote, self).validate()
@@ -108,8 +106,7 @@
 				where name = %s and (customer = %s or
 					ifnull(customer,'')='')""", (self.project_name, self.customer))
 			if not res:
-				msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.customer,self.project_name,self.project_name))
-				raise Exception
+				frappe.throw(_("Customer {0} does not belong to project {1}").format(self.customer, self.project_name))
 
 	def validate_for_items(self):
 		check_list, chk_dupl_itm = [], []
@@ -119,14 +116,12 @@
 
 			if frappe.db.get_value("Item", d.item_code, "is_stock_item") == 'Yes':
 				if e in check_list:
-					msgprint("Please check whether item %s has been entered twice wrongly."
-						% d.item_code)
+					msgprint(_("Note: Item {0} entered multiple times").format(d.item_code))
 				else:
 					check_list.append(e)
 			else:
 				if f in chk_dupl_itm:
-					msgprint("Please check whether item %s has been entered twice wrongly."
-						% d.item_code)
+					msgprint(_("Note: Item {0} entered multiple times").format(d.item_code))
 				else:
 					chk_dupl_itm.append(f)
 
@@ -134,8 +129,7 @@
 		for d in self.get_item_list():
 			if frappe.db.get_value("Item", d['item_code'], "is_stock_item") == "Yes":
 				if not d['warehouse']:
-					msgprint("Please enter Warehouse for item %s as it is stock item"
-						% d['item_code'], raise_exception=1)
+					frappe.throw(_("Warehouse required for stock Item {0}").format(d["item_code"]))
 
 
 	def update_current_stock(self):
@@ -187,18 +181,13 @@
 		"""
 		if not any([flt(d.get('packed_qty')) for d in self.get(self.fname)]):
 			return
-		packing_error_list = []
+		has_error = False
 		for d in self.get(self.fname):
 			if flt(d.get('qty')) != flt(d.get('packed_qty')):
-				packing_error_list.append([
-					d.get('item_code', ''),
-					d.get('qty', 0),
-					d.get('packed_qty', 0)
-				])
-		if packing_error_list:
-			err_msg = "\n".join([("Item: " + d[0] + ", Qty: " + cstr(d[1]) \
-				+ ", Packed: " + cstr(d[2])) for d in packing_error_list])
-			frappe.msgprint("Packing Error:\n" + err_msg, raise_exception=1)
+				frappe.msgprint(_("Packed quantity must equal quantity for Item {0} in row {1}").format(d.item_code, d.idx))
+				has_error = True
+		if has_error:
+			raise frappe.ValidationError
 
 	def check_next_docstatus(self):
 		submit_rv = frappe.db.sql("""select t1.name
@@ -206,16 +195,14 @@
 			where t1.name = t2.parent and t2.delivery_note = %s and t1.docstatus = 1""",
 			(self.name))
 		if submit_rv:
-			msgprint("Sales Invoice : " + cstr(submit_rv[0][0]) + " has already been submitted !")
-			raise Exception , "Validation Error."
+			frappe.throw(_("Sales Invoice {0} has already been submitted").format(submit_rv[0][0]))
 
 		submit_in = frappe.db.sql("""select t1.name
 			from `tabInstallation Note` t1, `tabInstallation Note Item` t2
 			where t1.name = t2.parent and t2.prevdoc_docname = %s and t1.docstatus = 1""",
 			(self.name))
 		if submit_in:
-			msgprint("Installation Note : "+cstr(submit_in[0][0]) +" has already been submitted !")
-			raise Exception , "Validation Error."
+			frappe.throw(_("Installation Note {0} has already been submitted").format(submit_in[0][0]))
 
 	def cancel_packing_slips(self):
 		"""
@@ -228,7 +215,7 @@
 			for r in res:
 				ps = frappe.get_doc('Packing Slip', r[0])
 				ps.cancel()
-			frappe.msgprint(_("Packing Slip(s) Cancelled"))
+			frappe.msgprint(_("Packing Slip(s) cancelled"))
 
 
 	def update_stock_ledger(self):
@@ -293,8 +280,7 @@
 		si.run_method("onload_post_render")
 
 		if len(si.get("entries")) == 0:
-			frappe.msgprint(_("All these items have already been invoiced."),
-				raise_exception=True)
+			frappe.throw(_("All these items have already been invoiced"))
 
 	def update_item(source_doc, target_doc, source_parent):
 		target_doc.qty = source_doc.qty - invoiced_qty_map.get(source_doc.name, 0)
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 1bdab9e..45c571c 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -18,13 +18,13 @@
 			from frappe.model.naming import make_autoname
 			self.item_code = make_autoname(self.naming_series+'.#####')
 		elif not self.item_code:
-			msgprint(_("Item Code (item_code) is mandatory because Item naming is not sequential."), raise_exception=1)
+			msgprint(_("Item Code is mandatory because Item is not automatically numbered"), raise_exception=1)
 
 		self.name = self.item_code
 
 	def validate(self):
 		if not self.stock_uom:
-			msgprint(_("Please enter Default Unit of Measure"), raise_exception=1)
+			msgprint(_("Please enter default Unit of Measure"), raise_exception=1)
 
 		self.check_warehouse_is_set_for_stock_item()
 		self.check_stock_uom_with_bin()
@@ -51,7 +51,7 @@
 
 	def check_warehouse_is_set_for_stock_item(self):
 		if self.is_stock_item=="Yes" and not self.default_warehouse:
-			frappe.msgprint(_("Default Warehouse is mandatory for Stock Item."),
+			frappe.msgprint(_("Default Warehouse is mandatory for stock Item."),
 				raise_exception=WarehouseNotSet)
 
 	def add_default_uom_in_conversion_factor_table(self):
@@ -97,17 +97,12 @@
 		check_list = []
 		for d in self.get('uom_conversion_details'):
 			if cstr(d.uom) in check_list:
-				msgprint(_("UOM %s has been entered more than once in Conversion Factor Table." %
-				 	cstr(d.uom)), raise_exception=1)
+				frappe.throw(_("Unit of Measure {0} has been entered more than once in Conversion Factor Table").format(d.uom))
 			else:
 				check_list.append(cstr(d.uom))
 
 			if d.uom and cstr(d.uom) == cstr(self.stock_uom) and flt(d.conversion_factor) != 1:
-					msgprint(_("""Conversion Factor of UOM: %s should be equal to 1. As UOM: %s is Stock UOM of Item: %s.""" %
-						(d.uom, d.uom, self.name)), raise_exception=1)
-			elif d.uom and cstr(d.uom)!= self.stock_uom and flt(d.conversion_factor) == 1:
-				msgprint(_("""Conversion Factor of UOM: %s should not be equal to 1. As UOM: %s is not Stock UOM of Item: %s""" %
-					(d.uom, d.uom, self.name)), raise_exception=1)
+				frappe.throw(_("Conversion factor for default Unit of Measure must be 1 in row {0}").format(d.idx))
 
 	def validate_item_type(self):
 		if cstr(self.is_manufactured_item) == "No":
@@ -118,7 +113,7 @@
 				it must be a stock item."))
 
 		if self.has_serial_no == 'Yes' and self.is_stock_item == 'No':
-			msgprint("'Has Serial No' can not be 'Yes' for non-stock item", raise_exception=1)
+			msgprint(_("'Has Serial No' can not be 'Yes' for non-stock item"), raise_exception=1)
 
 	def check_for_active_boms(self):
 		if self.is_purchase_item != "Yes":
@@ -153,10 +148,10 @@
 				account_type = frappe.db.get_value("Account", d.tax_type, "account_type")
 
 				if account_type not in ['Tax', 'Chargeable', 'Income Account', 'Expense Account']:
-					msgprint("'%s' is not Tax / Chargeable / Income / Expense Account" % d.tax_type, raise_exception=1)
+					frappe.throw(_("Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable").format(d.idx))
 				else:
 					if d.tax_type in check_list:
-						msgprint("Rate is entered twice for: '%s'" % d.tax_type, raise_exception=1)
+						frappe.throw(_("{0} entered twice in Item Tax").format(d.tax_type))
 					else:
 						check_list.append(d.tax_type)
 
@@ -165,8 +160,7 @@
 			duplicate = frappe.db.sql("""select name from tabItem where barcode = %s
 				and name != %s""", (self.barcode, self.name))
 			if duplicate:
-				msgprint("Barcode: %s already used in item: %s" %
-					(self.barcode, cstr(duplicate[0][0])), raise_exception = 1)
+				frappe.throw(_("Barcode {0} already used in Item {1}").format(self.barcode, duplicate[0][0]))
 
 	def cant_change(self):
 		if not self.get("__islocal"):
@@ -182,8 +176,7 @@
 	def validate_item_type_for_reorder(self):
 		if self.re_order_level or len(self.get("item_reorder", {"material_request_type": "Purchase"})):
 			if not self.is_purchase_item:
-				frappe.msgprint(_("""To set reorder level, item must be Purchase Item"""),
-					raise_exception=1)
+				frappe.throw(_("""To set reorder level, item must be Purchase Item"""))
 
 	def check_if_sle_exists(self):
 		sle = frappe.db.sql("""select name from `tabStock Ledger Entry`
@@ -193,9 +186,7 @@
 	def validate_name_with_item_group(self):
 		# causes problem with tree build
 		if frappe.db.exists("Item Group", self.name):
-			frappe.msgprint("An item group exists with same name (%s), \
-				please change the item name or rename the item group" %
-				self.name, raise_exception=1)
+			frappe.throw(_("An Item Group exists with same name, please change the item name or rename the item group"))
 
 	def update_item_price(self):
 		frappe.db.sql("""update `tabItem Price` set item_name=%s,
@@ -269,14 +260,7 @@
 		end_of_life = frappe.db.get_value("Item", item_code, "end_of_life")
 
 	if end_of_life and getdate(end_of_life) <= now_datetime().date():
-		msg = (_("Item") + " %(item_code)s: " + _("reached its end of life on") + \
-			" %(date)s. " + _("Please check") + ": %(end_of_life_label)s " + \
-			"in Item master") % {
-				"item_code": item_code,
-				"date": formatdate(end_of_life),
-				"end_of_life_label": frappe.get_meta("Item").get_label("end_of_life")
-			}
-
+		msg = _("Item {0} has reached its end of life on {1}").format(item_code, formatdate(end_of_life))
 		_msgprint(msg, verbose)
 
 def validate_is_stock_item(item_code, is_stock_item=None, verbose=1):
@@ -284,9 +268,7 @@
 		is_stock_item = frappe.db.get_value("Item", item_code, "is_stock_item")
 
 	if is_stock_item != "Yes":
-		msg = (_("Item") + " %(item_code)s: " + _("is not a Stock Item")) % {
-			"item_code": item_code,
-		}
+		msg = _("Item {0} is not a stock Item").format(item_code)
 
 		_msgprint(msg, verbose)
 
@@ -295,10 +277,7 @@
 		docstatus = frappe.db.get_value("Item", item_code, "docstatus")
 
 	if docstatus == 2:
-		msg = (_("Item") + " %(item_code)s: " + _("is a cancelled Item")) % {
-			"item_code": item_code,
-		}
-
+		msg = _("Item {0} is cancelled").format(item_code)
 		_msgprint(msg, verbose)
 
 def _msgprint(msg, verbose):
diff --git a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
index e7cb410..b1a67e2 100644
--- a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
+++ b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
@@ -9,20 +9,20 @@
 from frappe.model.document import Document
 
 class LandedCostWizard(Document):
-			
+
 	def update_landed_cost(self):
 		"""
-			Add extra cost and recalculate all values in pr, 
+			Add extra cost and recalculate all values in pr,
 			Recalculate valuation rate in all sle after pr posting date
 		"""
-		purchase_receipts = [row.purchase_receipt for row in 
+		purchase_receipts = [row.purchase_receipt for row in
 			self.get("lc_pr_details")]
-			
+
 		self.validate_purchase_receipts(purchase_receipts)
 		self.cancel_pr(purchase_receipts)
 		self.add_charges_in_pr(purchase_receipts)
 		self.submit_pr(purchase_receipts)
-		msgprint("Landed Cost updated successfully")
+		msgprint(_("Landed Cost updated successfully"))
 
 	def validate_purchase_receipts(self, purchase_receipts):
 		for pr in purchase_receipts:
@@ -32,21 +32,21 @@
 	def add_charges_in_pr(self, purchase_receipts):
 		""" Add additional charges in selected pr proportionately"""
 		total_amt = self.get_total_pr_amt(purchase_receipts)
-		
+
 		for pr in purchase_receipts:
 			pr_doc = frappe.get_doc('Purchase Receipt', pr)
 			pr_items = pr_doc.get("purchase_tax_details")
-			
+
 			for lc in self.get("landed_cost_details"):
 				amt = flt(lc.amount) * flt(pr_doc.net_total)/ flt(total_amt)
-				
+
 				matched_row = pr_doc.get("other_charges", {
 					"category": "Valuation",
 					"add_deduct_tax": "Add",
 					"charge_type": "Actual",
 					"account_head": lc.account_head
 				})
-				
+
 				if not matched_row:	# add if not exists
 					ch = pr_doc.append("other_charges")
 					ch.category = 'Valuation'
@@ -63,30 +63,30 @@
 					matched_row[0].rate = amt
 					matched_row[0].tax_amount = amt
 					matched_row[0].cost_center = lc.cost_center
-					
+
 			pr_doc.run_method("validate")
 			for d in pr_doc.get_all_children():
 				d.db_update()
-	
+
 	def get_total_pr_amt(self, purchase_receipts):
-		return frappe.db.sql("""SELECT SUM(net_total) FROM `tabPurchase Receipt` 
-			WHERE name in (%s)""" % ', '.join(['%s']*len(purchase_receipts)), 
+		return frappe.db.sql("""SELECT SUM(net_total) FROM `tabPurchase Receipt`
+			WHERE name in (%s)""" % ', '.join(['%s']*len(purchase_receipts)),
 			tuple(purchase_receipts))[0][0]
-			
+
 	def cancel_pr(self, purchase_receipts):
 		for pr in purchase_receipts:
 			pr_doc = frappe.get_doc("Purchase Receipt", pr)
-			
+
 			pr_doc.run_method("update_ordered_qty")
-			
-			frappe.db.sql("""delete from `tabStock Ledger Entry` 
+
+			frappe.db.sql("""delete from `tabStock Ledger Entry`
 				where voucher_type='Purchase Receipt' and voucher_no=%s""", pr)
-			frappe.db.sql("""delete from `tabGL Entry` where voucher_type='Purchase Receipt' 
+			frappe.db.sql("""delete from `tabGL Entry` where voucher_type='Purchase Receipt'
 				and voucher_no=%s""", pr)
-			
+
 	def submit_pr(self, purchase_receipts):
 		for pr in purchase_receipts:
 			pr_doc = frappe.get_doc("Purchase Receipt", pr)
 			pr_doc.run_method("update_ordered_qty")
 			pr_doc.run_method("update_stock")
-			pr_doc.run_method("make_gl_entries")
\ No newline at end of file
+			pr_doc.run_method("make_gl_entries")
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index 156751e..db97611 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -114,7 +114,7 @@
 		self.check_modified_date()
 		self.update_bin(is_submit = (status == 'Submitted') and 1 or 0, is_stopped = 1)
 		frappe.db.set(self, 'status', cstr(status))
-		msgprint(self.doctype + ": " + self.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)))
+		frappe.msgprint(_("Status updated to {0}").format(_(status)))
 
 	def on_cancel(self):
 		# Step 1:=> Get Purchase Common Obj
diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.py b/erpnext/stock/doctype/packing_slip/packing_slip.py
index b4b64cd..e1a8f44 100644
--- a/erpnext/stock/doctype/packing_slip/packing_slip.py
+++ b/erpnext/stock/doctype/packing_slip/packing_slip.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.utils import flt, cint
-from frappe import msgprint, _
+from frappe import _
 
 from frappe.model.document import Document
 
@@ -32,12 +32,12 @@
 			Validates if delivery note has status as draft
 		"""
 		if cint(frappe.db.get_value("Delivery Note", self.delivery_note, "docstatus")) != 0:
-			msgprint(_("""Invalid Delivery Note. Delivery Note should exist and should be in draft state. Please rectify and try again."""), raise_exception=1)
-	
+			frappe.throw(_("Delivery Note {0} must not be submitted").format(self.delivery_note))
+
 	def validate_items_mandatory(self):
 		rows = [d.item_code for d in self.get("item_details")]
 		if not rows:
-			frappe.msgprint(_("No Items to Pack"), raise_exception=1)
+			frappe.msgprint(_("No Items to pack"), raise_exception=1)
 
 	def validate_case_nos(self):
 		"""
@@ -50,8 +50,8 @@
 		elif self.from_case_no > self.to_case_no:
 			frappe.msgprint(_("'To Case No.' cannot be less than 'From Case No.'"),
 				raise_exception=1)
-		
-		
+
+
 		res = frappe.db.sql("""SELECT name FROM `tabPacking Slip`
 			WHERE delivery_note = %(delivery_note)s AND docstatus = 1 AND
 			(from_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s
@@ -60,9 +60,7 @@
 			""", self.as_dict())
 
 		if res:
-			frappe.msgprint(_("""Case No(s) already in use. Please rectify and try again.
-				Recommended <b>From Case No. = %s</b>""") % self.get_recommended_case_no(),
-				raise_exception=1)
+			frappe.throw(_("""Case No(s) already in use. Try from Case No {0}""").format(self.get_recommended_case_no()))
 
 	def validate_qty(self):
 		"""
@@ -85,13 +83,13 @@
 			* Item Quantity dict of current packing slip doc
 			* No. of Cases of this packing slip
 		"""
-		
+
 		rows = [d.item_code for d in self.get("item_details")]
-		
+
 		condition = ""
 		if rows:
 			condition = " and item_code in (%s)" % (", ".join(["%s"]*len(rows)))
-		
+
 		# gets item code, qty per item code, latest packed qty per item code and stock uom
 		res = frappe.db.sql("""select item_code, ifnull(sum(qty), 0) as qty,
 			(select sum(ifnull(psi.qty, 0) * (abs(ps.to_case_no - ps.from_case_no) + 1))
@@ -100,7 +98,7 @@
 				and ps.delivery_note = dni.parent and psi.item_code=dni.item_code) as packed_qty,
 			stock_uom, item_name
 			from `tabDelivery Note Item` dni
-			where parent=%s %s 
+			where parent=%s %s
 			group by item_code""" % ("%s", condition),
 			tuple([self.delivery_note] + rows), as_dict=1)
 
@@ -117,12 +115,8 @@
 		item['recommended_qty'] = (flt(item['qty']) - flt(item['packed_qty'])) / no_of_cases
 		item['specified_qty'] = flt(ps_item_qty[item['item_code']])
 		if not item['packed_qty']: item['packed_qty'] = 0
-		
-		frappe.msgprint("""
-			Invalid Quantity specified (%(specified_qty)s %(stock_uom)s).
-			%(packed_qty)s out of %(qty)s %(stock_uom)s already packed for %(item_code)s.
-			<b>Recommended quantity for %(item_code)s = %(recommended_qty)s 
-			%(stock_uom)s</b>""" % item, raise_exception=1)
+
+		frappe.throw(_("Quantity for Item {0} must be less than {1}").format(item.get("item_code"), item.get("recommended_qty")))
 
 	def update_item_details(self):
 		"""
@@ -132,9 +126,9 @@
 			self.from_case_no = self.get_recommended_case_no()
 
 		for d in self.get("item_details"):
-			res = frappe.db.get_value("Item", d.item_code, 
+			res = frappe.db.get_value("Item", d.item_code,
 				["net_weight", "weight_uom"], as_dict=True)
-			
+
 			if res and len(res)>0:
 				d.net_weight = res["net_weight"]
 				d.weight_uom = res["weight_uom"]
@@ -146,12 +140,12 @@
 		"""
 		recommended_case_no = frappe.db.sql("""SELECT MAX(to_case_no) FROM `tabPacking Slip`
 			WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.as_dict())
-		
+
 		return cint(recommended_case_no[0][0]) + 1
-		
+
 	def get_items(self):
 		self.set("item_details", [])
-		
+
 		dn_details = self.get_details_for_packing()[0]
 		for item in dn_details:
 			if flt(item.qty) > flt(item.packed_qty):
@@ -164,11 +158,11 @@
 
 def item_details(doctype, txt, searchfield, start, page_len, filters):
 	from erpnext.controllers.queries import get_match_cond
-	return frappe.db.sql("""select name, item_name, description from `tabItem` 
-				where name in ( select item_code FROM `tabDelivery Note Item` 
-	 						where parent= %s 
-	 							and ifnull(qty, 0) > ifnull(packed_qty, 0)) 
-	 			and %s like "%s" %s 
-	 			limit  %s, %s """ % ("%s", searchfield, "%s", 
-	 			get_match_cond(doctype), "%s", "%s"), 
-	 			(filters["delivery_note"], "%%%s%%" % txt, start, page_len))
\ No newline at end of file
+	return frappe.db.sql("""select name, item_name, description from `tabItem`
+				where name in ( select item_code FROM `tabDelivery Note Item`
+	 						where parent= %s
+	 							and ifnull(qty, 0) > ifnull(packed_qty, 0))
+	 			and %s like "%s" %s
+	 			limit  %s, %s """ % ("%s", searchfield, "%s",
+	 			get_match_cond(doctype), "%s", "%s"),
+	 			(filters["delivery_note"], "%%%s%%" % txt, start, page_len))
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 7626112..fa3571f 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -6,7 +6,7 @@
 
 from frappe.utils import cstr, flt, cint
 
-from frappe import msgprint, _
+from frappe import _
 import frappe.defaults
 from erpnext.stock.utils import update_bin
 
@@ -86,21 +86,18 @@
 
 			# Check Received Qty = Accepted Qty + Rejected Qty
 			if ((flt(d.qty) + flt(d.rejected_qty)) != flt(d.received_qty)):
-
-				msgprint("Sum of Accepted Qty and Rejected Qty must be equal to Received quantity. Error for Item: " + cstr(d.item_code))
-				raise Exception
+				frappe.throw(_("Accepted + Rejected Qty must be equal to Received quantity for Item {0}").format(d.item_code))
 
 
 	def validate_challan_no(self):
 		"Validate if same challan no exists for same supplier in a submitted purchase receipt"
 		if self.challan_no:
-			exists = frappe.db.sql("""
+			exists = frappe.db.sql_list("""
 			SELECT name FROM `tabPurchase Receipt`
 			WHERE name!=%s AND supplier=%s AND challan_no=%s
 		AND docstatus=1""", (self.name, self.supplier, self.challan_no))
 			if exists:
-				frappe.msgprint("Another Purchase Receipt using the same Challan No. already exists.\
-			Please enter a valid Challan No.", raise_exception=1)
+				frappe.throw(_("Supplier delivery number duplicate in {0}").format(exists))
 
 	def validate_with_previous_doc(self):
 		super(PurchaseReceipt, self).validate_with_previous_doc(self.tname, {
@@ -129,8 +126,7 @@
 		if frappe.db.get_value("Buying Settings", None, "po_required") == 'Yes':
 			 for d in self.get('purchase_receipt_details'):
 				 if not d.prevdoc_docname:
-					 msgprint("Purchse Order No. required against item %s"%d.item_code)
-					 raise Exception
+					 frappe.throw(_("Purchase Order number required for Item {0}").format(d.item_code))
 
 	def update_stock(self):
 		sl_entries = []
@@ -212,7 +208,7 @@
 				(d.item_code,), as_dict = 1)
 			ins_reqd = ins_reqd and ins_reqd[0]['inspection_required'] or 'No'
 			if ins_reqd == 'Yes' and not d.qa_no:
-				msgprint("Item: " + d.item_code + " requires QA Inspection. Please enter QA No or report to authorized person to create Quality Inspection")
+				frappe.throw(_("Quality Inspection required for Item {0}").format(d.item_code))
 
 	# Check for Stopped status
 	def check_for_stopped_status(self, pc_obj):
@@ -251,9 +247,7 @@
 			where t1.name = t2.parent and t2.purchase_receipt = %s and t1.docstatus = 1""",
 			(self.name))
 		if submit_rv:
-			msgprint("Purchase Invoice : " + cstr(self.submit_rv[0][0]) + " has already been submitted !")
-			raise Exception , "Validation Error."
-
+			frappe.throw(_("Purchase Invoice {0} is already submitted").format(self.submit_rv[0][0]))
 
 	def on_cancel(self):
 		pc_obj = frappe.get_doc('Purchase Common')
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 9078655..37838ec 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -29,7 +29,7 @@
 		if self.get("__islocal") and self.warehouse:
 			frappe.throw(_("New Serial No cannot have Warehouse. Warehouse must be \
 				set by Stock Entry or Purchase Receipt"), SerialNoCannotCreateDirectError)
-			
+
 		self.set_maintenance_status()
 		self.validate_warehouse()
 		self.validate_item()
@@ -38,28 +38,28 @@
 	def set_maintenance_status(self):
 		if not self.warranty_expiry_date and not self.amc_expiry_date:
 			self.maintenance_status = None
-			
+
 		if self.warranty_expiry_date and self.warranty_expiry_date < nowdate():
 			self.maintenance_status = "Out of Warranty"
-		
+
 		if self.amc_expiry_date and self.amc_expiry_date < nowdate():
 			self.maintenance_status = "Out of AMC"
-		
+
 		if self.amc_expiry_date and self.amc_expiry_date >= nowdate():
 			self.maintenance_status = "Under AMC"
-			
+
 		if self.warranty_expiry_date and self.warranty_expiry_date >= nowdate():
 			self.maintenance_status = "Under Warranty"
 
 	def validate_warehouse(self):
 		if not self.get("__islocal"):
-			item_code, warehouse = frappe.db.get_value("Serial No", 
+			item_code, warehouse = frappe.db.get_value("Serial No",
 				self.name, ["item_code", "warehouse"])
 			if item_code != self.item_code:
-				frappe.throw(_("Item Code cannot be changed for Serial No."), 
+				frappe.throw(_("Item Code cannot be changed for Serial No."),
 					SerialNoCannotCannotChangeError)
 			if not self.via_stock_ledger and warehouse != self.warehouse:
-				frappe.throw(_("Warehouse cannot be changed for Serial No."), 
+				frappe.throw(_("Warehouse cannot be changed for Serial No."),
 					SerialNoCannotCannotChangeError)
 
 	def validate_item(self):
@@ -69,17 +69,17 @@
 		item = frappe.get_doc("Item", self.item_code)
 		if item.has_serial_no!="Yes":
 			frappe.throw(_("Item must have 'Has Serial No' as 'Yes'") + ": " + self.item_code)
-			
+
 		self.item_group = item.item_group
 		self.description = item.description
 		self.item_name = item.item_name
 		self.brand = item.brand
 		self.warranty_period = item.warranty_period
-		
+
 	def set_status(self, last_sle):
 		if last_sle:
 			if last_sle.voucher_type == "Stock Entry":
-				document_type = frappe.db.get_value("Stock Entry", last_sle.voucher_no, 
+				document_type = frappe.db.get_value("Stock Entry", last_sle.voucher_no,
 					"purpose")
 			else:
 				document_type = last_sle.voucher_type
@@ -98,7 +98,7 @@
 					self.status = "Not Available"
 		else:
 			self.status = "Not Available"
-		
+
 	def set_purchase_details(self, purchase_sle):
 		if purchase_sle:
 			self.purchase_document_type = purchase_sle.voucher_type
@@ -108,13 +108,13 @@
 			self.purchase_rate = purchase_sle.incoming_rate
 			if purchase_sle.voucher_type == "Purchase Receipt":
 				self.supplier, self.supplier_name = \
-					frappe.db.get_value("Purchase Receipt", purchase_sle.voucher_no, 
+					frappe.db.get_value("Purchase Receipt", purchase_sle.voucher_no,
 						["supplier", "supplier_name"])
 		else:
-			for fieldname in ("purchase_document_type", "purchase_document_no", 
+			for fieldname in ("purchase_document_type", "purchase_document_no",
 				"purchase_date", "purchase_time", "purchase_rate", "supplier", "supplier_name"):
 					self.set(fieldname, None)
-				
+
 	def set_sales_details(self, delivery_sle):
 		if delivery_sle:
 			self.delivery_document_type = delivery_sle.voucher_type
@@ -122,70 +122,70 @@
 			self.delivery_date = delivery_sle.posting_date
 			self.delivery_time = delivery_sle.posting_time
 			self.customer, self.customer_name = \
-				frappe.db.get_value(delivery_sle.voucher_type, delivery_sle.voucher_no, 
+				frappe.db.get_value(delivery_sle.voucher_type, delivery_sle.voucher_no,
 					["customer", "customer_name"])
 			if self.warranty_period:
-				self.warranty_expiry_date	= add_days(cstr(delivery_sle.posting_date), 
+				self.warranty_expiry_date	= add_days(cstr(delivery_sle.posting_date),
 					cint(self.warranty_period))
 		else:
-			for fieldname in ("delivery_document_type", "delivery_document_no", 
-				"delivery_date", "delivery_time", "customer", "customer_name", 
+			for fieldname in ("delivery_document_type", "delivery_document_no",
+				"delivery_date", "delivery_time", "customer", "customer_name",
 				"warranty_expiry_date"):
 					self.set(fieldname, None)
-							
+
 	def get_last_sle(self):
 		entries = {}
 		sle_dict = self.get_stock_ledger_entries()
 		if sle_dict:
 			if sle_dict.get("incoming", []):
 				entries["purchase_sle"] = sle_dict["incoming"][0]
-		
+
 			if len(sle_dict.get("incoming", [])) - len(sle_dict.get("outgoing", [])) > 0:
 				entries["last_sle"] = sle_dict["incoming"][0]
 			else:
 				entries["last_sle"] = sle_dict["outgoing"][0]
 				entries["delivery_sle"] = sle_dict["outgoing"][0]
-				
+
 		return entries
-		
+
 	def get_stock_ledger_entries(self):
 		sle_dict = {}
-		for sle in frappe.db.sql("""select * from `tabStock Ledger Entry` 
-			where serial_no like %s and item_code=%s and ifnull(is_cancelled, 'No')='No' 
-			order by posting_date desc, posting_time desc, name desc""", 
+		for sle in frappe.db.sql("""select * from `tabStock Ledger Entry`
+			where serial_no like %s and item_code=%s and ifnull(is_cancelled, 'No')='No'
+			order by posting_date desc, posting_time desc, name desc""",
 			("%%%s%%" % self.name, self.item_code), as_dict=1):
 				if self.name.upper() in get_serial_nos(sle.serial_no):
 					if sle.actual_qty > 0:
 						sle_dict.setdefault("incoming", []).append(sle)
 					else:
 						sle_dict.setdefault("outgoing", []).append(sle)
-					
+
 		return sle_dict
-					
+
 	def on_trash(self):
 		if self.status == 'Delivered':
 			frappe.throw(_("Delivered Serial No ") + self.name + _(" can not be deleted"))
 		if self.warehouse:
 			frappe.throw(_("Cannot delete Serial No in warehouse. \
 				First remove from warehouse, then delete.") + ": " + self.name)
-	
+
 	def before_rename(self, old, new, merge=False):
 		if merge:
 			frappe.throw(_("Sorry, Serial Nos cannot be merged"))
-			
+
 	def after_rename(self, old, new, merge=False):
 		"""rename serial_no text fields"""
-		for dt in frappe.db.sql("""select parent from tabDocField 
+		for dt in frappe.db.sql("""select parent from tabDocField
 			where fieldname='serial_no' and fieldtype='Text'"""):
-			
-			for item in frappe.db.sql("""select name, serial_no from `tab%s` 
+
+			for item in frappe.db.sql("""select name, serial_no from `tab%s`
 				where serial_no like '%%%s%%'""" % (dt[0], old)):
-				
+
 				serial_nos = map(lambda i: i==old and new or i, item[1].split('\n'))
-				frappe.db.sql("""update `tab%s` set serial_no = %s 
+				frappe.db.sql("""update `tab%s` set serial_no = %s
 					where name=%s""" % (dt[0], '%s', '%s'),
 					('\n'.join(serial_nos), item[0]))
-	
+
 	def on_stock_ledger_entry(self):
 		if self.via_stock_ledger and not self.get("__islocal"):
 			last_sle = self.get_last_sle()
@@ -193,7 +193,7 @@
 			self.set_purchase_details(last_sle.get("purchase_sle"))
 			self.set_sales_details(last_sle.get("delivery_sle"))
 			self.set_maintenance_status()
-			
+
 	def on_communication(self):
 		return
 
@@ -201,11 +201,11 @@
 	item_det = get_item_details(sle.item_code)
 	validate_serial_no(sle, item_det)
 	update_serial_nos(sle, item_det)
-					
+
 def validate_serial_no(sle, item_det):
 	if item_det.has_serial_no=="No":
 		if sle.serial_no:
-			frappe.throw(_("Serial Number should be blank for Non Serialized Item" + ": " 
+			frappe.throw(_("Serial Number should be blank for Non Serialized Item" + ": "
 				+ sle.item_code), SerialNoNotRequiredError)
 	else:
 		if sle.serial_no:
@@ -216,41 +216,41 @@
 			if len(serial_nos) and len(serial_nos) != abs(cint(sle.actual_qty)):
 				frappe.throw(_("Serial Nos do not match with qty") + \
 					(": %s (%s)" % (sle.item_code, sle.actual_qty)), SerialNoQtyError)
-					
+
 			if len(serial_nos) != len(set(serial_nos)):
-				frappe.throw(_("Duplicate Serial No entered against item") + 
+				frappe.throw(_("Duplicate Serial No entered against item") +
 					(": %s" % sle.item_code), SerialNoDuplicateError)
-			
+
 			for serial_no in serial_nos:
 				if frappe.db.exists("Serial No", serial_no):
 					sr = frappe.get_doc("Serial No", serial_no)
-					
+
 					if sr.item_code!=sle.item_code:
-						frappe.throw(_("Serial No does not belong to Item") + 
+						frappe.throw(_("Serial No does not belong to Item") +
 							(": %s (%s)" % (sle.item_code, serial_no)), SerialNoItemError)
-							
+
 					if sr.warehouse and sle.actual_qty > 0:
-						frappe.throw(_("Same Serial No") + ": " + sr.name + 
+						frappe.throw(_("Same Serial No") + ": " + sr.name +
 							_(" can not be received twice"), SerialNoDuplicateError)
-					
+
 					if sle.actual_qty < 0:
 						if sr.warehouse!=sle.warehouse:
-							frappe.throw(_("Serial No") + ": " + serial_no + 
-								_(" does not belong to Warehouse") + ": " + sle.warehouse, 
+							frappe.throw(_("Serial No") + ": " + serial_no +
+								_(" does not belong to Warehouse") + ": " + sle.warehouse,
 								SerialNoWarehouseError)
-					
+
 						if sle.voucher_type in ("Delivery Note", "Sales Invoice") \
 							and sr.status != "Available":
-							frappe.throw(_("Serial No status must be 'Available' to Deliver") 
+							frappe.throw(_("Serial No status must be 'Available' to Deliver")
 								+ ": " + serial_no, SerialNoStatusError)
 				elif sle.actual_qty < 0:
 					# transfer out
 					frappe.throw(_("Serial No must exist to transfer out.") + \
 						": " + serial_no, SerialNoNotExistsError)
 		elif sle.actual_qty < 0 or not item_det.serial_no_series:
-			frappe.throw(_("Serial Number Required for Serialized Item" + ": " 
+			frappe.throw(_("Serial Number Required for Serialized Item" + ": "
 				+ sle.item_code), SerialNoRequiredError)
-				
+
 def update_serial_nos(sle, item_det):
 	if sle.is_cancelled == "No" and not sle.serial_no and sle.actual_qty > 0 and item_det.serial_no_series:
 		from frappe.model.naming import make_autoname
@@ -258,7 +258,7 @@
 		for i in xrange(cint(sle.actual_qty)):
 			serial_nos.append(make_autoname(item_det.serial_no_series))
 		frappe.db.set(sle, "serial_no", "\n".join(serial_nos))
-		
+
 	if sle.serial_no:
 		serial_nos = get_serial_nos(sle.serial_no)
 		for serial_no in serial_nos:
@@ -271,12 +271,12 @@
 				make_serial_no(serial_no, sle)
 
 def get_item_details(item_code):
-	return frappe.db.sql("""select name, has_batch_no, docstatus, 
-		is_stock_item, has_serial_no, serial_no_series 
+	return frappe.db.sql("""select name, has_batch_no, docstatus,
+		is_stock_item, has_serial_no, serial_no_series
 		from tabItem where name=%s""", item_code, as_dict=True)[0]
-		
+
 def get_serial_nos(serial_no):
-	return [s.strip() for s in cstr(serial_no).strip().upper().replace(',', '\n').split('\n') 
+	return [s.strip() for s in cstr(serial_no).strip().upper().replace(',', '\n').split('\n')
 		if s.strip()]
 
 def make_serial_no(serial_no, sle):
@@ -290,14 +290,14 @@
 	sr.warehouse = sle.warehouse
 	sr.status = "Available"
 	sr.save()
-	frappe.msgprint(_("Serial No created") + ": " + sr.name)
+	frappe.msgprint(_("Serial No {0} created").format(sr.name))
 	return sr.name
-	
+
 def update_serial_nos_after_submit(controller, parentfield):
 	stock_ledger_entries = frappe.db.sql("""select voucher_detail_no, serial_no
-		from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""", 
+		from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
 		(controller.doctype, controller.name), as_dict=True)
-		
+
 	if not stock_ledger_entries: return
 
 	for d in controller.get(parentfield):
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index cb130b2..dfa2c62 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -7,7 +7,7 @@
 
 from frappe.utils import cstr, cint, flt, comma_or, nowdate
 
-from frappe import msgprint, _
+from frappe import _
 from erpnext.stock.utils import get_incoming_rate
 from erpnext.stock.stock_ledger import get_previous_sle
 from erpnext.controllers.queries import get_match_cond
@@ -67,15 +67,13 @@
 		valid_purposes = ["Material Issue", "Material Receipt", "Material Transfer",
 			"Manufacture/Repack", "Subcontract", "Sales Return", "Purchase Return"]
 		if self.purpose not in valid_purposes:
-			msgprint(_("Purpose must be one of ") + comma_or(valid_purposes),
-				raise_exception=True)
+			frappe.throw(_("Purpose must be one of {0}").format(comma_or(valid_purposes)))
 
 	def validate_item(self):
 		stock_items = self.get_stock_items()
 		for item in self.get("mtn_details"):
 			if item.item_code not in stock_items:
-				msgprint(_("""Only Stock Items are allowed for Stock Entry"""),
-					raise_exception=True)
+				frappe.throw(_("""Only Stock Items are allowed for Stock Entry"""))
 
 	def validate_warehouse(self, pro_obj):
 		"""perform various (sometimes conditional) validations on warehouse"""
@@ -100,15 +98,13 @@
 				d.t_warehouse = self.to_warehouse
 
 			if not (d.s_warehouse or d.t_warehouse):
-				msgprint(_("Atleast one warehouse is mandatory"), raise_exception=1)
+				frappe.throw(_("Atleast one warehouse is mandatory"))
 
 			if self.purpose in source_mandatory and not d.s_warehouse:
-				msgprint(_("Row # ") + "%s: " % cint(d.idx)
-					+ _("Source Warehouse") + _(" is mandatory"), raise_exception=1)
+				frappe.throw(_("Source warehouse is mandatory for row {0}").format(d.idx))
 
 			if self.purpose in target_mandatory and not d.t_warehouse:
-				msgprint(_("Row # ") + "%s: " % cint(d.idx)
-					+ _("Target Warehouse") + _(" is mandatory"), raise_exception=1)
+				frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx))
 
 			if self.purpose == "Manufacture/Repack":
 				if validate_for_manufacture_repack:
@@ -116,23 +112,18 @@
 						d.s_warehouse = None
 
 						if not d.t_warehouse:
-							msgprint(_("Row # ") + "%s: " % cint(d.idx)
-								+ _("Target Warehouse") + _(" is mandatory"), raise_exception=1)
+							frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx))
 
 						elif pro_obj and cstr(d.t_warehouse) != pro_obj.fg_warehouse:
-							msgprint(_("Row # ") + "%s: " % cint(d.idx)
-								+ _("Target Warehouse") + _(" should be same as that in ")
-								+ _("Production Order"), raise_exception=1)
+							frappe.throw(_("Target warehouse in row {0} must be same as Production Order").format(d.idx))
 
 					else:
 						d.t_warehouse = None
 						if not d.s_warehouse:
-							msgprint(_("Row # ") + "%s: " % cint(d.idx)
-								+ _("Source Warehouse") + _(" is mandatory"), raise_exception=1)
+							frappe.throw(_("Source warehouse is mandatory for row {0}").format(d.idx))
 
 			if cstr(d.s_warehouse) == cstr(d.t_warehouse):
-				msgprint(_("Source and Target Warehouse cannot be same"),
-					raise_exception=1)
+				frappe.throw(_("Source and target warehouse cannot be same for row {0}").format(d.idx))
 
 	def validate_production_order(self, pro_obj=None):
 		if not pro_obj:
@@ -228,17 +219,13 @@
 			if d.bom_no and not frappe.db.sql("""select name from `tabBOM`
 					where item = %s and name = %s and docstatus = 1 and is_active = 1""",
 					(d.item_code, d.bom_no)):
-				msgprint(_("Item") + " %s: " % cstr(d.item_code)
-					+ _("does not belong to BOM: ") + cstr(d.bom_no)
-					+ _(" or the BOM is cancelled or inactive"), raise_exception=1)
+				frappe.throw(_("BOM {0} is not submitted or inactive BOM for Item {1}").format(d.bom_no, d.item_code))
 
 	def validate_finished_goods(self):
 		"""validation: finished good quantity should be same as manufacturing quantity"""
-		import json
 		for d in self.get('mtn_details'):
 			if d.bom_no and flt(d.transfer_qty) != flt(self.fg_completed_qty):
-				msgprint(_("Row #") + " %s: " % d.idx
-					+ _("Quantity should be equal to Manufacturing Quantity. To fetch items again, click on 'Get Items' button or update the Quantity manually."), raise_exception=1)
+				frappe.throw(_("Quantity in row {0} must be same as manufactured quantity").format(d.idx))
 
 	def validate_return_reference_doc(self):
 		"""validate item with reference doc"""
@@ -247,14 +234,12 @@
 		if ref.doc:
 			# validate docstatus
 			if ref.doc.docstatus != 1:
-				frappe.msgprint(_(ref.doc.doctype) + ' "' + ref.doc.name + '": '
-					+ _("Status should be Submitted"), raise_exception=frappe.InvalidStatusError)
+				frappe.throw(_("{0} {1} must be submitted").format(ref.doc.doctype, ref.doc.name),
+					frappe.InvalidStatusError)
 
 			# update stock check
 			if ref.doc.doctype == "Sales Invoice" and cint(ref.doc.update_stock) != 1:
-				frappe.msgprint(_(ref.doc.doctype) + ' "' + ref.doc.name + '": '
-					+ _("Update Stock should be checked."),
-					raise_exception=NotUpdateStockError)
+				frappe.throw(_("'Update Stock' for Sales Invoice {0} must be set").format(ref.doc.name), NotUpdateStockError)
 
 			# posting date check
 			ref_posting_datetime = "%s %s" % (cstr(ref.doc.posting_date),
@@ -263,9 +248,7 @@
 				cstr(self.posting_time))
 			if this_posting_datetime < ref_posting_datetime:
 				from frappe.utils.dateutils import datetime_in_user_format
-				frappe.msgprint(_("Posting Date Time cannot be before")
-					+ ": " + datetime_in_user_format(ref_posting_datetime),
-					raise_exception=True)
+				frappe.throw(_("Posting timestamp must be after {0}").format(datetime_in_user_format(ref_posting_datetime)))
 
 			stock_items = get_stock_items_for_return(ref.doc, ref.parentfields)
 			already_returned_item_qty = self.get_already_returned_item_qty(ref.fieldname)
@@ -273,9 +256,8 @@
 			for item in self.get("mtn_details"):
 				# validate if item exists in the ref doc and that it is a stock item
 				if item.item_code not in stock_items:
-					msgprint(_("Item") + ': "' + item.item_code + _("\" does not exist in ") +
-						ref.doc.doctype + ": " + ref.doc.name,
-						raise_exception=frappe.DoesNotExistError)
+					frappe.throw(_("Item {0} does not exist in {1} {2}").format(item.item_code, ref.doc.doctype, ref.doc.name),
+						frappe.DoesNotExistError)
 
 				# validate quantity <= ref item's qty - qty already returned
 				ref_item = ref.doc.getone({"item_code": item.item_code})
@@ -328,12 +310,10 @@
 	def update_production_order(self):
 		def _validate_production_order(pro_doc):
 			if flt(pro_doc.docstatus) != 1:
-				frappe.throw(_("Production Order must be submitted") + ": " +
-					self.production_order)
+				frappe.throw(_("Production Order {0} must be submitted").format(self.production_order))
 
 			if pro_doc.status == 'Stopped':
-				msgprint(_("Transaction not allowed against stopped Production Order") + ": " +
-					self.production_order)
+				frappe.throw(_("Transaction not allowed against stopped Production Order {0}").format(self.production_order))
 
 		if self.production_order:
 			pro_doc = frappe.get_doc("Production Order", self.production_order)
@@ -372,7 +352,7 @@
 			where name = %s and (ifnull(end_of_life,'')='' or end_of_life > now())""",
 			(arg.get('item_code')), as_dict = 1)
 		if not item:
-			msgprint("Item is not active", raise_exception=1)
+			frappe.throw(_("Item {0} is not active or end of life has been reached").format(arg.get("item_code")))
 
 		ret = {
 			'uom'			      	: item and item[0]['stock_uom'] or '',
@@ -398,8 +378,7 @@
 		uom = frappe.db.sql("""select conversion_factor from `tabUOM Conversion Detail`
 			where parent = %s and uom = %s""", (arg['item_code'], arg['uom']), as_dict = 1)
 		if not uom or not flt(uom[0].conversion_factor):
-			msgprint("There is no Conversion Factor for UOM '%s' in Item '%s'" % (arg['uom'],
-				arg['item_code']))
+			frappe.msgprint(_("UOM coversion factor required for UOM {0} in Item {1}").format(arg["uom"], arg["item_code"]))
 			ret = {'uom' : ''}
 		else:
 			ret = {
@@ -531,12 +510,10 @@
 
 		# show some message
 		if not len(item_dict):
-			frappe.msgprint(_("""All items have already been transferred \
-				for this Production Order."""))
+			frappe.msgprint(_("""All items have already been transferred for this Production Order."""))
 
 		elif only_pending_fetched:
-			frappe.msgprint(_("""Only quantities pending to be transferred \
-				were fetched for the following items:\n""" + "\n".join(only_pending_fetched)))
+			frappe.msgprint(_("Pending Items {0} updated").format(only_pending_fetched))
 
 		return item_dict
 
@@ -589,10 +566,8 @@
 					{"name": item.material_request_item, "parent": item.material_request},
 					["item_code", "warehouse", "idx"], as_dict=True)
 				if mreq_item.item_code != item.item_code or mreq_item.warehouse != item.t_warehouse:
-					msgprint(_("Row #") + (" %d: " % item.idx) + _("does not match")
-						+ " " + _("Row #") + (" %d %s " % (mreq_item.idx, _("of")))
-						+ _("Material Request") + (" - %s" % item.material_request),
-						raise_exception=frappe.MappingMismatchError)
+					frappe.throw(_("Item or Warehouse for row {0} does not match Material Request").format(item.idx),
+						frappe.MappingMismatchError)
 
 @frappe.whitelist()
 def get_party_details(ref_dt, ref_dn):
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 34558fb..3717bf1 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -3,7 +3,7 @@
 from __future__ import unicode_literals
 
 import frappe
-from frappe import msgprint
+from frappe import _
 from frappe.utils import cint, flt, cstr, now
 from erpnext.stock.utils import get_valuation_method
 import json
@@ -309,17 +309,11 @@
 
 def _raise_exceptions(args, verbose=1):
 	deficiency = min(e["diff"] for e in _exceptions)
-	msg = """Negative stock error:
-		Cannot complete this transaction because stock will start
-		becoming negative (%s) for Item <b>%s</b> in Warehouse
-		<b>%s</b> on <b>%s %s</b> in Transaction %s %s.
-		Total Quantity Deficiency: <b>%s</b>""" % \
-		(_exceptions[0]["diff"], args.get("item_code"), args.get("warehouse"),
-		_exceptions[0]["posting_date"], _exceptions[0]["posting_time"],
-		_exceptions[0]["voucher_type"], _exceptions[0]["voucher_no"],
-		abs(deficiency))
+	msg = _("Negative Stock Error ({6}) for Item {0} in Warehouse {1} on {2} {3} in {4} {5}").format(args["item_code"],
+		args.get("warehouse"), _exceptions[0]["posting_date"], _exceptions[0]["posting_time"],
+		_(_exceptions[0]["voucher_type"]), _exceptions[0]["voucher_no"], deficiency)
 	if verbose:
-		msgprint(msg, raise_exception=NegativeStockError)
+		frappe.throw(msg, NegativeStockError)
 	else:
 		raise NegativeStockError, msg
 
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index bce94f3..1c5458e 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -2,7 +2,7 @@
 # License: GNU General Public License v3. See license.txt
 
 import frappe
-from frappe import msgprint, _
+from frappe import _
 import json
 from frappe.utils import flt, cstr, nowdate, add_days, cint
 from frappe.defaults import get_global_default
@@ -58,8 +58,7 @@
 		bin.update_stock(args)
 		return bin
 	else:
-		msgprint("[Stock Update] Ignored %s since it is not a stock item"
-			% args.get("item_code"))
+		frappe.msgprint(_("Item {0} ignored since it is not a stock item").format(args.get("item_code")))
 
 def get_incoming_rate(args):
 	"""Get Incoming Rate based on valuation method"""
@@ -134,22 +133,20 @@
 		if val:
 			val = val.strip()
 			if val in valid_serial_nos:
-				msgprint("You have entered duplicate serial no: '%s'" % val, raise_exception=1)
+				frappe.throw(_("Serial number {0} entered more than once").format(val))
 			else:
 				valid_serial_nos.append(val)
 
 	if qty and len(valid_serial_nos) != abs(qty):
-		msgprint("Please enter serial nos for "
-			+ cstr(abs(qty)) + " quantity against item code: " + item_code,
-			raise_exception=1)
+		frappe.throw(_("{0} valid serial nos for Item {1}").format(abs(qty), item_code))
 
 	return valid_serial_nos
 
 def validate_warehouse_company(warehouse, company):
 	warehouse_company = frappe.db.get_value("Warehouse", warehouse, "company")
 	if warehouse_company and warehouse_company != company:
-		frappe.msgprint(_("Warehouse does not belong to company.") + " (" + \
-			warehouse + ", " + company +")", raise_exception=InvalidWarehouseCompany)
+		frappe.throw(_("Warehouse {0} does not belong to company {1}").format(warehouse, company),
+			InvalidWarehouseCompany)
 
 def get_sales_bom_buying_amount(item_code, warehouse, voucher_type, voucher_no, voucher_detail_no,
 		stock_ledger_entries, item_sales_bom):
