diff --git a/manufacturing/doctype/bom/bom.js b/manufacturing/doctype/bom/bom.js
index 4e8fbc9..f0c15fa 100644
--- a/manufacturing/doctype/bom/bom.js
+++ b/manufacturing/doctype/bom/bom.js
@@ -59,27 +59,22 @@
 	set_operation_no(doc);
 }
 
-cur_frm.cscript.item = function(doc, dt, dn) {
-	if (doc.item) {
-		get_server_fields('get_item_details', doc.item, '', doc, dt, dn, 1);
-	}
-}
+cur_frm.add_fetch("item", "description", "description");
+cur_frm.add_fetch("item", "stock_uom", "uom");
 
 cur_frm.cscript.workstation = function(doc,dt,dn) {
 	var d = locals[dt][dn];
-	if (d.workstation) {
-		var callback = function(r, rt) {
-			calculate_op_cost(doc, dt, dn);
-			calculate_total(doc);
-		}
-		get_server_fields('get_workstation_details', d.workstation, 
-			'bom_operations', doc, dt, dn, 1, callback);
-	}
+	wn.model.with_doc("Workstation", d.workstation, function(i, v) {
+		d.hour_rate = v.hour_rate;
+		refresh_field("hour_rate");
+		calculate_op_cost(doc);
+		calculate_total(doc);
+	});
 }
 
 
 cur_frm.cscript.hour_rate = function(doc, dt, dn) {
-	calculate_op_cost(doc, dt, dn);
+	calculate_op_cost(doc);
 	calculate_total(doc);
 }
 
@@ -114,7 +109,7 @@
 				$.extend(d, r.message);
 				refresh_field("bom_materials");
 				doc = locals[doc.doctype][doc.name];
-				calculate_rm_cost(doc, cdt, cdn);
+				calculate_rm_cost(doc);
 				calculate_total(doc);
 			},
 			freeze: true
@@ -124,7 +119,7 @@
 
 
 cur_frm.cscript.qty = function(doc, cdt, cdn) {
-	calculate_rm_cost(doc, cdt, cdn);
+	calculate_rm_cost(doc);
 	calculate_total(doc);
 }
 
@@ -134,12 +129,12 @@
 		msgprint("You can not change rate if BOM mentioned agianst any item");
 		get_bom_material_detail(doc, cdt, cdn);
 	} else {
-		calculate_rm_cost(doc, cdt, cdn);
+		calculate_rm_cost(doc);
 		calculate_total(doc);
 	}
 }
 
-var calculate_op_cost = function(doc, dt, dn) {	
+var calculate_op_cost = function(doc) {	
 	var op = getchildren('BOM Operation', doc.name, 'bom_operations');
 	total_op_cost = 0;
 	for(var i=0;i<op.length;i++) {
@@ -151,7 +146,7 @@
 	refresh_field('operating_cost');
 }
 
-var calculate_rm_cost = function(doc, dt, dn) {	
+var calculate_rm_cost = function(doc) {	
 	var rm = getchildren('BOM Item', doc.name, 'bom_materials');
 	total_rm_cost = 0;
 	for(var i=0;i<rm.length;i++) {
@@ -201,7 +196,7 @@
 }
 
 cur_frm.cscript.validate = function(doc, dt, dn) {
-	calculate_op_cost(doc, dt, dn);
-	calculate_rm_cost(doc, dt, dn);
+	calculate_op_cost(doc);
+	calculate_rm_cost(doc);
 	calculate_total(doc);
 }
diff --git a/manufacturing/doctype/bom/bom.py b/manufacturing/doctype/bom/bom.py
index b4eeaff..1408a3a 100644
--- a/manufacturing/doctype/bom/bom.py
+++ b/manufacturing/doctype/bom/bom.py
@@ -44,10 +44,11 @@
 		self.validate_main_item()
 		self.validate_operations()
 		self.validate_materials()
+		self.set_bom_material_details()
+		self.calculate_cost()
 		
 	def on_update(self):
 		self.check_recursion()
-		self.calculate_cost()
 		self.update_exploded_items()
 		self.doc.save()
 	
@@ -73,15 +74,7 @@
 			from `tabItem` where name=%s""", item_code, as_dict = 1)
 
 		return item
-
-	def get_item_details(self, item_code):
-		res = webnotes.conn.sql("""select description, stock_uom as uom
-			from `tabItem` where name=%s""", item_code, as_dict = 1)
-		return res and res[0] or {}
-
-	def get_workstation_details(self,workstation):
-		return {'hour_rate': webnotes.conn.get_value("Workstation", workstation, "hour_rate")}
-
+		
 	def validate_rm_item(self, item):
 		if item[0]['name'] == self.doc.item:
 			msgprint("Item_code: %s in materials tab cannot be same as FG Item", 
@@ -89,25 +82,35 @@
 		
 		if not item or item[0]['docstatus'] == 2:
 			msgprint("Item %s does not exist in system" % item[0]['item_code'], raise_exception = 1)
-
-	def get_bom_material_detail(self):
+			
+	def set_bom_material_details(self):
+		for item in self.doclist.get({"parentfield": "bom_materials"}):			
+			ret = self.get_bom_material_detail({ "item_code": item.item_code, "bom_no": item.bom_no,
+				"qty": item.qty	})
+			
+			for r in ret:
+				if not item.fields[r]:
+					item.fields[r] = ret[r]
+		
+	def get_bom_material_detail(self, args=None):
 		""" Get raw material details like uom, desc and rate"""
 
-		arg = webnotes.form_dict.get('args')
-		import json
-		arg = json.loads(arg)
-		
-		item = self.get_item_det(arg['item_code'])
+		if not args:
+			args = webnotes.form_dict.get('args')
+			import json
+			args = json.loads(args)
+			
+		item = self.get_item_det(args['item_code'])
 		self.validate_rm_item(item)
 		
-		arg['bom_no'] = arg['bom_no'] or item and cstr(item[0]['default_bom']) or ''
-		arg.update(item[0])
+		args['bom_no'] = args['bom_no'] or item and cstr(item[0]['default_bom']) or ''
+		args.update(item[0])
 
-		rate = self.get_rm_rate(arg)
+		rate = self.get_rm_rate(args)
 		ret_item = {
-			 'description'  : item and arg['description'] or '',
-			 'stock_uom'	: item and arg['stock_uom'] or '',
-			 'bom_no'		: arg['bom_no'],
+			 'description'  : item and args['description'] or '',
+			 'stock_uom'	: item and args['stock_uom'] or '',
+			 'bom_no'		: args['bom_no'],
 			 'rate'			: rate
 		}
 		return ret_item
@@ -183,11 +186,14 @@
 		if not item:
 			msgprint("Item %s does not exists in the system or expired." % 
 				self.doc.item, raise_exception = 1)
-
 		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.doc.item, raise_exception = 1)
+		else:
+			ret = webnotes.conn.get_value("Item", self.doc.item, ["description", "stock_uom"])
+			self.doc.description = ret[0]
+			self.doc.uom = ret[1]
 
 	def validate_operations(self):
 		""" Check duplicate operation no"""
@@ -293,9 +299,10 @@
 		"""Update workstation rate and calculates totals"""
 		total_op_cost = 0
 		for d in getlist(self.doclist, 'bom_operations'):
+			if d.workstation and not d.hour_rate:
+				d.hour_rate = webnotes.conn.get_value("Workstation", d.workstation, "hour_rate")
 			if d.hour_rate and d.time_in_mins:
 				d.operating_cost = flt(d.hour_rate) * flt(d.time_in_mins) / 60.0
-			d.save()
 			total_op_cost += flt(d.operating_cost)
 		self.doc.operating_cost = total_op_cost
 		
@@ -307,7 +314,6 @@
 				d.rate = self.get_bom_unitcost(d.bom_no)
 			d.amount = flt(d.rate) * flt(d.qty)
 			d.qty_consumed_per_unit = flt(d.qty) / flt(self.doc.quantity)
-			d.save()
 			total_rm_cost += d.amount
 		self.doc.raw_material_cost = total_rm_cost
 
