diff --git a/stock/doctype/stock_entry/test_stock_entry.py b/stock/doctype/stock_entry/test_stock_entry.py
index 3cd285d..caf3291 100644
--- a/stock/doctype/stock_entry/test_stock_entry.py
+++ b/stock/doctype/stock_entry/test_stock_entry.py
@@ -160,7 +160,21 @@
 			self.assertEquals(expected_gl_entries[i][1], gle.debit)
 			self.assertEquals(expected_gl_entries[i][2], gle.credit)
 	
-	def test_sales_invoice_return_of_non_packing_item(self):
+	def _clear_stock(self):
+		webnotes.conn.sql("delete from `tabStock Ledger Entry`")
+		webnotes.conn.sql("""delete from `tabBin`""")
+	
+	def _insert_material_receipt(self):
+		self._clear_stock()
+		material_receipt = webnotes.bean(copy=test_records[0])
+		material_receipt.insert()
+		material_receipt.submit()
+		
+	def _get_actual_qty(self):
+		return flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
+			"warehouse": "_Test Warehouse"}, "actual_qty"))
+			
+	def _test_sales_invoice_return(self, item_code, delivered_qty, returned_qty):
 		from stock.doctype.stock_entry.stock_entry import NotUpdateStockError
 		
 		from accounts.doctype.sales_invoice.test_sales_invoice \
@@ -174,39 +188,36 @@
 		se = webnotes.bean(copy=test_records[0])
 		se.doc.purpose = "Sales Return"
 		se.doc.sales_invoice_no = si.doc.name
-		se.doclist[1].qty = 2.0
+		se.doclist[1].qty = returned_qty
+		se.doclist[1].transfer_qty = returned_qty
 		self.assertRaises(NotUpdateStockError, se.insert)
 		
-		webnotes.conn.sql("delete from `tabStock Ledger Entry`")
-		webnotes.conn.sql("""delete from `tabBin`""")
-		material_receipt = webnotes.bean(copy=test_records[0])
-		material_receipt.insert()
-		material_receipt.submit()
+		self._insert_material_receipt()
 		
 		# check currency available qty in bin
-		actual_qty_0 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
+		actual_qty_0 = self._get_actual_qty()
 		
 		# insert a pos invoice with update stock
 		si = webnotes.bean(copy=sales_invoice_test_records[1])
 		si.doc.is_pos = si.doc.update_stock = 1
 		si.doclist[1].warehouse = "_Test Warehouse"
+		si.doclist[1].item_code = item_code
 		si.insert()
 		si.submit()
 		
 		# check available bin qty after invoice submission
-		actual_qty_1 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
-		self.assertEquals(actual_qty_0 - 5, actual_qty_1)
+		actual_qty_1 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
 		
 		# check if item is validated
 		se = webnotes.bean(copy=test_records[0])
 		se.doc.purpose = "Sales Return"
 		se.doc.sales_invoice_no = si.doc.name
 		se.doc.posting_date = "2013-03-10"
-		se.doclist[1].item_code = "_Test Item Home Desktop 100"
-		se.doclist[1].qty = 2.0
-		se.doclist[1].transfer_qty = 2.0
+		se.doclist[1].item_code = "_Test Item Home Desktop 200"
+		se.doclist[1].qty = returned_qty
+		se.doclist[1].transfer_qty = returned_qty
 		
 		# check if stock entry gets submitted
 		self.assertRaises(webnotes.DoesNotExistError, se.insert)
@@ -216,68 +227,91 @@
 		se.doc.purpose = "Sales Return"
 		se.doc.posting_date = "2013-03-10"
 		se.doc.sales_invoice_no = si.doc.name
-		se.doclist[1].qty = 2.0
-		se.doclist[1].transfer_qty = 2.0
+		se.doclist[1].qty = returned_qty
+		se.doclist[1].transfer_qty = returned_qty
+		# in both cases item code remains _Test Item when returning
 		se.insert()
 		
 		se.submit()
 		
 		# check if available qty is increased
-		actual_qty_2 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
-		self.assertEquals(actual_qty_1 + 2, actual_qty_2)
+		actual_qty_2 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2)
+	
+	def test_sales_invoice_return_of_non_packing_item(self):
+		self._test_sales_invoice_return("_Test Item", 5, 2)
 			
 	def test_sales_invoice_return_of_packing_item(self):
-		webnotes.conn.sql("delete from `tabStock Ledger Entry`")
-		webnotes.conn.sql("""delete from `tabBin`""")
-		material_receipt = webnotes.bean(copy=test_records[0])
-		material_receipt.insert()
-		material_receipt.submit()
+		self._test_sales_invoice_return("_Test Sales BOM Item", 25, 20)
 		
-		# check currency available qty in bin
-		actual_qty_0 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
+	def _test_delivery_note_return(self, item_code, delivered_qty, returned_qty):
+		self._insert_material_receipt()
 		
-		from accounts.doctype.sales_invoice.test_sales_invoice \
-			import test_records as sales_invoice_test_records
-			
-		# insert a pos invoice with update stock
-		si = webnotes.bean(copy=sales_invoice_test_records[1])
-		si.doc.is_pos = si.doc.update_stock = 1
-		si.doclist[1].item_code = "_Test Sales BOM Item"
-		si.doclist[1].warehouse = "_Test Warehouse"
-		si.insert()
-		si.submit()
+		actual_qty_0 = self._get_actual_qty()
 		
-		# check available bin qty after invoice submission
-		actual_qty_1 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
-		self.assertEquals(actual_qty_0 - 25, actual_qty_1)
+		# insert and submit delivery note
+		from stock.doctype.delivery_note.test_delivery_note \
+			import test_records as delivery_note_test_records
+		dn = webnotes.bean(copy=delivery_note_test_records[0])
+		dn.doclist[1].item_code = item_code
+		dn.insert()
+		dn.submit()
 		
+		actual_qty_1 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
+		
+		# insert and submit stock entry for sales return
 		se = webnotes.bean(copy=test_records[0])
 		se.doc.purpose = "Sales Return"
-		se.doc.posting_date = "2013-03-10"
-		se.doc.sales_invoice_no = si.doc.name
-		se.doclist[1].qty = 20.0
-		se.doclist[1].transfer_qty = 20.0
-		se.insert()
+		se.doc.delivery_note_no = dn.doc.name
+		se.doc.posting_date = "2013-03-01"
+		se.doclist[1].qty = se.doclist[1].transfer_qty = returned_qty
 		
+		se.insert()
 		se.submit()
 		
-		# check if available qty is increased
-		actual_qty_2 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
-		self.assertEquals(actual_qty_1 + 20, actual_qty_2)
+		actual_qty_2 = self._get_actual_qty()
+		self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2)
 		
+	def test_delivery_note_return_of_non_packing_item(self):
+		self._test_delivery_note_return("_Test Item", 5, 2)
 		
-	# def test_delivery_note_return_of_non_packing_item(self):
-	# 	pass
-	# 	
-	# def test_delivery_note_return_of_packing_item(self):
-	# 	pass
-	# 	
-	# def test_purchase_receipt_return(self):
-	# 	pass
+	def test_delivery_note_return_of_packing_item(self):
+		self._test_delivery_note_return("_Test Sales BOM Item", 25, 20)
+		
+	def test_purchase_receipt_return(self):
+		self._clear_stock()
+		
+		actual_qty_0 = self._get_actual_qty()
+		
+		from stock.doctype.purchase_receipt.test_purchase_receipt \
+			import test_records as purchase_receipt_test_records
+		
+		# submit purchase receipt
+		pr = webnotes.bean(copy=purchase_receipt_test_records[0])
+		pr.insert()
+		pr.submit()
+		
+		actual_qty_1 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_0 + 10, actual_qty_1)
+		
+		# submit purchase return
+		se = webnotes.bean(copy=test_records[0])
+		se.doc.purpose = "Purchase Return"
+		se.doc.purchase_receipt_no = pr.doc.name
+		se.doc.posting_date = "2013-03-01"
+		se.doclist[1].qty = se.doclist[1].transfer_qty = 5
+		se.doclist[1].s_warehouse = "_Test Warehouse"
+		se.insert()
+		se.submit()
+		
+		actual_qty_2 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_1 - 5, actual_qty_2)
+		
 
 test_records = [
 	[
