diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index 59a899b..7bb9a52 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -18,21 +18,21 @@
 class InvalidPaymentEntry(ValidationError): pass
 
 class PaymentEntry(AccountsController):
-	def setup_party_account_field(self):		
+	def setup_party_account_field(self):
 		self.party_account_field = None
 		self.party_account = None
 		self.party_account_currency = None
-		
+
 		if self.payment_type == "Receive":
 			self.party_account_field = "paid_from"
 			self.party_account = self.paid_from
 			self.party_account_currency = self.paid_from_account_currency
-			
+
 		elif self.payment_type == "Pay":
 			self.party_account_field = "paid_to"
 			self.party_account = self.paid_to
 			self.party_account_currency = self.paid_to_account_currency
-							
+
 	def validate(self):
 		self.setup_party_account_field()
 		self.set_missing_values()
@@ -50,7 +50,7 @@
 		self.set_remarks()
 		self.validate_duplicate_entry()
 		self.validate_allocated_amount()
-		
+
 	def on_submit(self):
 		self.setup_party_account_field()
 		if self.difference_amount:
@@ -58,7 +58,7 @@
 		self.make_gl_entries()
 		self.update_advance_paid()
 		self.update_expense_claim()
-		
+
 	def on_cancel(self):
 		self.setup_party_account_field()
 		self.make_gl_entries(cancel=1)
@@ -72,8 +72,8 @@
 			if (d.reference_doctype, d.reference_name) in reference_names:
 				frappe.throw(_("Row #{0}: Duplicate entry in References {1} {2}").format(d.idx, d.reference_doctype, d.reference_name))
 			reference_names.append((d.reference_doctype, d.reference_name))
-	
-	
+
+
 	def validate_allocated_amount(self):
 		for d in self.get("references"):
 			if (flt(d.allocated_amount))> 0:
@@ -89,98 +89,98 @@
 
 	def set_missing_values(self):
 		if self.payment_type == "Internal Transfer":
-			for field in ("party", "party_balance", "total_allocated_amount", 
+			for field in ("party", "party_balance", "total_allocated_amount",
 				"base_total_allocated_amount", "unallocated_amount"):
 					self.set(field, None)
 			self.references = []
 		else:
 			if not self.party_type:
 				frappe.throw(_("Party Type is mandatory"))
-				
+
 			if not self.party:
 				frappe.throw(_("Party is mandatory"))
-				
-			self.party_name = frappe.db.get_value(self.party_type, self.party, 
+
+			self.party_name = frappe.db.get_value(self.party_type, self.party,
 				self.party_type.lower() + "_name")
-		
+
 		if self.party:
 			if not self.party_balance:
 				self.party_balance = get_balance_on(party_type=self.party_type,
 					party=self.party, date=self.posting_date, company=self.company)
-			
+
 			if not self.party_account:
 				party_account = get_party_account(self.party_type, self.party, self.company)
 				self.set(self.party_account_field, party_account)
 				self.party_account = party_account
-				
+
 		if self.paid_from and not (self.paid_from_account_currency or self.paid_from_account_balance):
 			acc = get_account_details(self.paid_from, self.posting_date)
 			self.paid_from_account_currency = acc.account_currency
 			self.paid_from_account_balance = acc.account_balance
-				
+
 		if self.paid_to and not (self.paid_to_account_currency or self.paid_to_account_balance):
 			acc = get_account_details(self.paid_to, self.posting_date)
 			self.paid_to_account_currency = acc.account_currency
 			self.paid_to_account_balance = acc.account_balance
-			
+
 		self.party_account_currency = self.paid_from_account_currency \
 			if self.payment_type=="Receive" else self.paid_to_account_currency
-			
+
 		self.set_missing_ref_details()
-			
-	
+
+
 	def set_missing_ref_details(self):
 		for d in self.get("references"):
 			if d.allocated_amount:
-				ref_details = get_reference_details(d.reference_doctype, 
+				ref_details = get_reference_details(d.reference_doctype,
 					d.reference_name, self.party_account_currency)
-					
+
 				for field, value in ref_details.items():
 					if not d.get(field):
 						d.set(field, value)
-						
+
 	def validate_payment_type(self):
 		if self.payment_type not in ("Receive", "Pay", "Internal Transfer"):
 			frappe.throw(_("Payment Type must be one of Receive, Pay and Internal Transfer"))
-	
+
 	def validate_party_details(self):
 		if self.party:
 			if not frappe.db.exists(self.party_type, self.party):
 				frappe.throw(_("Invalid {0}: {1}").format(self.party_type, self.party))
-			
+
 			if self.party_account:
 				party_account_type = "Receivable" if self.party_type=="Customer" else "Payable"
 				self.validate_account_type(self.party_account, [party_account_type])
-					
+
 	def validate_bank_accounts(self):
 		if self.payment_type in ("Pay", "Internal Transfer"):
 			self.validate_account_type(self.paid_from, ["Bank", "Cash"])
-			
+
 		if self.payment_type in ("Receive", "Internal Transfer"):
 			self.validate_account_type(self.paid_to, ["Bank", "Cash"])
-			
+
 	def validate_account_type(self, account, account_types):
 		account_type = frappe.db.get_value("Account", account, "account_type")
 		if account_type not in account_types:
 			frappe.throw(_("Account Type for {0} must be {1}").format(account, comma_or(account_types)))
-				
+
 	def set_exchange_rate(self):
 		if self.paid_from and not self.source_exchange_rate:
 			if self.paid_from_account_currency == self.company_currency:
 				self.source_exchange_rate = 1
 			else:
-				self.source_exchange_rate = get_exchange_rate(self.paid_from_account_currency, 
+				self.source_exchange_rate = get_exchange_rate(self.paid_from_account_currency,
 					self.company_currency, self.posting_date)
-		
+
 		if self.paid_to and not self.target_exchange_rate:
-			self.target_exchange_rate = get_exchange_rate(self.paid_to_account_currency, 
+			self.target_exchange_rate = get_exchange_rate(self.paid_to_account_currency,
 				self.company_currency, self.posting_date)
-				
+
 	def validate_mandatory(self):
 		for field in ("paid_amount", "received_amount", "source_exchange_rate", "target_exchange_rate"):
 			if not self.get(field):
 				frappe.throw(_("{0} is mandatory").format(self.meta.get_label(field)))
-				
+
 	def validate_reference_documents(self):
 		if self.party_type == "Customer":
 			valid_reference_doctypes = ("Sales Order", "Sales Invoice", "Journal Entry")
@@ -195,7 +195,7 @@
 			if d.reference_doctype not in valid_reference_doctypes:
 				frappe.throw(_("Reference Doctype must be one of {0}")
 					.format(comma_or(valid_reference_doctypes)))
-				
+
 			elif d.reference_name:
 				if not frappe.db.exists(d.reference_doctype, d.reference_name):
 					frappe.throw(_("{0} {1} does not exist").format(d.reference_doctype, d.reference_name))
@@ -208,7 +208,7 @@
 								.format(d.reference_doctype, d.reference_name, self.party_type, self.party))
 					else:
 						self.validate_journal_entry()
-								
+
 					if d.reference_doctype in ("Sales Invoice", "Purchase Invoice", "Expense Claim"):
 						if self.party_type=="Customer":
 							ref_party_account = ref_doc.debit_to
@@ -216,18 +216,18 @@
 							ref_party_account = ref_doc.credit_to
 						elif self.party_type=="Employee":
 							ref_party_account = ref_doc.payable_account
-						
+
 						if ref_party_account != self.party_account:
 							frappe.throw(_("{0} {1} is associated with {2}, but Party Account is {3}")
 								.format(d.reference_doctype, d.reference_name, ref_party_account, self.party_account))
-						
+
 					if ref_doc.docstatus != 1:
 						frappe.throw(_("{0} {1} must be submitted")
 							.format(d.reference_doctype, d.reference_name))
-							
+
 	def validate_journal_entry(self):
 		for d in self.get("references"):
-			if d.allocated_amount and d.reference_doctype == "Journal Entry":				
+			if d.allocated_amount and d.reference_doctype == "Journal Entry":
 				je_accounts = frappe.db.sql("""select debit, credit from `tabJournal Entry Account`
 					where account = %s and party=%s and docstatus = 1 and parent = %s
 					and (reference_type is null or reference_type in ("", "Sales Order", "Purchase Order"))
@@ -245,7 +245,7 @@
 					if not valid:
 						frappe.throw(_("Against Journal Entry {0} does not have any unmatched {1} entry")
 							.format(d.reference_name, dr_or_cr))
-							
+
 	def set_amounts(self):
 		self.set_amounts_in_company_currency()
 		self.set_total_allocated_amount()
@@ -255,111 +255,111 @@
 	def set_amounts_in_company_currency(self):
 		self.base_paid_amount, self.base_received_amount, self.difference_amount = 0, 0, 0
 		if self.paid_amount:
-			self.base_paid_amount = flt(flt(self.paid_amount) * flt(self.source_exchange_rate), 
+			self.base_paid_amount = flt(flt(self.paid_amount) * flt(self.source_exchange_rate),
 				self.precision("base_paid_amount"))
-				
+
 		if self.received_amount:
-			self.base_received_amount = flt(flt(self.received_amount) * flt(self.target_exchange_rate), 
+			self.base_received_amount = flt(flt(self.received_amount) * flt(self.target_exchange_rate),
 				self.precision("base_received_amount"))
-				
+
 	def set_total_allocated_amount(self):
 		if self.payment_type == "Internal Transfer":
 			return
-			
+
 		total_allocated_amount, base_total_allocated_amount = 0, 0
 		for d in self.get("references"):
-			if d.allocated_amount:				
+			if d.allocated_amount:
 				total_allocated_amount += flt(d.allocated_amount)
-				base_total_allocated_amount += flt(flt(d.allocated_amount) * flt(d.exchange_rate), 
+				base_total_allocated_amount += flt(flt(d.allocated_amount) * flt(d.exchange_rate),
 					self.precision("base_paid_amount"))
-					
+
 		self.total_allocated_amount = abs(total_allocated_amount)
 		self.base_total_allocated_amount = abs(base_total_allocated_amount)
-	
+
 	def set_unallocated_amount(self):
 		self.unallocated_amount = 0;
 		if self.party:
 			party_amount = self.paid_amount if self.payment_type=="Receive" else self.received_amount
-			
+
 			total_deductions = sum([flt(d.amount) for d in self.get("deductions")])
-			
+
 			if self.total_allocated_amount < party_amount:
 				if self.payment_type == "Receive":
 					self.unallocated_amount = party_amount - (self.total_allocated_amount - total_deductions)
 				else:
 					self.unallocated_amount = party_amount - (self.total_allocated_amount + total_deductions)
-				
+
 	def set_difference_amount(self):
-		base_unallocated_amount = flt(self.unallocated_amount) * (flt(self.source_exchange_rate) 
+		base_unallocated_amount = flt(self.unallocated_amount) * (flt(self.source_exchange_rate)
 			if self.payment_type=="Receive" else flt(self.target_exchange_rate))
-			
+
 		base_party_amount = flt(self.base_total_allocated_amount) + flt(base_unallocated_amount)
-		
+
 		if self.payment_type == "Receive":
 			self.difference_amount = base_party_amount - self.base_received_amount
 		elif self.payment_type == "Pay":
 			self.difference_amount = self.base_paid_amount - base_party_amount
 		else:
 			self.difference_amount = self.base_paid_amount - flt(self.base_received_amount)
-			
+
 		for d in self.get("deductions"):
 			if d.amount:
 				self.difference_amount -= flt(d.amount)
-				
+
 		self.difference_amount = flt(self.difference_amount, self.precision("difference_amount"))
-				
+
 	def clear_unallocated_reference_document_rows(self):
 		self.set("references", self.get("references", {"allocated_amount": ["not in", [0, None, ""]]}))
 
-		frappe.db.sql("""delete from `tabPayment Entry Reference` 
+		frappe.db.sql("""delete from `tabPayment Entry Reference`
 			where parent = %s and allocated_amount = 0""", self.name)
-			
+
 	def validate_payment_against_negative_invoice(self):
-		if ((self.payment_type=="Pay" and self.party_type=="Customer") 
+		if ((self.payment_type=="Pay" and self.party_type=="Customer")
 				or (self.payment_type=="Receive" and self.party_type=="Supplier")):
-				
-			total_negative_outstanding = sum([abs(flt(d.outstanding_amount)) 
+
+			total_negative_outstanding = sum([abs(flt(d.outstanding_amount))
 				for d in self.get("references") if flt(d.outstanding_amount) < 0])
-			
+
 			party_amount = self.paid_amount if self.payment_type=="Receive" else self.received_amount
 
 			if not total_negative_outstanding:
 				frappe.throw(_("Cannot {0} {1} {2} without any negative outstanding invoice")
-					.format(self.payment_type, ("to" if self.party_type=="Customer" else "from"), 
+					.format(self.payment_type, ("to" if self.party_type=="Customer" else "from"),
 						self.party_type), InvalidPaymentEntry)
-					
+
 			elif party_amount > total_negative_outstanding:
 				frappe.throw(_("Paid Amount cannot be greater than total negative outstanding amount {0}")
 					.format(total_negative_outstanding), InvalidPaymentEntry)
-			
+
 	def set_title(self):
 		if self.payment_type in ("Receive", "Pay"):
 			self.title = self.party
 		else:
 			self.title = self.paid_from + " - " + self.paid_to
-			
+
 	def validate_transaction_reference(self):
 		bank_account = self.paid_to if self.payment_type == "Receive" else self.paid_from
 		bank_account_type = frappe.db.get_value("Account", bank_account, "account_type")
-		
+
 		if bank_account_type == "Bank":
 			if not self.reference_no or not self.reference_date:
 				frappe.throw(_("Reference No and Reference Date is mandatory for Bank transaction"))
-				
+
 	def set_remarks(self):
 		if self.remarks: return
-		
+
 		if self.payment_type=="Internal Transfer":
 			remarks = [_("Amount {0} {1} transferred from {2} to {3}")
 				.format(self.paid_from_account_currency, self.paid_amount, self.paid_from, self.paid_to)]
 		else:
-			
+
 			remarks = [_("Amount {0} {1} {2} {3}").format(
 				self.party_account_currency,
 				self.paid_amount if self.payment_type=="Receive" else self.received_amount,
 				_("received from") if self.payment_type=="Receive" else _("to"), self.party
 			)]
-			
+
 		if self.reference_no:
 			remarks.append(_("Transaction reference no {0} dated {1}")
 				.format(self.reference_no, self.reference_date))
@@ -367,35 +367,35 @@
 		if self.payment_type in ["Receive", "Pay"]:
 			for d in self.get("references"):
 				if d.allocated_amount:
-					remarks.append(_("Amount {0} {1} against {2} {3}").format(self.party_account_currency, 
+					remarks.append(_("Amount {0} {1} against {2} {3}").format(self.party_account_currency,
 						d.allocated_amount, d.reference_doctype, d.reference_name))
-		
+
 		for d in self.get("deductions"):
 			if d.amount:
 				remarks.append(_("Amount {0} {1} deducted against {2}")
 					.format(self.company_currency, d.amount, d.account))
 
 		self.set("remarks", "\n".join(remarks))
-			
+
 	def make_gl_entries(self, cancel=0, adv_adj=0):
 		if self.payment_type in ("Receive", "Pay") and not self.get("party_account_field"):
 			self.setup_party_account_field()
-			
+
 		gl_entries = []
 		self.add_party_gl_entries(gl_entries)
 		self.add_bank_gl_entries(gl_entries)
 		self.add_deductions_gl_entries(gl_entries)
 
 		make_gl_entries(gl_entries, cancel=cancel, adv_adj=adv_adj)
-		
+
 	def add_party_gl_entries(self, gl_entries):
 		if self.party_account:
 			if self.payment_type=="Receive":
 				against_account = self.paid_to
 			else:
 				 against_account = self.paid_from
-			
-				
+
+
 			party_gl_dict = self.get_gl_dict({
 				"account": self.party_account,
 				"party_type": self.party_type,
@@ -403,39 +403,39 @@
 				"against": against_account,
 				"account_currency": self.party_account_currency
 			})
-			
+
 			dr_or_cr = "credit" if self.party_type == "Customer" else "debit"
-			
+
 			for d in self.get("references"):
 				gle = party_gl_dict.copy()
 				gle.update({
 					"against_voucher_type": d.reference_doctype,
 					"against_voucher": d.reference_name
 				})
-				
-				allocated_amount_in_company_currency = flt(flt(d.allocated_amount) * flt(d.exchange_rate), 
-					self.precision("paid_amount"))	
-				
+
+				allocated_amount_in_company_currency = flt(flt(d.allocated_amount) * flt(d.exchange_rate),
+					self.precision("paid_amount"))
+
 				gle.update({
 					dr_or_cr + "_in_account_currency": d.allocated_amount,
 					dr_or_cr: allocated_amount_in_company_currency
 				})
-				
+
 				gl_entries.append(gle)
-				
+
 			if self.unallocated_amount:
 				base_unallocated_amount = base_unallocated_amount = self.unallocated_amount * \
 					(self.source_exchange_rate if self.payment_type=="Receive" else self.target_exchange_rate)
-					
+
 				gle = party_gl_dict.copy()
-				
+
 				gle.update({
 					dr_or_cr + "_in_account_currency": self.unallocated_amount,
 					dr_or_cr: base_unallocated_amount
 				})
 
 				gl_entries.append(gle)
-				
+
 	def add_bank_gl_entries(self, gl_entries):
 		if self.payment_type in ("Pay", "Internal Transfer"):
 			gl_entries.append(
@@ -457,14 +457,14 @@
 					"debit": self.base_received_amount
 				})
 			)
-			
+
 	def add_deductions_gl_entries(self, gl_entries):
 		for d in self.get("deductions"):
 			if d.amount:
 				account_currency = get_account_currency(d.account)
 				if account_currency != self.company_currency:
 					frappe.throw(_("Currency for {0} must be {1}").format(d.account, self.company_currency))
-					
+
 				gl_entries.append(
 					self.get_gl_dict({
 						"account": d.account,
@@ -475,7 +475,7 @@
 						"cost_center": d.cost_center
 					})
 				)
-				
+
 	def update_advance_paid(self):
 		if self.payment_type in ("Receive", "Pay") and self.party:
 			for d in self.get("references"):
@@ -495,17 +495,17 @@
 
 	party_account_currency = get_account_currency(args.get("party_account"))
 	company_currency = frappe.db.get_value("Company", args.get("company"), "default_currency")
-	
+
 	# Get negative outstanding sales /purchase invoices
 	total_field = "base_grand_total" if party_account_currency == company_currency else "grand_total"
-		
-	negative_outstanding_invoices = get_negative_outstanding_invoices(args.get("party_type"), 
+
+	negative_outstanding_invoices = get_negative_outstanding_invoices(args.get("party_type"),
 		args.get("party"), args.get("party_account"), total_field)
 
 	# Get positive outstanding sales /purchase invoices
-	outstanding_invoices = get_outstanding_invoices(args.get("party_type"), args.get("party"), 
+	outstanding_invoices = get_outstanding_invoices(args.get("party_type"), args.get("party"),
 		args.get("party_account"))
-	
+
 	for d in outstanding_invoices:
 		d["exchange_rate"] = 1
 		if party_account_currency != company_currency:
@@ -517,11 +517,11 @@
 				)
 
 	# Get all SO / PO which are not fully billed or aginst which full advance not paid
-	orders_to_be_billed =  get_orders_to_be_billed(args.get("posting_date"),args.get("party_type"), args.get("party"), 
+	orders_to_be_billed =  get_orders_to_be_billed(args.get("posting_date"),args.get("party_type"), args.get("party"),
 		party_account_currency, company_currency)
-	
+
 	return negative_outstanding_invoices + outstanding_invoices + orders_to_be_billed
-	
+
 def get_orders_to_be_billed(posting_date, party_type, party, party_account_currency, company_currency):
 	if party_type == "Customer":
 		voucher_type = 'Sales Order'
@@ -529,7 +529,7 @@
 		voucher_type = 'Purchase Order'
 	elif party_type == "Employee":
 		voucher_type = None
-		
+
 	orders = []
 	if voucher_type:
 		ref_field = "base_grand_total" if party_account_currency == company_currency else "grand_total"
@@ -560,19 +560,19 @@
 	for d in orders:
 		d["voucher_type"] = voucher_type
 		# This assumes that the exchange rate required is the one in the SO
-		d["exchange_rate"] = get_exchange_rate(party_account_currency, 
+		d["exchange_rate"] = get_exchange_rate(party_account_currency,
 			company_currency, posting_date)
 		order_list.append(d)
 
 	return order_list
-	
+
 def get_negative_outstanding_invoices(party_type, party, party_account, total_field):
 	if party_type != "Employee":
 		voucher_type = "Sales Invoice" if party_type == "Customer" else "Purchase Invoice"
 		return frappe.db.sql("""
 			select
-				"{voucher_type}" as voucher_type, name as voucher_no, 
-				{total_field} as invoice_amount, outstanding_amount, posting_date, 
+				"{voucher_type}" as voucher_type, name as voucher_no,
+				{total_field} as invoice_amount, outstanding_amount, posting_date,
 				due_date, conversion_rate as exchange_rate
 			from
 				`tab{voucher_type}`
@@ -588,18 +588,18 @@
 			}), (party, party_account), as_dict = True)
 	else:
 		return []
-	
+
 @frappe.whitelist()
 def get_party_details(company, party_type, party, date):
 	if not frappe.db.exists(party_type, party):
 		frappe.throw(_("Invalid {0}: {1}").format(party_type, party))
-		
+
 	party_account = get_party_account(party_type, party, company)
-	
+
 	account_currency = get_account_currency(party_account)
 	account_balance = get_balance_on(party_account, date)
 	party_balance = get_balance_on(party_type=party_type, party=party)
-	
+
 	return {
 		"party_account": party_account,
 		"party_account_currency": account_currency,
@@ -607,7 +607,7 @@
 		"account_balance": account_balance
 	}
 
-@frappe.whitelist()	
+@frappe.whitelist()
 def get_account_details(account, date):
 	frappe.has_permission('Payment Entry', throw=True)
 	return frappe._dict({
@@ -615,61 +615,61 @@
 		"account_balance": get_balance_on(account, date),
 		"account_type": frappe.db.get_value("Account", account, "account_type")
 	})
-	
+
 @frappe.whitelist()
 def get_company_defaults(company):
 	fields = ["write_off_account", "exchange_gain_loss_account", "cost_center"]
 	ret = frappe.db.get_value("Company", company, fields, as_dict=1)
-	
+
 	for fieldname in fields:
 		if not ret[fieldname]:
 			frappe.throw(_("Please set default {0} in Company {1}")
 				.format(frappe.get_meta("Company").get_label(fieldname), company))
-	
+
 	return ret
 
 @frappe.whitelist()
 def get_reference_details(reference_doctype, reference_name, party_account_currency):
 	total_amount = outstanding_amount = exchange_rate = None
 	ref_doc = frappe.get_doc(reference_doctype, reference_name)
-	
+
 	if reference_doctype != "Journal Entry":
 		if party_account_currency == ref_doc.company_currency:
 			if ref_doc.doctype == "Expense Claim":
 				total_amount = ref_doc.total_sanctioned_amount
-			else: 
+			else:
 				total_amount = ref_doc.base_grand_total
 			exchange_rate = 1
 		else:
 			total_amount = ref_doc.grand_total
-			
-			# Get the exchange rate from the original ref doc 
+
+			# Get the exchange rate from the original ref doc
 			# or get it based on the posting date of the ref doc
 			exchange_rate = ref_doc.get("conversion_rate") or \
 				get_exchange_rate(party_account_currency, ref_doc.company_currency, ref_doc.posting_date)
-		
+
 		outstanding_amount = ref_doc.get("outstanding_amount") \
 			if reference_doctype in ("Sales Invoice", "Purchase Invoice", "Expense Claim") \
-			else flt(total_amount) - flt(ref_doc.advance_paid)			
+			else flt(total_amount) - flt(ref_doc.advance_paid)
 	else:
 		# Get the exchange rate based on the posting date of the ref doc
-		exchange_rate = get_exchange_rate(party_account_currency, 
+		exchange_rate = get_exchange_rate(party_account_currency,
 			ref_doc.company_currency, ref_doc.posting_date)
-		
+
 	return frappe._dict({
 		"due_date": ref_doc.get("due_date"),
 		"total_amount": total_amount,
 		"outstanding_amount": outstanding_amount,
 		"exchange_rate": exchange_rate
 	})
-	
+
 @frappe.whitelist()
 def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount=None):
 	doc = frappe.get_doc(dt, dn)
-	
+
 	if dt in ("Sales Order", "Purchase Order") and flt(doc.per_billed, 2) > 0:
 		frappe.throw(_("Can only make payment against unbilled {0}").format(dt))
-	
+
 	if dt in ("Sales Invoice", "Sales Order"):
 		party_type = "Customer"
 	elif dt in ("Purchase Invoice", "Purchase Order"):
@@ -684,16 +684,16 @@
 		party_account = doc.credit_to
 	else:
 		party_account = get_party_account(party_type, doc.get(party_type.lower()), doc.company)
-		
+
 	party_account_currency = doc.get("party_account_currency") or get_account_currency(party_account)
-	
+
 	# payment type
 	if (dt == "Sales Order" or (dt=="Sales Invoice" and doc.outstanding_amount > 0)) \
 		or (dt=="Purchase Invoice" and doc.outstanding_amount < 0):
 			payment_type = "Receive"
 	else:
 		payment_type = "Pay"
-	
+
 	# amounts
 	grand_total = outstanding_amount = 0
 	if party_amount:
@@ -710,9 +710,9 @@
 		outstanding_amount = grand_total - flt(doc.advance_paid)
 
 	# bank or cash
-	bank = get_default_bank_cash_account(doc.company, "Bank", mode_of_payment=doc.get("mode_of_payment"), 
+	bank = get_default_bank_cash_account(doc.company, "Bank", mode_of_payment=doc.get("mode_of_payment"),
 		account=bank_account)
-	
+
 	paid_amount = received_amount = 0
 	if party_account_currency == bank.account_currency:
 		paid_amount = received_amount = abs(outstanding_amount)
@@ -724,7 +724,7 @@
 		received_amount = abs(outstanding_amount)
 		if bank_amount:
 			paid_amount = bank_amount
-	
+
 	pe = frappe.new_doc("Payment Entry")
 	pe.payment_type = payment_type
 	pe.company = doc.company
@@ -741,7 +741,7 @@
 	pe.received_amount = received_amount
 	pe.allocate_payment_amount = 1
 	pe.letter_head = doc.get("letter_head")
-	
+
 	pe.append("references", {
 		"reference_doctype": dt,
 		"reference_name": dn,
diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py
index 9d6b75b..0316cca 100644
--- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py
@@ -21,102 +21,102 @@
 		pe.paid_from = "Debtors - _TC"
 		pe.insert()
 		pe.submit()
-		
+
 		expected_gle = dict((d[0], d) for d in [
 			["Debtors - _TC", 0, 1000, so.name],
 			["_Test Cash - _TC", 1000.0, 0, None]
 		])
-		
+
 		self.validate_gl_entries(pe.name, expected_gle)
-		
+
 		so_advance_paid = frappe.db.get_value("Sales Order", so.name, "advance_paid")
 		self.assertEqual(so_advance_paid, 1000)
-		
+
 		pe.cancel()
-		
+
 		self.assertFalse(self.get_gle(pe.name))
-		
+
 		so_advance_paid = frappe.db.get_value("Sales Order", so.name, "advance_paid")
 		self.assertEqual(so_advance_paid, 0)
-		
+
 	def test_payment_entry_against_si_usd_to_usd(self):
 		si =  create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
 			currency="USD", conversion_rate=50)
 		pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Bank USD - _TC")
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
-		pe.target_exchange_rate = 50		
+		pe.target_exchange_rate = 50
 		pe.insert()
 		pe.submit()
-		
+
 		expected_gle = dict((d[0], d) for d in [
 			["_Test Receivable USD - _TC", 0, 5000, si.name],
 			["_Test Bank USD - _TC", 5000.0, 0, None]
 		])
-		
+
 		self.validate_gl_entries(pe.name, expected_gle)
-		
+
 		outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"))
 		self.assertEqual(outstanding_amount, 0)
-		
+
 		pe.cancel()
 		self.assertFalse(self.get_gle(pe.name))
-		
+
 		outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"))
 		self.assertEqual(outstanding_amount, 100)
-		
+
 	def test_payment_entry_against_pi(self):
 		pi =  make_purchase_invoice(supplier="_Test Supplier USD", debit_to="_Test Payable USD - _TC",
 			currency="USD", conversion_rate=50)
 		pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank USD - _TC")
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
-		pe.source_exchange_rate = 50		
+		pe.source_exchange_rate = 50
 		pe.insert()
 		pe.submit()
-		
+
 		expected_gle = dict((d[0], d) for d in [
 			["_Test Payable USD - _TC", 12500, 0, pi.name],
 			["_Test Bank USD - _TC", 0, 12500, None]
 		])
-		
+
 		self.validate_gl_entries(pe.name, expected_gle)
-		
+
 		outstanding_amount = flt(frappe.db.get_value("Sales Invoice", pi.name, "outstanding_amount"))
 		self.assertEqual(outstanding_amount, 0)
 
 	def test_payment_entry_against_ec(self):
-		
+
 		payable = frappe.db.get_value('Company', "_Test Company", 'default_payable_account')
 		ec =  make_expense_claim(payable, 300, 300, "_Test Company","Travel Expenses - _TC")
 		pe = get_payment_entry("Expense Claim", ec.name, bank_account="_Test Bank USD - _TC", bank_amount=300)
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
-		pe.source_exchange_rate = 1		
+		pe.source_exchange_rate = 1
 		pe.insert()
 		pe.submit()
-		
+
 		expected_gle = dict((d[0], d) for d in [
 			[payable, 300, 0, ec.name],
 			["_Test Bank USD - _TC", 0, 300, None]
 		])
-		
+
 		self.validate_gl_entries(pe.name, expected_gle)
-		
+
 		outstanding_amount = flt(frappe.db.get_value("Expense Claim", ec.name, "total_sanctioned_amount")) - \
 			flt(frappe.db.get_value("Expense Claim", ec.name, "total_amount_reimbursed"))
 		self.assertEqual(outstanding_amount, 0)
-		
+
 	def test_payment_entry_against_si_usd_to_inr(self):
 		si =  create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
 			currency="USD", conversion_rate=50)
-		pe = get_payment_entry("Sales Invoice", si.name, party_amount=20, 
+		pe = get_payment_entry("Sales Invoice", si.name, party_amount=20,
 			bank_account="_Test Bank - _TC", bank_amount=900)
 		pe.reference_no = "1"
 		pe.reference_date = "2016-01-01"
-		
+
 		self.assertEqual(pe.difference_amount, 100)
-		
+
 		pe.append("deductions", {
 			"account": "_Test Exchange Gain/Loss - _TC",
 			"cost_center": "_Test Cost Center - _TC",
@@ -124,15 +124,15 @@
 		})
 		pe.insert()
 		pe.submit()
-		
+
 		expected_gle = dict((d[0], d) for d in [
 			["_Test Receivable USD - _TC", 0, 1000, si.name],
 			["_Test Bank - _TC", 900, 0, None],
 			["_Test Exchange Gain/Loss - _TC", 100.0, 0, None],
 		])
-		
+
 		self.validate_gl_entries(pe.name, expected_gle)
-		
+
 		outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"))
 		self.assertEqual(outstanding_amount, 80)
 
@@ -163,7 +163,7 @@
 			pe.source_exchange_rate, 65.1,
 			"{0} is not equal to {1}".format(pe.source_exchange_rate, 65.1)
 		)
-		
+
 	def test_internal_transfer_usd_to_inr(self):
 		pe = frappe.new_doc("Payment Entry")
 		pe.payment_type = "Internal Transfer"
@@ -175,31 +175,31 @@
 		pe.received_amount = 4500
 		pe.reference_no = "2"
 		pe.reference_date = nowdate()
-		
+
 		pe.setup_party_account_field()
 		pe.set_missing_values()
 		pe.set_exchange_rate()
 		pe.set_amounts()
-				
+
 		self.assertEquals(pe.difference_amount, 500)
-		
+
 		pe.append("deductions", {
 			"account": "_Test Exchange Gain/Loss - _TC",
 			"cost_center": "_Test Cost Center - _TC",
 			"amount": 500
 		})
-		
+
 		pe.insert()
 		pe.submit()
-		
+
 		expected_gle = dict((d[0], d) for d in [
 			["_Test Bank USD - _TC", 0, 5000, None],
 			["_Test Bank - _TC", 4500, 0, None],
 			["_Test Exchange Gain/Loss - _TC", 500.0, 0, None],
 		])
-		
+
 		self.validate_gl_entries(pe.name, expected_gle)
-		
+
 	def test_payment_against_negative_sales_invoice(self):
 		pe1 = frappe.new_doc("Payment Entry")
 		pe1.payment_type = "Pay"
@@ -209,33 +209,33 @@
 		pe1.paid_from = "_Test Cash - _TC"
 		pe1.paid_amount = 100
 		pe1.received_amount = 100
-		
+
 		self.assertRaises(InvalidPaymentEntry, pe1.validate)
-		
+
 		si1 =  create_sales_invoice()
-		
+
 		# create full payment entry against si1
 		pe2 = get_payment_entry("Sales Invoice", si1.name, bank_account="_Test Cash - _TC")
 		pe2.insert()
 		pe2.submit()
-		
+
 		# create return entry against si1
 		create_sales_invoice(is_return=1, return_against=si1.name, qty=-1)
 		si1_outstanding = frappe.db.get_value("Sales Invoice", si1.name, "outstanding_amount")
 		self.assertEqual(si1_outstanding, -100)
-		
+
 		# pay more than outstanding against si1
 		pe3 = get_payment_entry("Sales Invoice", si1.name, bank_account="_Test Cash - _TC")
 		pe3.paid_amount = pe3.received_amount = 300
 		self.assertRaises(InvalidPaymentEntry, pe3.validate)
-		
+
 		# pay negative outstanding against si1
 		pe3.paid_to = "Debtors - _TC"
 		pe3.paid_amount = pe3.received_amount = 100
-		
+
 		pe3.insert()
 		pe3.submit()
-		
+
 		expected_gle = dict((d[0], d) for d in [
 			["Debtors - _TC", 100, 0, si1.name],
 			["_Test Cash - _TC", 0, 100, None]
@@ -251,10 +251,10 @@
 
 		outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si1.name, "outstanding_amount"))
 		self.assertEqual(outstanding_amount, -100)
-		
+
 	def validate_gl_entries(self, voucher_no, expected_gle):
 		gl_entries = self.get_gle(voucher_no)
-			
+
 		self.assertTrue(gl_entries)
 
 		for i, gle in enumerate(gl_entries):
@@ -262,7 +262,7 @@
 			self.assertEquals(expected_gle[gle.account][1], gle.debit)
 			self.assertEquals(expected_gle[gle.account][2], gle.credit)
 			self.assertEquals(expected_gle[gle.account][3], gle.against_voucher)
-		
+
 	def get_gle(self, voucher_no):
 		return frappe.db.sql("""select account, debit, credit, against_voucher
 			from `tabGL Entry` where voucher_type='Payment Entry' and voucher_no=%s
diff --git a/erpnext/docs/user/manual/en/accounts/payment-entry.md b/erpnext/docs/user/manual/en/accounts/payment-entry.md
index a6dbde0..ae82eb2 100644
--- a/erpnext/docs/user/manual/en/accounts/payment-entry.md
+++ b/erpnext/docs/user/manual/en/accounts/payment-entry.md
@@ -6,6 +6,7 @@
   2. Purchase Invoice.
   3. Sales Order (Advance Payment)
   4. Purchase Order (Advance Payment)
+  5. Expense Claim
 
 ####Step 1: Make Payment
 
@@ -21,7 +22,7 @@
 
 ####Step 3: Payment Amount
 
-Enter actual payment amount received from the Customer or paid to the Supplier.
+Enter actual payment amount received from the Customer or paid to the Supplier or Employee.
 
 <img class="screenshot" alt="Making Payment" src="/docs/assets/img/accounts/payment-entry-3.png">
 
@@ -90,7 +91,7 @@
 	- Updating opening balance in an Accounts.
 	- Fixed Asset Depreciation entry.
 	- For adjusting Credit Note against Sales Invoice and Debit Note against Purchase Invoice, incase there is no payment happening at all.
-
+ 4. Payment Entries are used if a cheque is printed.
 * * *
 
 ## Managing Outstanding Payments
diff --git a/erpnext/docs/user/manual/en/human-resources/expense-claim.md b/erpnext/docs/user/manual/en/human-resources/expense-claim.md
index 718e7fd..2d7432f 100644
--- a/erpnext/docs/user/manual/en/human-resources/expense-claim.md
+++ b/erpnext/docs/user/manual/en/human-resources/expense-claim.md
@@ -39,11 +39,18 @@
 <img class="screenshot" alt="Expense Claim" src="/docs/assets/img/human-resources/payment.png">
 
 #### Payment Entry
-<img class="screenshot" alt="Expense Claim" src="/docs/assets/img/human-resources/payment_entry.png">
-
+<img class="screenshot" alt="Expense Claim" src="{{docs_base_url}}/assets/img/human-resources/payment_entry.png">
 
 Note: This amount should not be clubbed with Salary because the amount will then be taxable to the Employee.
 
+Alternatively, a Payment Entry can be made for an employee and all outstanding Expense Claims will be pulled in.
+
+> Accounts > Payment Entry > New Payment Entry
+
+Set the Payment Type to "Pay", the Party Type to Employee, the Party to the employee being paid and the account being paid 
+from. All outstanding expense claims will be pulled in and payments amounts can be allocated to each expense.
+<img class="screenshot" alt="Expense Claim" src="{{docs_base_url}}/assets/img/human-resources/expense_claim_payment_entry.png">
+
 ### Linking with Task & Project
 
 * To Link Expense Claim with Task or Project specify the Task or the Project while making an Expense Claim
diff --git a/erpnext/hr/doctype/expense_claim/test_expense_claim.py b/erpnext/hr/doctype/expense_claim/test_expense_claim.py
index 016e8fa..bcde2c0 100644
--- a/erpnext/hr/doctype/expense_claim/test_expense_claim.py
+++ b/erpnext/hr/doctype/expense_claim/test_expense_claim.py
@@ -14,7 +14,7 @@
 		frappe.db.sql("""delete from `tabTask` where project = "_Test Project 1" """)
 		frappe.db.sql("""delete from `tabProject` where name = "_Test Project 1" """)
 
-		
+
 		frappe.get_doc({
 			"project_name": "_Test Project 1",
 			"doctype": "Project",
@@ -25,7 +25,7 @@
 		task_name = frappe.db.get_value("Task", {"project": "_Test Project 1"})
 		payable_account = get_payable_account("Wind Power LLC")
 
-		expense_claim = make_expense_claim(payable_account, 300, 200, "Wind Power LLC","Travel Expenses - WP", "_Test Project 1", task_name)
+		make_expense_claim(payable_account, 300, 200, "Wind Power LLC","Travel Expenses - WP", "_Test Project 1", task_name)
 
 		self.assertEqual(frappe.db.get_value("Task", task_name, "total_expense_claim"), 200)
 		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_expense_claim"), 200)
@@ -40,7 +40,7 @@
 
 		self.assertEqual(frappe.db.get_value("Task", task_name, "total_expense_claim"), 200)
 		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_expense_claim"), 200)
-		
+
 	def test_expense_claim_status(self):
 		payable_account = get_payable_account("Wind Power LLC")
 		expense_claim = make_expense_claim(payable_account, 300, 200, "Wind Power LLC", "Travel Expenses - WP")
@@ -54,7 +54,7 @@
 
 		expense_claim = frappe.get_doc("Expense Claim", expense_claim.name)
 		self.assertEqual(expense_claim.status, "Paid")
-		
+
 		je.cancel()
 		expense_claim = frappe.get_doc("Expense Claim", expense_claim.name)
 		self.assertEqual(expense_claim.status, "Unpaid")
@@ -63,7 +63,7 @@
 		payable_account = get_payable_account("Wind Power LLC")
 		expense_claim = make_expense_claim(payable_account, 300, 200, "Wind Power LLC", "Travel Expenses - WP")
 		expense_claim.submit()
-		
+
 		gl_entries = frappe.db.sql("""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Expense Claim' and voucher_no=%s
 			order by account asc""", expense_claim.name, as_dict=1)
@@ -100,7 +100,7 @@
 
 def get_payable_account(company):
 	return frappe.db.get_value('Company', company, 'default_payable_account')
-	
+
 def make_expense_claim(payable_account,claim_amount, sanctioned_amount, company, account, project=None, task_name=None):
 	expense_claim = frappe.get_doc({
 		 "doctype": "Expense Claim",
@@ -118,5 +118,5 @@
 
 	expense_claim.submit()
 	return expense_claim
-	
+
 
