fixed asset depreciation
diff --git a/erpnext/accounts/doctype/asset/asset.js b/erpnext/accounts/doctype/asset/asset.js
index e961b7d..91d41e5 100644
--- a/erpnext/accounts/doctype/asset/asset.js
+++ b/erpnext/accounts/doctype/asset/asset.js
@@ -4,20 +4,37 @@
 frappe.provide("erpnext.asset");
 
 frappe.ui.form.on('Asset', {
-	refresh: function(frm) {
-		cur_frm.add_custom_button("Scrap", function() {
-			erpnext.asset.scrap_asset(); 
+	onload: function(frm) {
+		frm.set_query("item_code", function() {
+			return {
+				"filters": {
+					"is_stock_item": 0,
+					"is_fixed_asset": 1,
+					"disabled": 0
+				}
+			};
 		});
 	},
+	
+	refresh: function(frm) {
+		if(frm.doc.docstatus==1 && frm.doc.status=='Available') {
+			cur_frm.add_custom_button("Scrap", function() {
+				erpnext.asset.scrap_asset(frm);
+			});
+		}
+	}
 });
 
-erpnext.asset.scrap_asset = function() {
+erpnext.asset.scrap_asset = function(frm) {
 	frappe.confirm(__("Do you really want to scrap this asset?"), function () {
 		frappe.call({
 			args: {
 				"asset_name": frm.doc.name
 			},
-			method: "erpnext.accounts.doctype.asset.depreciation.scrap_asset"
+			method: "erpnext.accounts.doctype.asset.depreciation.scrap_asset",
+			callback: function(r) {
+				cur_frm.reload_doc();
+			}
 		})
 	})
 }
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/asset/asset.json b/erpnext/accounts/doctype/asset/asset.json
index 760e00d..8c29c44 100644
--- a/erpnext/accounts/doctype/asset/asset.json
+++ b/erpnext/accounts/doctype/asset/asset.json
@@ -64,6 +64,32 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "item_code", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Item Code", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Item", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "default": "Available", 
    "fieldname": "status", 
    "fieldtype": "Select", 
@@ -74,13 +100,13 @@
    "in_list_view": 0, 
    "label": "Status", 
    "length": 0, 
-   "no_copy": 0, 
+   "no_copy": 1, 
    "options": "Available\nSold\nScrapped", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 0, 
+   "read_only": 1, 
    "report_hide": 0, 
    "reqd": 1, 
    "search_index": 0, 
@@ -166,6 +192,32 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "purchase_invoice", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Purchase Invoice", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Purchase Invoice", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "company", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -216,7 +268,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "default": "Straight Line", 
+   "default": "", 
    "depends_on": "", 
    "fieldname": "depreciation_method", 
    "fieldtype": "Select", 
@@ -244,15 +296,14 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "description": "The time period over which the company expects that the asset will be productive", 
-   "fieldname": "useful_life", 
+   "fieldname": "number_of_depreciations", 
    "fieldtype": "Int", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Useful Life (Years)", 
+   "label": "Number of Depreciations", 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
@@ -270,14 +321,14 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "start_depreciation_from_purchase_date", 
-   "fieldtype": "Check", 
+   "fieldname": "number_of_months_in_a_period", 
+   "fieldtype": "Int", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Start Depreciation from Purchase Date", 
+   "label": "Number of Months in a Period", 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
@@ -295,6 +346,32 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "next_depreciation_date", 
+   "fieldtype": "Date", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Next Depreciation Date", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "column_break_11", 
    "fieldtype": "Column Break", 
    "hidden": 0, 
@@ -319,16 +396,17 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "gross_value", 
+   "fieldname": "gross_purchase_amount", 
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Gross Value", 
+   "label": "Gross Purchase Amount", 
    "length": 0, 
    "no_copy": 0, 
+   "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -344,17 +422,18 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "description": "The estimated resale value of an asset at the end of its useful life", 
-   "fieldname": "salvage_value", 
-   "fieldtype": "Data", 
+   "description": "", 
+   "fieldname": "expected_value_after_useful_life", 
+   "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Salvage Value", 
+   "label": "Expected Value After Useful Life", 
    "length": 0, 
    "no_copy": 0, 
+   "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -369,7 +448,33 @@
   {
    "allow_on_submit": 0, 
    "bold": 0, 
-   "collapsible": 1, 
+   "collapsible": 0, 
+   "fieldname": "current_value", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Current Value (After Depreciation)", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Company:company:default_currency", 
+   "permlevel": 0, 
+   "precision": "", 
+   "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, 
    "fieldname": "section_break_14", 
    "fieldtype": "Section Break", 
    "hidden": 0, 
@@ -404,13 +509,38 @@
    "in_list_view": 0, 
    "label": "Depreciation Schedules", 
    "length": 0, 
-   "no_copy": 0, 
+   "no_copy": 1, 
    "options": "Depreciation Schedule", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "amended_from", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Amended From", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Asset", 
+   "permlevel": 0, 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
    "search_index": 0, 
@@ -423,11 +553,11 @@
  "idx": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
- "is_submittable": 0, 
+ "is_submittable": 1, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-03-03 17:34:00.991228", 
+ "modified": "2016-03-09 12:22:05.223886", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Asset", 
@@ -437,7 +567,7 @@
   {
    "amend": 0, 
    "apply_user_permissions": 0, 
-   "cancel": 0, 
+   "cancel": 1, 
    "create": 1, 
    "delete": 1, 
    "email": 1, 
@@ -451,7 +581,7 @@
    "role": "Accounts User", 
    "set_user_permissions": 0, 
    "share": 1, 
-   "submit": 0, 
+   "submit": 1, 
    "write": 1
   }
  ], 
diff --git a/erpnext/accounts/doctype/asset/asset.py b/erpnext/accounts/doctype/asset/asset.py
index 0479d0a..fb1502e 100644
--- a/erpnext/accounts/doctype/asset/asset.py
+++ b/erpnext/accounts/doctype/asset/asset.py
@@ -5,61 +5,90 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import flt, add_years
+from frappe.utils import flt, add_months, cint
 from frappe.model.document import Document
 
 class Asset(Document):
 	def validate(self):
-		self.validate_mandatory()
+		self.validate_fixed_asset_item()
+		self.validate_asset_values()
+		self.set_depreciation_settings()
 		self.make_depreciation_schedule()
-	
-	def validate_mandatory(self):
-		if not self.useful_life:
-			self.useful_life = frappe.db.get_value("Asset Category", self.asset_category, "useful_life")
-			if not self.useful_life:
-				frappe.throw(_("Useful Life is mandatory"))
-
+		
+	def on_cancel(self):
+		self.validate_cancellation()
+		self.delete_depreciation_entries()
+		
+	def validate_fixed_asset_item(self):
+		item = frappe.get_doc("Item", self.item_code)
+		if item.disabled:
+			frappe.throw(_("Item {0} has been disabled").format(self.item_code))
+		if item.is_stock_item:
+			frappe.throw(_("Item {0} must be a non-stock item").format(self.item_code))
+			
+	def validate_asset_values(self):
+		if flt(self.expected_value_after_useful_life) >= flt(self.gross_purchase_amount):
+			frappe.throw(_("Expected Value After Useful Life must be less than Gross Purchase Amount"))
+			
+		if not self.current_value:
+			self.current_value = flt(self.gross_purchase_amount)
+		else:
+			if flt(self.current_value) > flt(self.gross_purchase_amount):
+				frappe.throw(_("Current Value After Depreciation must be less than equal to {0}")
+					.format(flt(self.gross_purchase_amount)))
+							
+	def set_depreciation_settings(self):
+		asset_category = frappe.get_doc("Asset Category", self.asset_category)
+		
+		for field in ("depreciation_method", "number_of_depreciations", "number_of_months_in_a_period"):
+			if not self.get(field):
+				self.set(field, asset_category.get(field))
+				
 	def make_depreciation_schedule(self):
 		self.schedules = []
 		if not self.get("schedules") and self.status == "Available":
-			depreciation_method = self.get_depreciation_method()
-			
 			accumulated_depreciation = 0
-			value_after_depreciation = flt(self.gross_value)
-			for n in xrange(self.useful_life):
-				depreciation_date = add_years(self.purchase_date, 
-					n if self.start_depreciation_from_purchase_date else n+1)
-				depreciation_amount = self.get_depreciation_amount(value_after_depreciation, 
-					depreciation_method)
+			value_after_depreciation = flt(self.current_value)
+			for n in xrange(self.number_of_depreciations):
+				schedule_date = add_months(self.next_depreciation_date, 
+					n * cint(self.number_of_months_in_a_period))
+					
+				depreciation_amount = self.get_depreciation_amount(value_after_depreciation)
 				
 				self.append("schedules", {
-					"depreciation_date": depreciation_date,
+					"schedule_date": schedule_date,
 					"depreciation_amount": depreciation_amount,
 					"accumulated_depreciation_amount": accumulated_depreciation + depreciation_amount
 				})
-				
-	def get_depreciation_method(self):
-		depreciation_method = self.depreciation_method or \
-			frappe.db.get_value("Asset Category", self.asset_category, "depreciation_method") or \
-			frappe.db.get_value("Company", self.company, "depreciation_method")
-			
-		if not depreciation_method:
-			frappe.throw(_("Please set Depreciation Method in Asset Category {0} or Company {1}")
-				.format(self.asset_category, self.company))
-	
-	def get_depreciation_amount(self, depreciable_value, depreciation_method=None):
-		if not depreciation_method:
-			depreciation_method = self.get_depreciation_method()
-	
-		if depreciation_method == "Straight Line":
-			depreciation_amount = (flt(self.gross_value) - flt(self.salvage_value)) / flt(self.useful_life)
+				accumulated_depreciation += flt(depreciation_amount)
+				value_after_depreciation -= flt(depreciation_amount)
+									
+	def get_depreciation_amount(self, depreciable_value):
+		if self.depreciation_method == "Straight Line":
+			depreciation_amount = (flt(self.current_value) - 
+				flt(self.expected_value_after_useful_life)) / cint(self.number_of_depreciations)
 		else:
-			factor = 200 / self.useful_life
+			factor = 200 /  cint(self.number_of_depreciations)
 			depreciation_amount = depreciable_value * factor / 100
-	
+
 			value_after_depreciation = flt(depreciable_value) - depreciation_amount
-			if value_after_depreciation < self.salvage_value:
-				depreciation_amount = flt(depreciable_value) - flt(self.salvage_value)
-		
+			if value_after_depreciation < flt(self.expected_value_after_useful_life):
+				depreciation_amount = flt(depreciable_value) - flt(self.expected_value_after_useful_life)
+
 		return depreciation_amount
+		
+	def validate_cancellation(self):
+		if self.status != "Available":
+			frappe.throw(_("Asset {0} cannot be cancelled, as it is already {1}")
+				.format(self.name, self.status))
+		
+	def delete_depreciation_entries(self):
+		total_depreciation_amount = 0
+		for d in self.get("schedules"):
+			if d.journal_entry:
+				frappe.get_doc("Journal Entry", d.journal_entry).cancel()
+			
+				d.db_set("journal_entry", None)
+				total_depreciation_amount += flt(d.depreciation_amount)
+		self.db_set("current_value", (self.current_value - total_depreciation_amount))
 	
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/asset/depreciation.py b/erpnext/accounts/doctype/asset/depreciation.py
index 48a964a..bd2c74f 100644
--- a/erpnext/accounts/doctype/asset/depreciation.py
+++ b/erpnext/accounts/doctype/asset/depreciation.py
@@ -5,113 +5,140 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import flt, today
+from frappe.utils import flt, today, getdate
 
-
-# Depreciate
-#------------
-
-def post_depreciation_entries(self):
-	assets = get_depreciable_assets()
-	for asset in assets:
-		depreciate_asset(asset.asset_name, asset.depreciation_amount, asset.schedule_row)
-	
-def get_depreciable_assets(date=None):
+def post_depreciation_entries(date=None):
 	if not date:
 		date = today()
-		
-	return frappe.db.sql("""
-		select a.name as asset_name, ds.depreciation_amount, ds.name as schedule_row 
+	for asset in get_depreciable_assets(date):
+		make_depreciation_entry(asset, date)
+	
+def get_depreciable_assets(date):
+	return frappe.db.sql_list("""select a.name
 		from tabAsset a, `tabDepreciation Schedule` ds
-		where
-			a.name = ds.parent and ds.depreciation_date=%s 
-			and a.status = 'Available' and ds.posted=0 and a.docstatus < 2""", date, as_dict=1)
-		
-def depreciate_asset(asset_name, depreciation_amount, schedule_row):
-	asset = frappe.get_doc("Asset", asset_name)
-	accumulated_depreciation_account, depreciation_expense_account = get_depreciation_accounts(asset)
-	
-	je = frappe.new_doc("Journal Entry")
-	je.voucher_type = "Depreciation Entry"
-	je.posting_date = today()
-	je.company = asset.company
-	je.remark = "Depreciation Entry against {0} worth {1}".format(asset_name, depreciation_amount)
-	
-	je.append("accounts", {
-		"account": accumulated_depreciation_account,
-		"credit_in_account_currency": depreciation_amount,
-		"reference_type": "Asset",
-		"reference_name": asset.name
-	})
-	
-	je.append("accounts", {
-		"account": depreciation_expense_account,
-		"debit_in_account_currency": depreciation_amount,
-		"reference_type": "Asset",
-		"reference_name": asset.name
-	})
-	
-	je.flags.ignore_permissions = True
-	je.submit()
-	
-	frappe.db.sql("""update `tabDepreciation Schedule` 
-		set posted=1, journal_entry=%s, modified=now(), modified_by=%s where name=%s""", 
-		(je.name, frappe.session.user, schedule_row))
+		where a.name = ds.parent and a.docstatus=1 and ds.schedule_date<=%s 
+			and a.status = 'Available' and ifnull(ds.journal_entry, '')=''""", date)
 
+def make_depreciation_entry(asset_name, date=None):
+	if not date:
+		date = today()
+	
+	asset = frappe.get_doc("Asset", asset_name)
+	fixed_asset_account, accumulated_depreciation_account, depreciation_expense_account = \
+		get_depreciation_accounts(asset)
+	
+	for d in asset.get("schedules"):
+		if not d.journal_entry and getdate(d.schedule_date) <= getdate(date):
+			je = frappe.new_doc("Journal Entry")
+			je.voucher_type = "Depreciation Entry"
+			je.posting_date = d.schedule_date
+			je.company = asset.company
+			je.remark = "Depreciation Entry against {0} worth {1}".format(asset_name, d.depreciation_amount)
+	
+			je.append("accounts", {
+				"account": accumulated_depreciation_account,
+				"credit_in_account_currency": d.depreciation_amount,
+				"reference_type": "Asset",
+				"reference_name": asset.name
+			})
+	
+			je.append("accounts", {
+				"account": depreciation_expense_account,
+				"debit_in_account_currency": d.depreciation_amount,
+				"reference_type": "Asset",
+				"reference_name": asset.name
+			})
+	
+			je.flags.ignore_permissions = True
+			je.submit()
+	
+			d.db_set("journal_entry", je.name)
+			asset.current_value -= d.depreciation_amount
+			frappe.db.set_value("Asset", asset_name, "current_value", asset.current_value)			
+	
 def get_depreciation_accounts(asset):
-	accumulated_depreciation_account, depreciation_expense_account = frappe.db.get_value("Asset Category", 
-		asset.asset_category, ["accumulated_depreciation_account", "depreciation_expense_account"])
-		
+	accounts = frappe.db.sql("""select fixed_asset_account, accumulated_depreciation_account, 
+			depreciation_expense_account from `tabAsset Category Account`
+			where parent=%s and company=%s""", (asset.asset_category, asset.company), as_dict=1)[0]
+	
+	fixed_asset_account = accounts.fixed_asset_account
+	accumulated_depreciation_account = accounts.accumulated_depreciation_account
+	depreciation_expense_account = accounts.depreciation_expense_account
+	
 	if not accumulated_depreciation_account or not depreciation_expense_account:
 		accounts = frappe.db.get_value("Company", asset.company, 
 			["accumulated_depreciation_account", "depreciation_expense_account"])
+		
 		if not accumulated_depreciation_account:
 			accumulated_depreciation_account = accounts[0]
 		if not depreciation_expense_account:
 			depreciation_expense_account = accounts[1]
 			
-	if not accumulated_depreciation_account or not depreciation_expense_account:
+	if not fixed_asset_account or not accumulated_depreciation_account or not depreciation_expense_account:
 		frappe.throw(_("Please set Depreciation related Accounts in Asset Category {0} or Company {1}")
 			.format(asset.asset_category, asset.company))
 			
-	return accumulated_depreciation_account, depreciation_expense_account
+	return fixed_asset_account, accumulated_depreciation_account, depreciation_expense_account
 	
-# Scrap
-#---------
-
 @frappe.whitelist()
 def scrap_asset(asset_name):
 	asset = frappe.get_doc("Asset", asset_name)
-	asset.status = "Scrapped"
 	
-	accumulated_depr_amount = frappe.db.sql("""select accumulated_depreciation_amount 
-		from `tabDepreciation Schedule` 
-		where parent=%s and posted=1
-		order by depreciation_date desc limit 1""")
-		
-	accumulated_depr_amount = flt(accumulated_depr_amount[0][0]) if accumulated_depr_amount else 0
-	
-	net_value_after_depreciation = flt(asset.gross_value) - accumulated_depr_amount
-	
+	if asset.docstatus != 1 or asset.status != 'Available':
+		frappe.throw(_("Asset {0} must be submitted and available").format(asset.name))
+
 	je = frappe.new_doc("Journal Entry")
-	je.voucher_type = "Depreciation Entry"
+	je.voucher_type = "Journal Entry"
 	je.posting_date = today()
 	je.company = asset.company
-	je.remark = "Disposal Entry for asset {0}".format(asset_name)
+	je.remark = "Scrap Entry for asset {0}".format(asset_name)
 	
-	# je.append("accounts", {
-	# 	"account": accumulated_depreciation_account,
-	# 	"credit_in_account_currency": depreciation_amount,
-	# 	"reference_type": "Asset",
-	# 	"reference_name": asset.name
-	# })
-	#
-	# je.append("accounts", {
-	# 	"account": depreciation_expense_account,
-	# 	"debit_in_account_currency": depreciation_amount,
-	# 	"reference_type": "Asset",
-	# 	"reference_name": asset.name
-	# })
+	for entry in get_gl_entries_on_asset_disposal(asset):
+		entry.update({
+			"reference_type": "Asset",
+			"reference_name": asset_name
+		})
+		je.append("accounts", entry)
 	
 	je.flags.ignore_permissions = True
-	je.submit()
\ No newline at end of file
+	je.submit()
+	
+	frappe.db.set_value("Asset", asset_name, "status", "Scrapped")
+	
+@frappe.whitelist()
+def get_gl_entries_on_asset_disposal(asset, selling_amount=0):
+	fixed_asset_account, accumulated_depr_account, depr_expense_account = get_depreciation_accounts(asset)
+	disposal_account, disposal_cost_center = get_disposal_account_and_cost_center(asset.company)
+	accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(asset.current_value)
+	
+	gl_entries = [
+		{
+			"account": fixed_asset_account,
+			"credit_in_account_currency": asset.gross_purchase_amount,
+			"credit": asset.gross_purchase_amount
+		}, 
+		{
+			"account": accumulated_depr_account,
+			"debit_in_account_currency": accumulated_depr_amount,
+			"debit": accumulated_depr_amount
+		}
+	]
+	
+	profit_amount = flt(selling_amount) - flt(asset.current_value)
+	if flt(asset.current_value) and profit_amount:
+		debit_or_credit = "debit" if profit_amount < 0 else "credit"
+		gl_entries.append({
+			"account": disposal_account,
+			"cost_center": disposal_cost_center,
+			debit_or_credit: abs(profit_amount),
+			debit_or_credit + "_in_account_currency": abs(profit_amount)
+		})
+	
+	return gl_entries
+	
+def get_disposal_account_and_cost_center(company):
+	disposal_account, disposal_cost_center = frappe.db.get_value("Company", company, 
+		["disposal_account", "disposal_cost_center"])
+	if not disposal_account or not disposal_cost_center:
+		frappe.throw(_("Please set 'Asset Disposal Account' and 'Asset Disposal Cost Center' in Company {0}").format(company))
+	return disposal_account, disposal_cost_center
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/asset_category/asset_category.js b/erpnext/accounts/doctype/asset_category/asset_category.js
index 84f0dfc..862a202 100644
--- a/erpnext/accounts/doctype/asset_category/asset_category.js
+++ b/erpnext/accounts/doctype/asset_category/asset_category.js
@@ -1,8 +1,36 @@
 // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
 // For license information, please see license.txt
 
-frappe.ui.form.on('Asset Category', {
-	refresh: function(frm) {
+cur_frm.fields_dict['accounts'].grid.get_field('fixed_asset_account').get_query = function(doc, cdt, cdn) {
+	var d  = locals[cdt][cdn];
+	return {
+		"filters": {
+			"account_type": "Fixed Asset",
+			"root_type": "Asset",
+			"is_group": 0,
+			"company": d.company
+		}
+	};
+}
 
-	}
-});
+cur_frm.fields_dict['accounts'].grid.get_field('accumulated_depreciation_account').get_query = function(doc, cdt, cdn) {
+	var d  = locals[cdt][cdn];
+	return {
+		"filters": {
+			"root_type": "Asset",
+			"is_group": 0,
+			"company": d.company
+		}
+	};
+}
+
+cur_frm.fields_dict['accounts'].grid.get_field('depreciation_expense_account').get_query = function(doc, cdt, cdn) {
+	var d  = locals[cdt][cdn];
+	return {
+		"filters": {
+			"root_type": "Expense",
+			"is_group": 0,
+			"company": d.company
+		}
+	};
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/asset_category/asset_category.json b/erpnext/accounts/doctype/asset_category/asset_category.json
index 9338e22..9d8bd00 100644
--- a/erpnext/accounts/doctype/asset_category/asset_category.json
+++ b/erpnext/accounts/doctype/asset_category/asset_category.json
@@ -38,30 +38,6 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "section_break_2", 
-   "fieldtype": "Section 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, 
-   "precision": "", 
-   "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, 
    "default": "Straight Line", 
    "fieldname": "depreciation_method", 
    "fieldtype": "Select", 
@@ -80,7 +56,7 @@
    "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
-   "reqd": 0, 
+   "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
    "unique": 0
@@ -89,32 +65,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "useful_life", 
-   "fieldtype": "Int", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Useful Life (Years)", 
-   "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, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "column_break_5", 
+   "fieldname": "column_break_3", 
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
@@ -138,17 +89,16 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "fixed_asset_account", 
-   "fieldtype": "Link", 
+   "fieldname": "number_of_depreciations", 
+   "fieldtype": "Int", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Fixed Asset Account", 
+   "label": "Number of Depreciations", 
    "length": 0, 
    "no_copy": 0, 
-   "options": "Account", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -164,17 +114,16 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "accumulated_depreciation_account", 
-   "fieldtype": "Link", 
+   "fieldname": "number_of_months_in_a_period", 
+   "fieldtype": "Int", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Accumulated Depreciation Account", 
+   "label": "Number of Months in a Period", 
    "length": 0, 
    "no_copy": 0, 
-   "options": "Account", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -190,24 +139,49 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "depreciation_expense_account", 
-   "fieldtype": "Link", 
+   "fieldname": "section_break_2", 
+   "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Depreciation Expense Account", 
+   "label": "Accounts", 
    "length": 0, 
    "no_copy": 0, 
-   "options": "Account", 
    "permlevel": 0, 
    "precision": "", 
    "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
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "accounts", 
+   "fieldtype": "Table", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Accounts", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Asset Category Account", 
+   "permlevel": 0, 
+   "precision": "", 
+   "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
@@ -222,7 +196,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-03-03 15:17:44.877003", 
+ "modified": "2016-03-07 19:01:19.265210", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Asset Category", 
diff --git a/erpnext/accounts/doctype/asset_category/asset_category.py b/erpnext/accounts/doctype/asset_category/asset_category.py
index 8f922d1..f139499 100644
--- a/erpnext/accounts/doctype/asset_category/asset_category.py
+++ b/erpnext/accounts/doctype/asset_category/asset_category.py
@@ -4,7 +4,12 @@
 
 from __future__ import unicode_literals
 import frappe
+from frappe import _
 from frappe.model.document import Document
 
 class AssetCategory(Document):
-	pass
+	def validate(self):
+		for field in ("depreciation_method", "number_of_depreciations", 
+				"number_of_months_in_a_period", "accounts"):
+			if not self.get(field):
+				frappe.throw(_("{0} is mandatory").format(self.meta.get_label(field)))
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/asset_category_account/__init__.py b/erpnext/accounts/doctype/asset_category_account/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/asset_category_account/__init__.py
diff --git a/erpnext/accounts/doctype/asset_category_account/asset_category_account.json b/erpnext/accounts/doctype/asset_category_account/asset_category_account.json
new file mode 100644
index 0000000..5144e85
--- /dev/null
+++ b/erpnext/accounts/doctype/asset_category_account/asset_category_account.json
@@ -0,0 +1,136 @@
+{
+ "allow_copy": 0, 
+ "allow_import": 0, 
+ "allow_rename": 0, 
+ "creation": "2016-03-07 15:55:18.806409", 
+ "custom": 0, 
+ "docstatus": 0, 
+ "doctype": "DocType", 
+ "document_type": "", 
+ "fields": [
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "company", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Company", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Company", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "fixed_asset_account", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Fixed Asset Account", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Account", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "accumulated_depreciation_account", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Accumulated Depreciation Account", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Account", 
+   "permlevel": 0, 
+   "precision": "", 
+   "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, 
+   "fieldname": "depreciation_expense_account", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Depreciation Expense Account", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Account", 
+   "permlevel": 0, 
+   "precision": "", 
+   "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
+  }
+ ], 
+ "hide_heading": 0, 
+ "hide_toolbar": 0, 
+ "idx": 0, 
+ "in_create": 0, 
+ "in_dialog": 0, 
+ "is_submittable": 0, 
+ "issingle": 0, 
+ "istable": 1, 
+ "max_attachments": 0, 
+ "modified": "2016-03-07 19:02:09.879979", 
+ "modified_by": "Administrator", 
+ "module": "Accounts", 
+ "name": "Asset Category Account", 
+ "name_case": "", 
+ "owner": "Administrator", 
+ "permissions": [], 
+ "read_only": 0, 
+ "read_only_onload": 0, 
+ "sort_field": "modified", 
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/asset_category_account/asset_category_account.py b/erpnext/accounts/doctype/asset_category_account/asset_category_account.py
new file mode 100644
index 0000000..67925f4
--- /dev/null
+++ b/erpnext/accounts/doctype/asset_category_account/asset_category_account.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class AssetCategoryAccount(Document):
+	pass
diff --git a/erpnext/accounts/doctype/depreciation_schedule/depreciation_schedule.json b/erpnext/accounts/doctype/depreciation_schedule/depreciation_schedule.json
index 89685cc..50fba88 100644
--- a/erpnext/accounts/doctype/depreciation_schedule/depreciation_schedule.json
+++ b/erpnext/accounts/doctype/depreciation_schedule/depreciation_schedule.json
@@ -13,21 +13,21 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "depreciation_date", 
+   "fieldname": "schedule_date", 
    "fieldtype": "Date", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
-   "label": "Depreciation Date", 
+   "label": "Schedule Date", 
    "length": 0, 
-   "no_copy": 0, 
+   "no_copy": 1, 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 0, 
+   "read_only": 1, 
    "report_hide": 0, 
    "reqd": 1, 
    "search_index": 0, 
@@ -47,6 +47,31 @@
    "in_list_view": 1, 
    "label": "Depreciation Amount", 
    "length": 0, 
+   "no_copy": 1, 
+   "options": "Company:company:default_currency", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "column_break_3", 
+   "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, 
    "precision": "", 
@@ -54,7 +79,7 @@
    "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
@@ -72,12 +97,13 @@
    "in_list_view": 1, 
    "label": "Accumulated Depreciation Amount", 
    "length": 0, 
-   "no_copy": 0, 
+   "no_copy": 1, 
+   "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 0, 
+   "read_only": 1, 
    "report_hide": 0, 
    "reqd": 1, 
    "search_index": 0, 
@@ -88,47 +114,22 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "posted", 
-   "fieldtype": "Check", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Posted", 
-   "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, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
    "fieldname": "journal_entry", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
-   "in_list_view": 0, 
+   "in_list_view": 1, 
    "label": "Journal Entry", 
    "length": 0, 
-   "no_copy": 0, 
+   "no_copy": 1, 
    "options": "Journal Entry", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 0, 
+   "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
    "search_index": 0, 
@@ -145,7 +146,7 @@
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2016-03-03 14:50:39.794061", 
+ "modified": "2016-03-09 12:21:27.938215", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Depreciation Schedule", 
diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
index 9277da5..28b57bd 100644
--- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
+++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
@@ -16,6 +16,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 1, 
    "label": "Account", 
@@ -44,6 +45,7 @@
    "fieldtype": "Data", 
    "hidden": 1, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Account Type", 
@@ -68,6 +70,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Account Balance", 
@@ -96,6 +99,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 0, 
    "label": "Cost Center", 
@@ -124,6 +128,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -146,6 +151,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Party Type", 
@@ -170,6 +176,7 @@
    "fieldtype": "Dynamic Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Party", 
@@ -194,6 +201,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Party Balance", 
@@ -221,6 +229,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Currency", 
@@ -245,6 +254,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Account Currency", 
@@ -270,6 +280,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -293,6 +304,7 @@
    "fieldtype": "Float", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Exchange Rate", 
@@ -317,6 +329,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Amount", 
@@ -340,6 +353,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Debit", 
@@ -365,6 +379,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Debit in Company Currency", 
@@ -392,6 +407,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -414,6 +430,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Credit", 
@@ -439,6 +456,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Credit in Company Currency", 
@@ -466,6 +484,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Reference", 
@@ -489,12 +508,13 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Reference Type", 
    "length": 0, 
    "no_copy": 0, 
-   "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim", 
+   "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim\nAsset", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -514,6 +534,7 @@
    "fieldtype": "Dynamic Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Reference Name", 
@@ -539,6 +560,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -561,6 +583,7 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Is Advance", 
@@ -587,6 +610,7 @@
    "fieldtype": "Text", 
    "hidden": 1, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Against Account", 
@@ -614,12 +638,13 @@
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-12-02 04:14:37.571883", 
+ "modified": "2016-03-07 19:10:27.135795", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Journal Entry Account", 
  "owner": "Administrator", 
  "permissions": [], 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "sort_order": "DESC"
 }
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index 8ab7651..0143a4f 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -210,6 +210,18 @@
 	}
 });
 
+cur_frm.set_query("asset", "items", function(doc, cdt, cdn) {
+	var d = locals[cdt][cdn];
+	return {
+		filters: {
+			'item_code': d.item_code,
+			'docstatus': 1,
+			'company': doc.company,
+			'status': 'Available'
+		}
+	}
+});
+
 cur_frm.cscript.expense_account = function(doc, cdt, cdn){
 	var d = locals[cdt][cdn];
 	if(d.idx == 1 && d.expense_account){
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 5edfcb9..06b2ece 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -253,19 +253,28 @@
 		self.update_project()
 		
 	def post_asset_depreciation(self):
-		from erpnext.accounts.doctype.asset.asset import depreciate_asset
 		for d in self.get("items"):
 			if frappe.db.get_value("Item", d.item_code, "is_fixed_asset"):
 				if not d.asset:
 					frappe.throw(_("Row #{0}: Asset is mandatory against a Fixed Asset Item").format(d.idx))
 				else:
 					asset = frappe.get_doc("Asset", d.asset)
-					if asset.start_depreciation_from_purchase_date:
-						for schedule in asset.get("schedules"):
-							if schedule.depreciation_date == asset.purchase_date:
-								depreciate_asset(asset.name, schedule.depreciation_amount, schedule.name)
-								break
-
+					self.validate_asset(asset, d)
+					
+					frappe.db.set_value("Asset", asset.name, "purchase_invoice", 
+						(self.name if self.docstatus==1 else None))
+							
+	def validate_asset(self, asset, item_row):
+		super(PurchaseInvoice, self).validate_asset(asset, item_row)
+		
+		if getdate(asset.purchase_date) != getdate(self.posting_date):
+			frappe.throw(_("Purchase Date of asset {0} does not match with Purchase Invoice date")
+				.format(item_row.asset))
+				
+		if asset.supplier != self.supplier:
+			frappe.throw(_("Supplier of asset {0} does not match with the supplier in the Purchase Invoice")
+				.format(item_row.asset))
+		
 	def make_gl_entries(self):
 		auto_accounting_for_stock = \
 			cint(frappe.defaults.get_global_default("auto_accounting_for_stock"))
@@ -432,6 +441,7 @@
 
 		self.make_gl_entries_on_cancel()
 		self.update_project()
+		self.post_asset_depreciation()
 
 	def update_project(self):
 		project_list = []
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 89af721..265e697 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -471,3 +471,15 @@
 		}
 	}
 });
+
+cur_frm.set_query("asset", "items", function(doc, cdt, cdn) {
+	var d = locals[cdt][cdn];
+	return {
+		filters: {
+			'item_code': d.item_code,
+			'docstatus': 1,
+			'company': doc.company,
+			'status': 'Available'
+		}
+	}
+});
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 7b97013..9758067 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -13,6 +13,7 @@
 from erpnext.controllers.selling_controller import SellingController
 from erpnext.accounts.utils import get_account_currency
 from erpnext.stock.doctype.delivery_note.delivery_note import update_billed_amount_based_on_so
+from erpnext.accounts.doctype.asset.depreciation import get_gl_entries_on_asset_disposal
 
 form_grid_templates = {
 	"items": "templates/form_grid/item_grid.html"
@@ -59,6 +60,7 @@
 		self.validate_advance_jv("Sales Order")
 		self.add_remarks()
 		self.validate_write_off_account()
+		self.set_income_account_for_fixed_assets()
 
 		if cint(self.is_pos):
 			self.validate_pos()
@@ -447,6 +449,17 @@
 				msgprint(_("POS Profile required to make POS Entry"), raise_exception=True)
 
 		return warehouse
+		
+	def set_income_account_for_fixed_assets(self):
+		disposal_account = None
+		for d in self.get("items"):
+			if frappe.db.get_value("Item", d.item_code, "is_fixed_asset"):
+				if not disposal_account:
+					disposal_account = frappe.db.get_value("Company", self.company, "disposal_account")
+					if not disposal_account:
+						frappe.throw(_("Please mention 'Gain/Loss Account on Asset Disposal' in Company"))
+				
+				d.income_account = disposal_account
 
 	def on_update(self):
 		if cint(self.is_pos) == 1:
@@ -557,17 +570,31 @@
 		# income account gl entries
 		for item in self.get("items"):
 			if flt(item.base_net_amount):
-				account_currency = get_account_currency(item.income_account)
-				gl_entries.append(
-					self.get_gl_dict({
-						"account": item.income_account,
-						"against": self.customer,
-						"credit": item.base_net_amount,
-						"credit_in_account_currency": item.base_net_amount \
-							if account_currency==self.company_currency else item.net_amount,
-						"cost_center": item.cost_center
-					}, account_currency)
-				)
+				if frappe.db.get_value("Item", item.item_code, "is_fixed_asset"):
+					if not item.asset:
+						frappe.throw(_("Row #{0}: Asset is mandatory against a Fixed Asset Item")
+							.format(item.idx))
+					else:
+						asset = frappe.get_doc("Asset", item.asset)
+						self.validate_asset(asset, item)
+					
+						fixed_asset_gl_entries = get_gl_entries_on_asset_disposal(asset, item.base_net_amount)
+						for gle in fixed_asset_gl_entries:
+							gl_entries.append(self.get_gl_dict(gle))
+						
+						frappe.db.set_value("Asset", asset.name, "status", "Sold")
+				else:
+					account_currency = get_account_currency(item.income_account)
+					gl_entries.append(
+						self.get_gl_dict({
+							"account": item.income_account,
+							"against": self.customer,
+							"credit": item.base_net_amount,
+							"credit_in_account_currency": item.base_net_amount \
+								if account_currency==self.company_currency else item.net_amount,
+							"cost_center": item.cost_center
+						}, account_currency)
+					)
 
 		# expense account gl entries
 		if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) \
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index e14f0da..3ab22c5 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -458,7 +458,20 @@
 				# Note: not validating with gle account because we don't have the account
 				# at quotation / sales order level and we shouldn't stop someone
 				# from creating a sales invoice if sales order is already created
-
+				
+	def validate_asset(self, asset, item_row):
+		if asset.company != self.company:
+			frappe.throw(_("Row #{0}: Asset {1} does not belong to company {2}")
+				.format(item_row.idx, item_row.asset, self.company))
+				
+		elif asset.item_code != item_row.item_code:
+			frappe.throw(_("Row #{0}: Asset {1} does not linked to Item {2}")
+				.format(item_row.idx, item_row.asset, item_row.item_code))
+		elif asset.docstatus != 1:
+			frappe.throw(_("Row #{0}: Asset {1} must be submitted").format(item_row.idx, item_row.asset))
+		elif item_row.qty > 1:
+			frappe.throw(_("Row #{0}: Qty must be 1, as item is linked to an asset").format(item_row.idx))
+						
 @frappe.whitelist()
 def get_tax_rate(account_head):
 	return frappe.db.get_value("Account", account_head, "tax_rate")
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 0ccc82a..56c0d16 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -137,7 +137,8 @@
 		"erpnext.support.doctype.issue.issue.auto_close_tickets",
 		"erpnext.accounts.doctype.fiscal_year.fiscal_year.auto_create_fiscal_year",
 		"erpnext.hr.doctype.employee.employee.send_birthday_reminders",
-		"erpnext.projects.doctype.task.task.set_tasks_as_overdue"
+		"erpnext.projects.doctype.task.task.set_tasks_as_overdue",
+		"erpnext.accounts.doctype.asset.depreciation.post_depreciation_entries"
 	]
 }
 
diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js
index 01a2d1d..777fe1e 100644
--- a/erpnext/setup/doctype/company/company.js
+++ b/erpnext/setup/doctype/company/company.js
@@ -136,8 +136,12 @@
 		["default_expense_account", {"root_type": "Expense"}],
 		["default_income_account", {"root_type": "Income"}],
 		["round_off_account", {"root_type": "Expense"}],
+		["accumulated_depreciation_account", {"root_type": "Asset"}],
+		["depreciation_expense_account", {"root_type": "Expense"}],
+		["disposal_account", {"report_type": "Profit and Loss"}],
 		["cost_center", {}],
-		["round_off_cost_center", {}]
+		["round_off_cost_center", {}],
+		["disposal_cost_center", {}]
 	], function(i, v) {
 		erpnext.company.set_custom_query(frm, v);
 	});
diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json
index 3de72fd..95b17c4 100644
--- a/erpnext/setup/doctype/company/company.json
+++ b/erpnext/setup/doctype/company/company.json
@@ -253,12 +253,11 @@
    "no_copy": 0, 
    "options": "Terms and Conditions", 
    "permlevel": 0, 
-   "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
-   "reqd": 0, 
+   "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
    "unique": 0
@@ -990,18 +989,17 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "default": "Straight Line", 
-   "fieldname": "depreciation_method", 
-   "fieldtype": "Select", 
+   "fieldname": "accumulated_depreciation_account", 
+   "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Depreciation Method", 
+   "label": "Accumulated Depreciation Account", 
    "length": 0, 
-   "no_copy": 0, 
-   "options": "Straight Line\nDouble Declining Balance", 
+   "no_copy": 1, 
+   "options": "Account", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -1017,16 +1015,16 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "accumulated_depreciation_account", 
+   "fieldname": "depreciation_expense_account", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Accumulated Depreciation Account", 
+   "label": "Depreciation Expense Account", 
    "length": 0, 
-   "no_copy": 0, 
+   "no_copy": 1, 
    "options": "Account", 
    "permlevel": 0, 
    "precision": "", 
@@ -1067,16 +1065,16 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "depreciation_expense_account", 
+   "fieldname": "disposal_account", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Depreciation Expense Account", 
+   "label": "Gain/Loss Account on Asset Disposal", 
    "length": 0, 
-   "no_copy": 0, 
+   "no_copy": 1, 
    "options": "Account", 
    "permlevel": 0, 
    "precision": "", 
@@ -1093,17 +1091,17 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "gain_loss_account", 
+   "fieldname": "disposal_cost_center", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Gain/Loss Account on Asset Sale/Disposal", 
+   "label": "Asset Disposal Cost Center", 
    "length": 0, 
-   "no_copy": 0, 
-   "options": "Account", 
+   "no_copy": 1, 
+   "options": "Cost Center", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -1389,7 +1387,7 @@
  "istable": 0, 
  "max_attachments": 0, 
  "menu_index": 0, 
- "modified": "2016-03-08 20:21:46.331870", 
+ "modified": "2016-03-09 12:06:12.189968", 
  "modified_by": "Administrator", 
  "module": "Setup", 
  "name": "Company", 
diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json
index e628d0d..99afe33 100644
--- a/erpnext/stock/doctype/item/item.json
+++ b/erpnext/stock/doctype/item/item.json
@@ -255,6 +255,36 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "default": "", 
+   "depends_on": "", 
+   "description": "", 
+   "fieldname": "is_fixed_asset", 
+   "fieldtype": "Check", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Is Fixed Asset", 
+   "length": 0, 
+   "no_copy": 0, 
+   "oldfieldname": "is_asset_item", 
+   "oldfieldtype": "Select", 
+   "options": "", 
+   "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, 
    "fieldname": "disabled", 
    "fieldtype": "Check", 
    "hidden": 0, 
@@ -604,36 +634,6 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "default": "", 
-   "depends_on": "eval:doc.is_stock_item", 
-   "description": "", 
-   "fieldname": "is_fixed_asset", 
-   "fieldtype": "Check", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Is Fixed Asset", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "is_asset_item", 
-   "oldfieldtype": "Select", 
-   "options": "", 
-   "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": "is_stock_item", 
    "fieldname": "column_break1", 
    "fieldtype": "Column Break", 
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 39ef7e2..cc8886b 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -80,10 +80,12 @@
 		self.validate_variant_attributes()
 		self.validate_website_image()
 		self.make_thumbnail()
+		self.validate_fixed_asset_item()
 
 		if not self.get("__islocal"):
 			self.old_item_group = frappe.db.get_value(self.doctype, self.name, "item_group")
-			self.old_website_item_groups = frappe.db.sql_list("""select item_group from `tabWebsite Item Group`
+			self.old_website_item_groups = frappe.db.sql_list("""select item_group 
+				from `tabWebsite Item Group`
 				where parentfield='website_item_groups' and parenttype='Item' and parent=%s""", self.name)
 
 	def on_update(self):
@@ -566,6 +568,10 @@
 			if variant:
 				frappe.throw(_("Item variant {0} exists with same attributes")
 					.format(variant), ItemVariantExistsError)
+					
+	def validate_fixed_asset_item(self):
+		if self.is_fixed_asset and self.is_stock_item:
+			frappe.throw(_("Fixed Asset Item must be a non-stock item"))
 
 def validate_end_of_life(item_code, end_of_life=None, disabled=None, verbose=1):
 	if (not end_of_life) or (disabled is None):