Merge pull request #3143 from frappe/fix-travis

Update .travis.yml
diff --git a/erpnext/accounts/doctype/account/account.js b/erpnext/accounts/doctype/account/account.js
index 71acd62..a2eb714 100644
--- a/erpnext/accounts/doctype/account/account.js
+++ b/erpnext/accounts/doctype/account/account.js
@@ -12,12 +12,12 @@
 	cur_frm.toggle_display('account_name', doc.__islocal);
 
 	// hide fields if group
-	cur_frm.toggle_display(['account_type', 'tax_rate'], doc.group_or_ledger=='Ledger')
+	cur_frm.toggle_display(['account_type', 'tax_rate'], cint(doc.is_group)==0)
 
 	// disable fields
-	cur_frm.toggle_enable(['account_name', 'group_or_ledger', 'company'], false);
+	cur_frm.toggle_enable(['account_name', 'is_group', 'company'], false);
 
-	if(doc.group_or_ledger=='Ledger') {
+	if(cint(doc.is_group)==0) {
 		cur_frm.toggle_display('freeze_account', doc.__onload && doc.__onload.can_freeze_account);
 	}
 
@@ -40,7 +40,7 @@
 cur_frm.add_fetch('parent_account', 'root_type', 'root_type');
 
 cur_frm.cscript.account_type = function(doc, cdt, cdn) {
-	if(doc.group_or_ledger=='Ledger') {
+	if(doc.is_group==0) {
 		cur_frm.toggle_display(['tax_rate'], doc.account_type == 'Tax');
 		cur_frm.toggle_display('warehouse', doc.account_type=='Warehouse');
 	}
@@ -50,10 +50,10 @@
 	cur_frm.add_custom_button(__('Chart of Accounts'),
 		function() { frappe.set_route("Accounts Browser", "Account"); }, 'icon-sitemap')
 
-	if (cstr(doc.group_or_ledger) == 'Group') {
-		cur_frm.add_custom_button(__('Convert to Ledger'),
+	if (doc.is_group == 1) {
+		cur_frm.add_custom_button(__('Convert to non-Group'),
 			function() { cur_frm.cscript.convert_to_ledger(); }, 'icon-retweet', 'btn-default');
-	} else if (cstr(doc.group_or_ledger) == 'Ledger') {
+	} else if (cint(doc.is_group) == 0) {
 		cur_frm.add_custom_button(__('View Ledger'), function() {
 			frappe.route_options = {
 				"account": doc.name,
@@ -88,7 +88,7 @@
 cur_frm.fields_dict['parent_account'].get_query = function(doc) {
 	return {
 		filters: {
-			"group_or_ledger": "Group",
+			"is_group": 1,
 			"company": doc.company
 		}
 	}
diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json
index 4862962..77eaf65 100644
--- a/erpnext/accounts/doctype/account/account.json
+++ b/erpnext/accounts/doctype/account/account.json
@@ -38,18 +38,12 @@
    "search_index": 1
   }, 
   {
-   "default": "Ledger", 
-   "fieldname": "group_or_ledger", 
-   "fieldtype": "Select", 
-   "in_filter": 1, 
-   "in_list_view": 1, 
-   "label": "Group or Ledger", 
-   "oldfieldname": "group_or_ledger", 
-   "oldfieldtype": "Select", 
-   "options": "\nLedger\nGroup", 
+   "default": "0", 
+   "fieldname": "is_group", 
+   "fieldtype": "Check", 
+   "label": "Is Group", 
    "permlevel": 0, 
-   "read_only": 1, 
-   "reqd": 1, 
+   "precision": "", 
    "search_index": 1
   }, 
   {
@@ -107,7 +101,7 @@
    "label": "Account Type", 
    "oldfieldname": "account_type", 
    "oldfieldtype": "Select", 
-   "options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment\nStock", 
+   "options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment\nStock\nTemporary", 
    "permlevel": 0, 
    "search_index": 0
   }, 
@@ -177,7 +171,7 @@
  "icon": "icon-money", 
  "idx": 1, 
  "in_create": 0, 
- "modified": "2015-02-20 05:09:22.108350", 
+ "modified": "2015-04-27 20:07:37.147184", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Account", 
@@ -261,5 +255,5 @@
    "write": 1
   }
  ], 
- "search_fields": "group_or_ledger"
+ "search_fields": "is_group"
 }
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 23fa656..683734b 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -13,7 +13,7 @@
 	def onload(self):
 		frozen_accounts_modifier = frappe.db.get_value("Accounts Settings", "Accounts Settings",
 			"frozen_accounts_modifier")
-		if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.user.get_roles():
+		if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.get_roles():
 			self.get("__onload").can_freeze_account = True
 
 	def autoname(self):
@@ -32,12 +32,12 @@
 		"""Fetch Parent Details and validate parent account"""
 		if self.parent_account:
 			par = frappe.db.get_value("Account", self.parent_account,
-				["name", "group_or_ledger", "report_type", "root_type", "company"], as_dict=1)
+				["name", "is_group", "report_type", "root_type", "company"], as_dict=1)
 			if not par:
 				throw(_("Account {0}: Parent account {1} does not exist").format(self.name, self.parent_account))
 			elif par.name == self.name:
 				throw(_("Account {0}: You can not assign itself as parent account").format(self.name))
-			elif par.group_or_ledger != 'Group':
+			elif not par.is_group:
 				throw(_("Account {0}: Parent account {1} can not be a ledger").format(self.name, self.parent_account))
 			elif par.company != self.company:
 				throw(_("Account {0}: Parent account {1} does not belong to company: {2}")
@@ -59,7 +59,7 @@
 		if old_value and old_value != self.freeze_account:
 			frozen_accounts_modifier = frappe.db.get_value('Accounts Settings', None, 'frozen_accounts_modifier')
 			if not frozen_accounts_modifier or \
-				frozen_accounts_modifier not in frappe.user.get_roles():
+				frozen_accounts_modifier not in frappe.get_roles():
 					throw(_("You are not authorized to set Frozen value"))
 
 	def validate_balance_must_be_debit_or_credit(self):
@@ -78,7 +78,7 @@
 		elif self.check_gle_exists():
 			throw(_("Account with existing transaction cannot be converted to ledger"))
 		else:
-			self.group_or_ledger = 'Ledger'
+			self.is_group = 0
 			self.save()
 			return 1
 
@@ -88,7 +88,7 @@
 		elif self.account_type:
 			throw(_("Cannot covert to Group because Account Type is selected."))
 		else:
-			self.group_or_ledger = 'Group'
+			self.is_group = 1
 			self.save()
 			return 1
 
@@ -160,10 +160,10 @@
 				throw(_("Account {0} does not exist").format(new))
 
 			val = list(frappe.db.get_value("Account", new_account,
-				["group_or_ledger", "root_type", "company"]))
+				["is_group", "root_type", "company"]))
 
-			if val != [self.group_or_ledger, self.root_type, self.company]:
-				throw(_("""Merging is only possible if following properties are same in both records. Group or Ledger, Root Type, Company"""))
+			if val != [self.is_group, self.root_type, self.company]:
+				throw(_("""Merging is only possible if following properties are same in both records. Is Group, Root Type, Company"""))
 
 		return new_account
 
@@ -177,7 +177,7 @@
 
 def get_parent_account(doctype, txt, searchfield, start, page_len, filters):
 	return frappe.db.sql("""select name from tabAccount
-		where group_or_ledger = 'Group' and docstatus != 2 and company = %s
+		where is_group = 1 and docstatus != 2 and company = %s
 		and %s like %s order by name limit %s, %s""" %
 		("%s", searchfield, "%s", "%s", "%s"),
 		(filters["company"], "%%%s%%" % txt, start, page_len), as_list=1)
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
index a27d739..7729d22 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
@@ -13,18 +13,18 @@
 		accounts = []
 
 		def _import_accounts(children, parent, root_type, root_account=False):
-			for account_name, children in children.items():
+			for account_name, child in children.items():
 				if root_account:
-					root_type = children.get("root_type")
+					root_type = child.get("root_type")
 
-				if account_name not in ["account_type", "root_type", "group_or_ledger"]:
+				if account_name not in ["account_type", "root_type", "is_group"]:
 
 					account_name_in_db = unidecode(account_name.strip().lower())
 					if account_name_in_db in accounts:
 						count = accounts.count(account_name_in_db)
 						account_name = account_name + " " + cstr(count)
 
-					group_or_ledger = identify_group_or_ledger(children)
+					is_group = identify_is_group(child)
 					report_type = "Balance Sheet" if root_type in ["Asset", "Liability", "Equity"] \
 						else "Profit and Loss"
 
@@ -33,10 +33,10 @@
 						"account_name": account_name,
 						"company": company,
 						"parent_account": parent,
-						"group_or_ledger": group_or_ledger,
+						"is_group": is_group,
 						"root_type": root_type,
 						"report_type": report_type,
-						"account_type": children.get("account_type")
+						"account_type": child.get("account_type")
 					})
 
 					if root_account:
@@ -46,19 +46,19 @@
 
 					accounts.append(account_name_in_db)
 
-					_import_accounts(children, account.name, root_type)
+					_import_accounts(child, account.name, root_type)
 
 		_import_accounts(chart, None, None, root_account=True)
 
-def identify_group_or_ledger(children):
-	if children.get("group_or_ledger"):
-		group_or_ledger = children.get("group_or_ledger")
-	elif len(set(children.keys()) - set(["account_type", "root_type", "group_or_ledger"])):
-		group_or_ledger = "Group"
+def identify_is_group(child):
+	if child.get("is_group"):
+		is_group = child.get("is_group")
+	elif len(set(child.keys()) - set(["account_type", "root_type", "is_group"])):
+		is_group = 1
 	else:
-		group_or_ledger = "Ledger"
+		is_group = 0
 
-	return group_or_ledger
+	return is_group
 
 def get_chart(chart_name):
 	chart = {}
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json
index 58c4548..1ba0931 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json
@@ -85,7 +85,7 @@
                     },
                     "Stock in Hand": {
 		                "account_type": "Stock",
-						"group_or_ledger": "Group"
+						"is_group": 1
                     }
                 },
                 "Perliminary and Preoperating Expenses": {
@@ -326,7 +326,7 @@
 			    },
 				"Duties and Taxes": {
 					"account_type": "Tax",
-					"group_or_ledger": "Group"
+					"is_group": 1
 				},
                 "Accruals & Provisions": {
                     "Accruals": {
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json
index 84e734a..254e2b7 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json
@@ -12,7 +12,7 @@
 	            },
 	            "Bank Accounts": {
 	                "account_type": "Bank",
-					"group_or_ledger": "Group"
+					"is_group": 1
 	            },
 	            "Cash In Hand": {
 	                "Cash": {
@@ -21,17 +21,17 @@
 	                "account_type": "Cash"
 	            },
 	            "Loans and Advances (Assets)": {
-	            	"group_or_ledger": "Group"
+	            	"is_group": 1
 	            },
 	            "Securities and Deposits": {
 	                "Earnest Money": {}
 	            },
 	            "Stock Assets": {
 	                "account_type": "Stock",
-					"group_or_ledger": "Group"
+					"is_group": 1
 	            },
 	            "Tax Assets": {
-					"group_or_ledger": "Group"
+					"is_group": 1
 				}
 	        },
 	        "Fixed Assets": {
@@ -52,10 +52,12 @@
 	            }
 	        },
 	        "Investments": {
-	        	"group_or_ledger": "Group"
+	        	"is_group": 1
 	        },
-	        "Temporary Accounts (Assets)": {
-	            "Temporary Assets": {}
+	        "Temporary Accounts": {
+	            "Temporary Opening": {
+	            	"account_type": "Temporary"
+	            }
 	        },
 			"root_type": "Asset"
 	    },
@@ -146,7 +148,7 @@
 	        },
 	        "Indirect Income": {
 	            "account_type": "Income Account",
-				"group_or_ledger": "Group"
+				"is_group": 1
 	        },
 			"root_type": "Income"
 	    },
@@ -168,7 +170,7 @@
 			    },
 				"Duties and Taxes": {
 					"account_type": "Tax",
-					"group_or_ledger": "Group"
+					"is_group": 1
 				},
 				"Loans (Liabilities)": {
 					"Secured Loans": {},
@@ -176,10 +178,7 @@
 					"Bank Overdraft Account": {}
 				}
 	        },
-	        "Temporary Accounts (Liabilities)": {
-	            "Temporary Liabilities": {}
-	        },
 			"root_type": "Liability"
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ni_ni_chart_template.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ni_ni_chart_template.json
index 6db540a..eafc309 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ni_ni_chart_template.json
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ni_ni_chart_template.json
@@ -32,7 +32,7 @@
 						}
 					},
 					"Otros Equivalentes a Efectivo": {
-						"group_or_ledger": "Group",
+						"is_group": 1,
 						"account_type": "Cash"
 					}
 				},
@@ -61,7 +61,7 @@
 					"Estimacion para Cuentas Incobrables": {}
 				},
 				"Inventarios": {
-					"group_or_ledger": "Group",
+					"is_group": 1,
 					"account_type": "Stock"
 				},
 				"Impuestos Acreditables": {
@@ -90,7 +90,7 @@
 					"Retenciones Definitivas Sobre Rentas o Ganancias de Capital": {}
 				},
 				"Otras Cuentas por Cobrar": {
-					"group_or_ledger": "Group",
+					"is_group": 1,
 					"account_type": "Receivable"
 				}
 			},
@@ -110,11 +110,11 @@
 				},
 				"Inversiones Permanentes": {
 					"Inversiones Permanentes": {
-						"group_or_ledger": "Group",
+						"is_group": 1,
 						"account_type": "Fixed Asset"
 					},
 					"Negocios Conjuntos": {
-						"group_or_ledger": "Group",
+						"is_group": 1,
 						"account_type": "Fixed Asset"
 					}
 				},
@@ -124,25 +124,25 @@
 				},
 				"Activos Intangibles": {
 					"Patentes": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Marcas Registradas": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Derechos de Autor": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Concesiones": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Licencias": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Gastos de investigacion": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Amortizacion de Activos Intangibles": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Deterioro de Valor de Activos Intangibles": {}
 				},
@@ -150,29 +150,29 @@
 					"Gastos de Consitucion": {},
 					"Gastos Pre Operativos": {},
 					"Mejoras en Bienes Arrendados": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Amortizacion de Activos Amortizables": {},
 					"Deterioro de Valaor de Activos Amortizables": {}
 				},
 				"Cuentas por Cobrar a Largo Plazo": {
 					"Creditos a Largo Plazo": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					}
 				},
 				"Inversiones a Largo Plazo": {
 					"Depositos Bancarios a Plazo": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Intereses percibidos por adelantado": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Titulos y Acciones": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					}
 				},
 				"Activo por Impuestos Diferidos": {
-					"group_or_ledger": "Group"
+					"is_group": 1
 				}
 			},
 			"root_type": "Asset"
@@ -199,21 +199,21 @@
 				"Anticipos de Clientes": {},
 				"Pasivos Financieros a Corto Plazo": {
 					"Prestamos por Pagar a Corto Plazo": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Sobregiros Bancarios": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Otras Deudas Bancarias": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					}
 				},
 				"Gastos por Pagar": {
 					"Servicios Basicos": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Prestaciones Sociales": {
-						"group_or_ledger": "Group"
+						"is_group": 1
 					},
 					"Salarios por Pagar": {}
 				},
@@ -287,28 +287,28 @@
 					}
 				},
 				"Otras Cuentas por Pagar": {
-					"group_or_ledger": "Group"
+					"is_group": 1
 				}
 			},
 			"Pasivo No Corriente": {
 				"Prestamos a Largo Plazo": {
-					"group_or_ledger": "Group"
+					"is_group": 1
 				},
 				"Cuentas por Pagar a Largo Plaso": {
-					"group_or_ledger": "Group"
+					"is_group": 1
 				},
 				"Otras Cuentas por Pagar a Largo Plazo": {
-					"group_or_ledger": "Group"
+					"is_group": 1
 				},
 				"Otros Pasivos Financieros a Largo Plaso": {
-					"group_or_ledger": "Group"
+					"is_group": 1
 				}
 			},
 			"Obligaciones por Arrendamiento Financiero a Largo Plazo": {
-				"group_or_ledger": "Group"
+				"is_group": 1
 			},
 			"Pasivo por Impuestos Diferidos": {
-				"group_or_ledger": "Group"
+				"is_group": 1
 			},
 			"root_type": "Liability"
 		},
@@ -324,7 +324,7 @@
 				}
 			},
 			"Donaciones": {
-				"group_or_ledger": "Group"
+				"is_group": 1
 			},
 			"Ganancias Acumuladas": {
 				"Reservas": {
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
index 7236631..dd3c067 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
@@ -15,7 +15,7 @@
 	            },
 	            _("Bank Accounts"): {
 	                "account_type": "Bank",
-					"group_or_ledger": "Group"
+					"is_group": 1
 	            },
 	            _("Cash In Hand"): {
 	                _("Cash"): {
@@ -24,17 +24,17 @@
 	                "account_type": "Cash"
 	            },
 	            _("Loans and Advances (Assets)"): {
-	            	"group_or_ledger": "Group"
+	            	"is_group": 1
 	            },
 	            _("Securities and Deposits"): {
 	                _("Earnest Money"): {}
 	            },
 	            _("Stock Assets"): {
 	                "account_type": "Stock",
-					"group_or_ledger": "Group"
+					"is_group": 1
 	            },
 	            _("Tax Assets"): {
-					"group_or_ledger": "Group"
+					"is_group": 1
 				}
 	        },
 	        _("Fixed Assets"): {
@@ -55,10 +55,12 @@
 	            }
 	        },
 	        _("Investments"): {
-	        	"group_or_ledger": "Group"
+	        	"is_group": 1
 	        },
-	        _("Temporary Accounts (Assets)"): {
-	            _("Temporary Assets"): {}
+	        _("Temporary Accounts"): {
+	            _("Temporary Opening"): {
+	            	"account_type": "Temporary"
+	            }
 	        },
 			"root_type": "Asset"
 	    },
@@ -149,7 +151,7 @@
 	        },
 	        _("Indirect Income"): {
 	            "account_type": "Income Account",
-				"group_or_ledger": "Group"
+				"is_group": 1
 	        },
 			"root_type": "Income"
 	    },
@@ -167,7 +169,7 @@
 			    },
 				_("Duties and Taxes"): {
 					"account_type": "Tax",
-					"group_or_ledger": "Group"
+					"is_group": 1
 				},
 				_("Loans (Liabilities)"): {
 					_("Secured Loans"): {},
@@ -175,9 +177,6 @@
 					_("Bank Overdraft Account"): {},
 				},
 	        },
-	        _("Temporary Accounts (Liabilities)"): {
-	            _("Temporary Liabilities"): {}
-	        },
 			"root_type": "Liability"
 	    },
 		_("Equity"): {
diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py
index 985b884..2a3feda 100644
--- a/erpnext/accounts/doctype/account/test_account.py
+++ b/erpnext/accounts/doctype/account/test_account.py
@@ -8,37 +8,37 @@
 	from frappe.test_runner import make_test_objects
 
 	accounts = [
-		# [account_name, parent_account, group_or_ledger]
-		["_Test Account Bank Account", "Bank Accounts", "Ledger", "Bank"],
+		# [account_name, parent_account, is_group]
+		["_Test Account Bank Account", "Bank Accounts", 0, "Bank"],
 
-		["_Test Account Stock Expenses", "Direct Expenses", "Group", None],
-		["_Test Account Shipping Charges", "_Test Account Stock Expenses", "Ledger", "Chargeable"],
-		["_Test Account Customs Duty", "_Test Account Stock Expenses", "Ledger", "Tax"],
-		["_Test Account Insurance Charges", "_Test Account Stock Expenses", "Ledger", "Chargeable"],
-		["_Test Account Stock Adjustment", "_Test Account Stock Expenses", "Ledger", "Stock Adjustment"],
+		["_Test Account Stock Expenses", "Direct Expenses", 1, None],
+		["_Test Account Shipping Charges", "_Test Account Stock Expenses", 0, "Chargeable"],
+		["_Test Account Customs Duty", "_Test Account Stock Expenses", 0, "Tax"],
+		["_Test Account Insurance Charges", "_Test Account Stock Expenses", 0, "Chargeable"],
+		["_Test Account Stock Adjustment", "_Test Account Stock Expenses", 0, "Stock Adjustment"],
 
 
-		["_Test Account Tax Assets", "Current Assets", "Group", None],
-		["_Test Account VAT", "_Test Account Tax Assets", "Ledger", "Tax"],
-		["_Test Account Service Tax", "_Test Account Tax Assets", "Ledger", "Tax"],
+		["_Test Account Tax Assets", "Current Assets", 1, None],
+		["_Test Account VAT", "_Test Account Tax Assets", 0, "Tax"],
+		["_Test Account Service Tax", "_Test Account Tax Assets", 0, "Tax"],
 
-		["_Test Account Reserves and Surplus", "Current Liabilities", "Ledger", None],
+		["_Test Account Reserves and Surplus", "Current Liabilities", 0, None],
 
-		["_Test Account Cost for Goods Sold", "Expenses", "Ledger", None],
-		["_Test Account Excise Duty", "_Test Account Tax Assets", "Ledger", "Tax"],
-		["_Test Account Education Cess", "_Test Account Tax Assets", "Ledger", "Tax"],
-		["_Test Account S&H Education Cess", "_Test Account Tax Assets", "Ledger", "Tax"],
-		["_Test Account CST", "Direct Expenses", "Ledger", "Tax"],
-		["_Test Account Discount", "Direct Expenses", "Ledger", None],
-		["_Test Write Off", "Indirect Expenses", "Ledger", None],
+		["_Test Account Cost for Goods Sold", "Expenses", 0, None],
+		["_Test Account Excise Duty", "_Test Account Tax Assets", 0, "Tax"],
+		["_Test Account Education Cess", "_Test Account Tax Assets", 0, "Tax"],
+		["_Test Account S&H Education Cess", "_Test Account Tax Assets", 0, "Tax"],
+		["_Test Account CST", "Direct Expenses", 0, "Tax"],
+		["_Test Account Discount", "Direct Expenses", 0, None],
+		["_Test Write Off", "Indirect Expenses", 0, None],
 
 		# related to Account Inventory Integration
-		["_Test Account Stock In Hand", "Current Assets", "Ledger", None],
-		["_Test Account Fixed Assets", "Current Assets", "Ledger", None],
+		["_Test Account Stock In Hand", "Current Assets", 0, None],
+		["_Test Account Fixed Assets", "Current Assets", 0, None],
 
 		# Receivable / Payable Account
-		["_Test Receivable", "Current Assets", "Ledger", "Receivable"],
-		["_Test Payable", "Current Liabilities", "Ledger", "Payable"],
+		["_Test Receivable", "Current Assets", 0, "Receivable"],
+		["_Test Payable", "Current Liabilities", 0, "Payable"],
 	]
 
 	for company, abbr in [["_Test Company", "_TC"], ["_Test Company 1", "_TC1"]]:
@@ -47,8 +47,8 @@
 				"account_name": account_name,
 				"parent_account": parent_account + " - " + abbr,
 				"company": company,
-				"group_or_ledger": group_or_ledger,
+				"is_group": is_group,
 				"account_type": account_type
-			} for account_name, parent_account, group_or_ledger, account_type in accounts])
+			} for account_name, parent_account, is_group, account_type in accounts])
 
 	return test_objects
diff --git a/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.js b/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.js
index 96f9007..c39550b 100644
--- a/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.js
+++ b/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.js
@@ -26,7 +26,7 @@
 		return {
 			"filters": {
 				"account_type": "Bank",
-				"group_or_ledger": "Ledger"
+				"is_group": 0
 			}
 		};
 	});
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.js b/erpnext/accounts/doctype/cost_center/cost_center.js
index 1b4451f..6946bcb 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.js
+++ b/erpnext/accounts/doctype/cost_center/cost_center.js
@@ -18,7 +18,7 @@
 					filters:[
 						['Account', 'company', '=', me.frm.doc.company],
 						['Account', 'report_type', '=', 'Profit and Loss'],
-						['Account', 'group_or_ledger', '=', 'Ledger'],
+						['Account', 'is_group', '=', '0'],
 					]
 				}
 			});
@@ -27,7 +27,7 @@
 		this.frm.set_query("parent_cost_center", function() {
 			return {
 				filters:[
-					['Cost Center', 'group_or_ledger', '=', 'Group'],
+					['Cost Center', 'is_group', '=', '1'],
 					['Cost Center', 'company', '=', me.frm.doc.company],
 				]
 			}
@@ -40,15 +40,15 @@
 cur_frm.cscript.refresh = function(doc, cdt, cdn) {
 	var intro_txt = '';
 	cur_frm.toggle_display('cost_center_name', doc.__islocal);
-	cur_frm.toggle_enable(['group_or_ledger', 'company'], doc.__islocal);
+	cur_frm.toggle_enable(['is_group', 'company'], doc.__islocal);
 
-	if(!doc.__islocal && doc.group_or_ledger=='Group') {
+	if(!doc.__islocal && doc.is_group==1) {
 		intro_txt += __('Note: This Cost Center is a Group. Cannot make accounting entries against groups.');
 	}
 
 	cur_frm.cscript.hide_unhide_group_ledger(doc);
 
-	cur_frm.toggle_display('sb1', doc.group_or_ledger=='Ledger')
+	cur_frm.toggle_display('sb1', doc.is_group==0)
 	cur_frm.set_intro(intro_txt);
 
 	cur_frm.add_custom_button(__('Chart of Cost Centers'),
@@ -62,11 +62,11 @@
 }
 
 cur_frm.cscript.hide_unhide_group_ledger = function(doc) {
-	if (cstr(doc.group_or_ledger) == 'Group') {
-		cur_frm.add_custom_button(__('Convert to Ledger'),
+	if (doc.is_group == 1) {
+		cur_frm.add_custom_button(__('Convert to non-Group'),
 			function() { cur_frm.cscript.convert_to_ledger(); }, 'icon-retweet',
 				"btn-default")
-	} else if (cstr(doc.group_or_ledger) == 'Ledger') {
+	} else if (doc.is_group == 0) {
 		cur_frm.add_custom_button(__('Convert to Group'),
 			function() { cur_frm.cscript.convert_to_group(); }, 'icon-retweet',
 				"btn-default")
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.json b/erpnext/accounts/doctype/cost_center/cost_center.json
index b37fa96..409f59c 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.json
+++ b/erpnext/accounts/doctype/cost_center/cost_center.json
@@ -58,18 +58,12 @@
    "width": "50%"
   }, 
   {
-   "fieldname": "group_or_ledger", 
-   "fieldtype": "Select", 
-   "hidden": 0, 
-   "label": "Group or Ledger", 
-   "no_copy": 1, 
-   "oldfieldname": "group_or_ledger", 
-   "oldfieldtype": "Select", 
-   "options": "\nGroup\nLedger", 
+   "default": "0", 
+   "fieldname": "is_group", 
+   "fieldtype": "Check", 
+   "label": "Is Group", 
    "permlevel": 0, 
-   "print_hide": 1, 
-   "report_hide": 1, 
-   "reqd": 1
+   "precision": ""
   }, 
   {
    "description": "Define Budget for this Cost Center. To set budget action, see <a href=\"#!List/Company\">Company Master</a>", 
@@ -145,7 +139,7 @@
  "icon": "icon-money", 
  "idx": 1, 
  "in_create": 0, 
- "modified": "2015-02-20 05:07:59.251051", 
+ "modified": "2015-04-23 02:54:26.934607", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Cost Center", 
@@ -198,5 +192,5 @@
    "role": "Material User"
   }
  ], 
- "search_fields": "parent_cost_center"
+ "search_fields": "parent_cost_center, is_group"
 }
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py
index b6cc503..f26c80b 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.py
+++ b/erpnext/accounts/doctype/cost_center/cost_center.py
@@ -16,9 +16,6 @@
 			frappe.db.get_value("Company", self.company, "abbr")
 
 	def validate_mandatory(self):
-		if not self.group_or_ledger:
-			msgprint(_("Please select Group or Ledger value"), raise_exception=1)
-
 		if self.cost_center_name != self.company and not self.parent_cost_center:
 			msgprint(_("Please enter parent cost center"), raise_exception=1)
 		elif self.cost_center_name == self.company and self.parent_cost_center:
@@ -30,7 +27,7 @@
 		elif self.check_gle_exists():
 			msgprint(_("Cost Center with existing transactions can not be converted to ledger"), raise_exception=1)
 		else:
-			self.group_or_ledger = 'Ledger'
+			self.is_group = 0
 			self.save()
 			return 1
 
@@ -38,7 +35,7 @@
 		if self.check_gle_exists():
 			msgprint(_("Cost Center with existing transactions can not be converted to group"), raise_exception=1)
 		else:
-			self.group_or_ledger = 'Group'
+			self.is_group = 1
 			self.save()
 			return 1
 
@@ -52,7 +49,7 @@
 	def validate_budget_details(self):
 		check_acc_list = []
 		for d in self.get('budgets'):
-			if self.group_or_ledger=="Group":
+			if self.is_group==1:
 				msgprint(_("Budget cannot be set for Group Cost Centers"), raise_exception=1)
 
 			if [d.account, d.fiscal_year] in check_acc_list:
@@ -70,7 +67,7 @@
 		new_cost_center = get_name_with_abbr(newdn, self.company)
 
 		# Validate properties before merging
-		super(CostCenter, self).before_rename(olddn, new_cost_center, merge, "group_or_ledger")
+		super(CostCenter, self).before_rename(olddn, new_cost_center, merge, "is_group")
 
 		return new_cost_center
 
diff --git a/erpnext/accounts/doctype/cost_center/test_records.json b/erpnext/accounts/doctype/cost_center/test_records.json
index 7486214..129f0db 100644
--- a/erpnext/accounts/doctype/cost_center/test_records.json
+++ b/erpnext/accounts/doctype/cost_center/test_records.json
@@ -13,21 +13,21 @@
   "cost_center_name": "_Test Cost Center",
   "distribution_id": "_Test Distribution",
   "doctype": "Cost Center",
-  "group_or_ledger": "Ledger",
+  "is_group": 0,
   "parent_cost_center": "_Test Company - _TC"
  },
  {
   "company": "_Test Company",
   "cost_center_name": "_Test Cost Center 2",
   "doctype": "Cost Center",
-  "group_or_ledger": "Ledger",
+  "is_group": 0,
   "parent_cost_center": "_Test Company - _TC"
  },
  {
   "company": "_Test Company",
   "cost_center_name": "_Test Write Off Cost Center",
   "doctype": "Cost Center",
-  "group_or_ledger": "Ledger",
+  "is_group": 0,
   "parent_cost_center": "_Test Company - _TC"
  }
 ]
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json
index ffb3f9b..54c7dd6 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.json
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json
@@ -25,17 +25,6 @@
    "permlevel": 0
   }, 
   {
-   "fieldname": "aging_date", 
-   "fieldtype": "Date", 
-   "in_filter": 1, 
-   "in_list_view": 1, 
-   "label": "Aging Date", 
-   "oldfieldname": "aging_date", 
-   "oldfieldtype": "Date", 
-   "permlevel": 0, 
-   "search_index": 0
-  }, 
-  {
    "fieldname": "account", 
    "fieldtype": "Link", 
    "in_filter": 1, 
@@ -203,7 +192,7 @@
  "icon": "icon-list", 
  "idx": 1, 
  "in_create": 1, 
- "modified": "2014-09-11 18:35:22.822064", 
+ "modified": "2015-04-27 20:32:48.246818", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "GL Entry", 
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index 54acc9e..ae4dae0 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -63,10 +63,10 @@
 	def validate_account_details(self, adv_adj):
 		"""Account must be ledger, active and not freezed"""
 
-		ret = frappe.db.sql("""select group_or_ledger, docstatus, company
+		ret = frappe.db.sql("""select is_group, docstatus, company
 			from tabAccount where name=%s""", self.account, as_dict=1)[0]
 
-		if ret.group_or_ledger=='Group':
+		if ret.is_group==1:
 			frappe.throw(_("Account {0} cannot be a Group").format(self.account))
 
 		if ret.docstatus==2:
@@ -110,7 +110,7 @@
 		if acc_frozen_upto:
 			frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier')
 			if getdate(posting_date) <= getdate(acc_frozen_upto) \
-					and not frozen_accounts_modifier in frappe.user.get_roles():
+					and not frozen_accounts_modifier in frappe.get_roles():
 				frappe.throw(_("You are not authorized to add or update entries before {0}").format(formatdate(acc_frozen_upto)))
 
 def update_outstanding_amt(account, party_type, party, against_voucher_type, against_voucher, on_cancel=False):
@@ -155,5 +155,5 @@
 
 		if not frozen_accounts_modifier:
 			frappe.throw(_("Account {0} is frozen").format(account))
-		elif frozen_accounts_modifier not in frappe.user.get_roles():
+		elif frozen_accounts_modifier not in frappe.get_roles():
 			frappe.throw(_("Not authorized to edit frozen Account {0}").format(account))
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js
index 2b0003e..5ff9e5f 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.js
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js
@@ -36,7 +36,7 @@
 				return {
 					filters: {
 						company: me.frm.doc.company,
-						group_or_ledger: "Ledger"
+						is_group: 0
 					}
 				};
 			});
@@ -136,7 +136,6 @@
 cur_frm.script_manager.make(erpnext.accounts.JournalVoucher);
 
 cur_frm.cscript.refresh = function(doc) {
-	cur_frm.cscript.is_opening(doc)
 	erpnext.toggle_naming_series();
 	cur_frm.cscript.voucher_type(doc);
 
@@ -163,11 +162,6 @@
 	erpnext.get_fiscal_year(doc.company, doc.posting_date);
 }
 
-cur_frm.cscript.is_opening = function(doc, cdt, cdn) {
-	hide_field('aging_date');
-	if (doc.is_opening == 'Yes') unhide_field('aging_date');
-}
-
 cur_frm.cscript.update_totals = function(doc) {
 	var td=0.0; var tc =0.0;
 	var el = doc.accounts || [];
@@ -231,7 +225,7 @@
 		var jvdetail = frappe.model.add_child(doc, "Journal Entry Account", "accounts");
 		$.each(r, function(i, d) {
 			var row = frappe.model.add_child(doc, "Journal Entry Account", "accounts");
-			row.account = d.cash_bank_account;
+			row.account = d.account;
 			row.balance = d.balance;
 		});
 		refresh_field("accounts");
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json
index 5ebac38..6eb395d 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.json
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json
@@ -295,18 +295,6 @@
    "search_index": 1
   }, 
   {
-   "description": "", 
-   "fieldname": "aging_date", 
-   "fieldtype": "Date", 
-   "label": "Ageing Date", 
-   "no_copy": 0, 
-   "oldfieldname": "aging_date", 
-   "oldfieldtype": "Date", 
-   "permlevel": 0, 
-   "print_hide": 1, 
-   "read_only": 0
-  }, 
-  {
    "default": "Accounts Receivable", 
    "depends_on": "eval:doc.voucher_type == 'Write Off Entry'", 
    "fieldname": "write_off_based_on", 
@@ -457,7 +445,7 @@
  "icon": "icon-file-text", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-03-25 07:11:27.108475", 
+ "modified": "2015-04-27 20:32:31.655580", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Journal Entry", 
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index 0873b9b..6317793 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -32,7 +32,6 @@
 		self.validate_against_purchase_invoice()
 		self.set_against_account()
 		self.create_remarks()
-		self.set_aging_date()
 		self.set_print_format_fields()
 		self.validate_against_sales_order()
 		self.validate_against_purchase_order()
@@ -306,18 +305,6 @@
 		if r:
 			self.remark = ("\n").join(r) #User Remarks is not mandatory
 
-
-	def set_aging_date(self):
-		if self.is_opening != 'Yes':
-			self.aging_date = self.posting_date
-		else:
-			party_list = [d.party for d in self.get("accounts") if d.party_type and d.party]
-
-			if len(party_list) and not self.aging_date:
-				frappe.throw(_("Aging Date is mandatory for opening entry"))
-			else:
-				self.aging_date = self.posting_date
-
 	def set_print_format_fields(self):
 		for d in self.get('accounts'):
 			if d.party_type and d.party:
@@ -448,13 +435,12 @@
 						Pending Amount is {2}".format(d.idx, d.against_expense_claim, pending_amount)))
 
 	def validate_credit_debit_note(self):
-		count = frappe.db.exists({
-			"doctype": "Journal Entry",
-			"stock_entry":self.stock_entry,
-			"docstatus":1
-		})
-		if count:
-			frappe.throw(_("{0} already made against stock entry {1}".format(self.voucher_type, self.stock_entry)))
+		if self.stock_entry:
+			if frappe.db.get_value("Stock Entry", self.stock_entry, "docstatus") != 1:
+				frappe.throw(_("Stock Entry {0} is not submitted").format(self.stock_entry))
+				
+			if frappe.db.exists({"doctype": "Journal Entry", "stock_entry": self.stock_entry, "docstatus":1}):
+				frappe.msgprint(_("Warning: Another {0} # {1} exists against stock entry {2}".format(self.voucher_type, self.name, self.stock_entry)))
 
 	def validate_empty_accounts_table(self):
 		if not self.get('accounts'):
@@ -465,8 +451,8 @@
 	from erpnext.accounts.doctype.sales_invoice.sales_invoice import get_bank_cash_account
 	if mode_of_payment:
 		account = get_bank_cash_account(mode_of_payment, company)
-		if account.get("bank_cash_account"):
-			account.update({"balance": get_balance_on(account.get("bank_cash_account"))})
+		if account.get("account"):
+			account.update({"balance": get_balance_on(account.get("account"))})
 			return account
 
 	if voucher_type=="Bank Entry":
@@ -480,7 +466,7 @@
 
 	if account:
 		return {
-			"cash_bank_account": account,
+			"account": account,
 			"balance": get_balance_on(account)
 		}
 
@@ -537,7 +523,7 @@
 	d2 = jv.append("accounts")
 
 	if bank_account:
-		d2.account = bank_account["cash_bank_account"]
+		d2.account = bank_account["account"]
 		d2.balance = bank_account["balance"]
 
 	return jv
@@ -546,7 +532,7 @@
 def get_opening_accounts(company):
 	"""get all balance sheet accounts for opening entry"""
 	accounts = frappe.db.sql_list("""select name from tabAccount
-		where group_or_ledger='Ledger' and report_type='Balance Sheet' and company=%s""", company)
+		where is_group=0 and report_type='Balance Sheet' and company=%s""", company)
 
 	return [{"account": a, "balance": get_balance_on(a)} for a in accounts]
 
diff --git a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.js b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.js
index a052375..10807ff 100644
--- a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.js
+++ b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.js
@@ -5,7 +5,7 @@
 	return{
 		filters: [
 			['Account', 'account_type', 'in', 'Bank, Cash'],
-			['Account', 'group_or_ledger', '=', 'Ledger'],
+			['Account', 'is_group', '=', 0],
 			['Account', 'company', '=', doc.company]
 		]
 	}
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
index 9394bcb..71df6cf 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
@@ -22,7 +22,7 @@
 				return{
 					filters: {
 						"company": me.frm.doc.company,
-						"group_or_ledger": "Ledger",
+						"is_group": 0,
 						"account_type": (me.frm.doc.party_type == "Customer" ? "Receivable" : "Payable")
 					}
 				};
@@ -37,7 +37,7 @@
 				return{
 					filters:[
 						['Account', 'company', '=', me.frm.doc.company],
-						['Account', 'group_or_ledger', '=', 'Ledger'],
+						['Account', 'is_group', '=', 0],
 						['Account', 'account_type', 'in', ['Bank', 'Cash']]
 					]
 				};
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.js b/erpnext/accounts/doctype/payment_tool/payment_tool.js
index eb44161..cff0bd2 100644
--- a/erpnext/accounts/doctype/payment_tool/payment_tool.js
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.js
@@ -18,7 +18,7 @@
 		return {
 			filters: {
 				"account_type": ["in", ["Bank", "Cash"]],
-				"group_or_ledger": "Ledger",
+				"is_group": 0,
 				"company": frm.doc.company
 			}
 		}
@@ -74,10 +74,9 @@
 				"mode_of_payment": frm.doc.payment_mode,
 				"company": frm.doc.company
 		},
-		callback: function(r, rt) {
+		callback: function(r, rt) {			
 			if(r.message) {
-				frm.doc.set_value("payment_account", r.message['bank_cash_account']
-);
+				cur_frm.set_value("payment_account", r.message['account']);
 			}
 		}
 	});
diff --git a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.js b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.js
index 2f2fc7c..c087500 100644
--- a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.js
+++ b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.js
@@ -15,7 +15,7 @@
 			"company": doc.company,
 			"report_type": "Balance Sheet",
 			"freeze_account": "No",
-			"group_or_ledger": "Ledger"
+			"is_group": 0
 		}
-	}	
+	}
 }
diff --git a/erpnext/accounts/doctype/pos_setting/pos_setting.js b/erpnext/accounts/doctype/pos_setting/pos_setting.js
index 8004e3e..db5fec1 100755
--- a/erpnext/accounts/doctype/pos_setting/pos_setting.js
+++ b/erpnext/accounts/doctype/pos_setting/pos_setting.js
@@ -22,7 +22,7 @@
 	return{
 		filters:{
 			'report_type': "Balance Sheet",
-			'group_or_ledger': "Ledger",
+			'is_group': 0,
 			'company': doc.company
 		}
 	}
@@ -33,7 +33,7 @@
 cur_frm.fields_dict['income_account'].get_query = function(doc,cdt,cdn) {
 	return{
 		filters:{
-			'group_or_ledger': "Ledger",
+			'is_group': 0,
 			'company': doc.company,
 			'account_type': "Income Account"
 		}
@@ -47,7 +47,7 @@
 	return{
 		filters:{
 			'company': doc.company,
-			'group_or_ledger': "Ledger"
+			'is_group': 0
 		}
 	}
 }
@@ -60,7 +60,7 @@
 		filters: {
 			"report_type": "Profit and Loss",
 			"company": doc.company,
-			"group_or_ledger": "Ledger"
+			"is_group": 0
 		}
 	}
 }
@@ -83,7 +83,7 @@
 	return{
 		filters:{
 			'report_type': 'Profit and Loss',
-			'group_or_ledger': 'Ledger',
+			'is_group': 0,
 			'company': doc.company
 		}
 	}
@@ -94,7 +94,7 @@
 cur_frm.fields_dict.write_off_cost_center.get_query = function(doc) {
 	return{
 		filters:{
-			'group_or_ledger': 'Ledger',
+			'is_group': 0,
 			'company': doc.company
 		}
 	}
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index 9da83b6..3e16a31 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -67,8 +67,6 @@
 				}, "icon-download", "btn-default");
 
 		}
-
-		this.is_opening(doc);
 	},
 
 	supplier: function() {
@@ -116,11 +114,6 @@
 
 cur_frm.script_manager.make(erpnext.accounts.PurchaseInvoice);
 
-cur_frm.cscript.is_opening = function(doc, dt, dn) {
-	hide_field('aging_date');
-	if (doc.is_opening == 'Yes') unhide_field('aging_date');
-}
-
 cur_frm.cscript.make_bank_entry = function() {
 	return frappe.call({
 		method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_payment_entry_from_purchase_invoice",
@@ -161,7 +154,7 @@
 		filters:{
 			'account_type': 'Payable',
 			'root_type': 'Liability',
-			'group_or_ledger': 'Ledger',
+			'is_group': 0,
 			'company': doc.company
 		}
 	}
@@ -198,7 +191,7 @@
 	return {
 		filters: {
 			'company': doc.company,
-			'group_or_ledger': 'Ledger'
+			'is_group': 0
 		}
 
 	}
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
index 6cb1169..edbefba 100755
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
@@ -6,21 +6,6 @@
  "doctype": "DocType", 
  "fields": [
   {
-   "fieldname": "supplier_section", 
-   "fieldtype": "Section Break", 
-   "label": "", 
-   "options": "icon-user", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "column_break0", 
-   "fieldtype": "Column Break", 
-   "oldfieldtype": "Column Break", 
-   "permlevel": 0, 
-   "read_only": 0, 
-   "width": "50%"
-  }, 
-  {
    "fieldname": "naming_series", 
    "fieldtype": "Select", 
    "label": "Series", 
@@ -750,18 +735,6 @@
    "search_index": 1
   }, 
   {
-   "description": "Actual Invoice Date", 
-   "fieldname": "aging_date", 
-   "fieldtype": "Date", 
-   "label": "Aging Date", 
-   "oldfieldname": "aging_date", 
-   "oldfieldtype": "Date", 
-   "permlevel": 0, 
-   "print_hide": 1, 
-   "read_only": 0, 
-   "search_index": 0
-  }, 
-  {
    "allow_on_submit": 1, 
    "fieldname": "select_print_heading", 
    "fieldtype": "Link", 
@@ -965,7 +938,7 @@
  "icon": "icon-file-text", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-03-23 14:47:57.373436", 
+ "modified": "2015-04-30 03:05:13.790265", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Purchase Invoice", 
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 0e7a640..c0ebf68 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -47,7 +47,6 @@
 		self.check_for_stopped_status()
 		self.validate_with_previous_doc()
 		self.validate_uom_is_integer("uom", "qty")
-		self.set_aging_date()
 		self.set_against_expense_account()
 		self.validate_write_off_account()
 		self.update_valuation_rate("items")
@@ -141,13 +140,6 @@
 				}
 			})
 
-
-	def set_aging_date(self):
-		if self.is_opening != 'Yes':
-			self.aging_date = self.posting_date
-		elif not self.aging_date:
-			throw(_("Ageing date is mandatory for opening entry"))
-
 	def set_against_expense_account(self):
 		auto_accounting_for_stock = cint(frappe.defaults.get_global_default("auto_accounting_for_stock"))
 
@@ -173,7 +165,7 @@
 			elif item.expense_account not in against_accounts:
 				# if no auto_accounting_for_stock or not a stock item
 				against_accounts.append(item.expense_account)
-
+				
 		self.against_expense_account = ",".join(against_accounts)
 
 	def po_required(self):
@@ -247,6 +239,7 @@
 		self.update_against_document_in_jv()
 		self.update_prevdoc_status()
 		self.update_billing_status_for_zero_amount_refdoc("Purchase Order")
+		self.update_project()
 
 	def make_gl_entries(self):
 		auto_accounting_for_stock = \
@@ -288,7 +281,7 @@
 				)
 
 			# accumulate valuation tax
-			if tax.category in ("Valuation", "Valuation and Total") and flt(tax.base_tax_amount_after_discount_amount):
+			if self.is_opening == "No" and tax.category in ("Valuation", "Valuation and Total") and flt(tax.base_tax_amount_after_discount_amount):
 				if auto_accounting_for_stock and not tax.cost_center:
 					frappe.throw(_("Cost Center is required in row {0} in Taxes table for type {1}").format(tax.idx, _(tax.category)))
 				valuation_tax.setdefault(tax.cost_center, 0)
@@ -310,7 +303,8 @@
 					})
 				)
 
-			if auto_accounting_for_stock and item.item_code in stock_items and item.item_tax_amount:
+			if auto_accounting_for_stock and self.is_opening == "No" and \
+				item.item_code in stock_items and item.item_tax_amount:
 					# Post reverse entry for Stock-Received-But-Not-Billed if it is booked in Purchase Receipt
 					negative_expense_booked_in_pi = None
 					if item.purchase_receipt:
@@ -330,7 +324,7 @@
 
 						negative_expense_to_be_booked += flt(item.item_tax_amount, self.precision("item_tax_amount", item))
 
-		if negative_expense_to_be_booked and valuation_tax:
+		if self.is_opening == "No" and negative_expense_to_be_booked and valuation_tax:
 			# credit valuation tax amount in "Expenses Included In Valuation"
 			# this will balance out valuation amount included in cost of goods sold
 
@@ -380,9 +374,17 @@
 		self.update_prevdoc_status()
 		self.update_billing_status_for_zero_amount_refdoc("Purchase Order")
 		self.make_gl_entries_on_cancel()
-
-	def on_update(self):
-		pass
+		self.update_project()
+		
+	def update_project(self):
+		project_list = []
+		for d in self.items:
+			if d.project_name and d.project_name not in project_list:
+				project = frappe.get_doc("Project", d.project_name)
+				project.flags.dont_sync_tasks = True
+				project.update_purchase_costing()
+				project.save()
+				project_list.append(d.project_name)
 
 @frappe.whitelist()
 def get_expense_account(doctype, txt, searchfield, start, page_len, filters):
@@ -393,10 +395,10 @@
 	# Hence the first condition is an "OR"
 	return frappe.db.sql("""select tabAccount.name from `tabAccount`
 			where (tabAccount.report_type = "Profit and Loss"
-					or tabAccount.account_type in ("Expense Account", "Fixed Asset"))
-				and tabAccount.group_or_ledger="Ledger"
+					or tabAccount.account_type in ("Expense Account", "Fixed Asset", "Temporary"))
+				and tabAccount.is_group=0
 				and tabAccount.docstatus!=2
 				and tabAccount.company = '%(company)s'
 				and tabAccount.%(key)s LIKE '%(txt)s'
 				%(mcond)s""" % {'company': filters['company'], 'key': searchfield,
-			'txt': "%%%s%%" % txt, 'mcond':get_match_cond(doctype)})
\ No newline at end of file
+			'txt': "%%%s%%" % txt, 'mcond':get_match_cond(doctype)})
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 5ae47d7..7f46b08 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -6,7 +6,6 @@
 import unittest
 import frappe
 import frappe.model
-import json
 from frappe.utils import cint
 import frappe.defaults
 from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory, \
@@ -234,5 +233,47 @@
 	def test_recurring_invoice(self):
 		from erpnext.controllers.tests.test_recurring_document import test_recurring_document
 		test_recurring_document(self, test_records)
+		
+	def test_total_purchase_cost_for_project(self):		
+		purchase_invoice = frappe.new_doc('Purchase Invoice')
+		purchase_invoice.update({
+			"credit_to": "_Test Payable - _TC",
+			"supplier": "_Test Supplier",
+			"company": "_Test Company",
+			"items": [
+				{
+					"rate": 500,
+					"qty": 1,
+					"project_name": "_Test Project",
+					"item_code": "_Test Item Home Desktop 100",
+					"expense_account": "_Test Account Cost for Goods Sold - _TC",
+					"cost_center": "_Test Cost Center - _TC"
+				},
+				{
+					"rate": 1500,
+					"qty": 1,
+					"project_name": "_Test Project",
+					"item_code": "_Test Item Home Desktop 200",
+					"expense_account": "_Test Account Cost for Goods Sold - _TC",
+					"cost_center": "_Test Cost Center - _TC"
+				}
+			]
+		})
+		purchase_invoice.save()
+		purchase_invoice.submit()		
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 2000)
+		
+		purchase_invoice1 = frappe.copy_doc(purchase_invoice)
+		purchase_invoice1.save()
+		purchase_invoice1.submit()
+		
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 4000)
+		
+		purchase_invoice1.cancel()		
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 2000)
+		
+		purchase_invoice.cancel()		
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 0)
+		
 
 test_records = frappe.get_test_records('Purchase Invoice')
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index ade0d32..96b47c6 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -39,7 +39,6 @@
 	refresh: function(doc, dt, dn) {
 		this._super();
 
-		cur_frm.cscript.is_opening(doc, dt, dn);
 		cur_frm.dashboard.reset();
 
 		if(doc.docstatus==1) {
@@ -254,6 +253,12 @@
 				"mode_of_payment": doc.mode_of_payment,
 				"company": doc.company
 			 },
+			 callback: function(r, rt) {
+				if(r.message) {
+					cur_frm.set_value("cash_bank_account", r.message["account"]);
+				}
+			 	
+			 }
 		});
 	 }
 }
@@ -262,11 +267,6 @@
 	cur_frm.cscript.hide_fields(doc, dt, dn);
 }
 
-cur_frm.cscript.is_opening = function(doc, dt, dn) {
-	hide_field('aging_date');
-	if (doc.is_opening == 'Yes') unhide_field('aging_date');
-}
-
 cur_frm.cscript['Make Delivery Note'] = function() {
 	frappe.model.open_mapped_doc({
 		method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.make_delivery_note",
@@ -291,7 +291,7 @@
 	return{
 		filters: {
 			'report_type': 'Balance Sheet',
-			'group_or_ledger': 'Ledger',
+			'is_group': 0,
 			'company': doc.company
 		}
 	}
@@ -302,7 +302,7 @@
 		filters: [
 			["Account", "account_type", "in", ["Cash", "Bank"]],
 			["Account", "root_type", "=", "Asset"],
-			["Account", "group_or_ledger", "=", "Ledger"],
+			["Account", "is_group", "=",0],
 			["Account", "company", "=", doc.company]
 		]
 	}
@@ -312,7 +312,7 @@
 	return{
 		filters:{
 			'report_type': 'Profit and Loss',
-			'group_or_ledger': 'Ledger',
+			'is_group': 0,
 			'company': doc.company
 		}
 	}
@@ -323,7 +323,7 @@
 cur_frm.fields_dict.write_off_cost_center.get_query = function(doc) {
 	return{
 		filters:{
-			'group_or_ledger': 'Ledger',
+			'is_group': 0,
 			'company': doc.company
 		}
 	}
@@ -354,7 +354,7 @@
 			filters: {
 				'report_type': 'Profit and Loss',
 				'company': doc.company,
-				'group_or_ledger': 'Ledger'
+				"is_group": 0
 			}
 		}
 	}
@@ -367,7 +367,7 @@
 	return {
 		filters: {
 			'company': doc.company,
-			'group_or_ledger': 'Ledger'
+			"is_group": 0
 		}
 	}
 }
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index 11ae3b5..46c68e9 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -987,17 +987,6 @@
    "read_only": 0
   }, 
   {
-   "description": "Actual Invoice Date", 
-   "fieldname": "aging_date", 
-   "fieldtype": "Date", 
-   "label": "Aging Date", 
-   "oldfieldname": "aging_date", 
-   "oldfieldtype": "Date", 
-   "permlevel": 0, 
-   "print_hide": 1, 
-   "read_only": 0
-  }, 
-  {
    "fieldname": "fiscal_year", 
    "fieldtype": "Link", 
    "in_filter": 1, 
@@ -1254,8 +1243,8 @@
  "icon": "icon-file-text", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-04-02 13:42:22.985078", 
- "modified_by": "anand@erpnext.com", 
+ "modified": "2015-04-27 20:31:51.966964", 
+ "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Sales Invoice", 
  "owner": "Administrator", 
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 40712c2..9568c90 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -62,7 +62,6 @@
 		if not self.is_opening:
 			self.is_opening = 'No'
 
-		self.set_aging_date()
 		self.set_against_income_account()
 		self.validate_c_form()
 		self.validate_time_logs_are_submitted()
@@ -282,13 +281,6 @@
 				}
 			})
 
-
-	def set_aging_date(self):
-		if self.is_opening != 'Yes':
-			self.aging_date = self.posting_date
-		elif not self.aging_date:
-			throw(_("Ageing Date is mandatory for opening entry"))
-
 	def set_against_income_account(self):
 		"""Set against account for debit to account"""
 		against_acc = []
@@ -449,7 +441,7 @@
 
 	def make_gl_entries(self, repost_future_gle=True):
 		gl_entries = self.get_gl_entries()
-		
+
 		if gl_entries:
 			from erpnext.accounts.general_ledger import make_gl_entries
 
@@ -598,12 +590,12 @@
 
 @frappe.whitelist()
 def get_bank_cash_account(mode_of_payment, company):
-	account = frappe.db.get_value("Mode of Payment Account", {"parent": mode_of_payment, "company": company}, \
-		"default_account")
+	account = frappe.db.get_value("Mode of Payment Account", 
+		{"parent": mode_of_payment, "company": company}, "default_account")
 	if not account:
 		frappe.msgprint(_("Please set default Cash or Bank account in Mode of Payment {0}").format(mode_of_payment))
 	return {
-		"cash_bank_account": account
+		"account": account
 	}
 
 
@@ -616,8 +608,8 @@
 	# Hence the first condition is an "OR"
 	return frappe.db.sql("""select tabAccount.name from `tabAccount`
 			where (tabAccount.report_type = "Profit and Loss"
-					or tabAccount.account_type = "Income Account")
-				and tabAccount.group_or_ledger="Ledger"
+					or tabAccount.account_type in ("Income Account", "Temporary"))
+				and tabAccount.is_group=0
 				and tabAccount.docstatus!=2
 				and tabAccount.company = '%(company)s'
 				and tabAccount.%(key)s LIKE '%(txt)s'
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js
index 9c9b037..49b5c25 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.js
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js
@@ -24,18 +24,16 @@
 		'<ol>'+
 			'<li>'+__('To add child nodes, explore tree and click on the node under which you want to add more nodes.')+'</li>'+
 			'<li>'+
-			      __('Accounting Entries can be made against leaf nodes, called')+
-				 ' <b>' +__('Ledgers')+'</b>. '+ __('Entries against ') +
-				 '<b>' +__('Groups') + '</b> '+ __('are not allowed.')+
+			      __('Accounting Entries can be made against leaf nodes. Entries against Groups are not allowed.')+
 		    '</li>'+
-			'<li>'+__('Please do NOT create Account (Ledgers) for Customers and Suppliers. They are created directly from the Customer / Supplier masters.')+'</li>'+
+			'<li>'+__('Please do NOT create Accounts for Customers and Suppliers. They are created directly from the Customer / Supplier masters.')+'</li>'+
 			'<li>'+
 			     '<b>'+__('To create a Bank Account')+'</b>: '+
-			      __('Go to the appropriate group (usually Application of Funds > Current Assets > Bank Accounts and create a new Account Ledger (by clicking on Add Child) of type "Bank"')+
+			      __('Go to the appropriate group (usually Application of Funds > Current Assets > Bank Accounts and create a new Account (by clicking on Add Child) of type "Bank"')+
 			'</li>'+
 			'<li>'+
 			      '<b>'+__('To create a Tax Account') +'</b>: '+
-			      __('Go to the appropriate group (usually Source of Funds > Current Liabilities > Taxes and Duties and create a new Account Ledger (by clicking on Add Child) of type "Tax" and do mention the Tax rate.')+
+			      __('Go to the appropriate group (usually Source of Funds > Current Liabilities > Taxes and Duties and create a new Account (by clicking on Add Child) of type "Tax" and do mention the Tax rate.')+
 			'</li>'+
 		'</ol>'+
 		'<p>'+__('Please setup your chart of accounts before you start Accounting Entries')+'</p></div>').appendTo(main);
@@ -201,13 +199,12 @@
 			fields: [
 				{fieldtype:'Data', fieldname:'account_name', label:__('New Account Name'), reqd:true,
 					description: __("Name of new Account. Note: Please don't create accounts for Customers and Suppliers, they are created automatically from the Customer and Supplier master")},
-				{fieldtype:'Select', fieldname:'group_or_ledger', label:__('Group or Ledger'),
-					options:'Group\nLedger', "default": "Ledger",
-					description: __('Further accounts can be made under Groups, but entries can be made against Ledger')},
+				{fieldtype:'Check', fieldname:'is_group', label:__('Is Group'),
+					description: __('Further accounts can be made under Groups, but entries can be made against non-Groups')},
 				{fieldtype:'Select', fieldname:'account_type', label:__('Account Type'),
 					options: ['', 'Bank', 'Cash', 'Warehouse', 'Receivable', 'Payable',
 						'Equity', 'Cost of Goods Sold', 'Fixed Asset', 'Expense Account',
-						'Income Account', 'Tax', 'Chargeable'].join('\n'),
+						'Income Account', 'Tax', 'Chargeable', 'Temporary'].join('\n'),
 					description: __("Optional. This setting will be used to filter in various transactions.") },
 				{fieldtype:'Float', fieldname:'tax_rate', label:__('Tax Rate')},
 				{fieldtype:'Link', fieldname:'warehouse', label:__('Warehouse'), options:"Warehouse"}
@@ -217,12 +214,13 @@
 		var fd = d.fields_dict;
 
 		// account type if ledger
-		$(fd.group_or_ledger.input).change(function() {
-			if($(this).val()=='Group') {
+		$(fd.is_group.input).change(function() {
+			if($(this).prop("checked")) {
 				$(fd.account_type.wrapper).toggle(false);
 				$(fd.tax_rate.wrapper).toggle(false);
 				$(fd.warehouse.wrapper).toggle(false);
 			} else {
+				$(fd.account_type.wrapper).toggle(true);
 				fd.account_type.$input.trigger("change");
 			}
 		});
@@ -263,11 +261,11 @@
 
 		// show
 		d.on_page_show = function() {
-			$(fd.group_or_ledger.input).change();
+			$(fd.is_group.input).change();
 			$(fd.account_type.input).change();
 		}
 
-		$(fd.group_or_ledger.input).val("Ledger").change();
+		$(fd.is_group.input).prop("checked", false).change();
 		d.show();
 	},
 
@@ -278,8 +276,8 @@
 			title:__('New Cost Center'),
 			fields: [
 				{fieldtype:'Data', fieldname:'cost_center_name', label:__('New Cost Center Name'), reqd:true},
-				{fieldtype:'Select', fieldname:'group_or_ledger', label:__('Group or Ledger'),
-					options:'Group\nLedger', description:__('Further accounts can be made under Groups but entries can be made against Ledger')},
+				{fieldtype:'Check', fieldname:'is_group', label:__('Is Group'),
+					description:__('Further cost centers can be made under Groups but entries can be made against non-Groups')},
 				{fieldtype:'Button', fieldname:'create_new', label:__('Create New') }
 			]
 		});
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.py b/erpnext/accounts/page/accounts_browser/accounts_browser.py
index de19d3b..bb64e54 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.py
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.py
@@ -6,6 +6,7 @@
 import frappe.defaults
 from frappe.utils import flt
 from erpnext.accounts.utils import get_balance_on
+from erpnext.accounts.report.financial_statements import sort_root_accounts
 
 @frappe.whitelist()
 def get_companies():
@@ -20,17 +21,22 @@
 
 	# root
 	if args['parent'] in ("Accounts", "Cost Centers"):
+		select_cond = ", root_type, report_type" if args["parent"]=="Accounts" else ""
+		
 		acc = frappe.db.sql(""" select
-			name as value, if(group_or_ledger='Group', 1, 0) as expandable
+			name as value, is_group as expandable %s
 			from `tab%s`
 			where ifnull(parent_%s,'') = ''
 			and `company` = %s	and docstatus<2
-			order by name""" % (ctype, ctype.lower().replace(' ','_'), '%s'),
+			order by name""" % (select_cond, ctype, ctype.lower().replace(' ','_'), '%s'),
 				company, as_dict=1)
+
+		if args["parent"]=="Accounts":
+			sort_root_accounts(acc)
 	else:
 		# other
 		acc = frappe.db.sql("""select
-			name as value, if(group_or_ledger='Group', 1, 0) as expandable
+			name as value, is_group as expandable
 	 		from `tab%s`
 			where ifnull(parent_%s,'') = %s
 			and docstatus<2
diff --git a/erpnext/accounts/page/financial_analytics/financial_analytics.js b/erpnext/accounts/page/financial_analytics/financial_analytics.js
index a9ac72f..ef373aa 100644
--- a/erpnext/accounts/page/financial_analytics/financial_analytics.js
+++ b/erpnext/accounts/page/financial_analytics/financial_analytics.js
@@ -265,7 +265,7 @@
 		var me= this;
 		$.each(this.data, function(i, account) {
 			// update groups
-			if((account.group_or_ledger == "Ledger") || (account.rgt - account.lft == 1)) {
+			if((account.is_group == 0) || (account.rgt - account.lft == 1)) {
 				var parent = me.parent_map[account.name];
 				while(parent) {
 					var parent_account = me.item_by_name[parent];
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 7ea0c66..00e595f 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -186,7 +186,7 @@
 		frappe.throw(_("Due Date cannot be before Posting Date"))
 	elif credit_days is not None and diff > flt(credit_days):
 		is_credit_controller = frappe.db.get_value("Accounts Settings", None,
-			"credit_controller") in frappe.user.get_roles()
+			"credit_controller") in frappe.get_roles()
 
 		if is_credit_controller:
 			msgprint(_("Note: Due / Reference Date exceeds allowed customer credit days by {0} day(s)")
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 3bde399..52c9760 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -170,14 +170,15 @@
 		if not hasattr(self, "gl_entries"):
 			conditions, values = self.prepare_conditions(party_type)
 			self.gl_entries = frappe.db.sql("""select * from `tabGL Entry`
-				where docstatus < 2 {0} order by posting_date, party"""
+				where docstatus < 2 and party_type=%s {0} order by posting_date, party"""
 				.format(conditions), values, as_dict=True)
 
 		return self.gl_entries
 
 	def prepare_conditions(self, party_type):
 		conditions = [""]
-		values = []
+		values = [party_type]
+		
 		party_type_field = scrub(party_type)
 
 		if self.filters.company:
@@ -185,20 +186,9 @@
 			values.append(self.filters.company)
 
 		if self.filters.get(party_type_field):
-			conditions.append("party_type=%s and party=%s")
-			values += [party_type, self.filters.get(party_type_field)]
+			conditions.append("party=%s")
+			values.append(self.filters.get(party_type_field))
 
-		if self.filters.account:
-			conditions.append("account=%s")
-			values.append(self.filters.account)
-		else:
-			account_map = self.get_account_map()
-			if not account_map:
-				frappe.throw(_("No Customer Accounts found."))
-			else:
-				conditions.append("account in ({0})".format(", ".join(["%s"] * len(account_map))))
-				values += account_map.keys()
-				
 		return " and ".join(conditions), values
 
 	def get_gl_entries_for(self, party, party_type, against_voucher_type, against_voucher):
diff --git a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.js b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.js
index 35a4fe9..37d8130 100644
--- a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.js
+++ b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.js
@@ -24,13 +24,13 @@
 			"reqd": 1,
 			"get_query": function() {
 				return {
-					"query": "erpnext.controllers.queries.get_account_list", 
+					"query": "erpnext.controllers.queries.get_account_list",
 					"filters": [
 						['Account', 'account_type', 'in', 'Bank, Cash'],
-						['Account', 'group_or_ledger', '=', 'Ledger'],
+						['Account', 'is_group', '=', 0],
 					]
 				}
 			}
 		},
 	]
-}
\ No newline at end of file
+}
diff --git a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js
index 0d333da..581531b 100644
--- a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js
+++ b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js
@@ -14,7 +14,7 @@
 					"query": "erpnext.controllers.queries.get_account_list",
 					"filters": [
 						['Account', 'account_type', 'in', 'Bank, Cash'],
-						['Account', 'group_or_ledger', '=', 'Ledger'],
+						['Account', 'is_group', '=', 0],
 					]
 				}
 			}
diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py
index b58f078..07d5e51 100644
--- a/erpnext/accounts/report/financial_statements.py
+++ b/erpnext/accounts/report/financial_statements.py
@@ -184,9 +184,14 @@
 		parent_children_map.setdefault(d.parent_account or None, []).append(d)
 
 	filtered_accounts = []
+
 	def add_to_list(parent, level):
 		if level < depth:
-			for child in (parent_children_map.get(parent) or []):
+			children = parent_children_map.get(parent) or []
+			if parent == None:
+				sort_root_accounts(children)
+
+			for child in children:
 				child.indent = level
 				filtered_accounts.append(child)
 				add_to_list(child.name, level + 1)
@@ -203,6 +208,20 @@
 
 	return filtered_accounts, accounts_by_name
 
+def sort_root_accounts(roots):
+	"""Sort root types as Asset, Liability, Equity, Income, Expense"""
+
+	def compare_roots(a, b):
+		if a.report_type != b.report_type and a.report_type == "Balance Sheet":
+			return -1
+		if a.root_type != b.root_type and a.root_type == "Asset":
+			return -1
+		if a.root_type == "Liability" and b.root_type == "Equity":
+			return -1
+		return 1
+
+	roots.sort(compare_roots)
+
 def get_gl_entries(company, from_date, to_date, root_lft, root_rgt, ignore_closing_entries=False):
 	"""Returns a dict like { "account": [gl entries], ... }"""
 	additional_conditions = []
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index e70f2ea..a7ee7c0 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -8,7 +8,7 @@
 
 def execute(filters=None):
 	account_details = {}
-	for acc in frappe.db.sql("""select name, group_or_ledger from tabAccount""", as_dict=1):
+	for acc in frappe.db.sql("""select name, is_group from tabAccount""", as_dict=1):
 			account_details.setdefault(acc.name, acc)
 
 	validate_filters(filters, account_details)
@@ -25,7 +25,7 @@
 		frappe.throw(_("Account {0} does not exists").format(filters.account))
 
 	if filters.get("account") and filters.get("group_by_account") \
-			and account_details[filters.account].group_or_ledger == "Ledger":
+			and account_details[filters.account].is_group == 0:
 		frappe.throw(_("Can not filter based on Account, if grouped by Account"))
 
 	if filters.get("voucher_no") and filters.get("group_by_voucher"):
@@ -45,10 +45,10 @@
 			frappe.throw(_("Invalid {0}: {1}").format(party_type, party))
 
 def get_columns():
-	return [_("Posting Date") + ":Date:90", _("Account") + ":Link/Account:200", 
-		_("Debit") + ":Float:100", _("Credit") + ":Float:100", 
-		_("Voucher Type") + "::120", _("Voucher No") + ":Dynamic Link/Voucher Type:160", 
-		_("Against Account") + "::120", _("Party Type") + "::80", _("Party") + "::150", 
+	return [_("Posting Date") + ":Date:90", _("Account") + ":Link/Account:200",
+		_("Debit") + ":Float:100", _("Credit") + ":Float:100",
+		_("Voucher Type") + "::120", _("Voucher No") + ":Dynamic Link/Voucher Type:160",
+		_("Against Account") + "::120", _("Party Type") + "::80", _("Party") + "::150",
 		_("Cost Center") + ":Link/Cost Center:100", _("Remarks") + "::400"]
 
 def get_result(filters, account_details):
@@ -179,7 +179,7 @@
 	for d in data:
 		result.append([d.get("posting_date"), d.get("account"), d.get("debit"),
 			d.get("credit"), d.get("voucher_type"), d.get("voucher_no"),
-			d.get("against"), d.get("party_type"), d.get("party"), 
+			d.get("against"), d.get("party_type"), d.get("party"),
 			d.get("cost_center"), d.get("remarks")])
 
 	return result
diff --git a/erpnext/accounts/report/gross_profit/gross_profit.js b/erpnext/accounts/report/gross_profit/gross_profit.js
index b744e29..9035626 100644
--- a/erpnext/accounts/report/gross_profit/gross_profit.js
+++ b/erpnext/accounts/report/gross_profit/gross_profit.js
@@ -8,6 +8,7 @@
 			"label": __("Company"),
 			"fieldtype": "Link",
 			"options": "Company",
+			"reqd": 1,
 			"default": frappe.defaults.get_user_default("company")
 		},
 		{
diff --git a/erpnext/accounts/report/trial_balance/trial_balance.py b/erpnext/accounts/report/trial_balance/trial_balance.py
index f062cdb..761d038 100644
--- a/erpnext/accounts/report/trial_balance/trial_balance.py
+++ b/erpnext/accounts/report/trial_balance/trial_balance.py
@@ -123,7 +123,8 @@
 def prepare_data(accounts, filters, total_row):
 	show_zero_values = cint(filters.show_zero_values)
 	data = []
-	for i, d in enumerate(accounts):
+	accounts_with_zero_value = []
+	for d in accounts:
 		has_value = False
 		row = {
 			"account_name": d.account_name,
@@ -141,8 +142,13 @@
 			if row[key]:
 				has_value = True
 
-		if has_value or show_zero_values:
+		if show_zero_values:
 			data.append(row)
+		else:
+			if not has_value:
+				accounts_with_zero_value.append(d.name)
+			elif d.parent_account not in accounts_with_zero_value:
+				data.append(row)
 
 	data.extend([{},total_row])
 
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 4b5b5f6..e0f0e3b 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -89,7 +89,7 @@
 				% year_start_date)
 
 		# different filter for group and ledger - improved performance
-		if acc.group_or_ledger=="Group":
+		if acc.is_group:
 			cond.append("""exists (
 				select * from `tabAccount` ac where ac.name = gle.account
 				and ac.lft >= %s and ac.rgt <= %s
@@ -348,8 +348,8 @@
 def get_currency_precision(currency=None):
 	if not currency:
 		currency = frappe.db.get_value("Company",
-			frappe.db.get_default("company"), "default_currency")
-	currency_format = frappe.db.get_value("Currency", currency, "number_format")
+			frappe.db.get_default("company"), "default_currency", cache=True)
+	currency_format = frappe.db.get_value("Currency", currency, "number_format", cache=True)
 
 	from frappe.utils import get_number_format_info
 	return get_number_format_info(currency_format)[2]
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.py b/erpnext/buying/doctype/purchase_common/purchase_common.py
index 8cedddf..21791f7 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.py
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.py
@@ -3,7 +3,7 @@
 
 from __future__ import unicode_literals
 import frappe
-from frappe.utils import flt
+from frappe.utils import flt, cstr
 from frappe import _
 
 from erpnext.stock.doctype.item.item import get_last_purchase_details
@@ -39,7 +39,7 @@
 					(flt(last_purchase_rate), d.item_code))
 
 	def validate_for_items(self, obj):
-		check_list, chk_dupl_itm=[],[]
+		items = []
 		for d in obj.get("items"):
 			# validation for valid qty
 			if flt(d.qty) < 0 or (d.parenttype != 'Purchase Receipt' and not flt(d.qty)):
@@ -70,31 +70,11 @@
 			if not (obj.doctype=="Material Request" and getattr(obj, "material_request_type", None)=="Material Transfer"):
 				if item[0][1] != 'Yes' and item[0][2] != 'Yes':
 					frappe.throw(_("{0} must be a Purchased or Sub-Contracted Item in row {1}").format(d.item_code, d.idx))
-
-			# list criteria that should not repeat if item is stock item
-			e = [getattr(d, "schedule_date", None), d.item_code, d.description, d.warehouse, d.uom,
-				d.meta.get_field('prevdoc_docname') and d.prevdoc_docname or d.meta.get_field('sales_order_no') and d.sales_order_no or '',
-				d.meta.get_field('prevdoc_detail_docname') and d.prevdoc_detail_docname or '',
-				d.meta.get_field('batch_no') and d.batch_no or '']
-
-			# if is not stock item
-			f = [getattr(d, "schedule_date", None), d.item_code, d.description]
-
-			ch = frappe.db.sql("""select is_stock_item from `tabItem` where name = %s""", d.item_code)
-
-			if ch and ch[0][0] == 'Yes':
-				# check for same items
-				if e in check_list:
-					frappe.throw(_("Item {0} has been entered multiple times with same description or date or warehouse").format(d.item_code))
-				else:
-					check_list.append(e)
-
-			elif ch and ch[0][0] == 'No':
-				# check for same items
-				if f in chk_dupl_itm:
-					frappe.throw(_("Item {0} has been entered multiple times with same description or date").format(d.item_code))
-				else:
-					chk_dupl_itm.append(f)
+			
+			items.append(cstr(d.item_code))
+		if items and len(items) != len(set(items)):
+			frappe.msgprint(_("Warning: Same item has been entered multiple times."))
+			
 
 	def check_for_stopped_status(self, doctype, docname):
 		stopped = frappe.db.sql("""select name from `tab%s` where name = %s and
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json
index cd652fe..b985a06 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.json
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.json
@@ -508,6 +508,7 @@
    "fieldname": "advance_paid", 
    "fieldtype": "Currency", 
    "label": "Advance Paid", 
+   "no_copy": 1, 
    "permlevel": 0, 
    "print_hide": 1, 
    "read_only": 1
@@ -872,7 +873,7 @@
  "icon": "icon-file-text", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-03-23 14:47:26.072237", 
+ "modified": "2015-04-28 15:27:28.755816", 
  "modified_by": "Administrator", 
  "module": "Buying", 
  "name": "Purchase Order", 
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index 91c50b1..96a3d97 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -68,7 +68,10 @@
 		})
 
 	def validate_minimum_order_qty(self):
-		itemwise_min_order_qty = frappe._dict(frappe.db.sql("select name, min_order_qty from tabItem"))
+		items = list(set([d.item_code for d in self.get("items")]))
+
+		itemwise_min_order_qty = frappe._dict(frappe.db.sql("""select name, min_order_qty
+			from tabItem where name in ({0})""".format(", ".join(["%s"] * len(items))), items))
 
 		itemwise_qty = frappe._dict()
 		for d in self.get("items"):
@@ -77,7 +80,8 @@
 
 		for item_code, qty in itemwise_qty.items():
 			if flt(qty) < flt(itemwise_min_order_qty.get(item_code)):
-				frappe.throw(_("Item #{0}: Ordered qty can not less than item's minimum order qty (defined in item master).").format(item_code))
+				frappe.throw(_("Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item).").format(item_code,
+					qty, itemwise_min_order_qty.get(item_code)))
 
 	def get_schedule_dates(self):
 		for d in self.get('items'):
@@ -217,15 +221,15 @@
 
 	def on_update(self):
 		pass
-		
+
 	def before_recurring(self):
 		super(PurchaseOrder, self).before_recurring()
-		
+
 		for field in ("per_received", "per_billed"):
 			self.set(field, None)
 
 		for d in self.get("items"):
-			for field in ("received_qty", "billed_amt", "prevdoc_doctype", "prevdoc_docname", 
+			for field in ("received_qty", "billed_amt", "prevdoc_doctype", "prevdoc_docname",
 				"prevdoc_detail_docname", "supplier_quotation", "supplier_quotation_item"):
 					d.set(field, None)
 
diff --git a/erpnext/buying/doctype/supplier/supplier.js b/erpnext/buying/doctype/supplier/supplier.js
index a8ccf32..064fac1 100644
--- a/erpnext/buying/doctype/supplier/supplier.js
+++ b/erpnext/buying/doctype/supplier/supplier.js
@@ -65,7 +65,7 @@
 		filters: {
 			'account_type': 'Payable',
 			'company': d.company,
-			'group_or_ledger': 'Ledger'
+			"is_group": 0
 		}
 	}
 }
diff --git a/erpnext/config/projects.py b/erpnext/config/projects.py
index d591c9e..07149e3 100644
--- a/erpnext/config/projects.py
+++ b/erpnext/config/projects.py
@@ -32,6 +32,11 @@
 					"name": "Activity Type",
 					"description": _("Types of activities for Time Sheets"),
 				},
+				{
+					"type": "doctype",
+					"name": "Activity Cost",
+					"description": _("Cost of various activities"),
+				},
 			]
 		},
 		{
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index c622478..8a0c669 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -39,9 +39,8 @@
 
 	def before_recurring(self):
 		self.fiscal_year = None
-		for fieldname in ("due_date", "aging_date"):
-			if self.meta.get_field(fieldname):
-				self.set(fieldname, None)
+		if self.meta.get_field("due_date"):
+			self.due_date = None
 
 	def set_missing_values(self, for_validate=False):
 		for fieldname in ["posting_date", "transaction_date"]:
@@ -178,7 +177,6 @@
 			'posting_date': self.posting_date,
 			'voucher_type': self.doctype,
 			'voucher_no': self.name,
-			'aging_date': self.get("aging_date") or self.posting_date,
 			'remarks': self.get("remarks"),
 			'fiscal_year': self.fiscal_year,
 			'debit': 0,
@@ -358,7 +356,7 @@
 def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
 	"""common validation for currency and price list currency"""
 
-	company_currency = frappe.db.get_value("Company", company, "default_currency")
+	company_currency = frappe.db.get_value("Company", company, "default_currency", cache=True)
 
 	if not conversion_rate:
 		throw(_("{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}.").format(
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index 2af8738..898dd23 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -138,7 +138,7 @@
 	tax_accounts = frappe.db.sql("""select name, parent_account	from tabAccount
 		where tabAccount.docstatus!=2
 			and account_type in (%s)
-			and group_or_ledger = 'Ledger'
+			and is_group = 0
 			and company = %s
 			and `%s` LIKE %s
 		limit %s, %s""" %
@@ -147,7 +147,7 @@
 			start, page_len]))
 	if not tax_accounts:
 		tax_accounts = frappe.db.sql("""select name, parent_account	from tabAccount
-			where tabAccount.docstatus!=2 and group_or_ledger = 'Ledger'
+			where tabAccount.docstatus!=2 and is_group = 0
 				and company = %s and `%s` LIKE %s limit %s, %s"""
 			% ("%s", searchfield, "%s", "%s", "%s"),
 			(filters.get("company"), "%%%s%%" % txt, start, page_len))
@@ -281,8 +281,8 @@
 	elif isinstance(filters, list):
 		filter_list.extend(filters)
 
-	if "group_or_ledger" not in [d[1] for d in filter_list]:
-		filter_list.append(["Account", "group_or_ledger", "=", "Ledger"])
+	if "is_group" not in [d[1] for d in filter_list]:
+		filter_list.append(["Account", "is_group", "=", "0"])
 
 	if searchfield and txt:
 		filter_list.append([doctype, searchfield, "like", "%%%s%%" % txt])
diff --git a/erpnext/controllers/trends.py b/erpnext/controllers/trends.py
index 3d5e690..16387a5 100644
--- a/erpnext/controllers/trends.py
+++ b/erpnext/controllers/trends.py
@@ -31,7 +31,10 @@
 	for f in ["Fiscal Year", "Based On", "Period", "Company"]:
 		if not filters.get(f.lower().replace(" ", "_")):
 			frappe.throw(_("{0} is mandatory").format(f))
-
+			
+	if not frappe.db.exists("Fiscal Year", filters.get("fiscal_year")):
+		frappe.throw(_("Fiscal Year: {0} does not exists").format(filters.get("fiscal_year")))
+		
 	if filters.get("based_on") == filters.get("group_by"):
 		frappe.throw(_("'Based On' and 'Group By' can not be same"))
 
diff --git a/erpnext/controllers/website_list_for_contact.py b/erpnext/controllers/website_list_for_contact.py
index 3c9ae46..9282be2 100644
--- a/erpnext/controllers/website_list_for_contact.py
+++ b/erpnext/controllers/website_list_for_contact.py
@@ -22,7 +22,7 @@
 	from frappe.templates.pages.list import get_list
 	user = frappe.session.user
 
-	if user != "Guest" and is_website_user(user):
+	if user != "Guest" and is_website_user():
 		# find party for this contact
 		customers, suppliers = get_customers_suppliers(doctype, user)
 		if customers:
diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py
index 0fb8d48..b523416 100644
--- a/erpnext/crm/doctype/lead/lead.py
+++ b/erpnext/crm/doctype/lead/lead.py
@@ -11,14 +11,12 @@
 from erpnext.controllers.selling_controller import SellingController
 from erpnext.utilities.address_and_contact import load_address_and_contact
 
+sender_field = "email_id"
+
 class Lead(SellingController):
 	def get_feed(self):
 		return '{0}: {1}'.format(_(self.status), self.lead_name)
 
-	def set_sender(self, sender):
-		"""Will be called by **Communication** when a Lead is created from an incoming email."""
-		self.email_id = sender
-
 	def onload(self):
 		customer = frappe.db.get_value("Customer", {"lead_name": self.name})
 		self.get("__onload").is_customer = customer
diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py
index abf5fef..08d413f 100644
--- a/erpnext/crm/doctype/opportunity/opportunity.py
+++ b/erpnext/crm/doctype/opportunity/opportunity.py
@@ -2,32 +2,17 @@
 # License: GNU General Public License v3. See license.txt
 
 from __future__ import unicode_literals
-import frappe
+import frappe, json
 from frappe.utils import cstr, cint
 from frappe import msgprint, _
 from frappe.model.mapper import get_mapped_doc
 
 from erpnext.utilities.transaction_base import TransactionBase
 
+subject_field = "title"
+sender_field = "contact_email"
+
 class Opportunity(TransactionBase):
-	def set_sender(self, email_id):
-		"""Set lead against new opportunity"""
-		lead_name = frappe.db.get_value("Lead", {"email_id": email_id})
-		if not lead_name:
-			lead = frappe.get_doc({
-				"doctype": "Lead",
-				"email_id": email_id,
-				"lead_name": email_id
-			})
-			lead.insert(ignore_permissions=True)
-			lead_name = lead.name
-
-		self.enquiry_from = "Lead"
-		self.lead = lead_name
-
-	def set_subject(self, subject):
-		self.title = subject
-
 	def after_insert(self):
 		if self.lead:
 			frappe.get_doc("Lead", self.lead).set_status(update=True)
@@ -40,6 +25,8 @@
 				(not cint(self.get("__islocal"))) else None,
 		})
 
+		self.make_new_lead_if_required()
+
 		if not self.enquiry_from:
 			frappe.throw(_("Opportunity From field is mandatory"))
 
@@ -55,6 +42,22 @@
 		from erpnext.accounts.utils import validate_fiscal_year
 		validate_fiscal_year(self.transaction_date, self.fiscal_year, _("Opportunity Date"), self)
 
+	def make_new_lead_if_required(self):
+		"""Set lead against new opportunity"""
+		if not self.lead or self.customer:
+			lead_name = frappe.db.get_value("Lead", {"email_id": self.contact_email})
+			if not lead_name:
+				lead = frappe.get_doc({
+					"doctype": "Lead",
+					"email_id": self.contact_email,
+					"lead_name": self.contact_email
+				})
+				lead.insert(ignore_permissions=True)
+				lead_name = lead.name
+
+			self.enquiry_from = "Lead"
+			self.lead = lead_name
+
 	def declare_enquiry_lost(self,arg):
 		if not self.has_quotation():
 			frappe.db.set(self, 'status', 'Lost')
@@ -200,3 +203,11 @@
 	}, target_doc, set_missing_values)
 
 	return doclist
+
+@frappe.whitelist()
+def set_multiple_status(names, status):
+	names = json.loads(names)
+	for name in names:
+		opp = frappe.get_doc("Opportunity", name)
+		opp.status = status
+		opp.save()
diff --git a/erpnext/crm/doctype/opportunity/opportunity_list.js b/erpnext/crm/doctype/opportunity/opportunity_list.js
index 6c6c897..55a5463 100644
--- a/erpnext/crm/doctype/opportunity/opportunity_list.js
+++ b/erpnext/crm/doctype/opportunity/opportunity_list.js
@@ -6,5 +6,16 @@
 			indicator[1] = "green";
 		}
 		return indicator;
+	},
+	onload: function(listview) {
+		var method = "erpnext.crm.doctype.opportunity.opportunity.set_multiple_status";
+
+		listview.page.add_menu_item(__("Set as Open"), function() {
+			listview.call_for_selected_items(method, {"status": "Open"});
+		});
+
+		listview.page.add_menu_item(__("Set as Closed"), function() {
+			listview.call_for_selected_items(method, {"status": "Closed"});
+		});
 	}
 };
diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py
index 5e857f8..72a2686 100644
--- a/erpnext/hr/doctype/employee/employee.py
+++ b/erpnext/hr/doctype/employee/employee.py
@@ -6,7 +6,7 @@
 
 from frappe.utils import getdate, validate_email_add, today
 from frappe.model.naming import make_autoname
-from frappe import throw, _, msgprint
+from frappe import throw, _
 import frappe.permissions
 from frappe.model.document import Document
 from frappe.model.mapper import get_mapped_doc
@@ -139,8 +139,8 @@
 	def validate_employee_leave_approver(self):
 		for l in self.get("leave_approvers")[:]:
 			if "Leave Approver" not in frappe.get_roles(l.leave_approver):
-				self.get("leave_approvers").remove(l)
-				msgprint(_("{0} is not a valid Leave Approver. Removing row #{1}.").format(l.leave_approver, l.idx))
+				frappe.get_doc("User", l.leave_approver).add_roles("Leave Approver")
+
 
 	def validate_reports_to(self):
 		if self.reports_to == self.name:
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.js b/erpnext/hr/doctype/expense_claim/expense_claim.js
index 8076bf7..d279074 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.js
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.js
@@ -133,12 +133,14 @@
 cur_frm.cscript.calculate_total_amount = function(doc,cdt,cdn){
 	cur_frm.cscript.calculate_total(doc,cdt,cdn);
 }
+
 cur_frm.cscript.claim_amount = function(doc,cdt,cdn){
 	cur_frm.cscript.calculate_total(doc,cdt,cdn);
 
 	var child = locals[cdt][cdn];
 	refresh_field("sanctioned_amount", child.name, child.parentfield);
 }
+
 cur_frm.cscript.sanctioned_amount = function(doc,cdt,cdn){
 	cur_frm.cscript.calculate_total(doc,cdt,cdn);
 }
@@ -148,3 +150,30 @@
 		cur_frm.email_doc(frappe.boot.notification_settings.expense_claim_message);
 	}
 }
+
+erpnext.expense_claim = {
+	set_title :function(frm) {
+		if (!frm.doc.task) {
+			frm.set_value("title", frm.doc.employee_name);
+		}
+		else {
+			frm.set_value("title", frm.doc.employee_name + " for "+ frm.doc.task);
+		}
+	}
+}
+
+frappe.ui.form.on("Expense Claim", "employee_name", function(frm) {
+	erpnext.expense_claim.set_title(frm);
+});
+
+frappe.ui.form.on("Expense Claim", "task", function(frm) {
+	erpnext.expense_claim.set_title(frm);
+});
+
+cur_frm.fields_dict['task'].get_query = function(doc) {
+	return {
+		filters:{
+			'project': doc.project
+		}
+	}	
+}
\ No newline at end of file
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.json b/erpnext/hr/doctype/expense_claim/expense_claim.json
index ef3d617..e9e29a8 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.json
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.json
@@ -93,7 +93,8 @@
    "oldfieldname": "expense_voucher_details", 
    "oldfieldtype": "Table", 
    "options": "Expense Claim Detail", 
-   "permlevel": 0
+   "permlevel": 0, 
+   "reqd": 1
   }, 
   {
    "fieldname": "sb1", 
@@ -102,6 +103,7 @@
    "permlevel": 0
   }, 
   {
+   "default": "Today", 
    "fieldname": "posting_date", 
    "fieldtype": "Date", 
    "in_filter": 1, 
@@ -192,6 +194,21 @@
    "precision": ""
   }, 
   {
+   "fieldname": "task", 
+   "fieldtype": "Link", 
+   "label": "Task", 
+   "options": "Task", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "title", 
+   "fieldtype": "Data", 
+   "label": "Title", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "email_id", 
    "fieldtype": "Data", 
    "hidden": 1, 
@@ -220,7 +237,7 @@
  "icon": "icon-money", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-03-26 04:41:50.473196", 
+ "modified": "2015-05-02 07:42:25.202983", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Expense Claim", 
@@ -241,25 +258,6 @@
   }, 
   {
    "amend": 1, 
-   "apply_user_permissions": 0, 
-   "cancel": 1, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 0, 
-   "export": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "HR Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 1, 
-   "write": 1
-  }, 
-  {
-   "amend": 1, 
    "apply_user_permissions": 1, 
    "cancel": 1, 
    "create": 1, 
@@ -272,6 +270,7 @@
    "role": "Expense Approver", 
    "share": 1, 
    "submit": 1, 
+   "user_permission_doctypes": "[\"Company\",\"Expense Claim\",\"Fiscal Year\",\"Project\",\"Task\",\"User\"]", 
    "write": 1
   }, 
   {
@@ -288,11 +287,12 @@
    "role": "HR User", 
    "share": 1, 
    "submit": 1, 
+   "user_permission_doctypes": "[\"Company\",\"Expense Claim\",\"Fiscal Year\",\"Project\",\"Task\",\"User\"]", 
    "write": 1
   }
  ], 
  "search_fields": "approval_status,employee,employee_name", 
  "sort_field": "modified", 
  "sort_order": "DESC", 
- "title_field": "employee_name"
+ "title_field": "title"
 }
\ No newline at end of file
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.py b/erpnext/hr/doctype/expense_claim/expense_claim.py
index 76606e5..6687399 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.py
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import get_fullname
+from frappe.utils import get_fullname, flt
 from frappe.model.document import Document
 from erpnext.hr.utils import set_employee_name
 from erpnext.accounts.utils import validate_fiscal_year
@@ -18,19 +18,44 @@
 
 	def validate(self):
 		validate_fiscal_year(self.posting_date, self.fiscal_year, _("Posting Date"), self)
-		self.validate_exp_details()
+		self.validate_sanctioned_amount()
 		self.validate_expense_approver()
+		self.validate_task()
+		self.calculate_total_amount()
 		set_employee_name(self)
 
 	def on_submit(self):
 		if self.approval_status=="Draft":
 			frappe.throw(_("""Approval Status must be 'Approved' or 'Rejected'"""))
-
-	def validate_exp_details(self):
-		if not self.get('expenses'):
-			frappe.throw(_("Please add expense voucher details"))
+		if self.task:
+			self.update_task()
+			
+	def on_cancel(self):
+		if self.task:
+			self.update_task()
+			
+	def calculate_total_amount(self):
+		self.total_claimed_amount = 0 
+		self.total_sanctioned_amount = 0
+		for d in self.get('expenses'):
+			self.total_claimed_amount += flt(d.claim_amount)
+			self.total_sanctioned_amount += flt(d.sanctioned_amount)
 
 	def validate_expense_approver(self):
 		if self.exp_approver and "Expense Approver" not in frappe.get_roles(self.exp_approver):
 			frappe.throw(_("{0} ({1}) must have role 'Expense Approver'")\
 				.format(get_fullname(self.exp_approver), self.exp_approver), InvalidExpenseApproverError)
+	
+	def update_task(self):
+		task = frappe.get_doc("Task", self.task)
+		task.update_total_expense_claim()
+		task.save()
+
+	def validate_task(self):
+		if self.project and not self.task:
+			frappe.throw(_("Task is mandatory if Expense Claim is against a Project"))
+
+	def validate_sanctioned_amount(self):
+		for d in self.get('expenses'):
+			if flt(d.sanctioned_amount) > flt(d.claim_amount):
+				frappe.throw(_("Sanctioned Amount cannot be greater than Claim Amount in Row {0}.").format(d.idx))
\ No newline at end of file
diff --git a/erpnext/hr/doctype/expense_claim/test_expense_claim.py b/erpnext/hr/doctype/expense_claim/test_expense_claim.py
index f1c657a..a9091fb 100644
--- a/erpnext/hr/doctype/expense_claim/test_expense_claim.py
+++ b/erpnext/hr/doctype/expense_claim/test_expense_claim.py
@@ -8,4 +8,47 @@
 test_records = frappe.get_test_records('Expense Claim')
 
 class TestExpenseClaim(unittest.TestCase):
-	pass
+	def test_total_expense_claim_for_project(self):
+		frappe.db.sql("""delete from `tabTask` where project = "_Test Project 1" """)
+		frappe.db.sql("""delete from `tabProject` where name = "_Test Project 1" """)
+		
+		frappe.get_doc({
+			"project_name": "_Test Project 1",
+			"doctype": "Project",
+			"tasks" :
+				[{ "title": "_Test Project Task 1", "status": "Open" }]
+		}).save()
+		
+		task_name = frappe.db.get_value("Task",{"project": "_Test Project 1"})
+		expense_claim = frappe.get_doc({
+			 "doctype": "Expense Claim",
+			 "employee": "_T-Employee-0001",
+			 "approval_status": "Approved",
+			 "project": "_Test Project 1",
+			 "task": task_name,
+			 "expenses": 
+			 	[{ "expense_type": "Food", "claim_amount": 300, "sanctioned_amount": 200 }]
+		})
+		expense_claim.submit()
+		
+		self.assertEqual(frappe.db.get_value("Task", task_name, "total_expense_claim"), 200)
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_expense_claim"), 200)
+		
+		expense_claim2 = frappe.get_doc({
+			 "doctype": "Expense Claim",
+			 "employee": "_T-Employee-0001",
+			 "approval_status": "Approved",
+			 "project": "_Test Project 1",
+			 "task": task_name,
+			 "expenses": 
+			 	[{ "expense_type": "Food", "claim_amount": 600, "sanctioned_amount": 500 }]
+		})
+		expense_claim2.submit()
+		
+		self.assertEqual(frappe.db.get_value("Task", task_name, "total_expense_claim"), 700)
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_expense_claim"), 700)
+		
+		expense_claim2.cancel()
+		
+		self.assertEqual(frappe.db.get_value("Task", task_name, "total_expense_claim"), 200)
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_expense_claim"), 200)
diff --git a/erpnext/hr/doctype/expense_claim_detail/expense_claim_detail.json b/erpnext/hr/doctype/expense_claim_detail/expense_claim_detail.json
index d975189..c6123ee 100644
--- a/erpnext/hr/doctype/expense_claim_detail/expense_claim_detail.json
+++ b/erpnext/hr/doctype/expense_claim_detail/expense_claim_detail.json
@@ -16,6 +16,12 @@
    "width": "150px"
   }, 
   {
+   "fieldname": "column_break_2", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "expense_type", 
    "fieldtype": "Link", 
    "in_list_view": 1, 
@@ -29,6 +35,12 @@
    "width": "150px"
   }, 
   {
+   "fieldname": "section_break_4", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "description", 
    "fieldtype": "Small Text", 
    "in_list_view": 1, 
@@ -40,6 +52,12 @@
    "width": "300px"
   }, 
   {
+   "fieldname": "section_break_6", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "claim_amount", 
    "fieldtype": "Currency", 
    "in_list_view": 1, 
@@ -53,6 +71,12 @@
    "width": "150px"
   }, 
   {
+   "fieldname": "column_break_8", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "allow_on_submit": 0, 
    "fieldname": "sanctioned_amount", 
    "fieldtype": "Currency", 
@@ -69,7 +93,7 @@
  ], 
  "idx": 1, 
  "istable": 1, 
- "modified": "2014-05-09 02:16:38.529082", 
+ "modified": "2015-04-08 06:18:47.539134", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Expense Claim Detail", 
diff --git a/erpnext/hr/doctype/job_applicant/job_applicant.py b/erpnext/hr/doctype/job_applicant/job_applicant.py
index 90b0ec9..b0482cd 100644
--- a/erpnext/hr/doctype/job_applicant/job_applicant.py
+++ b/erpnext/hr/doctype/job_applicant/job_applicant.py
@@ -9,12 +9,14 @@
 from frappe import _
 from frappe.utils import comma_and
 
+sender_field = "email_id"
+
 class JobApplicant(Document):
 	def onload(self):
 		offer_letter = frappe.get_all("Offer Letter", filters={"job_applicant": self.name})
 		if offer_letter:
-			self.__onload.offer_letter = offer_letter[0].name
-	
+			self.get("__onload").offer_letter = offer_letter[0].name
+
 	def autoname(self):
 		keys = filter(None, (self.applicant_name, self.email_id))
 		if not keys:
@@ -31,6 +33,3 @@
 
 			if names:
 				frappe.throw(_("Email id must be unique, already exists for {0}").format(comma_and(names)), frappe.DuplicateEntryError)
-
-	def set_sender(self, sender):
-		self.email_id = sender
diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 2b4bbbd..7e72064 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -3,6 +3,10 @@
 
 cur_frm.add_fetch('employee','employee_name','employee_name');
 
+frappe.ui.form.on("Leave Application", "leave_approver", function(frm) {
+	frm.set_value("leave_approver_name", frappe.user.full_name(frm.doc.leave_approver));
+});
+
 cur_frm.cscript.onload = function(doc, dt, dn) {
 	if(!doc.posting_date)
 		set_multiple(dt,dn,{posting_date:get_today()});
@@ -13,7 +17,10 @@
 
 	cur_frm.set_query("leave_approver", function() {
 		return {
-			filters: [["UserRole", "role", "=", "Leave Approver"]]
+			query: "erpnext.hr.doctype.leave_application.leave_application.get_approvers",
+			filters: {
+				employee: cur_frm.doc.employee
+			}
 		};
 	});
 
@@ -106,18 +113,3 @@
 }
 
 cur_frm.fields_dict.employee.get_query = erpnext.queries.employee;
-
-frappe.ui.form.on("Leave Application", "leave_approver", function(frm) {
-	frappe.call({
-		"method": "frappe.client.get",
-		args: {
-			doctype: "User",
-			name: frm.doc.leave_approver
-		},
-		callback: function (data) {
-			frappe.model.set_value(frm.doctype, frm.docname, "leave_approver_name",
-				data.message.first_name
-				+ (data.message.last_name ? (" " + data.message.last_name) : ""))
-		}
-	})
-})
diff --git a/erpnext/hr/doctype/leave_application/leave_application.json b/erpnext/hr/doctype/leave_application/leave_application.json
index cb15d42..cd32b9c 100644
--- a/erpnext/hr/doctype/leave_application/leave_application.json
+++ b/erpnext/hr/doctype/leave_application/leave_application.json
@@ -17,17 +17,8 @@
    "permlevel": 1
   }, 
   {
-   "description": "Leave can be approved by users with Role, \"Leave Approver\"", 
-   "fieldname": "leave_approver", 
-   "fieldtype": "Link", 
-   "label": "Leave Approver", 
-   "options": "User", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "leave_approver_name", 
-   "fieldtype": "Read Only", 
-   "label": "Leave Approver Name", 
+   "fieldname": "column_break_12", 
+   "fieldtype": "Column Break", 
    "permlevel": 0, 
    "precision": ""
   }, 
@@ -44,6 +35,20 @@
    "search_index": 1
   }, 
   {
+   "fieldname": "leave_balance", 
+   "fieldtype": "Float", 
+   "label": "Leave Balance Before Application", 
+   "no_copy": 1, 
+   "permlevel": 0, 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "section_break_5", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "from_date", 
    "fieldtype": "Date", 
    "in_list_view": 1, 
@@ -68,6 +73,15 @@
    "permlevel": 0
   }, 
   {
+   "fieldname": "total_leave_days", 
+   "fieldtype": "Float", 
+   "in_list_view": 1, 
+   "label": "Total Leave Days", 
+   "no_copy": 1, 
+   "permlevel": 0, 
+   "read_only": 1
+  }, 
+  {
    "fieldname": "column_break1", 
    "fieldtype": "Column Break", 
    "permlevel": 0, 
@@ -81,6 +95,12 @@
    "permlevel": 0
   }, 
   {
+   "fieldname": "section_break_7", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "employee", 
    "fieldtype": "Link", 
    "in_filter": 1, 
@@ -101,38 +121,33 @@
    "search_index": 0
   }, 
   {
-   "fieldname": "leave_balance", 
-   "fieldtype": "Float", 
-   "label": "Leave Balance Before Application", 
-   "no_copy": 1, 
+   "fieldname": "column_break_15", 
+   "fieldtype": "Column Break", 
    "permlevel": 0, 
-   "read_only": 1
+   "precision": ""
   }, 
   {
-   "fieldname": "total_leave_days", 
-   "fieldtype": "Float", 
-   "in_list_view": 1, 
-   "label": "Total Leave Days", 
-   "no_copy": 1, 
+   "description": "", 
+   "fieldname": "leave_approver", 
+   "fieldtype": "Link", 
+   "label": "Leave Approver", 
+   "options": "User", 
+   "permlevel": 0
+  }, 
+  {
+   "fieldname": "leave_approver_name", 
+   "fieldtype": "Read Only", 
+   "label": "Leave Approver Name", 
    "permlevel": 0, 
-   "read_only": 1
+   "precision": ""
   }, 
   {
    "fieldname": "sb10", 
    "fieldtype": "Section Break", 
-   "label": "More Info", 
+   "label": "", 
    "permlevel": 0
   }, 
   {
-   "allow_on_submit": 1, 
-   "default": "1", 
-   "fieldname": "follow_via_email", 
-   "fieldtype": "Check", 
-   "label": "Follow via Email", 
-   "permlevel": 0, 
-   "print_hide": 1
-  }, 
-  {
    "default": "Today", 
    "fieldname": "posting_date", 
    "fieldtype": "Date", 
@@ -153,6 +168,15 @@
    "search_index": 0
   }, 
   {
+   "allow_on_submit": 1, 
+   "default": "1", 
+   "fieldname": "follow_via_email", 
+   "fieldtype": "Check", 
+   "label": "Follow via Email", 
+   "permlevel": 0, 
+   "print_hide": 1
+  }, 
+  {
    "fieldname": "column_break_17", 
    "fieldtype": "Column Break", 
    "permlevel": 0
@@ -192,7 +216,7 @@
  "idx": 1, 
  "is_submittable": 1, 
  "max_attachments": 3, 
- "modified": "2015-02-05 05:11:40.611487", 
+ "modified": "2015-04-30 02:19:39.330689", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Leave Application", 
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index d3bf358..c75c2bd 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -204,6 +204,17 @@
 		post(**{"txt": args.message, "contact": args.message_to, "subject": args.subject,
 			"notify": cint(self.follow_via_email)})
 
+@frappe.whitelist()
+def get_approvers(doctype, txt, searchfield, start, page_len, filters):
+	if not filters.get("employee"):
+		frappe.throw(_("Please select Employee Record first."))
+
+	return frappe.db.sql("""select user.name, user.first_name, user.last_name from
+		tabUser user, `tabEmployee Leave Approver` approver where
+		approver.parent = %s
+		and user.name like %s
+		and approver.leave_approver=user.name""", (filters.get("employee"), "%" + txt + "%"))
+
 def get_holidays(leave_app):
 	tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2, `tabEmployee` e1
 		where e1.name = %s and h1.parent = h2.name and e1.holiday_list = h2.name
diff --git a/erpnext/hr/doctype/leave_application/leave_application_list.js b/erpnext/hr/doctype/leave_application/leave_application_list.js
index e0558a7..f82dfb2 100644
--- a/erpnext/hr/doctype/leave_application/leave_application_list.js
+++ b/erpnext/hr/doctype/leave_application/leave_application_list.js
@@ -1,6 +1,6 @@
 frappe.listview_settings['Leave Application'] = {
 	add_fields: ["status", "leave_type", "employee", "employee_name", "total_leave_days", "from_date"],
-	filters:[["status","!=", "Rejected"], ["to_date", ">=", frappe.datetime.get_today()]],
+	filters:[["status","!=", "Rejected"]],
 	get_indicator: function(doc) {
 		return [__(doc.status), frappe.utils.guess_colour(doc.status),
 			"status,=," + doc.status];
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 14932d2..4c87dc7 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -388,6 +388,7 @@
 				and bom_item.docstatus < 2
 				and bom_item.parent = %(bom)s
 				and item.name = bom_item.item_code
+				and ifnull(item.is_stock_item, 'No') = 'Yes'
 				{conditions}
 				group by item_code, stock_uom"""
 
diff --git a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
index 2dc6ce8..0c25e8f 100644
--- a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
+++ b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
@@ -42,7 +42,7 @@
   }, 
   {
    "fieldname": "hour_rate", 
-   "fieldtype": "Currency", 
+   "fieldtype": "Float", 
    "in_list_view": 0, 
    "label": "Hour Rate", 
    "oldfieldname": "hour_rate", 
@@ -77,7 +77,7 @@
  ], 
  "idx": 1, 
  "istable": 1, 
- "modified": "2015-04-21 07:11:38.730014", 
+ "modified": "2015-04-22 03:24:47.809532", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "BOM Operation", 
diff --git a/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json b/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json
index 2034ae5..8313485 100644
--- a/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json
+++ b/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json
@@ -194,7 +194,7 @@
   {
    "allow_on_submit": 0, 
    "fieldname": "hour_rate", 
-   "fieldtype": "Currency", 
+   "fieldtype": "Float", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "in_filter": 0, 
@@ -293,7 +293,7 @@
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
- "modified": "2015-04-21 07:10:43.341203", 
+ "modified": "2015-04-22 03:25:18.542350", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Production Order Operation", 
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index 968c115..1298790 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -248,8 +248,10 @@
 					ifnull(sum(ifnull(fb.qty, 0)/ifnull(bom.quantity, 1)), 0) as qty,
 					fb.description, fb.stock_uom, it.min_order_qty
 					from `tabBOM Explosion Item` fb, `tabBOM` bom, `tabItem` it
-					where bom.name = fb.parent and it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No'
+					where bom.name = fb.parent and it.name = fb.item_code 
+					and ifnull(it.is_pro_applicable, 'No') = 'No'
 					and ifnull(it.is_sub_contracted_item, 'No') = 'No'
+					and ifnull(it.is_stock_item, 'No') = 'Yes'
 					and fb.docstatus<2 and bom.name=%s
 					group by item_code, stock_uom""", bom, as_dict=1):
 						bom_wise_item_details.setdefault(d.item_code, d)
@@ -262,6 +264,7 @@
 					from `tabBOM Item` bom_item, `tabBOM` bom, tabItem item
 					where bom.name = bom_item.parent and bom.name = %s and bom_item.docstatus < 2
 					and bom_item.item_code = item.name
+					and ifnull(item.is_stock_item, 'No') = 'Yes'
 					group by item_code""", bom, as_dict=1):
 						bom_wise_item_details.setdefault(d.item_code, d)
 
@@ -320,8 +323,9 @@
 				# shortage
 				requested_qty = total_qty - flt(item_projected_qty.get(item))
 				# consider minimum order qty
-				requested_qty = requested_qty > flt(so_item_qty[0][3]) and \
-					requested_qty or flt(so_item_qty[0][3])
+
+				if requested_qty < flt(so_item_qty[0][3]):
+					requested_qty = flt(so_item_qty[0][3])
 
 			# distribute requested qty SO wise
 			for item_details in so_item_qty:
diff --git a/erpnext/manufacturing/report/completed_production_orders/completed_production_orders.json b/erpnext/manufacturing/report/completed_production_orders/completed_production_orders.json
index 0ad6cc4..3c16810 100644
--- a/erpnext/manufacturing/report/completed_production_orders/completed_production_orders.json
+++ b/erpnext/manufacturing/report/completed_production_orders/completed_production_orders.json
@@ -5,12 +5,12 @@
  "doctype": "Report", 
  "idx": 1, 
  "is_standard": "Yes", 
- "modified": "2015-03-30 05:42:42.742398", 
+ "modified": "2015-04-24 21:04:02.944586", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Completed Production Orders", 
  "owner": "Administrator", 
- "query": "SELECT\n  `tabProduction Order`.name as \"Production Order:Link/Production Order:200\",\n  `tabProduction Order`.creation as \"Date:Date:120\",\n  `tabProduction Order`.production_item as \"Item:Link/Item:150\",\n  `tabProduction Order`.qty as \"To Produce:Int:100\",\n  `tabProduction Order`.produced_qty as \"Produced:Int:100\",\n  `tabProduction Order`.company as \"Company:Link/Company:\",\nFROM\n  `tabProduction Order`\nWHERE\n  `tabProduction Order`.docstatus=1\n  AND ifnull(`tabProduction Order`.produced_qty,0) = `tabProduction Order`.qty", 
+ "query": "SELECT\n  `tabProduction Order`.name as \"Production Order:Link/Production Order:200\",\n  `tabProduction Order`.creation as \"Date:Date:120\",\n  `tabProduction Order`.production_item as \"Item:Link/Item:150\",\n  `tabProduction Order`.qty as \"To Produce:Int:100\",\n  `tabProduction Order`.produced_qty as \"Produced:Int:100\",\n  `tabProduction Order`.company as \"Company:Link/Company:\"\nFROM\n  `tabProduction Order`\nWHERE\n  `tabProduction Order`.docstatus=1\n  AND ifnull(`tabProduction Order`.produced_qty,0) = `tabProduction Order`.qty", 
  "ref_doctype": "Production Order", 
  "report_name": "Completed Production Orders", 
  "report_type": "Query Report"
diff --git a/erpnext/manufacturing/report/open_production_orders/open_production_orders.json b/erpnext/manufacturing/report/open_production_orders/open_production_orders.json
index bb32326..860f81d 100644
--- a/erpnext/manufacturing/report/open_production_orders/open_production_orders.json
+++ b/erpnext/manufacturing/report/open_production_orders/open_production_orders.json
@@ -5,12 +5,12 @@
  "doctype": "Report", 
  "idx": 1, 
  "is_standard": "Yes", 
- "modified": "2015-03-30 05:43:59.976254", 
+ "modified": "2015-04-23 03:26:35.711681", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Open Production Orders", 
  "owner": "Administrator", 
- "query": "SELECT\n  `tabProduction Order`.name as \"Production Order:Link/Production Order:200\",\n  `tabProduction Order`.creation as \"Date:Date:120\",\n  `tabProduction Order`.production_item as \"Item:Link/Item:150\",\n  `tabProduction Order`.qty as \"To Produce:Int:100\",\n  `tabProduction Order`.produced_qty as \"Produced:Int:100\",\n  `tabProduction Order`.company as \"Company:Link/Company:\",\nFROM\n  `tabProduction Order`\nWHERE\n  `tabProduction Order`.docstatus=1\n  AND ifnull(`tabProduction Order`.produced_qty,0) < `tabProduction Order`.qty\n  AND NOT EXISTS (SELECT name from `tabStock Entry` where production_order =`tabProduction Order`.name) ", 
+ "query": "SELECT\n  `tabProduction Order`.name as \"Production Order:Link/Production Order:200\",\n  `tabProduction Order`.creation as \"Date:Date:120\",\n  `tabProduction Order`.production_item as \"Item:Link/Item:150\",\n  `tabProduction Order`.qty as \"To Produce:Int:100\",\n  `tabProduction Order`.produced_qty as \"Produced:Int:100\",\n  `tabProduction Order`.company as \"Company:Link/Company:\"\nFROM\n  `tabProduction Order`\nWHERE\n  `tabProduction Order`.docstatus=1\n  AND ifnull(`tabProduction Order`.produced_qty,0) < `tabProduction Order`.qty\n  AND NOT EXISTS (SELECT name from `tabStock Entry` where production_order =`tabProduction Order`.name) ", 
  "ref_doctype": "Production Order", 
  "report_name": "Open Production Orders", 
  "report_type": "Query Report"
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 0e0fda9..e147ee3 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -101,6 +101,7 @@
 execute:frappe.reload_doc('crm', 'doctype', 'opportunity')
 erpnext.patches.v5_0.rename_table_fieldnames
 execute:frappe.db.sql("update `tabJournal Entry` set voucher_type='Journal Entry' where ifnull(voucher_type, '')=''")
+erpnext.patches.v5_0.is_group
 erpnext.patches.v4_2.party_model
 erpnext.patches.v5_0.party_model_patch_fix
 erpnext.patches.v4_1.fix_jv_remarks
@@ -143,3 +144,7 @@
 erpnext.patches.v5_0.execute_on_doctype_update
 erpnext.patches.v4_2.fix_recurring_orders
 erpnext.patches.v4_2.delete_gl_entries_for_cancelled_invoices
+erpnext.patches.v5_0.project_costing
+erpnext.patches.v5_0.update_temporary_account
+erpnext.patches.v5_0.update_advance_paid
+erpnext.patches.v5_0.link_warehouse_with_account
\ No newline at end of file
diff --git a/erpnext/patches/v4_2/party_model.py b/erpnext/patches/v4_2/party_model.py
index bb4ff0b..d105349 100644
--- a/erpnext/patches/v4_2/party_model.py
+++ b/erpnext/patches/v4_2/party_model.py
@@ -15,24 +15,21 @@
 		delete_individual_party_account()
 		remove_customer_supplier_account_report()
 
-
-def link_warehouse_account():
-	frappe.db.sql("""update tabAccount set warehouse=master_name
-		where ifnull(account_type, '') = 'Warehouse' and ifnull(master_name, '') != ''""")
-
 def create_receivable_payable_account():
 	receivable_payable_accounts = frappe._dict()
 
 	def _create_account(args):
-		account = frappe.new_doc("Account")
-		account.group_or_ledger = "Ledger"
-		account.update(args)
-		account.insert()
+		if not frappe.db.get_value("Account", 
+				{"account_name": args["account_name"], "company": args["company"]}):
+			account = frappe.new_doc("Account")
+			account.is_group = 0
+			account.update(args)
+			account.insert()
 
-		frappe.db.set_value("Company", args["company"], ("default_receivable_account"
-			if args["account_type"]=="Receivable" else "default_payable_account"), account.name)
+			frappe.db.set_value("Company", args["company"], ("default_receivable_account"
+				if args["account_type"]=="Receivable" else "default_payable_account"), account.name)
 
-		receivable_payable_accounts.setdefault(args["company"], {}).setdefault(args["account_type"], account.name)
+			receivable_payable_accounts.setdefault(args["company"], {}).setdefault(args["account_type"], account.name)
 
 	for company in frappe.db.sql_list("select name from tabCompany"):
 		_create_account({
@@ -52,8 +49,11 @@
 	return receivable_payable_accounts
 
 def get_parent_account(company, master_type):
-	parent_account = frappe.db.get_value("Company", company,
-		"receivables_group" if master_type=="Customer" else "payables_group")
+	parent_account = None
+	
+	if "receivables_group" in frappe.db.get_table_columns("Company"):
+		parent_account = frappe.db.get_value("Company", company,
+			"receivables_group" if master_type=="Customer" else "payables_group")
 	if not parent_account:
 		parent_account = frappe.db.get_value("Account", {"company": company,
 			"account_name": "Accounts Receivable" if master_type=="Customer" else "Accounts Payable"})
@@ -78,7 +78,8 @@
 		return
 
 	for dt in ["Journal Entry Account", "GL Entry"]:
-		records = frappe.db.sql("""select name, account from `tab%s` where account in (%s)""" %
+		records = frappe.db.sql("""select name, account from `tab%s` 
+			where account in (%s) and ifnull(party, '') = ''""" % 
 			(dt, ", ".join(['%s']*len(account_map))), tuple(account_map.keys()), as_dict=1)
 		for i, d in enumerate(records):
 			account_details = account_map.get(d.account, {})
@@ -87,7 +88,7 @@
 
 			frappe.db.sql("update `tab{0}` set account=%s, party_type=%s, party=%s where name=%s".format(dt),
 				(new_account, account_details.get("master_type"), account_details.get("master_name"), d.name))
-				
+
 			if i%500 == 0:
 				frappe.db.commit()
 
diff --git a/erpnext/patches/v5_0/is_group.py b/erpnext/patches/v5_0/is_group.py
new file mode 100644
index 0000000..4e3f760
--- /dev/null
+++ b/erpnext/patches/v5_0/is_group.py
@@ -0,0 +1,9 @@
+from __future__ import unicode_literals
+
+import frappe
+
+def execute():
+	frappe.reload_doctype("Account")
+	frappe.reload_doctype("Cost Center")
+	frappe.db.sql("update tabAccount set is_group = if(group_or_ledger='Group', 1, 0)")
+	frappe.db.sql("update `tabCost Center` set is_group = if(group_or_ledger='Group', 1, 0)")
diff --git a/erpnext/patches/v5_0/link_warehouse_with_account.py b/erpnext/patches/v5_0/link_warehouse_with_account.py
new file mode 100644
index 0000000..338fd7a
--- /dev/null
+++ b/erpnext/patches/v5_0/link_warehouse_with_account.py
@@ -0,0 +1,10 @@
+# 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
+
+def execute():
+	if "master_name" in frappe.db.get_table_columns("Account"):	
+		frappe.db.sql("""update tabAccount set warehouse=master_name
+			where ifnull(account_type, '') = 'Warehouse' and ifnull(master_name, '') != ''""")
\ No newline at end of file
diff --git a/erpnext/patches/v5_0/project_costing.py b/erpnext/patches/v5_0/project_costing.py
new file mode 100644
index 0000000..33bb9c1
--- /dev/null
+++ b/erpnext/patches/v5_0/project_costing.py
@@ -0,0 +1,7 @@
+import frappe
+
+def execute():
+	frappe.reload_doctype("Project")
+	frappe.db.sql("update `tabProject` set expected_start_date = project_start_date, \
+		expected_end_date = completion_date, actual_end_date = act_completion_date, \
+		estimated_costing = project_value, gross_margin = gross_margin_value")
\ No newline at end of file
diff --git a/erpnext/patches/v5_0/taxes_and_totals_in_party_currency.py b/erpnext/patches/v5_0/taxes_and_totals_in_party_currency.py
index 97efe6f..c595f4e 100644
--- a/erpnext/patches/v5_0/taxes_and_totals_in_party_currency.py
+++ b/erpnext/patches/v5_0/taxes_and_totals_in_party_currency.py
@@ -3,6 +3,8 @@
 # License: GNU General Public License v3. See license.txt
 
 import frappe
+from frappe.model.meta import get_field_precision
+from frappe.custom.doctype.property_setter.property_setter import make_property_setter
 
 def execute():
 	selling_doctypes = ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"]
@@ -18,19 +20,32 @@
 	frappe.reload_doctype(dt)
 	frappe.reload_doctype(dt + " Item")
 	frappe.reload_doctype(tax_table)
-
+	
+	net_total_precision = get_field_precision(frappe.get_meta(dt).get_field("net_total"))
+	for field in ("total", "base_total", "base_net_total"):
+		make_property_setter(dt, field, "precision", net_total_precision, "Select")
+	
+	rate_field_precision = get_field_precision(frappe.get_meta(dt + " Item").get_field("rate"))
+	for field in ("net_rate", "base_net_rate", "net_amount", "base_net_amount", "base_rate", "base_amount"):
+		make_property_setter(dt + " Item", field, "precision", rate_field_precision, "Select")
+		
+	tax_amount_precision = get_field_precision(frappe.get_meta(tax_table).get_field("tax_amount"))
+	for field in ("base_tax_amount", "total", "base_total", "tax_amount_after_discount_amount", 
+		"base_tax_amount_after_discount_amount"):
+			make_property_setter(tax_table, field, "precision", tax_amount_precision, "Select")
+	
 	# update net_total, discount_on
 	frappe.db.sql("""
 		UPDATE
 			`tab{0}`
 		SET
-			total = net_total,
-			base_total = net_total*conversion_rate,
-			net_total = base_net_total / conversion_rate,
+			total = round(net_total, {1}),
+			base_total = round(net_total*conversion_rate, {1}),
+			net_total = round(base_net_total / conversion_rate, {1}),
 			apply_discount_on = "Grand Total"
 		WHERE
 			docstatus < 2
-	""".format(dt))
+	""".format(dt, net_total_precision))
 
 
 	# update net_amount
@@ -40,14 +55,14 @@
 		SET
 			item.base_net_amount = item.base_amount,
 			item.base_net_rate = item.base_rate,
-			item.net_amount = item.base_net_amount / par.conversion_rate,
-			item.net_rate = item.base_net_rate / par.conversion_rate,
-			item.base_amount = item.amount * par.conversion_rate,
-			item.base_rate = item.rate * par.conversion_rate
+			item.net_amount = round(item.base_net_amount / par.conversion_rate, {2}),
+			item.net_rate = round(item.base_net_rate / par.conversion_rate, {2}),
+			item.base_amount = round(item.amount * par.conversion_rate, {2}),
+			item.base_rate = round(item.rate * par.conversion_rate, {2})
 		WHERE
 			par.name = item.parent
 			and par.docstatus < 2
-	""".format(dt, dt + " Item"))
+	""".format(dt, dt + " Item", rate_field_precision))
 
 	# update tax in party currency
 	frappe.db.sql("""
@@ -55,12 +70,12 @@
 			`tab{0}` par, `tab{1}` tax
 		SET
 			tax.base_tax_amount = tax.tax_amount,
-			tax.tax_amount = tax.base_tax_amount / par.conversion_rate,
-			tax.base_total = tax.total,
-			tax.total = tax.base_total / conversion_rate,
-			tax.base_tax_amount_after_discount_amount = tax.tax_amount_after_discount_amount,
-			tax.tax_amount_after_discount_amount = tax.base_tax_amount_after_discount_amount / conversion_rate
+			tax.tax_amount = round(tax.base_tax_amount / par.conversion_rate, {2}),
+			tax.base_total = round(tax.total, {2}),
+			tax.total = round(tax.base_total / conversion_rate, {2}),
+			tax.base_tax_amount_after_discount_amount = round(tax.tax_amount_after_discount_amount, {2}),
+			tax.tax_amount_after_discount_amount = round(tax.base_tax_amount_after_discount_amount / conversion_rate, {2})
 		WHERE
 			par.name = tax.parent
 			and par.docstatus < 2
-	""".format(dt, tax_table))
+	""".format(dt, tax_table, tax_amount_precision))
diff --git a/erpnext/patches/v5_0/update_advance_paid.py b/erpnext/patches/v5_0/update_advance_paid.py
new file mode 100644
index 0000000..74e71e8
--- /dev/null
+++ b/erpnext/patches/v5_0/update_advance_paid.py
@@ -0,0 +1,13 @@
+# 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
+
+def execute():
+	for dt in ("Sales Order", "Purchase Order"):
+		orders_with_advance = frappe.db.sql("""select name from `tab{0}` 
+			where docstatus < 2 and ifnull(advance_paid, 0) != 0""".format(dt), as_dict=1)
+			
+		for order in orders_with_advance:
+			frappe.get_doc(dt, order.name).set_total_advance_paid()
\ No newline at end of file
diff --git a/erpnext/patches/v5_0/update_item_description_and_image.py b/erpnext/patches/v5_0/update_item_description_and_image.py
index 7e61314..6b47052 100644
--- a/erpnext/patches/v5_0/update_item_description_and_image.py
+++ b/erpnext/patches/v5_0/update_item_description_and_image.py
@@ -30,7 +30,8 @@
 			
 		count = 1
 		for d in records:
-			if cstr(d.description) == item_details.get(d.item_code).old_description:
+			if d.item_code and item_details.get(d.item_code) \
+					and cstr(d.description) == item_details.get(d.item_code).old_description:
 				image_url = item_details.get(d.item_code).image_url
 				desc = item_details.get(d.item_code).new_description
 			else:
diff --git a/erpnext/patches/v5_0/update_projects.py b/erpnext/patches/v5_0/update_projects.py
index f49bc66..edb18af 100644
--- a/erpnext/patches/v5_0/update_projects.py
+++ b/erpnext/patches/v5_0/update_projects.py
@@ -3,6 +3,8 @@
 def execute():
 	# convert milestones to tasks
 	frappe.reload_doctype("Project")
+	frappe.reload_doc("projects", "doctype", "project_task")
+	frappe.reload_doctype("Task")
 
 	for m in frappe.get_all("Project Milestone", "*"):
 		if (m.milestone and m.milestone_date
diff --git a/erpnext/patches/v5_0/update_temporary_account.py b/erpnext/patches/v5_0/update_temporary_account.py
new file mode 100644
index 0000000..078c871
--- /dev/null
+++ b/erpnext/patches/v5_0/update_temporary_account.py
@@ -0,0 +1,9 @@
+# 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
+
+def execute():
+	frappe.db.sql("""Update `tabAccount` set account_type = 'Temporary' 
+		where account_name in ('Temporary Assets', 'Temporary Liabilities', 'Temporary Opening')""")
\ No newline at end of file
diff --git a/erpnext/projects/doctype/activity_cost/__init__.py b/erpnext/projects/doctype/activity_cost/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/projects/doctype/activity_cost/__init__.py
diff --git a/erpnext/projects/doctype/activity_cost/activity_cost.json b/erpnext/projects/doctype/activity_cost/activity_cost.json
new file mode 100644
index 0000000..7f7720a
--- /dev/null
+++ b/erpnext/projects/doctype/activity_cost/activity_cost.json
@@ -0,0 +1,170 @@
+{
+ "allow_copy": 0, 
+ "allow_import": 1, 
+ "allow_rename": 1, 
+ "autoname": "Activity Cost - .#", 
+ "creation": "2015-03-23 02:00:21.861546", 
+ "custom": 0, 
+ "docstatus": 0, 
+ "doctype": "DocType", 
+ "document_type": "Master", 
+ "fields": [
+  {
+   "allow_on_submit": 0, 
+   "fieldname": "employee", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Employee", 
+   "no_copy": 0, 
+   "options": "Employee", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0
+  }, 
+  {
+   "fieldname": "employee_name", 
+   "fieldtype": "Read Only", 
+   "label": "Employee Name", 
+   "options": "employee.employee_name", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "column_break_2", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "fieldname": "activity_type", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Activity Type", 
+   "no_copy": 0, 
+   "options": "Activity Type", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0
+  }, 
+  {
+   "fieldname": "section_break_4", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "default": "0", 
+   "description": "per hour", 
+   "fieldname": "billing_rate", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Billing Rate", 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0
+  }, 
+  {
+   "fieldname": "column_break_6", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "default": "0", 
+   "description": "per hour", 
+   "fieldname": "costing_rate", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Costing Rate", 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0
+  }, 
+  {
+   "fieldname": "title", 
+   "fieldtype": "Data", 
+   "hidden": 1, 
+   "label": "title", 
+   "no_copy": 1, 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }
+ ], 
+ "hide_heading": 0, 
+ "hide_toolbar": 0, 
+ "in_create": 0, 
+ "in_dialog": 0, 
+ "is_submittable": 0, 
+ "issingle": 0, 
+ "istable": 0, 
+ "modified": "2015-04-14 02:08:33.690406", 
+ "modified_by": "Administrator", 
+ "module": "Projects", 
+ "name": "Activity Cost", 
+ "name_case": "", 
+ "owner": "Administrator", 
+ "permissions": [
+  {
+   "amend": 0, 
+   "apply_user_permissions": 0, 
+   "cancel": 0, 
+   "create": 1, 
+   "delete": 1, 
+   "email": 1, 
+   "export": 1, 
+   "import": 0, 
+   "permlevel": 0, 
+   "print": 1, 
+   "read": 1, 
+   "report": 1, 
+   "role": "Projects User", 
+   "set_user_permissions": 0, 
+   "share": 1, 
+   "submit": 0, 
+   "write": 1
+  }
+ ], 
+ "read_only": 0, 
+ "read_only_onload": 0, 
+ "sort_field": "modified", 
+ "sort_order": "DESC", 
+ "title_field": "title"
+}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/activity_cost/activity_cost.py b/erpnext/projects/doctype/activity_cost/activity_cost.py
new file mode 100644
index 0000000..121e650
--- /dev/null
+++ b/erpnext/projects/doctype/activity_cost/activity_cost.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+from frappe.model.document import Document
+
+class DuplicationError(frappe.ValidationError): pass
+
+class ActivityCost(Document):
+	def validate(self):
+		self.set_title()
+		self.check_unique()
+		
+	def set_title(self):
+		self.title = _("{0} for {1}").format(self.employee_name, self.activity_type)
+		
+	def check_unique(self):
+		if frappe.db.sql("""select name from `tabActivity Cost` where employee_name= %s and activity_type= %s and name != %s""",
+			(self.employee_name, self.activity_type, self.name)):
+				frappe.throw(_("Activity Cost exists for Employee {0} against Activity Type - {1}")
+					.format(self.employee, self.activity_type), DuplicationError)
diff --git a/erpnext/projects/doctype/activity_cost/test_activity_cost.py b/erpnext/projects/doctype/activity_cost/test_activity_cost.py
new file mode 100644
index 0000000..5afd97f
--- /dev/null
+++ b/erpnext/projects/doctype/activity_cost/test_activity_cost.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+
+from erpnext.projects.doctype.activity_cost.activity_cost import DuplicationError
+
+class TestActivityCost(unittest.TestCase):
+	def test_duplication(self):
+		frappe.db.sql("delete from `tabActivity Cost`")
+		activity_cost1 = frappe.new_doc('Activity Cost')
+		activity_cost1.update({
+			"employee": "_T-Employee-0001",
+			"employee_name": "_Test Employee",
+			"activity_type": "_Test Activity Type",
+			"billing_rate": 100,
+			"costing_rate": 50
+		})
+		activity_cost1.insert()
+		activity_cost2 = frappe.copy_doc(activity_cost1)
+		self.assertRaises(DuplicationError, activity_cost2.insert )
diff --git a/erpnext/projects/doctype/activity_cost/test_records.json b/erpnext/projects/doctype/activity_cost/test_records.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/erpnext/projects/doctype/activity_cost/test_records.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js
index eeedeb0..aa55876 100644
--- a/erpnext/projects/doctype/project/project.js
+++ b/erpnext/projects/doctype/project/project.js
@@ -1,6 +1,19 @@
 // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
+frappe.ui.form.on("Project", {
+	onload: function(frm) {
+		var so = frappe.meta.get_docfield("Project", "sales_order");
+		so.get_route_options_for_new_doc = function(field) {
+			if(frm.is_new()) return;
+			return {
+				"customer": frm.doc.customer,
+				"project_name": frm.doc.name
+			}
+		}
+	}
+});
+
 frappe.ui.form.on("Project Task", "edit_task", function(frm, doctype, name) {
 	var doc = frappe.get_doc(doctype, name);
 	if(doc.task_id) {
@@ -14,13 +27,21 @@
 cur_frm.cscript.refresh = function(doc) {
 	if(!doc.__islocal) {
 		cur_frm.add_custom_button(__("Gantt Chart"), function() {
-			frappe.route_options = {"project": doc.name, "start": doc.project_start_date, "end": doc.completion_date};
+			frappe.route_options = {"project": doc.name, "start": doc.expected_start_date, "end": doc.expected_end_date};
 			frappe.set_route("Gantt", "Task");
 		}, "icon-tasks", true);
 		cur_frm.add_custom_button(__("Tasks"), function() {
 			frappe.route_options = {"project": doc.name}
 			frappe.set_route("List", "Task");
 		}, "icon-list", true);
+		cur_frm.add_custom_button(__("Time Logs"), function() {
+			frappe.route_options = {"project": doc.name}
+			frappe.set_route("List", "Time Log");
+		}, "icon-list", true);
+		cur_frm.add_custom_button(__("Expense Claims"), function() {
+			frappe.route_options = {"project": doc.name}
+			frappe.set_route("List", "Expense Claim");
+		}, "icon-list", true);
 	}
 }
 
@@ -29,3 +50,11 @@
 		query: "erpnext.controllers.queries.customer_query"
 	}
 }
+
+cur_frm.fields_dict['sales_order'].get_query = function(doc) {
+	return {
+		filters:{
+			'project_name': doc.name
+		}
+	}	
+}
diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json
index 6a143ab..2aca991 100644
--- a/erpnext/projects/doctype/project/project.json
+++ b/erpnext/projects/doctype/project/project.json
@@ -8,19 +8,6 @@
  "document_type": "Master", 
  "fields": [
   {
-   "fieldname": "overview", 
-   "fieldtype": "Section Break", 
-   "label": "Overview", 
-   "options": "icon-file", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "cb_project_status", 
-   "fieldtype": "Column Break", 
-   "label": "Status", 
-   "permlevel": 0
-  }, 
-  {
    "description": "", 
    "fieldname": "project_name", 
    "fieldtype": "Data", 
@@ -46,6 +33,23 @@
    "search_index": 1
   }, 
   {
+   "fieldname": "project_type", 
+   "fieldtype": "Select", 
+   "label": "Project Type", 
+   "no_copy": 0, 
+   "oldfieldname": "project_type", 
+   "oldfieldtype": "Data", 
+   "options": "Internal\nExternal\nOther", 
+   "permlevel": 0, 
+   "search_index": 0
+  }, 
+  {
+   "fieldname": "column_break_5", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "is_active", 
    "fieldtype": "Select", 
    "label": "Is Active", 
@@ -69,16 +73,16 @@
    "search_index": 0
   }, 
   {
-   "fieldname": "cb_project_dates", 
-   "fieldtype": "Column Break", 
-   "label": "Dates", 
-   "permlevel": 0
+   "fieldname": "section_break_12", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
   }, 
   {
-   "fieldname": "project_start_date", 
+   "fieldname": "expected_start_date", 
    "fieldtype": "Date", 
    "in_filter": 1, 
-   "label": "Project Start Date", 
+   "label": "Expected Start Date", 
    "no_copy": 0, 
    "oldfieldname": "project_start_date", 
    "oldfieldtype": "Date", 
@@ -86,9 +90,15 @@
    "search_index": 0
   }, 
   {
-   "fieldname": "completion_date", 
+   "fieldname": "column_break_11", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "expected_end_date", 
    "fieldtype": "Date", 
-   "label": "Completion Date", 
+   "label": "Expected End Date", 
    "no_copy": 0, 
    "oldfieldname": "completion_date", 
    "oldfieldtype": "Date", 
@@ -96,25 +106,40 @@
    "search_index": 0
   }, 
   {
-   "fieldname": "act_completion_date", 
-   "fieldtype": "Date", 
-   "label": "Actual Completion Date", 
-   "no_copy": 0, 
-   "oldfieldname": "act_completion_date", 
-   "oldfieldtype": "Date", 
-   "permlevel": 0, 
-   "search_index": 0
+   "fieldname": "customer_details", 
+   "fieldtype": "Section Break", 
+   "label": "", 
+   "oldfieldtype": "Section Break", 
+   "options": "icon-user", 
+   "permlevel": 0
   }, 
   {
-   "fieldname": "project_type", 
-   "fieldtype": "Select", 
-   "label": "Project Type", 
+   "fieldname": "customer", 
+   "fieldtype": "Link", 
+   "in_filter": 1, 
+   "label": "Customer", 
    "no_copy": 0, 
-   "oldfieldname": "project_type", 
-   "oldfieldtype": "Data", 
-   "options": "Internal\nExternal\nOther", 
+   "oldfieldname": "customer", 
+   "oldfieldtype": "Link", 
+   "options": "Customer", 
    "permlevel": 0, 
-   "search_index": 0
+   "print_hide": 1, 
+   "reqd": 0, 
+   "search_index": 1
+  }, 
+  {
+   "fieldname": "column_break_14", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "sales_order", 
+   "fieldtype": "Link", 
+   "label": "Sales Order", 
+   "options": "Sales Order", 
+   "permlevel": 0, 
+   "precision": ""
   }, 
   {
    "fieldname": "sb_milestones", 
@@ -130,7 +155,8 @@
    "label": "Tasks", 
    "options": "Project Task", 
    "permlevel": 0, 
-   "precision": ""
+   "precision": "", 
+   "reqd": 0
   }, 
   {
    "fieldname": "percent_complete", 
@@ -159,25 +185,55 @@
    "search_index": 0
   }, 
   {
-   "fieldname": "company", 
-   "fieldtype": "Link", 
-   "label": "Company", 
-   "options": "Company", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "project_details", 
+   "fieldname": "section_break_18", 
    "fieldtype": "Section Break", 
-   "label": "Project Costing", 
-   "oldfieldtype": "Section Break", 
-   "options": "icon-money", 
-   "permlevel": 0
+   "permlevel": 0, 
+   "precision": ""
   }, 
   {
-   "fieldname": "project_value", 
+   "fieldname": "actual_start_date", 
+   "fieldtype": "Data", 
+   "label": "Actual Start Date", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "actual_time", 
+   "fieldtype": "Float", 
+   "label": "Actual Time (in Hours)", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "column_break_20", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "actual_end_date", 
+   "fieldtype": "Date", 
+   "label": "Actual End Date", 
+   "no_copy": 0, 
+   "oldfieldname": "act_completion_date", 
+   "oldfieldtype": "Date", 
+   "permlevel": 0, 
+   "read_only": 1, 
+   "search_index": 0
+  }, 
+  {
+   "fieldname": "section_break_26", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "estimated_costing", 
    "fieldtype": "Currency", 
    "in_list_view": 1, 
-   "label": "Project Value", 
+   "label": "Estimated Costing", 
    "no_copy": 0, 
    "oldfieldname": "project_value", 
    "oldfieldtype": "Currency", 
@@ -187,15 +243,17 @@
    "search_index": 0
   }, 
   {
-   "fieldname": "est_material_cost", 
-   "fieldtype": "Currency", 
-   "label": "Estimated Material Cost", 
-   "no_copy": 0, 
-   "oldfieldname": "est_material_cost", 
-   "oldfieldtype": "Currency", 
-   "options": "Company:company:default_currency", 
+   "fieldname": "column_break_22", 
+   "fieldtype": "Column Break", 
    "permlevel": 0, 
-   "search_index": 0
+   "precision": ""
+  }, 
+  {
+   "fieldname": "company", 
+   "fieldtype": "Link", 
+   "label": "Company", 
+   "options": "Company", 
+   "permlevel": 0
   }, 
   {
    "fieldname": "cost_center", 
@@ -205,64 +263,100 @@
    "permlevel": 0
   }, 
   {
-   "fieldname": "column_break0", 
+   "fieldname": "project_details", 
+   "fieldtype": "Section Break", 
+   "label": "", 
+   "oldfieldtype": "Section Break", 
+   "options": "icon-money", 
+   "permlevel": 0
+  }, 
+  {
+   "description": "", 
+   "fieldname": "total_costing_amount", 
+   "fieldtype": "Currency", 
+   "label": "Total Costing Amount (via Time Logs)", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "description": "", 
+   "fieldname": "total_expense_claim", 
+   "fieldtype": "Currency", 
+   "label": "Total Expense Claim (via Expense Claims)", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "column_break_28", 
    "fieldtype": "Column Break", 
-   "label": "Margin", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "description": "", 
+   "fieldname": "total_billing_amount", 
+   "fieldtype": "Currency", 
+   "label": "Total Billing Amount (via Time Logs)", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "total_purchase_cost", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "label": "Total Purchase Cost (via Purchase Invoice)", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "margin", 
+   "fieldtype": "Section Break", 
+   "label": "", 
    "oldfieldtype": "Column Break", 
    "permlevel": 0, 
    "width": "50%"
   }, 
   {
-   "fieldname": "gross_margin_value", 
+   "fieldname": "gross_margin", 
    "fieldtype": "Currency", 
-   "label": "Gross Margin Value", 
+   "label": "Gross Margin", 
    "no_copy": 0, 
    "oldfieldname": "gross_margin_value", 
    "oldfieldtype": "Currency", 
    "options": "Company:company:default_currency", 
    "permlevel": 0, 
+   "read_only": 1, 
    "reqd": 0, 
    "search_index": 0
   }, 
   {
+   "fieldname": "column_break_37", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "per_gross_margin", 
-   "fieldtype": "Currency", 
+   "fieldtype": "Percent", 
    "label": "Gross Margin %", 
    "no_copy": 0, 
    "oldfieldname": "per_gross_margin", 
    "oldfieldtype": "Currency", 
-   "options": "Company:company:default_currency", 
+   "options": "", 
    "permlevel": 0, 
+   "read_only": 1, 
    "reqd": 0, 
    "search_index": 0
-  }, 
-  {
-   "fieldname": "customer_details", 
-   "fieldtype": "Section Break", 
-   "label": "Customer Details", 
-   "oldfieldtype": "Section Break", 
-   "options": "icon-user", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "customer", 
-   "fieldtype": "Link", 
-   "in_filter": 1, 
-   "label": "Customer", 
-   "no_copy": 0, 
-   "oldfieldname": "customer", 
-   "oldfieldtype": "Link", 
-   "options": "Customer", 
-   "permlevel": 0, 
-   "print_hide": 1, 
-   "reqd": 0, 
-   "search_index": 1
   }
  ], 
  "icon": "icon-puzzle-piece", 
  "idx": 1, 
  "max_attachments": 4, 
- "modified": "2015-02-22 11:17:49.051755", 
+ "modified": "2015-04-27 07:37:44.239930", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Project", 
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index c142180..c914f22 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -21,27 +21,23 @@
 				"status": task.status,
 				"start_date": task.exp_start_date,
 				"end_date": task.exp_end_date,
-				"desciption": task.description,
+				"description": task.description,
 				"task_id": task.name
 			})
 
-	def get_gross_profit(self):
-		pft, per_pft =0, 0
-		pft = flt(self.project_value) - flt(self.est_material_cost)
-		#if pft > 0:
-		per_pft = (flt(pft) / flt(self.project_value)) * 100
-		ret = {'gross_margin_value': pft, 'per_gross_margin': per_pft}
-		return ret
-
 	def validate(self):
-		if self.project_start_date and self.completion_date:
-			if getdate(self.completion_date) < getdate(self.project_start_date):
-				frappe.throw(_("Expected Completion Date can not be less than Project Start Date"))
-
+		self.validate_dates()
 		self.sync_tasks()
 
+	def validate_dates(self):
+		if self.expected_start_date and self.expected_end_date:
+			if getdate(self.expected_end_date) < getdate(self.expected_start_date):
+				frappe.throw(_("Expected End Date can not be less than Expected Start Date"))
+
 	def sync_tasks(self):
 		"""sync tasks and remove table"""
+		if self.flags.dont_sync_tasks: return
+
 		task_names = []
 		for t in self.tasks:
 			if t.task_id:
@@ -55,7 +51,7 @@
 				"status": t.status,
 				"exp_start_date": t.start_date,
 				"exp_end_date": t.end_date,
-				"desciption": t.description,
+				"description": t.description,
 			})
 
 			task.flags.ignore_links = True
@@ -78,6 +74,25 @@
 			frappe.db.set_value("Project", self.name, "percent_complete",
 			 	int(float(completed) / total * 100))
 
+	def update_costing(self):
+		total_cost = frappe.db.sql("""select sum(total_costing_amount) as costing_amount,
+			sum(total_billing_amount) as billing_amount, sum(total_expense_claim) as expense_claim,
+			min(act_start_date) as start_date, max(act_end_date) as end_date, sum(actual_time) as time
+			from `tabTask` where project = %s""", self.name, as_dict=1)[0]
+
+		self.total_costing_amount = total_cost.costing_amount
+		self.total_billing_amount = total_cost.billing_amount
+		self.total_expense_claim = total_cost.expense_claim
+		self.actual_start_date = total_cost.start_date
+		self.actual_end_date = total_cost.end_date
+		self.actual_time = total_cost.time
+		self.gross_margin = flt(total_cost.billing_amount) - flt(total_cost.costing_amount)
+		if self.total_billing_amount:
+			self.per_gross_margin = (self.gross_margin / flt(self.total_billing_amount)) *100
+			
+	def update_purchase_costing(self):
+		self.total_purchase_cost = frappe.db.sql("""select sum(amount) as cost
+			from `tabPurchase Invoice Item` where project_name = %s and docstatus=1 """, self.name, as_dict=1)[0].cost or 0
 
 @frappe.whitelist()
 def get_cost_center_name(project_name):
diff --git a/erpnext/projects/doctype/project/project_list.js b/erpnext/projects/doctype/project/project_list.js
index 8281c7d..b0d1ae8 100644
--- a/erpnext/projects/doctype/project/project_list.js
+++ b/erpnext/projects/doctype/project/project_list.js
@@ -1,5 +1,5 @@
 frappe.listview_settings['Project'] = {
-	add_fields: ["status", "priority", "is_active", "percent_complete", "completion_date"],
+	add_fields: ["status", "priority", "is_active", "percent_complete", "expected_end_date"],
 	filters:[["status","=", "Open"]],
 	get_indicator: function(doc) {
 		if(doc.status=="Open" && doc.percent_complete) {
diff --git a/erpnext/projects/doctype/project/test_project.py b/erpnext/projects/doctype/project/test_project.py
index 744d6b4..f69ce80 100644
--- a/erpnext/projects/doctype/project/test_project.py
+++ b/erpnext/projects/doctype/project/test_project.py
@@ -5,4 +5,3 @@
 
 import frappe
 test_records = frappe.get_test_records('Project')
-test_ignore = ["Task"]
diff --git a/erpnext/projects/doctype/project/test_records.json b/erpnext/projects/doctype/project/test_records.json
index 69226f0..9379c22 100644
--- a/erpnext/projects/doctype/project/test_records.json
+++ b/erpnext/projects/doctype/project/test_records.json
@@ -1,10 +1,12 @@
 [
  {
-  "project_name": "_Test Project", 
-  "status": "Open"
- }, 
- {
-  "project_name": "_Test Project 1", 
-  "status": "Open"
+  "project_name": "_Test Project",
+  "status": "Open",
+  "tasks":[ 
+   {
+	  "title": "_Test Task",
+	  "status": "Open"
+   }
+  ]
  }
 ]
\ No newline at end of file
diff --git a/erpnext/projects/doctype/project_task/project_task.json b/erpnext/projects/doctype/project_task/project_task.json
index c29dcc0..e5aae3e 100644
--- a/erpnext/projects/doctype/project_task/project_task.json
+++ b/erpnext/projects/doctype/project_task/project_task.json
@@ -37,7 +37,7 @@
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Status", 
-   "no_copy": 0, 
+   "no_copy": 1, 
    "options": "Open\nWorking\nPending Review\nClosed\nCancelled", 
    "permlevel": 0, 
    "precision": "", 
@@ -49,9 +49,10 @@
    "set_only_once": 0
   }, 
   {
+   "depends_on": "task_id", 
    "fieldname": "edit_task", 
    "fieldtype": "Button", 
-   "label": "Edit Task", 
+   "label": "View Task", 
    "permlevel": 0, 
    "precision": ""
   }, 
@@ -143,7 +144,7 @@
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
- "modified": "2015-02-23 01:55:18.865117", 
+ "modified": "2015-04-23 05:48:00.504508", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Project Task", 
diff --git a/erpnext/projects/doctype/task/task.js b/erpnext/projects/doctype/task/task.js
index 51aabca..9756331 100644
--- a/erpnext/projects/doctype/task/task.js
+++ b/erpnext/projects/doctype/task/task.js
@@ -25,6 +25,19 @@
 		this.frm.doc.project && frappe.model.remove_from_locals("Project",
 			this.frm.doc.project);
 	},
+	
+	refresh: function(doc) {
+		if(!doc.__islocal) {
+			cur_frm.add_custom_button(__("Time Logs"), function() {
+				frappe.route_options = {"project": doc.project, "task": doc.name}
+				frappe.set_route("List", "Time Log");
+			}, "icon-list", true);
+			cur_frm.add_custom_button(__("Expense Claims"), function() {
+				frappe.route_options = {"project": doc.project, "task": doc.name}
+				frappe.set_route("List", "Expense Claim");
+			}, "icon-list", true);
+		}
+	}
 });
 
 
diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json
index e547834..fc604c2 100644
--- a/erpnext/projects/doctype/task/task.json
+++ b/erpnext/projects/doctype/task/task.json
@@ -7,16 +7,6 @@
  "document_type": "Master", 
  "fields": [
   {
-   "fieldname": "task_details", 
-   "fieldtype": "Section Break", 
-   "label": "", 
-   "oldfieldtype": "Section Break", 
-   "permlevel": 0, 
-   "print_width": "50%", 
-   "search_index": 0, 
-   "width": "50%"
-  }, 
-  {
    "fieldname": "subject", 
    "fieldtype": "Data", 
    "in_filter": 1, 
@@ -28,24 +18,14 @@
    "reqd": 1
   }, 
   {
-   "fieldname": "exp_start_date", 
-   "fieldtype": "Date", 
-   "label": "Expected Start Date", 
-   "oldfieldname": "exp_start_date", 
-   "oldfieldtype": "Date", 
-   "permlevel": 0, 
-   "reqd": 0
-  }, 
-  {
-   "fieldname": "exp_end_date", 
-   "fieldtype": "Date", 
-   "in_filter": 1, 
-   "label": "Expected End Date", 
-   "oldfieldname": "exp_end_date", 
-   "oldfieldtype": "Date", 
-   "permlevel": 0, 
-   "reqd": 0, 
-   "search_index": 1
+   "fieldname": "project", 
+   "fieldtype": "Link", 
+   "in_list_view": 1, 
+   "label": "Project", 
+   "oldfieldname": "project", 
+   "oldfieldtype": "Link", 
+   "options": "Project", 
+   "permlevel": 0
   }, 
   {
    "fieldname": "column_break0", 
@@ -67,16 +47,6 @@
    "permlevel": 0
   }, 
   {
-   "fieldname": "project", 
-   "fieldtype": "Link", 
-   "in_list_view": 1, 
-   "label": "Project", 
-   "oldfieldname": "project", 
-   "oldfieldtype": "Link", 
-   "options": "Project", 
-   "permlevel": 0
-  }, 
-  {
    "fieldname": "priority", 
    "fieldtype": "Select", 
    "in_filter": 1, 
@@ -110,41 +80,52 @@
   {
    "fieldname": "time_and_budget", 
    "fieldtype": "Section Break", 
-   "label": "Time and Budget", 
+   "label": "", 
    "oldfieldtype": "Section Break", 
    "permlevel": 0
   }, 
   {
-   "fieldname": "expected", 
-   "fieldtype": "Column Break", 
-   "label": "Expected", 
-   "oldfieldtype": "Column Break", 
+   "fieldname": "exp_start_date", 
+   "fieldtype": "Date", 
+   "label": "Expected Start Date", 
+   "oldfieldname": "exp_start_date", 
+   "oldfieldtype": "Date", 
    "permlevel": 0, 
-   "print_width": "50%", 
-   "width": "50%"
+   "reqd": 0
   }, 
   {
-   "fieldname": "exp_total_hrs", 
-   "fieldtype": "Data", 
-   "label": "Total Hours (Expected)", 
+   "default": "0", 
+   "description": "", 
+   "fieldname": "expected_time", 
+   "fieldtype": "Float", 
+   "label": "Expected Time (in hours)", 
    "oldfieldname": "exp_total_hrs", 
    "oldfieldtype": "Data", 
    "permlevel": 0, 
    "reqd": 0
   }, 
   {
-   "fieldname": "allocated_budget", 
-   "fieldtype": "Currency", 
-   "label": "Allocated Budget", 
-   "oldfieldname": "allocated_budget", 
-   "oldfieldtype": "Currency", 
-   "options": "Company:company:default_currency", 
-   "permlevel": 0
+   "fieldname": "column_break_11", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
   }, 
   {
+   "fieldname": "exp_end_date", 
+   "fieldtype": "Date", 
+   "in_filter": 1, 
+   "label": "Expected End Date", 
+   "oldfieldname": "exp_end_date", 
+   "oldfieldtype": "Date", 
+   "permlevel": 0, 
+   "reqd": 0, 
+   "search_index": 1
+  }, 
+  {
+   "description": "", 
    "fieldname": "actual", 
-   "fieldtype": "Column Break", 
-   "label": "Actual", 
+   "fieldtype": "Section Break", 
+   "label": "", 
    "oldfieldtype": "Column Break", 
    "permlevel": 0, 
    "print_width": "50%", 
@@ -153,27 +134,77 @@
   {
    "fieldname": "act_start_date", 
    "fieldtype": "Date", 
-   "label": "Actual Start Date", 
+   "label": "Actual Start Date (via Time Logs)", 
    "oldfieldname": "act_start_date", 
    "oldfieldtype": "Date", 
-   "permlevel": 0
+   "permlevel": 0, 
+   "read_only": 1
+  }, 
+  {
+   "default": "", 
+   "description": "", 
+   "fieldname": "actual_time", 
+   "fieldtype": "Float", 
+   "label": "Actual Time (in hours)", 
+   "options": "", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "column_break_15", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
   }, 
   {
    "fieldname": "act_end_date", 
    "fieldtype": "Date", 
-   "label": "Actual End Date", 
+   "label": "Actual End Date (via Time Logs)", 
    "oldfieldname": "act_end_date", 
    "oldfieldtype": "Date", 
-   "permlevel": 0
+   "permlevel": 0, 
+   "read_only": 1
   }, 
   {
-   "fieldname": "actual_budget", 
+   "fieldname": "section_break_17", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "total_costing_amount", 
    "fieldtype": "Currency", 
-   "label": "Actual Budget", 
+   "label": "Total Costing Amount (via Time Logs)", 
    "oldfieldname": "actual_budget", 
    "oldfieldtype": "Currency", 
    "options": "Company:company:default_currency", 
-   "permlevel": 0
+   "permlevel": 0, 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "total_expense_claim", 
+   "fieldtype": "Currency", 
+   "label": "Total Expense Claim (via Expense Claim)", 
+   "options": "Company:company:default_currency", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "column_break_20", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "total_billing_amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "label": "Total Billing Amount (via Time Logs)", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
   }, 
   {
    "fieldname": "more_details", 
@@ -216,8 +247,9 @@
  ], 
  "icon": "icon-check", 
  "idx": 1, 
+ "istable": 0, 
  "max_attachments": 5, 
- "modified": "2015-02-20 05:09:27.295024", 
+ "modified": "2015-04-14 07:56:24.481667", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Task", 
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index acd0877..a03340f 100644
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import frappe, json
 
-from frappe.utils import getdate, today
+from frappe.utils import getdate
 from frappe import _
 
 
@@ -26,27 +26,48 @@
 			return ret
 
 	def validate(self):
+		self.validate_dates()
+		
+	def validate_dates(self):
 		if self.exp_start_date and self.exp_end_date and getdate(self.exp_start_date) > getdate(self.exp_end_date):
 			frappe.throw(_("'Expected Start Date' can not be greater than 'Expected End Date'"))
 
 		if self.act_start_date and self.act_end_date and getdate(self.act_start_date) > getdate(self.act_end_date):
 			frappe.throw(_("'Actual Start Date' can not be greater than 'Actual End Date'"))
 
-		self.update_status()
-
-	def update_status(self):
-		status = frappe.db.get_value("Task", self.name, "status")
-		if self.status=="Working" and status !="Working" and not self.act_start_date:
-			self.act_start_date = today()
-
-		if self.status=="Closed" and status != "Closed" and not self.act_end_date:
-			self.act_end_date = today()
-
 	def on_update(self):
+		self.update_percentage()
+		self.update_project()
+			
+	def update_percentage(self):
 		"""update percent complete in project"""
 		if self.project and not self.flags.from_project:
 			project = frappe.get_doc("Project", self.project)
 			project.run_method("update_percent_complete")
+			
+	def update_total_expense_claim(self):
+		self.total_expense_claim = frappe.db.sql("""select sum(total_sanctioned_amount) from `tabExpense Claim` 
+			where project = %s and task = %s and approval_status = "Approved" and docstatus=1""",(self.project, self.name))
+			
+	def update_time_and_costing(self):
+		tl = frappe.db.sql("""select min(from_time) as start_date, max(to_time) as end_date,
+			 sum(billing_amount) as total_billing_amount, sum(costing_amount) as total_costing_amount,
+			sum(hours) as time from `tabTime Log` where project = %s and task = %s and docstatus=1""",
+			(self.project, self.name),as_dict=1)[0]
+		if self.status == "Open":
+			self.status = "Working"
+		self.total_costing_amount= tl.total_costing_amount
+		self.total_billing_amount= tl.total_billing_amount
+		self.actual_time= tl.time
+		self.act_start_date= tl.start_date
+		self.act_end_date= tl.end_date
+			
+	def update_project(self):
+		if self.project and frappe.db.exists("Project", self.project):
+			project = frappe.get_doc("Project", self.project)
+			project.flags.dont_sync_tasks = True
+			project.update_costing()
+			project.save()
 
 @frappe.whitelist()
 def get_events(start, end, filters=None):
diff --git a/erpnext/projects/doctype/task/test_records.json b/erpnext/projects/doctype/task/test_records.json
index 1f98172..42ca0e7 100644
--- a/erpnext/projects/doctype/task/test_records.json
+++ b/erpnext/projects/doctype/task/test_records.json
@@ -1,8 +1,8 @@
 [
  {
-  "project": "_Test Project", 
   "status": "Open", 
-  "subject": "_Test Task"
+  "subject": "_Test Task",
+  "name": "task001"
  }, 
  {
   "status": "Open", 
diff --git a/erpnext/projects/doctype/task/test_task.py b/erpnext/projects/doctype/task/test_task.py
index 6f75e0d..62e560f 100644
--- a/erpnext/projects/doctype/task/test_task.py
+++ b/erpnext/projects/doctype/task/test_task.py
@@ -5,5 +5,3 @@
 
 import frappe
 test_records = frappe.get_test_records('Task')
-test_dependencies = ["Project"]
-test_ignore = ["Customer"]
diff --git a/erpnext/projects/doctype/time_log/test_records.json b/erpnext/projects/doctype/time_log/test_records.json
index d9e67e9..568c012 100644
--- a/erpnext/projects/doctype/time_log/test_records.json
+++ b/erpnext/projects/doctype/time_log/test_records.json
@@ -5,7 +5,6 @@
   "doctype": "Time Log",
   "from_time": "2013-01-01 10:00:00.000000",
   "note": "_Test Note",
-  "to_time": "2013-01-01 11:00:00.000000",
-  "project": "_Test Project"
+  "to_time": "2013-01-01 11:00:00.000000"
  }
 ]
diff --git a/erpnext/projects/doctype/time_log/test_time_log.py b/erpnext/projects/doctype/time_log/test_time_log.py
index 8f8e31d..3d9e0be 100644
--- a/erpnext/projects/doctype/time_log/test_time_log.py
+++ b/erpnext/projects/doctype/time_log/test_time_log.py
@@ -10,7 +10,6 @@
 from erpnext.projects.doctype.time_log.time_log import NotSubmittedError
 from erpnext.manufacturing.doctype.workstation.workstation import WorkstationHolidayError
 from erpnext.manufacturing.doctype.workstation.workstation import NotInWorkingHoursError
-from erpnext.projects.doctype.time_log_batch.test_time_log_batch import *
 from erpnext.manufacturing.doctype.production_order.test_production_order import make_prod_order_test_record
 
 
@@ -85,6 +84,72 @@
 		test_time_log.to_time = "2013-01-01 10:00:00.000000"
 		self.assertRaises(frappe.ValidationError, test_time_log.save)
 		frappe.db.sql("delete from `tabTime Log`")
-
+		
+	def test_total_activity_cost_for_project(self):
+		frappe.db.sql("""delete from `tabTask` where project = "_Test Project 1" """)
+		frappe.db.sql("""delete from `tabProject` where name = "_Test Project 1" """)
+		frappe.db.sql("""delete from `tabActivity Cost` where employee = "_T-Employee-0001" and activity_type = "_Test Activity Type" """)
+		
+		activity_cost = frappe.new_doc('Activity Cost')
+		activity_cost.update({
+			"employee": "_T-Employee-0001",
+			"employee_name": "_Test Employee",
+			"activity_type": "_Test Activity Type",
+			"billing_rate": 100,
+			"costing_rate": 50
+		})
+		activity_cost.insert()
+		
+		frappe.get_doc({
+			"project_name": "_Test Project 1",
+			"doctype": "Project",
+			"tasks" :
+				[{ "title": "_Test Project Task 1", "status": "Open" }]
+		}).save()
+		
+		task_name = frappe.db.get_value("Task",{"project": "_Test Project 1"})
+		
+		time_log = frappe.get_doc({
+			 "activity_type": "_Test Activity Type",
+			 "docstatus": 1,
+			 "doctype": "Time Log",
+			 "from_time": "2013-02-02 09:00:00.000000",
+			 "to_time": "2013-02-02 11:00:00.000000",
+			 "employee": "_T-Employee-0001",
+			 "project": "_Test Project 1",
+			 "task": task_name,
+			 "billable": 1
+		})
+		time_log.save()
+		self.assertEqual(time_log.costing_rate, 50)
+		self.assertEqual(time_log.costing_amount, 100)
+		self.assertEqual(time_log.billing_rate, 100)
+		self.assertEqual(time_log.billing_amount, 200)
+		time_log.submit()
+		
+		self.assertEqual(frappe.db.get_value("Task", task_name, "total_billing_amount"), 200)
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_billing_amount"), 200)
+		
+		time_log2 = frappe.get_doc({
+			 "activity_type": "_Test Activity Type",
+			 "docstatus": 1,
+			 "doctype": "Time Log",
+			 "from_time": "2013-02-03 09:00:00.000000",
+			 "to_time": "2013-02-03 11:00:00.000000",
+			 "employee": "_T-Employee-0001",
+			 "project": "_Test Project 1",
+			 "task": task_name,
+			 "billable": 1
+		})
+		time_log2.save()
+		
+		self.assertEqual(frappe.db.get_value("Task", task_name, "total_billing_amount"), 400)
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_billing_amount"), 400)
+		
+		time_log2.cancel()
+		
+		self.assertEqual(frappe.db.get_value("Task", task_name, "total_billing_amount"), 200)
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_billing_amount"), 200)
+		
 test_records = frappe.get_test_records('Time Log')
 test_ignore = ["Time Log Batch", "Sales Invoice"]
diff --git a/erpnext/projects/doctype/time_log/time_log.js b/erpnext/projects/doctype/time_log/time_log.js
index a49b1f1..536ddf8 100644
--- a/erpnext/projects/doctype/time_log/time_log.js
+++ b/erpnext/projects/doctype/time_log/time_log.js
@@ -4,10 +4,12 @@
 frappe.provide("erpnext.projects");
 
 frappe.ui.form.on("Time Log", "onload", function(frm) {
-	frm.set_query("task", erpnext.queries.task);
 	if (frm.doc.for_manufacturing) {
 		frappe.ui.form.trigger("Time Log", "production_order");
 	}
+	if (frm.doc.from_time && frm.doc.to_time) {
+		frappe.ui.form.trigger("Time Log", "to_time");
+	}
 });
 
 frappe.ui.form.on("Time Log", "refresh", function(frm) {
@@ -41,4 +43,60 @@
 	if(frm._setting_hours) return;
 	frm.set_value("hours", moment(cur_frm.doc.to_time).diff(moment(cur_frm.doc.from_time),
 		"hours"));
-});
\ No newline at end of file
+
+});
+
+var calculate_cost = function(frm) {
+	frm.set_value("costing_amount", frm.doc.costing_rate * frm.doc.hours);
+	if (frm.doc.billable==1){
+		frm.set_value("billing_amount", frm.doc.billing_rate * frm.doc.hours);
+	}
+}
+
+var get_activity_cost = function(frm) {
+	if (frm.doc.employee && frm.doc.activity_type){
+		return frappe.call({
+			method: "erpnext.projects.doctype.time_log.time_log.get_activity_cost",
+			args: {
+				"employee": frm.doc.employee,
+				"activity_type": frm.doc.activity_type
+			},
+			callback: function(r) {
+				if(!r.exc && r.message) {
+					frm.set_value("costing_rate", r.message.costing_rate);
+					frm.set_value("billing_rate", r.message.billing_rate);
+					calculate_cost(frm);
+				}
+			}
+		});
+	}
+}
+
+frappe.ui.form.on("Time Log", "hours", function(frm) {
+	calculate_cost(frm);
+});
+
+frappe.ui.form.on("Time Log", "activity_type", function(frm) {
+	get_activity_cost(frm);
+});
+
+frappe.ui.form.on("Time Log", "employee", function(frm) {
+	get_activity_cost(frm);
+});
+
+frappe.ui.form.on("Time Log", "billable", function(frm) {
+	if (frm.doc.billable==1) {
+		calculate_cost(frm);
+	}
+	else {
+		frm.set_value("billing_amount", 0);
+	}
+});
+
+cur_frm.fields_dict['task'].get_query = function(doc) {
+	return {
+		filters:{
+			'project': doc.project
+		}
+	}	
+}
diff --git a/erpnext/projects/doctype/time_log/time_log.json b/erpnext/projects/doctype/time_log/time_log.json
index 20b5c0c..e9e2077 100644
--- a/erpnext/projects/doctype/time_log/time_log.json
+++ b/erpnext/projects/doctype/time_log/time_log.json
@@ -17,44 +17,10 @@
    "reqd": 1
   }, 
   {
-   "fieldname": "from_time", 
-   "fieldtype": "Datetime", 
-   "in_list_view": 0, 
-   "label": "From Time", 
-   "permlevel": 0, 
-   "read_only": 0, 
-   "reqd": 1
-  }, 
-  {
-   "fieldname": "to_time", 
-   "fieldtype": "Datetime", 
-   "in_list_view": 0, 
-   "label": "To Time", 
-   "permlevel": 0, 
-   "read_only": 0, 
-   "reqd": 1
-  }, 
-  {
-   "fieldname": "hours", 
-   "fieldtype": "Float", 
-   "in_list_view": 1, 
-   "label": "Hours", 
-   "permlevel": 0, 
-   "read_only": 0
-  }, 
-  {
-   "fieldname": "user", 
-   "fieldtype": "Link", 
-   "label": "User", 
-   "options": "User", 
-   "permlevel": 0, 
-   "precision": ""
-  }, 
-  {
-   "fieldname": "column_break_3", 
+   "fieldname": "column_break_2", 
    "fieldtype": "Column Break", 
    "permlevel": 0, 
-   "read_only": 0
+   "precision": ""
   }, 
   {
    "fieldname": "status", 
@@ -67,20 +33,62 @@
    "reqd": 0
   }, 
   {
-   "fieldname": "billable", 
-   "fieldtype": "Check", 
+   "fieldname": "section_break_4", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "from_time", 
+   "fieldtype": "Datetime", 
    "in_list_view": 0, 
-   "label": "Billable", 
+   "label": "From Time", 
+   "permlevel": 0, 
+   "read_only": 0, 
+   "reqd": 1
+  }, 
+  {
+   "default": "0", 
+   "fieldname": "hours", 
+   "fieldtype": "Float", 
+   "in_list_view": 1, 
+   "label": "Hours", 
    "permlevel": 0, 
    "read_only": 0
   }, 
   {
-   "fieldname": "for_manufacturing", 
-   "fieldtype": "Check", 
-   "label": "For Manufacturing", 
+   "fieldname": "to_time", 
+   "fieldtype": "Datetime", 
+   "in_list_view": 0, 
+   "label": "To Time", 
    "permlevel": 0, 
-   "precision": "", 
-   "read_only": 1
+   "read_only": 0, 
+   "reqd": 1
+  }, 
+  {
+   "fieldname": "column_break_8", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "depends_on": "", 
+   "fieldname": "project", 
+   "fieldtype": "Link", 
+   "in_list_view": 1, 
+   "label": "Project", 
+   "options": "Project", 
+   "permlevel": 0, 
+   "read_only": 0
+  }, 
+  {
+   "depends_on": "", 
+   "fieldname": "task", 
+   "fieldtype": "Link", 
+   "label": "Task", 
+   "options": "Task", 
+   "permlevel": 0, 
+   "read_only": 0
   }, 
   {
    "depends_on": "eval:!doc.for_manufacturing", 
@@ -94,11 +102,47 @@
    "reqd": 0
   }, 
   {
-   "depends_on": "eval:!doc.for_manufacturing", 
-   "fieldname": "task", 
+   "fieldname": "section_break_12", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "user", 
    "fieldtype": "Link", 
-   "label": "Task", 
-   "options": "Task", 
+   "label": "User", 
+   "options": "User", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "employee", 
+   "fieldtype": "Link", 
+   "label": "Employee", 
+   "options": "Employee", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "column_break_3", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "read_only": 0
+  }, 
+  {
+   "fieldname": "for_manufacturing", 
+   "fieldtype": "Check", 
+   "hidden": 1, 
+   "label": "For Manufacturing", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "billable", 
+   "fieldtype": "Check", 
+   "in_list_view": 0, 
+   "label": "Billable", 
    "permlevel": 0, 
    "read_only": 0
   }, 
@@ -180,20 +224,62 @@
    "read_only": 0
   }, 
   {
-   "fieldname": "section_break_9", 
+   "depends_on": "", 
+   "fieldname": "section_break_24", 
    "fieldtype": "Section Break", 
    "permlevel": 0, 
-   "read_only": 0
+   "precision": ""
   }, 
   {
-   "depends_on": "", 
-   "fieldname": "project", 
-   "fieldtype": "Link", 
-   "in_list_view": 1, 
-   "label": "Project", 
-   "options": "Project", 
+   "default": "0", 
+   "description": "", 
+   "fieldname": "costing_rate", 
+   "fieldtype": "Currency", 
+   "label": "Costing Rate (per hour)", 
    "permlevel": 0, 
-   "read_only": 0
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "default": "0", 
+   "fieldname": "costing_amount", 
+   "fieldtype": "Currency", 
+   "label": "Costing Amount", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "column_break_25", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "default": "0", 
+   "description": "", 
+   "fieldname": "billing_rate", 
+   "fieldtype": "Currency", 
+   "label": "Billing Rate (per hour)", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "default": "0", 
+   "description": "Will be updated only if Time Log is 'Billable'", 
+   "fieldname": "billing_amount", 
+   "fieldtype": "Currency", 
+   "label": "Billing Amount", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
+   "fieldname": "section_break_29", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
   }, 
   {
    "description": "Will be updated when batched.", 
@@ -214,12 +300,6 @@
    "read_only": 1
   }, 
   {
-   "fieldname": "column_break_16", 
-   "fieldtype": "Column Break", 
-   "permlevel": 0, 
-   "read_only": 0
-  }, 
-  {
    "fieldname": "amended_from", 
    "fieldtype": "Link", 
    "ignore_user_permissions": 1, 
@@ -242,7 +322,7 @@
  "icon": "icon-time", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-04-06 02:47:16.187046", 
+ "modified": "2015-04-14 09:07:28.468792", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Time Log", 
diff --git a/erpnext/projects/doctype/time_log/time_log.py b/erpnext/projects/doctype/time_log/time_log.py
index c385c09..f7b501d 100644
--- a/erpnext/projects/doctype/time_log/time_log.py
+++ b/erpnext/projects/doctype/time_log/time_log.py
@@ -24,12 +24,16 @@
 		self.check_workstation_timings()
 		self.validate_production_order()
 		self.validate_manufacturing()
+		self.validate_task()
+		self.update_cost()
 
 	def on_submit(self):
 		self.update_production_order()
+		self.update_task()
 
 	def on_cancel(self):
 		self.update_production_order()
+		self.update_task()
 
 	def before_update_after_submit(self):
 		self.set_status()
@@ -63,6 +67,7 @@
 	def validate_overlap(self):
 		"""Checks if 'Time Log' entries overlap for a user, workstation. """
 		self.validate_overlap_for("user")
+		self.validate_overlap_for("employee")
 		self.validate_overlap_for("workstation")
 
 	def validate_overlap_for(self, fieldname):
@@ -123,8 +128,8 @@
 
 	def update_production_order(self):
 		"""Updates `start_date`, `end_date`, `status` for operation in Production Order."""
-
-		if self.for_manufacturing and self.production_order:
+		
+		if self.production_order and self.for_manufacturing:
 			if not self.operation_id:
 				frappe.throw(_("Operation ID not set"))
 
@@ -205,6 +210,27 @@
 			self.production_order = None
 			self.operation = None
 			self.quantity = None
+	
+	def update_cost(self):
+		rate = get_activity_cost(self.employee, self.activity_type)
+		if rate:
+			self.costing_rate = rate.get('costing_rate')
+			self.billing_rate = rate.get('billing_rate') 
+			self.costing_amount = self.costing_rate * self.hours
+			if self.billable:
+				self.billing_amount = self.billing_rate * self.hours
+			else:
+				self.billing_amount = 0
+				
+	def validate_task(self):
+		if self.project and not self.task:
+			frappe.throw(_("Task is Mandatory if Time Log is against a project"))
+	
+	def update_task(self):
+		if self.task and frappe.db.exists("Task", self.task):
+			task = frappe.get_doc("Task", self.task)
+			task.update_time_and_costing()
+			task.save()
 
 @frappe.whitelist()
 def get_events(start, end, filters=None):
@@ -242,3 +268,9 @@
 			d.title += " for Project: " + d.project
 
 	return data
+	
+@frappe.whitelist()
+def get_activity_cost(employee=None, activity_type=None):
+	rate = frappe.db.sql("""select costing_rate, billing_rate from `tabActivity Cost` where employee= %s
+		and activity_type= %s""", (employee, activity_type), as_dict=1)
+	return rate[0] if rate else {}
diff --git a/erpnext/projects/doctype/time_log/time_log_list.js b/erpnext/projects/doctype/time_log/time_log_list.js
index d444806..a2eb05c 100644
--- a/erpnext/projects/doctype/time_log/time_log_list.js
+++ b/erpnext/projects/doctype/time_log/time_log_list.js
@@ -3,7 +3,7 @@
 
 // render
 frappe.listview_settings['Time Log'] = {
-	add_fields: ["status", "billable", "activity_type", "task", "project", "hours", "for_manufacturing"],
+	add_fields: ["status", "billable", "activity_type", "task", "project", "hours", "for_manufacturing", "billing_amount"],
 	selectable: true,
 	onload: function(me) {
 		me.page.add_menu_item(__("Make Time Log Batch"), function() {
@@ -37,7 +37,7 @@
 					$.extend(detail, {
 						"time_log": d.name,
 						"activity_type": d.activity_type,
-						"created_by": d.owner,
+						"billing_amount": d.billing_amount,
 						"hours": d.hours
 					});
 				})
diff --git a/erpnext/projects/doctype/time_log_batch/test_time_log_batch.py b/erpnext/projects/doctype/time_log_batch/test_time_log_batch.py
index 240ca97..faa0a60 100644
--- a/erpnext/projects/doctype/time_log_batch/test_time_log_batch.py
+++ b/erpnext/projects/doctype/time_log_batch/test_time_log_batch.py
@@ -44,7 +44,6 @@
 def create_time_log_batch(time_log):
 	tlb = frappe.get_doc({
 		"doctype": "Time Log Batch",
-		"rate": "500",
 		"time_logs": [
 			{
 			"doctype": "Time Log Batch Detail",
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch.js b/erpnext/projects/doctype/time_log_batch/time_log_batch.js
index 0635db0..6b5f080 100644
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch.js
+++ b/erpnext/projects/doctype/time_log_batch/time_log_batch.js
@@ -2,7 +2,7 @@
 // License: GNU General Public License v3. See license.txt
 
 cur_frm.add_fetch("time_log", "activity_type", "activity_type");
-cur_frm.add_fetch("time_log", "owner", "created_by");
+cur_frm.add_fetch("time_log", "billing_amount", "billing_amount");
 cur_frm.add_fetch("time_log", "hours", "hours");
 
 cur_frm.set_query("time_log", "time_logs", function(doc) {
@@ -36,3 +36,15 @@
 		});
 	}
 });
+
+frappe.ui.form.on("Time Log Batch Detail", "time_log", function(frm, cdt, cdn) {
+	var tl = frm.doc.time_logs || [];
+	total_hr = 0;
+	total_amt = 0;
+	for(var i=0; i<tl.length; i++) {
+		total_hr += tl[i].hours;
+		total_amt += tl[i].billing_amount;
+	}
+	cur_frm.set_value("total_hours", total_hr);
+	cur_frm.set_value("total_billing_amount", total_amt);
+});
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch.json b/erpnext/projects/doctype/time_log_batch/time_log_batch.json
index a42c4ea..93726ee 100644
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch.json
+++ b/erpnext/projects/doctype/time_log_batch/time_log_batch.json
@@ -15,28 +15,22 @@
    "reqd": 1
   }, 
   {
-   "description": "For Sales Invoice", 
-   "fieldname": "rate", 
-   "fieldtype": "Currency", 
-   "label": "Rate", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "column_break_3", 
-   "fieldtype": "Column Break", 
-   "permlevel": 0
-  }, 
-  {
    "default": "Draft", 
    "fieldname": "status", 
    "fieldtype": "Select", 
    "in_list_view": 0, 
    "label": "Status", 
+   "no_copy": 1, 
    "options": "Draft\nSubmitted\nBilled\nCancelled", 
    "permlevel": 0, 
    "read_only": 1
   }, 
   {
+   "fieldname": "column_break_3", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0
+  }, 
+  {
    "description": "Will be updated after Sales Invoice is Submitted.", 
    "fieldname": "sales_invoice", 
    "fieldtype": "Link", 
@@ -60,7 +54,14 @@
    "reqd": 1
   }, 
   {
-   "description": "In Hours", 
+   "fieldname": "section_break_8", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "default": "0", 
+   "description": "updated via Time Logs", 
    "fieldname": "total_hours", 
    "fieldtype": "Float", 
    "in_list_view": 1, 
@@ -69,6 +70,22 @@
    "read_only": 1
   }, 
   {
+   "fieldname": "column_break_10", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "default": "0", 
+   "description": "updated via Time Logs", 
+   "fieldname": "total_billing_amount", 
+   "fieldtype": "Float", 
+   "label": "Total Billing Amount", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
+  }, 
+  {
    "fieldname": "amended_from", 
    "fieldtype": "Link", 
    "ignore_user_permissions": 1, 
@@ -83,7 +100,7 @@
  "icon": "icon-time", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-02-05 05:11:48.360822", 
+ "modified": "2015-04-15 08:00:52.746961", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Time Log Batch", 
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch.py b/erpnext/projects/doctype/time_log_batch/time_log_batch.py
index 9565536..eaccc8c 100644
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch.py
+++ b/erpnext/projects/doctype/time_log_batch/time_log_batch.py
@@ -7,6 +7,7 @@
 import frappe
 from frappe import _
 
+from frappe.utils import flt
 from frappe.model.document import Document
 from frappe.model.mapper import get_mapped_doc
 
@@ -14,22 +15,24 @@
 
 	def validate(self):
 		self.set_status()
-		self.total_hours = 0.0
 		for d in self.get("time_logs"):
 			tl = frappe.get_doc("Time Log", d.time_log)
 			self.update_time_log_values(d, tl)
 			self.validate_time_log_is_submitted(tl)
-			self.total_hours += float(tl.hours or 0.0)
+			self.total_hours += flt(tl.hours)
+			self.total_billing_amount += flt(tl.billing_amount)
 
 	def update_time_log_values(self, d, tl):
 		d.update({
 			"hours": tl.hours,
 			"activity_type": tl.activity_type,
-			"created_by": tl.owner
+			"billing_amount": tl.billing_amount
 		})
 
 	def validate_time_log_is_submitted(self, tl):
-		if tl.status != "Submitted" and self.docstatus == 0:
+		if tl.status == "Batched for Billing":
+			frappe.throw(_("Time Log {0} already billed").format(tl.name))
+		elif tl.status != "Submitted":
 			frappe.throw(_("Time Log {0} must be 'Submitted'").format(tl.name))
 
 	def set_status(self):
@@ -65,15 +68,15 @@
 	def update_item(source_doc, target_doc, source_parent):
 		target_doc.stock_uom = "Hour"
 		target_doc.description = "via Time Logs"
+		target_doc.qty = 1
 
 	target = frappe.new_doc("Sales Invoice")
 	target.append("items", get_mapped_doc("Time Log Batch", source_name, {
 		"Time Log Batch": {
 			"doctype": "Sales Invoice Item",
 			"field_map": {
-				"rate": "base_rate",
-				"name": "time_log_batch",
-				"total_hours": "qty",
+				"total_billing_amount": "rate",
+				"name": "time_log_batch"
 			},
 			"postprocess": update_item
 		}
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js b/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js
index f4876b8..9c02ac3 100644
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js
+++ b/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js
@@ -1,5 +1,5 @@
 frappe.listview_settings['Time Log Batch'] = {
-	add_fields: ["status", "total_hours", "rate"],
+	add_fields: ["status", "total_hours"],
 	get_indicator: function(doc) {
 		return [__(doc.status), frappe.utils.guess_colour(doc.status), "status,=," + doc.status];
 	}
diff --git a/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.json b/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.json
index 15e7e8e..da8ff4c 100644
--- a/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.json
+++ b/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.json
@@ -1,5 +1,5 @@
 {
- "creation": "2013-03-05 09:11:06.000000", 
+ "creation": "2013-03-05 09:11:06", 
  "docstatus": 0, 
  "doctype": "DocType", 
  "fields": [
@@ -15,15 +15,20 @@
    "width": "200px"
   }, 
   {
-   "fieldname": "created_by", 
-   "fieldtype": "Link", 
+   "fieldname": "hours", 
+   "fieldtype": "Float", 
    "in_list_view": 1, 
-   "label": "Created By", 
-   "options": "User", 
+   "label": "Hours", 
    "permlevel": 0, 
    "read_only": 1
   }, 
   {
+   "fieldname": "section_break_3", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "activity_type", 
    "fieldtype": "Data", 
    "in_list_view": 1, 
@@ -32,18 +37,21 @@
    "read_only": 1
   }, 
   {
-   "fieldname": "hours", 
+   "fieldname": "billing_amount", 
    "fieldtype": "Float", 
    "in_list_view": 1, 
-   "label": "Hours", 
-   "permlevel": 0
+   "label": "Billing Amount", 
+   "permlevel": 0, 
+   "precision": "", 
+   "read_only": 1
   }
  ], 
  "idx": 1, 
  "istable": 1, 
- "modified": "2013-12-20 19:21:54.000000", 
+ "modified": "2015-04-15 05:35:08.805589", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Time Log Batch Detail", 
- "owner": "Administrator"
+ "owner": "Administrator", 
+ "permissions": []
 }
\ No newline at end of file
diff --git a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
index 1ef760e..5800156 100644
--- a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
+++ b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
@@ -17,8 +17,8 @@
 		data.append([project.name, pr_item_map.get(project.name, 0),
 			se_item_map.get(project.name, 0), dn_item_map.get(project.name, 0),
 			project.project_name, project.status, project.company,
-			project.customer, project.project_value, project.project_start_date,
-			project.completion_date])
+			project.customer, project.estimated_costing, project.expected_start_date,
+			project.expected_end_date])
 
 	return columns, data
 
@@ -30,8 +30,8 @@
 		_("Project Start Date") + ":Date:120", _("Completion Date") + ":Date:120"]
 
 def get_project_details():
-	return frappe.db.sql(""" select name, project_name, status, company, customer, project_value,
-		project_start_date, completion_date from tabProject where docstatus < 2""", as_dict=1)
+	return frappe.db.sql(""" select name, project_name, status, company, customer, estimated_costing,
+		expected_start_date, expected_end_date from tabProject where docstatus < 2""", as_dict=1)
 
 def get_purchased_items_cost():
 	pr_items = frappe.db.sql("""select project_name, sum(base_net_amount) as amount
diff --git a/erpnext/public/js/account_tree_grid.js b/erpnext/public/js/account_tree_grid.js
index ed3704a..ac8784d 100644
--- a/erpnext/public/js/account_tree_grid.js
+++ b/erpnext/public/js/account_tree_grid.js
@@ -178,7 +178,7 @@
 		var me= this;
 		$.each(this.data, function(i, account) {
 			// update groups
-			if((account.group_or_ledger == "Ledger") || (account.rgt - account.lft == 1)) {
+			if((account.is_group == 0) || (account.rgt - account.lft == 1)) {
 				var parent = me.parent_map[account.name];
 				while(parent) {
 					var parent_account = me.item_by_name[parent];
diff --git a/erpnext/public/js/controllers/accounts.js b/erpnext/public/js/controllers/accounts.js
index 5d779fa..212d2ae 100644
--- a/erpnext/public/js/controllers/accounts.js
+++ b/erpnext/public/js/controllers/accounts.js
@@ -5,6 +5,66 @@
 frappe.provide("erpnext.taxes");
 frappe.provide("erpnext.taxes.flags");
 
+frappe.ui.form.on(cur_frm.doctype, {
+	onload: function(frm) {
+		if(frm.get_field("taxes")) {
+			frm.set_query("account_head", "taxes", function(doc) {
+				if(frm.cscript.tax_table == "Sales Taxes and Charges") {
+					var account_type = ["Tax", "Chargeable", "Expense Account"];
+				} else {
+					var account_type = ["Tax", "Chargeable", "Income Account"];
+				}
+
+				return {
+					query: "erpnext.controllers.queries.tax_account_query",
+					filters: {
+						"account_type": account_type,
+						"company": doc.company
+					}
+				}
+			});
+
+			frm.set_query("cost_center", "taxes", function(doc) {
+				return {
+					filters: {
+						'company': doc.company,
+						"is_group": 0
+					}
+				}
+			});
+		}
+	},
+	validate: function(frm) {
+		// neither is absolutely mandatory
+		// check mandatory based on charge_type
+		frm.get_docfield("taxes", "rate").reqd = 0;
+		frm.get_docfield("taxes", "tax_amount").reqd = 0;
+
+		$.each(frm.doc.taxes || [], function(i, d) {
+			if(d.charge_type==="Actual") {
+				d.rate = 0;
+				if(!d.tax_amount) {
+					msgprint(__("Amount is mandatory for {0}", [d.account_head]));
+					validated = false;
+				}
+			} else {
+				d.tax_amount = 0;
+				if(!d.rate) {
+					msgprint(__("Rate is mandatory for {0}", [d.account_head]));
+					validated = false;
+				}
+			}
+		});
+	},
+	taxes_on_form_rendered: function(frm) {
+		erpnext.taxes.set_conditional_mandatory_rate_or_amount(frm);
+	}
+});
+
+
+
+
+
 
 cur_frm.cscript.account_head = function(doc, cdt, cdn) {
 	var d = locals[cdt][cdn];
@@ -134,42 +194,6 @@
 	}
 }
 
-// setup conditional mandatory for tax and rates
-frappe.ui.form.on(cur_frm.doctype, "taxes_on_form_rendered", function(frm) {
-	erpnext.taxes.set_conditional_mandatory_rate_or_amount(frm);
-});
-
-// setup queries for taxes
-frappe.ui.form.on(cur_frm.doctype, "onload", function(frm) {
-	if(frm.get_field("taxes")) {
-		frm.set_query("account_head", "taxes", function(doc) {
-			if(frm.cscript.tax_table == "Sales Taxes and Charges") {
-				var account_type = ["Tax", "Chargeable", "Expense Account"];
-			} else {
-				var account_type = ["Tax", "Chargeable", "Income Account"];
-			}
-
-			return {
-				query: "erpnext.controllers.queries.tax_account_query",
-				filters: {
-					"account_type": account_type,
-					"company": doc.company
-				}
-			}
-		});
-
-		frm.set_query("cost_center", "taxes", function(doc) {
-			return {
-				filters: {
-					'company': doc.company,
-					'group_or_ledger': "Ledger"
-				}
-			}
-		});
-	}
-});
-
-
 
 // For customizing print
 cur_frm.pformat.total = function(doc) { return ''; }
diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js
index d39cc1a..6acf64c 100644
--- a/erpnext/public/js/controllers/taxes_and_totals.js
+++ b/erpnext/public/js/controllers/taxes_and_totals.js
@@ -335,9 +335,9 @@
 				var diff = me.frm.doc.net_total
 					- flt(last_tax.total / me.frm.doc.conversion_rate, precision("grand_total"));
 
-				if ( diff && Math.abs(diff) <= (2.0 / Math.pow(10, last_tax.precision("tax_amount"))) ) {
+				if ( diff && Math.abs(diff) <= (2.0 / Math.pow(10, precision("tax_amount", last_tax))) ) {
 					var adjustment_amount = flt(diff * me.frm.doc.conversion_rate, 
-							last_tax.precision("tax_amount"));
+							precision("tax_amount", last_tax));
 					last_tax.tax_amount += adjustment_amount;
 					last_tax.tax_amount_after_discount += adjustment_amount;
 					last_tax.total += adjustment_amount;
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index 7ee342f..b45e120 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -190,8 +190,11 @@
 		if (this.frm.doc.posting_date) var date = this.frm.doc.posting_date;
 		else var date = this.frm.doc.transaction_date;
 		erpnext.get_fiscal_year(this.frm.doc.company, date, fn);
-
 		erpnext.get_letter_head(this.frm.doc.company);
+
+		if(this.frm.doc.company) {
+			erpnext.last_selected_company = this.frm.doc.company;
+		}
 	},
 
 	transaction_date: function() {
@@ -211,7 +214,8 @@
 		this.set_dynamic_labels();
 
 		var company_currency = this.get_company_currency();
-		if(this.frm.doc.currency !== company_currency) {
+		// Added `ignore_pricing_rule` to determine if document is loading after mapping from another doc
+		if(this.frm.doc.currency !== company_currency  && !this.frm.doc.ignore_pricing_rule) {
 			this.get_exchange_rate(this.frm.doc.currency, company_currency,
 				function(exchange_rate) {
 					me.frm.set_value("conversion_rate", exchange_rate);
diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js
index 111ad6d..355fe7d 100644
--- a/erpnext/public/js/utils.js
+++ b/erpnext/public/js/utils.js
@@ -41,6 +41,8 @@
 			if(companies.length === 1) {
 				if(!cur_frm.doc.company) cur_frm.set_value("company", companies[0]);
 				cur_frm.toggle_display("company", false);
+			} else if(erpnext.last_selected_company) {
+				if(!cur_frm.doc.company) cur_frm.set_value("company", erpnext.last_selected_company);
 			}
 		}
 	},
@@ -76,8 +78,8 @@
 						"options": "Serial No",
 						"label": __("Serial No"),
 						"get_query": function () {
-							return { 
-								filters: { 
+							return {
+								filters: {
 									item_code:grid_row.doc.item_code ,
 									warehouse:grid_row.doc.warehouse
 								}
diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js
index b87d7c0..d83628d 100644
--- a/erpnext/selling/doctype/customer/customer.js
+++ b/erpnext/selling/doctype/customer/customer.js
@@ -93,7 +93,7 @@
 		filters: {
 			'account_type': 'Receivable',
 			'company': d.company,
-			'group_or_ledger': 'Ledger'
+			"is_group": 0
 		}
 	}
 }
diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py
index 7e722fc..2d0f850 100644
--- a/erpnext/selling/doctype/customer/customer.py
+++ b/erpnext/selling/doctype/customer/customer.py
@@ -161,7 +161,7 @@
 
 		# If not authorized person raise exception
 		credit_controller = frappe.db.get_value('Accounts Settings', None, 'credit_controller')
-		if not credit_controller or credit_controller not in frappe.user.get_roles():
+		if not credit_controller or credit_controller not in frappe.get_roles():
 			throw(_("Please contact to the user who have Sales Master Manager {0} role")
 				.format(" / " + credit_controller if credit_controller else ""))
 
diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json
index e627824..553064c 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.json
+++ b/erpnext/selling/doctype/sales_order/sales_order.json
@@ -595,6 +595,7 @@
    "fieldname": "advance_paid", 
    "fieldtype": "Currency", 
    "label": "Advance Paid", 
+   "no_copy": 1, 
    "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "print_hide": 1, 
@@ -1079,7 +1080,7 @@
  "idx": 1, 
  "is_submittable": 1, 
  "issingle": 0, 
- "modified": "2015-03-23 14:46:09.478285", 
+ "modified": "2015-04-28 15:27:40.852414", 
  "modified_by": "Administrator", 
  "module": "Selling", 
  "name": "Sales Order", 
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 9525fa5..398e1e1 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -51,7 +51,7 @@
 			d.projected_qty = tot_avail_qty and flt(tot_avail_qty[0][0]) or 0
 		unique_chk_list = set(check_list)
 		if len(unique_chk_list) != len(check_list):
-			frappe.msgprint(_("Warning:Same item has been entered multiple times."))
+			frappe.msgprint(_("Warning: Same item has been entered multiple times."))
 
 	def validate_sales_mntc_quotation(self):
 		for d in self.get('items'):
diff --git a/erpnext/setup/doctype/authorization_control/authorization_control.py b/erpnext/setup/doctype/authorization_control/authorization_control.py
index 5d937ac..f1c198c 100644
--- a/erpnext/setup/doctype/authorization_control/authorization_control.py
+++ b/erpnext/setup/doctype/authorization_control/authorization_control.py
@@ -32,7 +32,7 @@
 				if(d[0]): appr_users.append(d[0])
 				if(d[1]): appr_roles.append(d[1])
 
-			if not has_common(appr_roles, frappe.user.get_roles()) and not has_common(appr_users, [session['user']]):
+			if not has_common(appr_roles, frappe.get_roles()) and not has_common(appr_users, [session['user']]):
 				frappe.msgprint(_("Not authroized since {0} exceeds limits").format(_(based_on)))
 				frappe.throw(_("Can be approved by {0}").format(comma_or(appr_roles + appr_users)))
 
@@ -77,7 +77,7 @@
 		auth_value = av_dis
 
 		if val == 1: add_cond += " and system_user = '"+session['user'].replace("'", "\\'")+"'"
-		elif val == 2: add_cond += " and system_role IN %s" % ("('"+"','".join(frappe.user.get_roles())+"')")
+		elif val == 2: add_cond += " and system_role IN %s" % ("('"+"','".join(frappe.get_roles())+"')")
 		else: add_cond += " and ifnull(system_user,'') = '' and ifnull(system_role,'') = ''"
 
 		if based_on == 'Grand Total': auth_value = total
@@ -130,7 +130,7 @@
 			where transaction = %s and system_role IN (%s) and based_on IN (%s)
 			and (company = %s or ifnull(company,'')='')
 			and docstatus != 2
-		""" % ('%s', "'"+"','".join(frappe.user.get_roles())+"'", "'"+"','".join(final_based_on)+"'", '%s'), (doctype_name, company))]
+		""" % ('%s', "'"+"','".join(frappe.get_roles())+"'", "'"+"','".join(final_based_on)+"'", '%s'), (doctype_name, company))]
 
 		for d in based_on:
 			self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 2, company)
diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js
index 5ff256d..817fdb6 100644
--- a/erpnext/setup/doctype/company/company.js
+++ b/erpnext/setup/doctype/company/company.js
@@ -5,37 +5,35 @@
 
 frappe.ui.form.on("Company", {
 	onload_post_render: function(frm) {
-		frm.get_field("delete_company").$input.addClass("btn-danger");
+		frm.get_field("delete_company_transactions").$input.addClass("btn-danger");
 	},
 	country: function(frm) {
 		erpnext.company.set_chart_of_accounts_options(frm.doc);
 	},
-	delete_company: function(frm) {
+	delete_company_transactions: function(frm) {
 		var d = frappe.prompt({
 			fieldtype:"Data",
 			fieldname: "company_name",
 			label: __("Please re-type company name to confirm"),
 			reqd: 1,
-			description: __("Please make sure you really want to delete this company and all its transactions. Your master data will remain as it is. This action cannot be undone.")},
+			description: __("Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone.")},
 				function(data) {
 					if(data.company_name !== frm.doc.name) {
 						frappe.msgprint("Company name not same");
 						return;
 					}
 					frappe.call({
-						method: "erpnext.setup.doctype.company.delete_company.delete_company",
+						method: "erpnext.setup.doctype.company.delete_company_transactions.delete_company_transactions",
 						args: {
 							company_name: data.company_name
 						},
 						freeze: true,
-						callback: function(r) {
-							if(!r.exc) {
-								frappe.model.clear_doc("Company", data.company_name);
-								window.history.back();
-							}
+						callback: function(r, rt) {
+							if(!r.exc) 
+								frappe.msgprint(__("Successfully deleted all transactions related to this company!"));
 						}
 					});
-				}, __("Delete Comany and all Related Transactions"), __("Delete"));
+				}, __("Delete all the Transactions for this Company"), __("Delete"));
 
 			d.get_primary_btn().addClass("btn-danger");
 	}
@@ -114,7 +112,7 @@
 	return{
 		filters: [
 			['Account', 'account_type', '=', 'Bank'],
-			['Account', 'group_or_ledger', '=', 'Ledger'],
+			['Account', 'is_group', '=', 0],
 			['Account', 'company', '=', doc.name]
 		]
 	}
@@ -124,7 +122,7 @@
 	return{
 		filters: [
 			['Account', 'account_type', '=', 'Cash'],
-			['Account', 'group_or_ledger', '=', 'Ledger'],
+			['Account', 'is_group', '=', 0],
 			['Account', 'company', '=', doc.name]
 		]
 	}
@@ -134,7 +132,7 @@
 	return{
 		filters:{
 			'company': doc.name,
-			'group_or_ledger': "Ledger",
+			"is_group": 0,
 			"account_type": "Receivable"
 		}
 	}
@@ -144,7 +142,7 @@
 	return{
 		filters:{
 			'company': doc.name,
-			'group_or_ledger': "Ledger",
+			"is_group": 0,
 			"account_type": "Payable"
 		}
 	}
@@ -156,7 +154,7 @@
 	return{
 		filters:{
 			'company': doc.name,
-			'group_or_ledger': "Ledger",
+			"is_group": 0,
 			"report_type": "Profit and Loss"
 		}
 	}
@@ -166,7 +164,7 @@
 	return{
 		filters:{
 			'company': doc.name,
-			'group_or_ledger': "Ledger",
+			"is_group": 0,
 			"report_type": "Profit and Loss"
 		}
 	}
@@ -176,7 +174,7 @@
 	return{
 		filters:{
 			'company': doc.name,
-			'group_or_ledger': "Ledger",
+			"is_group": 0,
 		}
 	}
 }
@@ -187,7 +185,7 @@
 			"filters": {
 				"report_type": "Profit and Loss",
 				"company": doc.name,
-				'group_or_ledger': "Ledger"
+				"is_group": 0
 			}
 		}
 	}
@@ -200,7 +198,7 @@
 			"filters": {
 				"report_type": "Balance Sheet",
 				"company": doc.name,
-				'group_or_ledger': "Ledger"
+				"is_group": 0
 			}
 		}
 	}
diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json
index f7faf96..0e7b17a 100644
--- a/erpnext/setup/doctype/company/company.json
+++ b/erpnext/setup/doctype/company/company.json
@@ -397,16 +397,16 @@
    "read_only": 0
   }, 
   {
-   "fieldname": "delete_company", 
+   "fieldname": "delete_company_transactions", 
    "fieldtype": "Button", 
-   "label": "Delete Company", 
+   "label": "Delete Company Transactions", 
    "permlevel": 0, 
    "precision": ""
   }
  ], 
  "icon": "icon-building", 
  "idx": 1, 
- "modified": "2015-04-17 01:37:32.304374", 
+ "modified": "2015-05-04 11:22:42.116328", 
  "modified_by": "Administrator", 
  "module": "Setup", 
  "name": "Company", 
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index a89fc51..ad89114 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -55,7 +55,7 @@
 			self.create_default_warehouses()
 			self.install_country_fixtures()
 
-		if not frappe.db.get_value("Cost Center", {"group_or_ledger": "Ledger", "company": self.name}):
+		if not frappe.db.get_value("Cost Center", {"is_group": 0, "company": self.name}):
 			self.create_default_cost_center()
 
 		self.set_default_accounts()
@@ -71,7 +71,7 @@
 		for whname in (_("Stores"), _("Work In Progress"), _("Finished Goods")):
 			if not frappe.db.exists("Warehouse", whname + " - " + self.abbr):
 				stock_group = frappe.db.get_value("Account", {"account_type": "Stock",
-					"group_or_ledger": "Group", "company": self.name})
+					"is_group": 1, "company": self.name})
 				if stock_group:
 					frappe.get_doc({
 						"doctype":"Warehouse",
@@ -125,7 +125,7 @@
 			return
 
 		account = frappe.db.get_value("Account", {"account_type": account_type,
-			"group_or_ledger": "Ledger", "company": self.name})
+			"is_group": 0, "company": self.name})
 
 		if account:
 			self.db_set(fieldname, account)
@@ -135,13 +135,13 @@
 			{
 				'cost_center_name': self.name,
 				'company':self.name,
-				'group_or_ledger':'Group',
+				'is_group': 1,
 				'parent_cost_center':None
 			},
 			{
 				'cost_center_name':_('Main'),
 				'company':self.name,
-				'group_or_ledger':'Ledger',
+				'is_group':0,
 				'parent_cost_center':self.name + ' - ' + self.abbr
 			},
 		]
@@ -167,6 +167,33 @@
 			where defkey='Company' and defvalue=%s""", (newdn, olddn))
 
 		frappe.defaults.clear_cache()
+		
+	def on_trash(self):
+		"""
+			Trash accounts and cost centers for this company if no gl entry exists
+		"""
+		rec = frappe.db.sql("SELECT name from `tabGL Entry` where company = %s", self.name)
+		if not rec:
+			# delete Account
+			frappe.db.sql("delete from `tabAccount` where company = %s", self.name)
+
+			# delete cost center child table - budget detail
+			frappe.db.sql("""delete bd.* from `tabBudget Detail` bd, `tabCost Center` cc 
+				where bd.parent = cc.name and cc.company = %s""", self.name)
+			#delete cost center
+			frappe.db.sql("delete from `tabCost Center` WHERE company = %s", self.name)
+
+			# delete account from customer and supplier
+			frappe.db.sql("delete from `tabParty Account` where company=%s", self.name)
+
+		if not frappe.db.get_value("Stock Ledger Entry", {"company": self.name}):
+			frappe.db.sql("""delete from `tabWarehouse` where company=%s""", self.name)
+
+		frappe.defaults.clear_default("company", value=self.name)
+
+		frappe.db.sql("""update `tabSingles` set value=""
+			where doctype='Global Defaults' and field='default_company'
+			and value=%s""", self.name)
 
 @frappe.whitelist()
 def replace_abbr(company, old, new):
diff --git a/erpnext/setup/doctype/company/delete_company.py b/erpnext/setup/doctype/company/delete_company_transactions.py
similarity index 82%
rename from erpnext/setup/doctype/company/delete_company.py
rename to erpnext/setup/doctype/company/delete_company_transactions.py
index 92b6c52..f27ba86 100644
--- a/erpnext/setup/doctype/company/delete_company.py
+++ b/erpnext/setup/doctype/company/delete_company_transactions.py
@@ -8,26 +8,19 @@
 from frappe import _
 
 @frappe.whitelist()
-def delete_company(company_name):
+def delete_company_transactions(company_name):
 	frappe.only_for("System Manager")
 	doc = frappe.get_doc("Company", company_name)
 
 	if frappe.session.user != doc.owner:
-		frappe.throw(_("Company can only be deleted by the creator"), frappe.PermissionError)
+		frappe.throw(_("Transactions can only be deleted by the creator of the Company"), frappe.PermissionError)
 
 	delete_bins(company_name)
 
 	for doctype in frappe.db.sql_list("""select parent from
 		tabDocField where fieldtype='Link' and options='Company'"""):
-		delete_for_doctype(doctype, company_name)
-
-	frappe.delete_doc("Company", company_name)
-
-	frappe.defaults.clear_default("company", value=doc.name)
-
-	frappe.db.sql("""update `tabSingles` set value=""
-		where doctype='Global Defaults' and field='default_company'
-		and value=%s""", doc.name)
+		if doctype not in ("Account", "Cost Center", "Warehouse", "Budget Detail", "Party Account"):
+			delete_for_doctype(doctype, company_name)
 
 def delete_for_doctype(doctype, company_name):
 	meta = frappe.get_meta(doctype)
diff --git a/erpnext/setup/doctype/customer_group/customer_group.js b/erpnext/setup/doctype/customer_group/customer_group.js
index 8e31119..7a5d2fa 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.js
+++ b/erpnext/setup/doctype/customer_group/customer_group.js
@@ -32,7 +32,7 @@
 		filters: {
 			'account_type': 'Receivable',
 			'company': d.company,
-			'group_or_ledger': 'Ledger'
+			"is_group": 0
 		}
 	}
 }
diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py
index 15a3781..87a1043 100644
--- a/erpnext/setup/doctype/email_digest/email_digest.py
+++ b/erpnext/setup/doctype/email_digest/email_digest.py
@@ -394,7 +394,7 @@
 		if not hasattr(self, "accounts"):
 			self.accounts = frappe.db.sql("""select name, account_type, account_name, root_type
 				from `tabAccount` where company=%s and docstatus < 2
-				and group_or_ledger = "Ledger" order by lft""",
+				and is_group = 0 order by lft""",
 				(self.company,), as_dict=1)
 		return self.accounts
 
diff --git a/erpnext/setup/doctype/supplier_type/supplier_type.js b/erpnext/setup/doctype/supplier_type/supplier_type.js
index 7b2464b..f1c5d70 100644
--- a/erpnext/setup/doctype/supplier_type/supplier_type.js
+++ b/erpnext/setup/doctype/supplier_type/supplier_type.js
@@ -11,7 +11,7 @@
 		filters: {
 			'account_type': 'Payable',
 			'company': d.company,
-			'group_or_ledger': 'Ledger'
+			"is_group": 0
 		}
 	}
 }
diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.py b/erpnext/setup/page/setup_wizard/setup_wizard.py
index 7fd3542..b80d55e 100644
--- a/erpnext/setup/page/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/page/setup_wizard/setup_wizard.py
@@ -297,14 +297,14 @@
 
 			try:
 				tax_group = frappe.db.get_value("Account", {"company": args.get("company_name"),
-					"group_or_ledger": "Group", "account_type": "Tax", "root_type": "Liability"})
+					"is_group": 1, "account_type": "Tax", "root_type": "Liability"})
 				if tax_group:
 					frappe.get_doc({
 						"doctype":"Account",
 						"company": args.get("company_name").strip(),
 						"parent_account": tax_group,
 						"account_name": args.get("tax_" + str(i)),
-						"group_or_ledger": "Ledger",
+						"is_group": 0,
 						"report_type": "Balance Sheet",
 						"account_type": "Tax",
 						"tax_rate": flt(tax_rate) if tax_rate else None
@@ -330,69 +330,78 @@
 					"company": args.get("company_name").strip()
 				})
 
-			frappe.get_doc({
-				"doctype":"Item",
-				"item_code": item,
-				"item_name": item,
-				"description": item,
-				"is_sales_item": "Yes" if is_sales_item else "No",
-				"is_purchase_item": "Yes" if is_purchase_item else "No",
-				"show_in_website": 1,
-				"is_stock_item": is_stock_item and "Yes" or "No",
-				"item_group": item_group,
-				"stock_uom": args.get("item_uom_" + str(i)),
-				"default_warehouse": default_warehouse
-			}).insert()
+			try:
+				frappe.get_doc({
+					"doctype":"Item",
+					"item_code": item,
+					"item_name": item,
+					"description": item,
+					"is_sales_item": "Yes" if is_sales_item else "No",
+					"is_purchase_item": "Yes" if is_purchase_item else "No",
+					"show_in_website": 1,
+					"is_stock_item": is_stock_item and "Yes" or "No",
+					"item_group": item_group,
+					"stock_uom": args.get("item_uom_" + str(i)),
+					"default_warehouse": default_warehouse
+				}).insert()
 
-			if args.get("item_img_" + str(i)):
-				item_image = args.get("item_img_" + str(i)).split(",")
-				if len(item_image)==3:
-					filename, filetype, content = item_image
-					fileurl = save_file(filename, content, "Item", item, decode=True).file_url
-					frappe.db.set_value("Item", item, "image", fileurl)
+				if args.get("item_img_" + str(i)):
+					item_image = args.get("item_img_" + str(i)).split(",")
+					if len(item_image)==3:
+						filename, filetype, content = item_image
+						fileurl = save_file(filename, content, "Item", item, decode=True).file_url
+						frappe.db.set_value("Item", item, "image", fileurl)
+			except frappe.NameError:
+				pass
 
 def create_customers(args):
 	for i in xrange(1,6):
 		customer = args.get("customer_" + str(i))
 		if customer:
-			frappe.get_doc({
-				"doctype":"Customer",
-				"customer_name": customer,
-				"customer_type": "Company",
-				"customer_group": _("Commercial"),
-				"territory": args.get("country"),
-				"company": args.get("company_name").strip()
-			}).insert()
-
-			if args.get("customer_contact_" + str(i)):
-				contact = args.get("customer_contact_" + str(i)).split(" ")
+			try:
 				frappe.get_doc({
-					"doctype":"Contact",
-					"customer": customer,
-					"first_name":contact[0],
-					"last_name": len(contact) > 1 and contact[1] or ""
+					"doctype":"Customer",
+					"customer_name": customer,
+					"customer_type": "Company",
+					"customer_group": _("Commercial"),
+					"territory": args.get("country"),
+					"company": args.get("company_name").strip()
 				}).insert()
 
+				if args.get("customer_contact_" + str(i)):
+					contact = args.get("customer_contact_" + str(i)).split(" ")
+					frappe.get_doc({
+						"doctype":"Contact",
+						"customer": customer,
+						"first_name":contact[0],
+						"last_name": len(contact) > 1 and contact[1] or ""
+					}).insert()
+			except frappe.NameError:
+				pass
+
 def create_suppliers(args):
 	for i in xrange(1,6):
 		supplier = args.get("supplier_" + str(i))
 		if supplier:
-			frappe.get_doc({
-				"doctype":"Supplier",
-				"supplier_name": supplier,
-				"supplier_type": _("Local"),
-				"company": args.get("company_name").strip()
-			}).insert()
-
-			if args.get("supplier_contact_" + str(i)):
-				contact = args.get("supplier_contact_" + str(i)).split(" ")
+			try:
 				frappe.get_doc({
-					"doctype":"Contact",
-					"supplier": supplier,
-					"first_name":contact[0],
-					"last_name": len(contact) > 1 and contact[1] or ""
+					"doctype":"Supplier",
+					"supplier_name": supplier,
+					"supplier_type": _("Local"),
+					"company": args.get("company_name").strip()
 				}).insert()
 
+				if args.get("supplier_contact_" + str(i)):
+					contact = args.get("supplier_contact_" + str(i)).split(" ")
+					frappe.get_doc({
+						"doctype":"Contact",
+						"supplier": supplier,
+						"first_name":contact[0],
+						"last_name": len(contact) > 1 and contact[1] or ""
+					}).insert()
+			except frappe.NameError:
+				pass
+
 
 def create_letter_head(args):
 	if args.get("attach_letterhead"):
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index b4ae5ef..e3a034c 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -7,7 +7,7 @@
 from frappe.utils import flt
 
 def get_company_currency(company):
-	currency = frappe.db.get_value("Company", company, "default_currency")
+	currency = frappe.db.get_value("Company", company, "default_currency", cache=True)
 	if not currency:
 		currency = frappe.db.get_default("currency")
 	if not currency:
diff --git a/erpnext/startup/report_data_map.py b/erpnext/startup/report_data_map.py
index 813090f..b8653cd 100644
--- a/erpnext/startup/report_data_map.py
+++ b/erpnext/startup/report_data_map.py
@@ -19,7 +19,7 @@
 	# Accounts
 	"Account": {
 		"columns": ["name", "parent_account", "lft", "rgt", "report_type",
-			"company", "group_or_ledger"],
+			"company", "is_group"],
 		"conditions": ["docstatus < 2"],
 		"order_by": "lft",
 		"links": {
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js
index 00916c2..631009f 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.js
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.js
@@ -214,7 +214,7 @@
 			filters: {
 				"report_type": "Profit and Loss",
 				"company": doc.company,
-				"group_or_ledger": "Ledger"
+				"is_group": 0
 			}
 		}
 	}
@@ -236,7 +236,7 @@
 
 			filters: {
 				'company': doc.company,
-				'group_or_ledger': "Ledger"
+				"is_group": 0
 			}
 		}
 	}
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json
index 473e9ad..e045eb9 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.json
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.json
@@ -1070,7 +1070,7 @@
  "idx": 1, 
  "in_create": 0, 
  "is_submittable": 1, 
- "modified": "2015-04-07 00:12:12.119039", 
+ "modified": "2015-04-24 00:12:12.119039", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Delivery Note", 
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index 24851dd..55d6d33 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -122,7 +122,7 @@
 			return {
 				filters: {
 					"report_type": "Profit and Loss",
-					"group_or_ledger": "Ledger"
+					"is_group": 0
 				}
 			}
 		}
@@ -133,7 +133,7 @@
 			return {
 				filters: {
 					"report_type": "Profit and Loss",
-					'group_or_ledger': "Ledger",
+					"is_group": 0,
 					'account_type': "Income Account"
 				}
 			}
@@ -144,7 +144,7 @@
 		// -----------------------------
 		frm.fields_dict['buying_cost_center'].get_query = function(doc) {
 			return {
-				filters:{ 'group_or_ledger': "Ledger" }
+				filters:{ "is_group": 0 }
 			}
 		}
 
@@ -153,7 +153,7 @@
 		// -----------------------------
 		frm.fields_dict['selling_cost_center'].get_query = function(doc) {
 			return {
-				filters:{ 'group_or_ledger': "Ledger" }
+				filters:{ "is_group": 0 }
 			}
 		}
 
diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json
index b34983d..282d182 100644
--- a/erpnext/stock/doctype/item/item.json
+++ b/erpnext/stock/doctype/item/item.json
@@ -428,6 +428,7 @@
    "reqd": 1
   }, 
   {
+   "depends_on": "eval:doc.is_purchase_item==\"Yes\"", 
    "fieldname": "default_supplier", 
    "fieldtype": "Link", 
    "ignore_user_permissions": 1, 
@@ -448,7 +449,7 @@
    "read_only": 0
   }, 
   {
-   "depends_on": "eval:doc.is_purchase_item==\"Yes\"", 
+   "depends_on": "", 
    "description": "Default Purchase Account in which cost of the item will be debited.", 
    "fieldname": "expense_account", 
    "fieldtype": "Link", 
@@ -461,7 +462,7 @@
    "read_only": 0
   }, 
   {
-   "depends_on": "eval:doc.is_purchase_item==\"Yes\"", 
+   "depends_on": "", 
    "description": "", 
    "fieldname": "buying_cost_center", 
    "fieldtype": "Link", 
@@ -877,7 +878,7 @@
  "icon": "icon-tag", 
  "idx": 1, 
  "max_attachments": 1, 
- "modified": "2015-03-03 06:18:35.717586", 
+ "modified": "2015-05-04 18:44:46.090445", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Item", 
diff --git a/erpnext/stock/doctype/item/item_list.js b/erpnext/stock/doctype/item/item_list.js
index 168252e..c6beeff 100644
--- a/erpnext/stock/doctype/item/item_list.js
+++ b/erpnext/stock/doctype/item/item_list.js
@@ -3,7 +3,7 @@
 		"has_variants", "end_of_life", "is_sales_item"],
 
 	get_indicator: function(doc) {
-		if(doc.end_of_life < frappe.datetime.get_today()) {
+		if(doc.end_of_life && doc.end_of_life < frappe.datetime.get_today()) {
 			return [__("Expired"), "grey", "end_of_life,<,Today"]
 		} else if(doc.has_variants) {
 			return [__("Template"), "blue", "has_variant,=,1"]
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index c7c7aaa..6bb2e2f 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -51,7 +51,7 @@
 				return {
 					filters: {
 						"company": me.frm.doc.company,
-						"group_or_ledger": "Ledger"
+						"is_group": 0
 					}
 				}
 			}
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index 1b3dc06..97e7c20 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -82,14 +82,14 @@
 		stock_frozen_upto = frappe.db.get_value('Stock Settings', None, 'stock_frozen_upto') or ''
 		if stock_frozen_upto:
 			stock_auth_role = frappe.db.get_value('Stock Settings', None,'stock_auth_role')
-			if getdate(self.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in frappe.user.get_roles():
+			if getdate(self.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in frappe.get_roles():
 				frappe.throw(_("Stock transactions before {0} are frozen").format(formatdate(stock_frozen_upto)), StockFreezeError)
 
 		stock_frozen_upto_days = int(frappe.db.get_value('Stock Settings', None, 'stock_frozen_upto_days') or 0)
 		if stock_frozen_upto_days:
 			stock_auth_role = frappe.db.get_value('Stock Settings', None,'stock_auth_role')
 			older_than_x_days_ago = (add_days(getdate(self.posting_date), stock_frozen_upto_days) <= date.today())
-			if older_than_x_days_ago and not stock_auth_role in frappe.user.get_roles():
+			if older_than_x_days_ago and not stock_auth_role in frappe.get_roles():
 				frappe.throw(_("Not allowed to update stock transactions older than {0}").format(stock_frozen_upto_days), StockFreezeError)
 
 	def scrub_posting_time(self):
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js
index 67eb882..c0ae213 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js
@@ -65,7 +65,7 @@
 				return {
 					"filters": {
 						'company': me.frm.doc.company,
-						'group_or_ledger': 'Ledger'
+						"is_group": 0
 					}
 				}
 			}
@@ -73,7 +73,7 @@
 				return {
 					"filters": {
 						'company': me.frm.doc.company,
-						'group_or_ledger': 'Ledger'
+						"is_group": 0
 					}
 				}
 			}
diff --git a/erpnext/stock/doctype/warehouse/warehouse.js b/erpnext/stock/doctype/warehouse/warehouse.js
index 27b63b5..22396b7 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.js
+++ b/erpnext/stock/doctype/warehouse/warehouse.js
@@ -9,7 +9,7 @@
 	return {
 		filters: {
 			"company": cur_frm.doc.company,
-			'group_or_ledger': "Group"
+			'is_group': 1
 		}
 	}
 })
diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py
index 1643f93..2024ebe 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -48,7 +48,7 @@
 						"doctype": "Account",
 						'account_name': self.warehouse_name,
 						'parent_account': self.create_account_under,
-						'group_or_ledger':'Ledger',
+						'is_group':0,
 						'company':self.company,
 						"account_type": "Warehouse",
 						"warehouse": self.name,
diff --git a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
index 1922d8a..0395987 100644
--- a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
+++ b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
@@ -8,20 +8,21 @@
 
 def execute(filters=None):
 	if not filters: filters = {}
+	
+	float_precision = cint(frappe.db.get_default("float_precision")) or 3
 
 	columns = get_columns(filters)
 	item_map = get_item_details(filters)
-	iwb_map = get_item_warehouse_batch_map(filters)
+	iwb_map = get_item_warehouse_batch_map(filters, float_precision)
 
 	data = []
 	for item in sorted(iwb_map):
 		for wh in sorted(iwb_map[item]):
 			for batch in sorted(iwb_map[item][wh]):
 				qty_dict = iwb_map[item][wh][batch]
-				data.append([item, item_map[item]["item_name"],
-					item_map[item]["description"], wh, batch,
-					qty_dict.opening_qty, qty_dict.in_qty,
-					qty_dict.out_qty, qty_dict.bal_qty
+				data.append([item, item_map[item]["item_name"], item_map[item]["description"], wh, batch,
+					flt(qty_dict.opening_qty, float_precision), flt(qty_dict.in_qty, float_precision),
+					flt(qty_dict.out_qty, float_precision), flt(qty_dict.bal_qty, float_precision)
 				])
 
 	return columns, data
@@ -56,8 +57,7 @@
 		where docstatus < 2 %s order by item_code, warehouse""" %
 		conditions, as_dict=1)
 
-def get_item_warehouse_batch_map(filters):
-	float_precision = cint(frappe.db.get_default("float_precision")) or 3
+def get_item_warehouse_batch_map(filters, float_precision):
 	sle = get_stock_ledger_entries(filters)
 	iwb_map = {}
 
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 5bb2f0c..954a03b 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -98,7 +98,7 @@
 
 		self.company = frappe.db.get_value("Warehouse", self.warehouse, "company")
 		self.precision = get_field_precision(frappe.get_meta("Stock Ledger Entry").get_field("stock_value"),
-			currency=frappe.db.get_value("Company", self.company, "default_currency"))
+			currency=frappe.db.get_value("Company", self.company, "default_currency", cache=True))
 
 		self.prev_stock_value = self.previous_sle.stock_value or 0.0
 		self.stock_queue = json.loads(self.previous_sle.stock_queue or "[]")
diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py
index dc6809f..0ab03cb 100644
--- a/erpnext/support/doctype/issue/issue.py
+++ b/erpnext/support/doctype/issue/issue.py
@@ -10,14 +10,12 @@
 from frappe.utils import now
 from frappe.utils.user import is_website_user
 
+sender_field = "raised_by"
+
 class Issue(Document):
 	def get_feed(self):
 		return "{0}: {1}".format(_(self.status), self.subject)
 
-	def set_sender(self, sender):
-		"""Will be called by **Communication** when the Issue is created from an incoming email."""
-		self.raised_by = sender
-
 	def validate(self):
 		self.update_status()
 		self.set_lead_contact(self.raised_by)
@@ -59,7 +57,7 @@
 	from frappe.templates.pages.list import get_list
 	user = frappe.session.user
 	ignore_permissions = False
-	if is_website_user(user):
+	if is_website_user():
 		if not filters: filters = []
 		filters.append(("Issue", "raised_by", "=", user))
 		ignore_permissions = True
diff --git a/erpnext/templates/pages/address.html b/erpnext/templates/pages/address.html
index 0e221ac..8544604 100644
--- a/erpnext/templates/pages/address.html
+++ b/erpnext/templates/pages/address.html
@@ -40,8 +40,8 @@
 
 <div class="container content">
     <ul class="breadcrumb">
-    	<li><a href="index">Home</a></li>
-    	<li><a href="addresses">My Addresses</a></li>
+    	<li><a href="/index">Home</a></li>
+    	<li><a href="/addresses">My Addresses</a></li>
     	<li class="active"><i class="icon-map-marker icon-fixed-width"></i> {{ title }}</li>
     </ul>
 	<h3><i class="icon-map-marker icon-fixed-width"></i> {{ title }}</h3>
diff --git a/erpnext/templates/pages/addresses.html b/erpnext/templates/pages/addresses.html
index 997143a..a0562c6 100644
--- a/erpnext/templates/pages/addresses.html
+++ b/erpnext/templates/pages/addresses.html
@@ -6,7 +6,7 @@
 
 {% block content %}
 <div class="addresses-content">
-	<p><a class="btn btn-default" href="address"><i class="icon-plus"> New Address</i></a></p>
+	<p><a class="btn btn-default" href="/address"><i class="icon-plus"> New Address</i></a></p>
 	<hr>
 	<div id="address-list">
 		<div class="text-muted progress">{{ _("Loading") }}...</div>
@@ -30,7 +30,7 @@
 				$.each(r.message, function(i, address) {
 					address.url_name = encodeURIComponent(address.name);
 					$(repl('<div> \
-						<p><a href="address?name=%(url_name)s">%(name)s</a></p> \
+						<p><a href="/address?name=%(url_name)s">%(name)s</a></p> \
 						<p>%(display)s</p> \
 						<hr> \
 					</div>', address)).appendTo($list);
diff --git a/erpnext/templates/pages/ticket.html b/erpnext/templates/pages/ticket.html
index cff019c..67d4800 100644
--- a/erpnext/templates/pages/ticket.html
+++ b/erpnext/templates/pages/ticket.html
@@ -11,8 +11,8 @@
 
 <div class="ticket-content">
     <ul class="breadcrumb">
-    	<li><a href="index">Home</a></li>
-    	<li><a href="tickets">My Tickets</a></li>
+    	<li><a href="/index">Home</a></li>
+    	<li><a href="/tickets">My Tickets</a></li>
     	<li class="active"><i class="icon-ticket icon-fixed-width"></i> {{ doc.name or "" }}</li>
     </ul>
 	{% if not doc -%}
diff --git a/erpnext/templates/pages/user.html b/erpnext/templates/pages/user.html
index 1d1d0b3..e9f356d 100644
--- a/erpnext/templates/pages/user.html
+++ b/erpnext/templates/pages/user.html
@@ -5,7 +5,7 @@
 {% block content %}
 <div class="user-content" style="max-width: 500px;">
     <ul class="breadcrumb">
-    	<li><a href="index">Home</a></li>
+    	<li><a href="/index">Home</a></li>
     	<li class="active"><i class="icon-user icon-fixed-width"></i> My Profile</li>
     </ul>
 	<div class="alert alert-warning" id="message" style="display: none;"></div>
diff --git a/setup.py b/setup.py
index 8011b75..8ac87b9 100644
--- a/setup.py
+++ b/setup.py
@@ -1,10 +1,6 @@
 from setuptools import setup, find_packages
 
-<<<<<<< HEAD
 version = "5.0.0-beta"
-=======
-version = "4.25.1"
->>>>>>> 3b8682f534f12bd72e52685d1286a2cc72713857
 
 with open("requirements.txt", "r") as f:
 	install_requires = f.readlines()