[cleanup]
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py b/erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py
new file mode 100644
index 0000000..4f1f576
--- /dev/null
+++ b/erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py
@@ -0,0 +1,12 @@
+from frappe import _
+
+data = {
+	'docstatus': 1,
+	'fieldname': 'purchase_order',
+	'transactions': [
+		{
+			'label': _('Related Documents'),
+			'items': ['Purchase Receipt', 'Purchase Invoice', 'Stock Entry']
+		},
+	]
+}
\ No newline at end of file
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
index 9bed98c..56ddd6b 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
@@ -9,6 +9,7 @@
  "docstatus": 0, 
  "doctype": "DocType", 
  "document_type": "Document", 
+ "editable_grid": 0, 
  "fields": [
   {
    "allow_on_submit": 0, 
@@ -1775,6 +1776,7 @@
  "hide_toolbar": 0, 
  "icon": "icon-shopping-cart", 
  "idx": 29, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 1, 
@@ -1782,7 +1784,7 @@
  "istable": 0, 
  "max_attachments": 0, 
  "menu_index": 0, 
- "modified": "2016-05-23 15:20:34.288790", 
+ "modified": "2016-07-08 06:48:04.162164", 
  "modified_by": "Administrator", 
  "module": "Buying", 
  "name": "Supplier Quotation", 
@@ -1845,7 +1847,7 @@
    "role": "Purchase User", 
    "set_user_permissions": 0, 
    "share": 1, 
-   "submit": 0, 
+   "submit": 1, 
    "write": 1
   }, 
   {
diff --git a/erpnext/demo/data/bom.json b/erpnext/demo/data/bom.json
index 145c0ba..1c3f7a9 100644
--- a/erpnext/demo/data/bom.json
+++ b/erpnext/demo/data/bom.json
@@ -1,145 +1,178 @@
 [
  {
-  "item": "Bearing Assembly", 
+  "item": "Bearing Assembly",
   "items": [
    {
-    "item_code": "Base Bearing Plate", 
-    "qty": 1.0, 
+    "item_code": "Base Bearing Plate",
+    "qty": 1.0,
     "rate": 15.0
-   }, 
+   },
    {
-    "item_code": "Bearing Block", 
-    "qty": 1.0, 
+    "item_code": "Bearing Block",
+    "qty": 1.0,
     "rate": 10.0
-   }, 
+   },
    {
-    "item_code": "Bearing Collar", 
-    "qty": 2.0, 
+    "item_code": "Bearing Collar",
+    "qty": 2.0,
     "rate": 20.0
-   }, 
+   },
    {
-    "item_code": "Bearing Pipe", 
-    "qty": 1.0, 
+    "item_code": "Bearing Pipe",
+    "qty": 1.0,
     "rate": 15.0
-   }, 
+   },
    {
-    "item_code": "Upper Bearing Plate", 
-    "qty": 1.0, 
+    "item_code": "Upper Bearing Plate",
+    "qty": 1.0,
     "rate": 50.0
    }
   ]
- }, 
+ },
  {
-  "item": "Wind Mill A Series", 
+  "item": "Wind Mill A Series",
   "items": [
    {
-    "item_code": "Base Bearing Plate", 
-    "qty": 1.0, 
+    "item_code": "Base Bearing Plate",
+    "qty": 1.0,
     "rate": 15.0
-   }, 
+   },
    {
-    "item_code": "Base Plate", 
-    "qty": 1.0, 
+    "item_code": "Base Plate",
+    "qty": 1.0,
     "rate": 20.0
-   }, 
+   },
    {
-    "item_code": "Bearing Block", 
-    "qty": 1.0, 
+    "item_code": "Bearing Block",
+    "qty": 1.0,
     "rate": 10.0
-   }, 
+   },
    {
-    "item_code": "Bearing Pipe", 
-    "qty": 1.0, 
+    "item_code": "Bearing Pipe",
+    "qty": 1.0,
     "rate": 15.0
-   }, 
+   },
    {
-    "item_code": "External Disc", 
-    "qty": 1.0, 
+    "item_code": "External Disc",
+    "qty": 1.0,
     "rate": 45.0
-   }, 
+   },
    {
-    "item_code": "Shaft", 
-    "qty": 1.0, 
+    "item_code": "Shaft",
+    "qty": 1.0,
     "rate": 30.0
-   }, 
+   },
    {
-    "item_code": "Wing Sheet", 
-    "qty": 4.0, 
+    "item_code": "Wing Sheet",
+    "qty": 4.0,
     "rate": 22.0
    }
   ]
- }, 
+ },
  {
-  "item": "Wind MIll C Series", 
+  "item": "Wind MIll C Series",
   "items": [
    {
-    "item_code": "Base Plate", 
-    "qty": 2.0, 
+    "item_code": "Base Plate",
+    "qty": 2.0,
     "rate": 20.0
-   }, 
+   },
    {
-    "item_code": "Internal Disc", 
-    "qty": 1.0, 
+    "item_code": "Internal Disc",
+    "qty": 1.0,
     "rate": 33.0
-   }, 
+   },
    {
-    "item_code": "External Disc", 
-    "qty": 1.0, 
+    "item_code": "External Disc",
+    "qty": 1.0,
     "rate": 45.0
-   }, 
+   },
    {
-    "item_code": "Bearing Assembly", 
-    "qty": 1.0, 
+    "item_code": "Bearing Assembly",
+    "qty": 1.0,
     "rate": 130.0
-   }, 
+   },
    {
-    "item_code": "Wing Sheet", 
-    "qty": 3.0, 
+    "item_code": "Wing Sheet",
+    "qty": 3.0,
     "rate": 22.0
    }
   ]
- }, 
+ },
  {
-  "item": "Wind Turbine", 
+  "item": "Wind Turbine",
+  "with_operations": 1,
+  "operations": [
+   {
+    "operation": "Prepare Frame",
+    "time_in_mins": 30.0,
+    "workstation": "Drilling Machine 1"
+   },
+   {
+    "operation": "Setup Fixtures",
+    "time_in_mins": 15.0,
+    "workstation": "Assembly Station 1"
+   },
+   {
+    "operation": "Assembly Operation",
+    "time_in_mins": 30.0,
+    "workstation": "Assembly Station 1"
+   },
+   {
+    "operation": "Wiring",
+    "time_in_mins": 20.0,
+    "workstation": "Assembly Station 1"
+   },
+   {
+    "operation": "Testing",
+    "time_in_mins": 10.0,
+    "workstation": "Packing and Testing Station"
+   },
+   {
+    "operation": "Packing",
+    "time_in_mins": 25.0,
+    "workstation": "Packing and Testing Station"
+   }
+  ],
   "items": [
    {
-    "item_code": "Base Bearing Plate", 
-    "qty": 1.0, 
+    "item_code": "Base Bearing Plate",
+    "qty": 1.0,
     "rate": 15.0
-   }, 
+   },
    {
-    "item_code": "Base Plate", 
-    "qty": 1.0, 
+    "item_code": "Base Plate",
+    "qty": 1.0,
     "rate": 20.0
-   }, 
+   },
    {
-    "item_code": "Bearing Collar", 
-    "qty": 1.0, 
+    "item_code": "Bearing Collar",
+    "qty": 1.0,
     "rate": 20.0
-   }, 
+   },
    {
-    "item_code": "Blade Rib", 
-    "qty": 1.0, 
+    "item_code": "Blade Rib",
+    "qty": 1.0,
     "rate": 10.0
-   }, 
+   },
    {
-    "item_code": "Shaft", 
-    "qty": 1.0, 
+    "item_code": "Shaft",
+    "qty": 1.0,
     "rate": 30.0
-   }, 
+   },
    {
-    "item_code": "Wing Sheet", 
-    "qty": 2.0, 
+    "item_code": "Wing Sheet",
+    "qty": 2.0,
     "rate": 22.0
    }
   ]
- }, 
+ },
  {
-  "item": "Base Plate", 
+  "item": "Base Plate",
   "items": [
    {
-    "item_code": "Base Plate Un Painted", 
-    "qty": 1.0, 
+    "item_code": "Base Plate Un Painted",
+    "qty": 1.0,
     "rate": 16.0
    }
   ]
diff --git a/erpnext/demo/demo.py b/erpnext/demo/demo.py
index ff0f184..9aeea3a 100644
--- a/erpnext/demo/demo.py
+++ b/erpnext/demo/demo.py
@@ -4,7 +4,7 @@
 import erpnext
 import frappe.utils
 from erpnext.demo.setup_data import setup_data
-from erpnext.demo.user import hr, sales, purchase
+from erpnext.demo.user import hr, sales, purchase, manufacturing, stock
 
 def make(domain='Manufacturing'):
 	frappe.flags.domain = domain
@@ -43,7 +43,8 @@
 		hr.work()
 		sales.work()
 		purchase.work()
-		# run_manufacturing()
+		manufacturing.work()
+		stock.work()
 		# run_stock()
 		# run_accounts()
 		# run_projects()
diff --git a/erpnext/demo/setup_data.py b/erpnext/demo/setup_data.py
index 6492152..f9bbd5d 100644
--- a/erpnext/demo/setup_data.py
+++ b/erpnext/demo/setup_data.py
@@ -14,6 +14,7 @@
 	setup_customer()
 	setup_supplier()
 	setup_item()
+	setup_warehouse()
 	import_json('Address')
 	import_json('Contact')
 	setup_workstation()
@@ -147,6 +148,11 @@
 		item.default_warehouse = frappe.get_all('Warehouse', filters={'warehouse_name': item.default_warehouse}, limit=1)[0].name
 		item.insert()
 
+def setup_warehouse():
+	w = frappe.new_doc('Warehouse')
+	w.warehouse_name = 'Supplier'
+	w.insert()
+
 def setup_currency_exchange():
 	frappe.get_doc({
 		'doctype': 'Currency Exchange',
@@ -182,7 +188,7 @@
 		user.password = 'demo'
 		user.insert()
 
-def import_json(doctype, submit=False):
+def import_json(doctype, submit=False, values=None):
 	frappe.flags.in_import = True
 	data = json.loads(open(frappe.get_app_path('erpnext', 'demo', 'data',
 		frappe.scrub(doctype) + '.json')).read())
@@ -266,13 +272,14 @@
 			and e.date_of_joining > f.year_start_date) else f.year_start_date
 		ss.to_date = f.year_end_date
 		ss.append('earnings', {
-			'earning_type': 'Basic',
-			'modified_value': random.random() * 10000
+			'salary_component': 'Basic',
+			'amount': random.random() * 10000
 		})
 		ss.append('deductions', {
-			'deduction_type': 'Income Tax',
-			'd_modified_amt': random.random() * 1000
+			'salary_component': 'Income Tax',
+			'amount': random.random() * 1000
 		})
+
 		ss.insert()
 
 def setup_account():
@@ -303,5 +310,16 @@
 
 	if not frappe.db.get_global('demo_purchase_user'):
 		user = frappe.get_doc('User', 'MichalSobczak@example.com')
-		user.add_roles('Purchase User', 'Purchase Manager', 'Accounts User')
+		user.add_roles('Purchase User', 'Purchase Manager', 'Accounts User', 'Stock User')
 		frappe.db.set_global('demo_purchase_user', user.name)
+
+	if not frappe.db.get_global('demo_manufacturing_user'):
+		user = frappe.get_doc('User', 'NuranVerkleij@example.com')
+		user.add_roles('Manufacturing User', 'Stock User', 'Purchase User', 'Accounts User')
+		frappe.db.set_global('demo_manufacturing_user', user.name)
+
+	if not frappe.db.get_global('demo_stock_user'):
+		user = frappe.get_doc('User', 'HatsueKashiwagi@example.com')
+		user.add_roles('Manufacturing User', 'Stock User', 'Purchase User', 'Accounts User')
+		frappe.db.set_global('demo_stock_user', user.name)
+
diff --git a/erpnext/demo/user/manufacturing.py b/erpnext/demo/user/manufacturing.py
new file mode 100644
index 0000000..c91570c
--- /dev/null
+++ b/erpnext/demo/user/manufacturing.py
@@ -0,0 +1,77 @@
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+
+import frappe, random, erpnext
+from frappe.utils.make_random import how_many
+from frappe.desk import query_report
+
+def work():
+	frappe.set_user(frappe.db.get_global('demo_manufacturing_user'))
+
+	from erpnext.projects.doctype.timesheet.timesheet import OverlapError
+
+	ppt = frappe.get_doc("Production Planning Tool", "Production Planning Tool")
+	ppt.company = erpnext.get_default_company()
+	ppt.use_multi_level_bom = 1
+	ppt.get_items_from = "Sales Order"
+	ppt.purchase_request_for_warehouse = "Stores - WPL"
+	ppt.run_method("get_open_sales_orders")
+	ppt.run_method("get_items")
+	ppt.run_method("raise_production_orders")
+	ppt.run_method("raise_material_requests")
+	frappe.db.commit()
+
+	# submit production orders
+	for pro in frappe.db.get_values("Production Order", {"docstatus": 0}, "name"):
+		b = frappe.get_doc("Production Order", pro[0])
+		b.wip_warehouse = "Work in Progress - WPL"
+		b.submit()
+		frappe.db.commit()
+
+	# submit material requests
+	for pro in frappe.db.get_values("Material Request", {"docstatus": 0}, "name"):
+		b = frappe.get_doc("Material Request", pro[0])
+		b.submit()
+		frappe.db.commit()
+
+	# stores -> wip
+	if random.random() < 0.3:
+		for pro in query_report.run("Open Production Orders")["result"][:how_many("Stock Entry for WIP")]:
+			make_stock_entry_from_pro(pro[0], "Material Transfer for Manufacture")
+
+	# wip -> fg
+	if random.random() < 0.3:
+		for pro in query_report.run("Production Orders in Progress")["result"][:how_many("Stock Entry for FG")]:
+			make_stock_entry_from_pro(pro[0], "Manufacture")
+
+	# submit time logs
+	for timesheet in frappe.get_all("Timesheet", ["name"], {"docstatus": 0,
+		"production_order": ("!=", ""), "to_time": ("<", frappe.flags.current_date)}):
+		timesheet = frappe.get_doc("Timesheet", timesheet.name)
+		try:
+			timesheet.submit()
+			frappe.db.commit()
+		except OverlapError:
+			pass
+
+def make_stock_entry_from_pro(pro_id, purpose):
+	from erpnext.manufacturing.doctype.production_order.production_order import make_stock_entry
+	from erpnext.stock.stock_ledger import NegativeStockError
+	from erpnext.stock.doctype.stock_entry.stock_entry import IncorrectValuationRateError, \
+		DuplicateEntryForProductionOrderError, OperationsNotCompleteError
+
+	try:
+		st = frappe.get_doc(make_stock_entry(pro_id, purpose))
+		st.posting_date = frappe.flags.current_date
+		st.fiscal_year = str(frappe.flags.current_date.year)
+		for d in st.get("items"):
+			d.cost_center = "Main - " + frappe.db.get_value('Company', st.company, 'abbr')
+		st.insert()
+		frappe.db.commit()
+		st.submit()
+		frappe.db.commit()
+	except (NegativeStockError, IncorrectValuationRateError, DuplicateEntryForProductionOrderError,
+		OperationsNotCompleteError):
+		frappe.db.rollback()
diff --git a/erpnext/demo/user/purchase.py b/erpnext/demo/user/purchase.py
index 58da9d3..9430677 100644
--- a/erpnext/demo/user/purchase.py
+++ b/erpnext/demo/user/purchase.py
@@ -27,6 +27,7 @@
 		for mr in frappe.get_all('Material Request',
 			filters={'material_request_type': 'Purchase', 'status': 'Open'},
 			limit=random.randint(1,6)):
+			print mr.name
 			if not frappe.get_all('Request for Quotation',
 				filters={'material_request': mr.name}, limit=1):
 				rfq = make_request_for_quotation(mr.name)
@@ -59,11 +60,11 @@
 		exchange_rate = get_exchange_rate(party_account_currency, company_currency)
 
 	# make supplier quotations
-	if random.random() < 0.3:
+	if random.random() < 0.2:
 		from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation
 
 		report = "Material Requests for which Supplier Quotations are not created"
-		for row in query_report.run(report)["result"][:how_many("Supplier Quotation")]:
+		for row in query_report.run(report)["result"][:random.randint(1, 3)]:
 			if row[0] != "'Total'":
 				sq = frappe.get_doc(make_supplier_quotation(row[0]))
 				sq.transaction_date = frappe.flags.current_date
@@ -89,13 +90,15 @@
 				po.submit()
 				frappe.db.commit()
 
-	if random.random() < 0.3:
+	if random.random() < 0.2:
 		make_subcontract()
 
 def make_material_request(item_code, qty):
 	mr = frappe.new_doc("Material Request")
 
-	if frappe.db.get_value('BOM', {'item': item_code, 'is_default': 1, 'is_active': 1}):
+	variant_of = frappe.db.get_value('Item', item_code, 'variant_of') or item_code
+
+	if frappe.db.get_value('BOM', {'item': variant_of, 'is_default': 1, 'is_active': 1}):
 		mr.material_request_type = 'Manufacture'
 	else:
 		mr.material_request_type = "Purchase"
@@ -143,6 +146,6 @@
 
 	# transfer material for sub-contract
 	stock_entry = frappe.get_doc(make_stock_entry(po.name, po.items[0].item_code))
-	stock_entry.from_warehouse = "Stores - WP"
-	stock_entry.to_warehouse = "Supplier - WP"
+	stock_entry.from_warehouse = "Stores - WPL"
+	stock_entry.to_warehouse = "Supplier - WPL"
 	stock_entry.insert()
diff --git a/erpnext/demo/user/stock.py b/erpnext/demo/user/stock.py
new file mode 100644
index 0000000..8266d7e
--- /dev/null
+++ b/erpnext/demo/user/stock.py
@@ -0,0 +1,97 @@
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+
+import frappe, random
+from frappe.desk import query_report
+from erpnext.stock.stock_ledger import NegativeStockError
+from erpnext.stock.doctype.serial_no.serial_no import SerialNoRequiredError, SerialNoQtyError
+
+def work():
+	frappe.set_user(frappe.db.get_global('demo_manufacturing_user'))
+
+	make_purchase_receipt()
+	make_delivery_note()
+	make_stock_reconciliation()
+	submit_draft_stock_entries()
+
+def make_purchase_receipt():
+	if random.random() < 0.6:
+		from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt
+		report = "Purchase Order Items To Be Received"
+		po_list =list(set([r[0] for r in query_report.run(report)["result"] if r[0]!="'Total'"]))[:random.randint(1, 10)]
+		for po in po_list:
+			pr = frappe.get_doc(make_purchase_receipt(po))
+
+			if pr.is_subcontracted=="Yes":
+				pr.supplier_warehouse = "Supplier - WPL"
+
+			pr.posting_date = frappe.flags.current_date
+			pr.insert()
+			try:
+				pr.submit()
+				frappe.db.commit()
+			except (NegativeStockError):
+				frappe.db.rollback()
+
+def make_delivery_note():
+	# make purchase requests
+
+	# make delivery notes (if possible)
+	if random.random() < 0.3:
+		from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note
+		report = "Ordered Items To Be Delivered"
+		for so in list(set([r[0] for r in query_report.run(report)["result"]
+			if r[0]!="'Total'"]))[:random.randint(1, 3)]:
+			dn = frappe.get_doc(make_delivery_note(so))
+			dn.posting_date = frappe.flags.current_date
+			for d in dn.get("items"):
+				if not d.expense_account:
+					d.expense_account = ("Cost of Goods Sold - {0}".format(
+						frappe.db.get_value('Company', dn.company, 'abbr')))
+			dn.insert()
+			try:
+				dn.submit()
+				frappe.db.commit()
+			except (NegativeStockError, SerialNoRequiredError, SerialNoQtyError):
+				frappe.db.rollback()
+
+def make_stock_reconciliation():
+	# random set some items as damaged
+	from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation \
+		import OpeningEntryAccountError, EmptyStockReconciliationItemsError
+
+	if random.random() < 0.1:
+		stock_reco = frappe.new_doc("Stock Reconciliation")
+		stock_reco.posting_date = frappe.flags.current_date
+		stock_reco.get_items_for("Stores - WP")
+		if stock_reco.items:
+			for item in stock_reco.items:
+				if item.qty:
+					item.qty = item.qty - round(random.randint(1, item.qty))
+			try:
+				stock_reco.insert()
+				stock_reco.submit()
+				frappe.db.commit()
+			except OpeningEntryAccountError:
+				frappe.db.rollback()
+			except EmptyStockReconciliationItemsError:
+				frappe.db.rollback()
+
+def submit_draft_stock_entries():
+	from erpnext.stock.doctype.stock_entry.stock_entry import IncorrectValuationRateError, \
+		DuplicateEntryForProductionOrderError, OperationsNotCompleteError
+
+	# try posting older drafts (if exists)
+	for st in frappe.db.get_values("Stock Entry", {"docstatus":0}, "name"):
+		try:
+			ste = frappe.get_doc("Stock Entry", st[0])
+			ste.posting_date = frappe.flags.current_date
+			ste.save()
+			ste.submit()
+			frappe.db.commit()
+		except (NegativeStockError, IncorrectValuationRateError, DuplicateEntryForProductionOrderError,
+			OperationsNotCompleteError):
+			frappe.db.rollback()
+
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 287ee9b..580d1ba 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -41,8 +41,8 @@
 
 		self.validate_materials()
 		self.set_bom_material_details()
-		self.calculate_cost()
 		self.validate_operations()
+		self.calculate_cost()
 
 	def on_update(self):
 		self.check_recursion()
@@ -64,7 +64,7 @@
 		self.manage_default_bom()
 
 	def get_item_det(self, item_code):
-		item = frappe.db.sql("""select name, item_name, docstatus, description, image, 
+		item = frappe.db.sql("""select name, item_name, docstatus, description, image,
 			is_sub_contracted_item, stock_uom, default_bom, last_purchase_rate
 			from `tabItem` where name=%s""", item_code, as_dict = 1)
 
@@ -370,7 +370,12 @@
 
 	def validate_operations(self):
 		if self.with_operations and not self.get('operations'):
-			frappe.throw(_("Operations cannot be left blank."))
+			frappe.throw(_("Operations cannot be left blank"))
+
+		if self.with_operations:
+			for d in self.operations:
+				if not d.description:
+					d.description = frappe.db.get_value('Operation', d.operation, 'description')
 
 def get_bom_items_as_dict(bom, company, qty=1, fetch_exploded=1):
 	item_dict = {}
diff --git a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
index 0171c41..18ab251 100644
--- a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
+++ b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
@@ -2,10 +2,13 @@
  "allow_copy": 0, 
  "allow_import": 0, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2013-02-22 01:27:49", 
  "custom": 0, 
  "docstatus": 0, 
  "doctype": "DocType", 
+ "document_type": "Setup", 
+ "editable_grid": 0, 
  "fields": [
   {
    "allow_on_submit": 0, 
@@ -15,6 +18,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Operation", 
@@ -25,6 +29,7 @@
    "options": "Operation", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -40,6 +45,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Workstation", 
@@ -50,6 +56,7 @@
    "options": "Workstation", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -65,18 +72,20 @@
    "fieldtype": "Text Editor", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
-   "label": "Operation Description", 
+   "label": "Description", 
    "length": 0, 
    "no_copy": 0, 
    "oldfieldname": "opn_description", 
    "oldfieldtype": "Text", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
-   "reqd": 1, 
+   "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
    "unique": 0
@@ -89,12 +98,14 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -110,6 +121,7 @@
    "fieldtype": "Float", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Hour Rate", 
@@ -119,6 +131,7 @@
    "oldfieldtype": "Currency", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -135,6 +148,7 @@
    "fieldtype": "Float", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Operation Time ", 
@@ -145,6 +159,7 @@
    "options": "", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -160,6 +175,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Operating Cost", 
@@ -169,6 +185,7 @@
    "oldfieldtype": "Currency", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -180,18 +197,21 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:42.924201", 
+ "modified": "2016-07-08 08:42:17.903362", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "BOM Operation", 
  "owner": "Administrator", 
  "permissions": [], 
+ "quick_entry": 0, 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/operation/operation.js b/erpnext/manufacturing/doctype/operation/operation.js
new file mode 100644
index 0000000..5c2aba6
--- /dev/null
+++ b/erpnext/manufacturing/doctype/operation/operation.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Operation', {
+	refresh: function(frm) {
+
+	}
+});
diff --git a/erpnext/manufacturing/doctype/operation/operation.json b/erpnext/manufacturing/doctype/operation/operation.json
index 66d0bb6..bf7f519 100644
--- a/erpnext/manufacturing/doctype/operation/operation.json
+++ b/erpnext/manufacturing/doctype/operation/operation.json
@@ -3,11 +3,13 @@
  "allow_import": 1, 
  "allow_rename": 1, 
  "autoname": "Prompt", 
+ "beta": 0, 
  "creation": "2014-11-07 16:20:30.683186", 
  "custom": 0, 
  "docstatus": 0, 
  "doctype": "DocType", 
  "document_type": "Setup", 
+ "editable_grid": 0, 
  "fields": [
   {
    "allow_on_submit": 0, 
@@ -17,6 +19,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Default Workstation", 
@@ -26,6 +29,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -41,6 +45,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -48,6 +53,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -63,14 +69,16 @@
    "fieldtype": "Text", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Operation Description", 
+   "label": "Description", 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -82,13 +90,15 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "icon": "icon-wrench", 
+ "idx": 0, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:50.879598", 
+ "modified": "2016-07-08 08:42:35.126397", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Operation", 
@@ -136,8 +146,10 @@
    "write": 1
   }
  ], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "sort_field": "modified", 
- "sort_order": "DESC"
+ "sort_order": "DESC", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.json b/erpnext/manufacturing/doctype/production_order/production_order.json
index 1a5415f..d1dc0c2 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.json
+++ b/erpnext/manufacturing/doctype/production_order/production_order.json
@@ -9,6 +9,7 @@
  "docstatus": 0, 
  "doctype": "DocType", 
  "document_type": "Setup", 
+ "editable_grid": 0, 
  "fields": [
   {
    "allow_on_submit": 0, 
@@ -201,6 +202,32 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "description": "", 
+   "fieldname": "sales_order", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Sales Order", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Sales Order", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "depends_on": "", 
    "fieldname": "qty", 
    "fieldtype": "Float", 
@@ -952,32 +979,6 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "description": "Manufacture against Sales Order", 
-   "fieldname": "sales_order", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Sales Order", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Sales Order", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
    "description": "Manufacture against Material Request", 
    "fieldname": "material_request", 
    "fieldtype": "Link", 
@@ -1091,7 +1092,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-07-06 16:09:38.879785", 
+ "modified": "2016-07-08 07:09:06.847763", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Production Order", 
diff --git a/erpnext/projects/web_form/tasks/tasks.json b/erpnext/projects/web_form/tasks/tasks.json
index 912b4c4..1d952fc 100644
--- a/erpnext/projects/web_form/tasks/tasks.json
+++ b/erpnext/projects/web_form/tasks/tasks.json
@@ -11,7 +11,7 @@
  "idx": 0, 
  "is_standard": 1, 
  "login_required": 1, 
- "modified": "2016-06-24 16:11:10.935835", 
+ "modified": "2016-07-07 06:04:30.979390", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "tasks", 
diff --git a/erpnext/setup/setup_wizard/install_fixtures.py b/erpnext/setup/setup_wizard/install_fixtures.py
index f2b72f4..3ea2539 100644
--- a/erpnext/setup/setup_wizard/install_fixtures.py
+++ b/erpnext/setup/setup_wizard/install_fixtures.py
@@ -183,7 +183,10 @@
 		{"doctype": "Offer Term", "offer_term": _("Incentives")},
 
 		{'doctype': "Print Heading", 'print_heading': _("Credit Note")},
-		{'doctype': "Print Heading", 'print_heading': _("Debit Note")}
+		{'doctype': "Print Heading", 'print_heading': _("Debit Note")},
+
+		{"doctype": "Salary Component", "salary_component": _("Basic")},
+		{"doctype": "Salary Component", "salary_component": _("Income Tax")},
 	]
 
 	from erpnext.setup.setup_wizard.industry_type import get_industry_types
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 05435f4..9ed005e 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -5,7 +5,7 @@
 import frappe
 import frappe.defaults
 from frappe import _
-from frappe.utils import cstr, cint, flt, comma_or, getdate, nowdate
+from frappe.utils import cstr, cint, flt, comma_or, getdate, nowdate, formatdate, format_time
 from erpnext.stock.utils import get_incoming_rate
 from erpnext.stock.stock_ledger import get_previous_sle, NegativeStockError
 from erpnext.stock.get_item_details import get_bin_details, get_default_cost_center, get_conversion_factor
@@ -225,9 +225,12 @@
 
 			# validate qty during submit
 			if d.docstatus==1 and d.s_warehouse and not allow_negative_stock and d.actual_qty < d.transfer_qty:
-				frappe.throw(_("""Row {0}: Qty not avalable in warehouse {1} on {2} {3}.
-					Available Qty: {4}, Transfer Qty: {5}""").format(d.idx, d.s_warehouse,
-					self.posting_date, self.posting_time, d.actual_qty, d.transfer_qty), NegativeStockError)
+				frappe.throw(_("Row {0}: Qty not available for {4} in warehouse {1} at posting time of the entry ({2} {3})".format(d.idx,
+					frappe.bold(d.s_warehouse), formatdate(self.posting_date),
+					format_time(self.posting_time), frappe.bold(d.item_code)))
+					+ '<br><br>' + _("Available qty is {0}, you need {1}").format(frappe.bold(d.actual_qty),
+						frappe.bold(d.transfer_qty)),
+					NegativeStockError, title=_('Insufficient Stock'))
 
 	def get_stock_and_rate(self):
 		self.set_transfer_qty()
diff --git a/erpnext/stock/doctype/warehouse/warehouse.json b/erpnext/stock/doctype/warehouse/warehouse.json
index 86516ff..192afbb 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.json
+++ b/erpnext/stock/doctype/warehouse/warehouse.json
@@ -9,6 +9,7 @@
  "docstatus": 0, 
  "doctype": "DocType", 
  "document_type": "Setup", 
+ "editable_grid": 0, 
  "fields": [
   {
    "allow_on_submit": 0, 
@@ -428,7 +429,7 @@
    "bold": 0, 
    "collapsible": 0, 
    "fieldname": "pin", 
-   "fieldtype": "Int", 
+   "fieldtype": "Data", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
@@ -588,7 +589,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-06-29 19:47:24.336215", 
+ "modified": "2016-07-08 06:00:36.113988", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Warehouse", 
diff --git a/erpnext/stock/doctype/warehouse/warehouse_tree.js b/erpnext/stock/doctype/warehouse/warehouse_tree.js
index 0134ca7..0baed4d 100644
--- a/erpnext/stock/doctype/warehouse/warehouse_tree.js
+++ b/erpnext/stock/doctype/warehouse/warehouse_tree.js
@@ -14,7 +14,7 @@
 		{fieldtype:'Data', fieldname: 'name_field',
 			label:__('New Warehouse Name'), reqd:true},
 		{fieldtype:'Check', fieldname:'is_group', label:__('Is Group'),
-			description: __("Further nodes can be only created under 'Group' type nodes")}
+			description: __("Child nodes can be only created under 'Group' type nodes")}
 	],
 	onrender: function(node) {
 		if (node.data && node.data.balance!==undefined) {
diff --git a/erpnext/stock/report/material_requests_for_which_supplier_quotations_are_not_created/material_requests_for_which_supplier_quotations_are_not_created.json b/erpnext/stock/report/material_requests_for_which_supplier_quotations_are_not_created/material_requests_for_which_supplier_quotations_are_not_created.json
index 55583a9..8615684 100644
--- a/erpnext/stock/report/material_requests_for_which_supplier_quotations_are_not_created/material_requests_for_which_supplier_quotations_are_not_created.json
+++ b/erpnext/stock/report/material_requests_for_which_supplier_quotations_are_not_created/material_requests_for_which_supplier_quotations_are_not_created.json
@@ -1,17 +1,19 @@
 {
- "apply_user_permissions": 1, 
- "creation": "2013-08-09 12:20:58", 
- "docstatus": 0, 
- "doctype": "Report", 
- "idx": 1, 
- "is_standard": "Yes", 
- "modified": "2015-03-30 05:46:11.917037", 
- "modified_by": "Administrator", 
- "module": "Stock", 
- "name": "Material Requests for which Supplier Quotations are not created", 
- "owner": "Administrator", 
- "query": "select \n    mr.name as \"Material Request:Link/Material Request:120\",\n    mr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tmr_item.qty as \"Qty:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\",\n\tmr.company as \"Company:Link/Company:\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\n\tand not exists(select name from `tabSupplier Quotation Item` where prevdoc_docname=mr.name)\norder by mr.transaction_date asc", 
- "ref_doctype": "Material Request", 
- "report_name": "Material Requests for which Supplier Quotations are not created", 
+ "add_total_row": 0,
+ "apply_user_permissions": 1,
+ "creation": "2013-08-09 12:20:58",
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "idx": 1,
+ "is_standard": "Yes",
+ "modified": "2016-07-08 05:43:10.236943",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Material Requests for which Supplier Quotations are not created",
+ "owner": "Administrator",
+ "query": "select \n    mr.name as \"Material Request:Link/Material Request:120\",\n    mr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tmr_item.qty as \"Qty:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\",\n\tmr.company as \"Company:Link/Company:\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\n\tand not exists(select name from `tabSupplier Quotation Item` where material_request=mr.name)\norder by mr.transaction_date asc",
+ "ref_doctype": "Material Request",
+ "report_name": "Material Requests for which Supplier Quotations are not created",
  "report_type": "Query Report"
 }
\ No newline at end of file
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 096a5e0..8d17a1e 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -229,7 +229,7 @@
 				# calculate new valuation rate only if stock value is positive
 				# else it remains the same as that of previous entry
 				self.valuation_rate = new_stock_value / new_stock_qty
-		
+
 	def get_moving_average_values(self, sle):
 		actual_qty = flt(sle.actual_qty)
 		new_stock_qty = flt(self.qty_after_transaction) + actual_qty
@@ -303,7 +303,7 @@
 						break
 				else:
 					index = 0
-					
+
 				# select first batch or the batch with same rate
 				batch = self.stock_queue[index]
 				if qty_to_pop >= batch[0]:
@@ -327,7 +327,7 @@
 
 		if stock_qty:
 			self.valuation_rate = stock_value / flt(stock_qty)
-		
+
 		if not self.stock_queue:
 			self.stock_queue.append([0, sle.incoming_rate or sle.outgoing_rate or self.valuation_rate])
 
@@ -346,8 +346,9 @@
 
 
 
-		if frappe.local.flags.currently_saving.doctype==self.exceptions[0]["voucher_type"] \
-			and frappe.local.flags.currently_saving.name==self.exceptions[0]["voucher_no"]:
+		if (frappe.local.flags.currently_saving
+			and frappe.local.flags.currently_saving.doctype==self.exceptions[0]["voucher_type"]
+			and frappe.local.flags.currently_saving.name==self.exceptions[0]["voucher_no"]):
 			msg = _("{0} units of {1} needed in {2} to complete this transaction.").format(
 				abs(deficiency), frappe.get_desk_link('Item', self.item_code),
 				frappe.get_desk_link('Warehouse', self.warehouse))