diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 6bd9564..5dbcef8 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -93,9 +93,8 @@
 		
 		if(cint(wn.defaults.get_default("auto_accounting_for_stock"))) {
 			var account_for = "stock_adjustment_account";
-			if (this.frm.doc.purpose == "Sales Return")
-				account_for = "stock_in_hand_account";
-			else if (this.frm.doc.purpose == "Purchase Return") 
+
+			if (this.frm.doc.purpose == "Purchase Return") 
 				account_for = "stock_received_but_not_billed";
 			
 			return this.frm.call({
@@ -236,7 +235,50 @@
 	
 	mtn_details_on_form_rendered: function(doc, grid_row) {
 		erpnext.setup_serial_no(grid_row)
+	},
+	
+	customer: function() {
+		return this.frm.call({
+			method: "erpnext.selling.doctype.customer.customer.get_customer_details",
+			args: { customer: this.frm.doc.customer }
+		});
+	},
+	
+	supplier: function() {
+		return this.frm.call({
+			method: "erpnext.buying.doctype.supplier.supplier.get_supplier_details",
+			args: { supplier: this.frm.doc.supplier }
+		});
+	},
+	
+	delivery_note_no: function() {
+		this.get_party_details({
+			ref_dt: "Delivery Note",
+			ref_dn: this.frm.doc.delivery_note_no
+		})
+	},
+	
+	sales_invoice_no: function() {
+		this.get_party_details({
+			ref_dt: "Sales Invoice",
+			ref_dn: this.frm.doc.sales_invoice_no
+		})
+	},
+	
+	purchase_receipt_no: function() {
+		this.get_party_details({
+			ref_dt: "Purchase Receipt",
+			ref_dn: this.frm.doc.purchase_receipt_no
+		})
+	},
+	
+	get_party_details: function(args) {
+		return this.frm.call({
+			method: "erpnext.stock.doctype.stock_entry.stock_entry.get_party_details",
+			args: args,
+		})
 	}
+	
 });
 
 cur_frm.script_manager.make(erpnext.stock.StockEntry);
@@ -265,32 +307,6 @@
 	}
 }
 
-cur_frm.cscript.delivery_note_no = function(doc, cdt, cdn) {
-	if(doc.delivery_note_no)
-		return get_server_fields('get_cust_values', '', '', doc, cdt, cdn, 1);
-}
-
-cur_frm.cscript.sales_invoice_no = function(doc, cdt, cdn) {
-	if(doc.sales_invoice_no) 
-		return get_server_fields('get_cust_values', '', '', doc, cdt, cdn, 1);
-}
-
-cur_frm.cscript.customer = function(doc, cdt, cdn) {
-	if(doc.customer) 
-		return get_server_fields('get_cust_addr', '', '', doc, cdt, cdn, 1);
-}
-
-cur_frm.cscript.purchase_receipt_no = function(doc, cdt, cdn) {
-	if(doc.purchase_receipt_no)	
-		return get_server_fields('get_supp_values', '', '', doc, cdt, cdn, 1);
-}
-
-cur_frm.cscript.supplier = function(doc, cdt, cdn) {
-	if(doc.supplier) 
-		return get_server_fields('get_supp_addr', '', '', doc, cdt, cdn, 1);
-
-}
-
 cur_frm.fields_dict['production_order'].get_query = function(doc) {
 	return{
 		filters:[
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 5c760f4..161a3ad 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -590,56 +590,6 @@
 			# increment idx by 1
 			idx += 1
 		return idx
-
-	def get_cust_values(self):
-		"""fetches customer details"""
-		if self.doc.delivery_note_no:
-			doctype = "Delivery Note"
-			name = self.doc.delivery_note_no
-		else:
-			doctype = "Sales Invoice"
-			name = self.doc.sales_invoice_no
-		
-		result = webnotes.conn.sql("""select customer, customer_name,
-			address_display as customer_address
-			from `tab%s` where name=%s""" % (doctype, "%s"), (name,), as_dict=1)
-		
-		return result and result[0] or {}
-		
-	def get_cust_addr(self):
-		from erpnext.utilities.transaction_base import get_default_address, get_address_display
-		res = webnotes.conn.sql("select customer_name from `tabCustomer` where name = '%s'"%self.doc.customer)
-		address_display = None
-		customer_address = get_default_address("customer", self.doc.customer)
-		if customer_address:
-			address_display = get_address_display(customer_address)
-		ret = { 
-			'customer_name'		: res and res[0][0] or '',
-			'customer_address' : address_display}
-
-		return ret
-
-	def get_supp_values(self):
-		result = webnotes.conn.sql("""select supplier, supplier_name,
-			address_display as supplier_address
-			from `tabPurchase Receipt` where name=%s""", (self.doc.purchase_receipt_no,),
-			as_dict=1)
-		
-		return result and result[0] or {}
-		
-	def get_supp_addr(self):
-		from erpnext.utilities.transaction_base import get_default_address, get_address_display
-		res = webnotes.conn.sql("""select supplier_name from `tabSupplier`
-			where name=%s""", self.doc.supplier)
-		address_display = None
-		supplier_address = get_default_address("customer", self.doc.customer)
-		if supplier_address:
-			address_display = get_address_display(supplier_address)	
-		
-		ret = {
-			'supplier_name' : res and res[0][0] or '',
-			'supplier_address' : address_display }
-		return ret
 		
 	def validate_with_material_request(self):
 		for item in self.doclist.get({"parentfield": "mtn_details"}):
@@ -653,6 +603,17 @@
 						+ _("Material Request") + (" - %s" % item.material_request), 
 						raise_exception=webnotes.MappingMismatchError)
 	
+@webnotes.whitelist()					
+def get_party_details(ref_dt, ref_dn):
+	if ref_dt in ["Delivery Note", "Sales Invoice"]:
+		res = webnotes.conn.get_value(ref_dt, ref_dn, 
+			["customer", "customer_name", "address_display as customer_address"], as_dict=1)
+	else:
+		res = webnotes.conn.get_value(ref_dt, ref_dn, 
+			["supplier", "supplier_name", "address_display as supplier_address"], as_dict=1)
+		print ref_dt, ref_dn, res
+	return res or {}
+	
 @webnotes.whitelist()
 def get_production_order_details(production_order):
 	result = webnotes.conn.sql("""select bom_no, 
@@ -965,5 +926,4 @@
 	
 	result = [parent] + [{"account": account} for account in children]
 	
-	return result
-		
+	return result
\ No newline at end of file
diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py
index 0241629..098a4bd 100644
--- a/erpnext/utilities/transaction_base.py
+++ b/erpnext/utilities/transaction_base.py
@@ -2,28 +2,14 @@
 # License: GNU General Public License v3. See license.txt
 
 from __future__ import unicode_literals
-import webnotes, json
+import webnotes
 from webnotes import msgprint, _
 from webnotes.utils import cstr, flt, now_datetime, cint
-from webnotes.model.doc import addchild
 
 from erpnext.controllers.status_updater import StatusUpdater
 
 
-class TransactionBase(StatusUpdater):			
-	def set_address_fields(self):
-		party_type, party_name = self.get_party_type_and_name()
-		
-		if party_type in ("Customer", "Lead"):
-			if self.doc.customer_address:
-				self.doc.address_display = get_address_display(self.doc.customer_address)
-				
-			if self.doc.shipping_address_name:
-				self.doc.shipping_address = get_address_display(self.doc.shipping_address_name)
-			
-		elif self.doc.supplier_address:
-			self.doc.address_display = get_address_display(self.doc.supplier_address)
-		
+class TransactionBase(StatusUpdater):
 	def set_contact_fields(self):
 		party_type, party_name = self.get_party_type_and_name()
 		
@@ -59,74 +45,6 @@
 		
 	def set_lead_defaults(self):
 		self.doc.fields.update(self.get_lead_defaults())
-			
-	# TODO deprecate this - used only in sales_order.js
-	def get_shipping_address(self, name):
-		shipping_address = get_default_address("customer", name, is_shipping_address=True)
-		return {
-			'shipping_address_name' : shipping_address,
-			'shipping_address' : get_address_display(shipping_address) if shipping_address else None
-		}
-		
-	# Get Supplier Default Primary Address - first load
-	# -----------------------
-	def get_default_supplier_address(self, args):
-		if isinstance(args, basestring):
-			args = json.loads(args)
-			
-		address_name = get_default_address("supplier", args["supplier"])
-		ret = {
-			'supplier_address' : address_name,
-			'address_display' : get_address_display(address_name),
-		}
-		ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
-		ret.update(self.get_supplier_details(args['supplier']))
-		return ret
-		
-	# Get Supplier Address
-	# -----------------------
-	def get_supplier_address(self, args):
-		args = json.loads(args)
-		ret = {
-			'supplier_address' : args['address'],
-			'address_display' : get_address_display(args["address"]),
-		}
-		ret.update(map_party_contact_details(contact_name=args['contact']))
-		return ret
-		
-	def set_supplier_address(self, args):
-		self.doc.fields.update(self.get_supplier_address(args))
-	
-	# Get Supplier Details
-	# -----------------------
-	def get_supplier_details(self, name):
-		supplier_details = webnotes.conn.sql("""\
-			select supplier_name, default_currency
-			from `tabSupplier`
-			where name = %s and docstatus < 2""", name, as_dict=1)
-		if supplier_details:
-			return {
-				'supplier_name': (supplier_details[0]['supplier_name']
-					or self.doc.fields.get('supplier_name')),
-				'currency': (supplier_details[0]['default_currency']
-					or self.doc.fields.get('currency')),
-			}
-		else:
-			return {}
-		
-	# Get Sales Person Details of Customer
-	# ------------------------------------
-	def get_sales_person(self, name):			
-		self.doclist = self.doc.clear_table(self.doclist,'sales_team')
-		idx = 0
-		for d in webnotes.conn.sql("select sales_person, allocated_percentage, allocated_amount, incentives from `tabSales Team` where parent = '%s'" % name):
-			ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
-			ch.sales_person = d and cstr(d[0]) or ''
-			ch.allocated_percentage = d and flt(d[1]) or 0
-			ch.allocated_amount = d and flt(d[2]) or 0
-			ch.incentives = d and flt(d[3]) or 0
-			ch.idx = idx
-			idx += 1
 
 	def load_notification_message(self):
 		dt = self.doc.doctype.lower().replace(" ", "_")
@@ -208,17 +126,6 @@
 				for field, condition in fields:
 					if prevdoc_values[field] is not None:
 						self.validate_value(field, condition, prevdoc_values[field], doc)
-	
-def get_default_address(party_field, party_name, is_shipping_address=False):
-	if is_shipping_address:
-		order_by = "is_shipping_address desc, is_primary_address desc, name asc"
-	else:
-		order_by = "is_primary_address desc, name asc"
-		
-	address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
-		limit 1""" % (party_field, "%s", order_by), party_name)
-	
-	return address[0][0] if address else None
 
 def get_default_contact(party_field, party_name):
 	contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
