Validation: Account must belong to the same company
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 014dde5..5b034f8 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -41,21 +41,24 @@
 				throw(_("Invalid Master Name"))
 
 	def validate_parent(self):
-		"""Fetch Parent Details and validation for account not to be created under ledger"""
+		"""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"], as_dict=1)
+				["name", "group_or_ledger", "report_type", "root_type", "company"], as_dict=1)
 			if not par:
-				throw(_("Parent account does not exist"))
-			elif par["name"] == self.name:
-				throw(_("You can not assign itself as parent account"))
-			elif par["group_or_ledger"] != 'Group':
-				throw(_("Parent account can not be a ledger"))
+				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':
+				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}")
+					.format(self.name, self.parent_account, self.company))
 
-			if par["report_type"]:
-				self.report_type = par["report_type"]
-			if par["root_type"]:
-				self.root_type = par["root_type"]
+			if par.report_type:
+				self.report_type = par.report_type
+			if par.root_type:
+				self.root_type = par.root_type
 
 	def validate_root_details(self):
 		#does not exists parent
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index f8e043a..bd623e6 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -35,6 +35,18 @@
 			self.default_currency != self.previous_default_currency and \
 			self.check_if_transactions_exist():
 				frappe.throw(_("Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency."))
+				
+		self.validate_default_accounts()
+		
+	def validate_default_accounts(self):
+		for field in ["default_bank_account", "default_cash_account", "receivables_group", "payables_group", 
+			"default_expense_account", "default_income_account", "stock_received_but_not_billed", 
+			"stock_adjustment_account", "expenses_included_in_valuation"]:
+				if self.get(field):
+					for_company = frappe.db.get_value("Account", self.get(field), "company")
+					if for_company != self.name:
+						frappe.throw(_("Account {0} does not belong to company: {1}")
+							.format(self.get(field), self.name))
 
 	def on_update(self):
 		if not frappe.db.sql("""select name from tabAccount
@@ -60,7 +72,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"})
+					"group_or_ledger": "Group", "company": self.name})
 				if stock_group:
 					frappe.get_doc({
 						"doctype":"Warehouse",
@@ -115,7 +127,8 @@
 			_set_default_account("expenses_included_in_valuation", "Expenses Included In Valuation")
 
 		if not self.default_income_account:
-			self.db_set("default_income_account", frappe.db.get_value("Account", {"account_name": _("Sales")}))
+			self.db_set("default_income_account", frappe.db.get_value("Account", 
+				{"account_name": _("Sales"), "company": self.name}))
 
 	def create_default_cost_center(self):
 		cc_list = [
diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py
index 2b68928..0095bbb 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -22,11 +22,16 @@
 		self.update_parent_account()
 
 	def update_parent_account(self):
-		if not getattr(self, "__islocal", None) and (self.create_account_under !=
-			frappe.db.get_value("Warehouse", self.name, "create_account_under")):
-				warehouse_account = frappe.db.get_value("Account",
-					{"account_type": "Warehouse", "company": self.company,
-					"master_name": self.name}, ["name", "parent_account"])
+		
+		if not getattr(self, "__islocal", None) \
+			and (self.create_account_under != frappe.db.get_value("Warehouse", self.name, "create_account_under")):
+				
+				self.validate_parent_account()
+				
+				warehouse_account = frappe.db.get_value("Account", 
+					{"account_type": "Warehouse", "company": self.company, "master_name": self.name}, 
+					["name", "parent_account"])
+					
 				if warehouse_account and warehouse_account[1] != self.create_account_under:
 					acc_doc = frappe.get_doc("Account", warehouse_account[0])
 					acc_doc.parent_account = self.create_account_under
@@ -57,13 +62,21 @@
 					msgprint(_("Account head {0} created").format(ac_doc.name))
 
 	def validate_parent_account(self):
+		if not self.company:
+			frappe.throw(_("Warehouse {0}: Company is mandatory").format(self.name))
+		
 		if not self.create_account_under:
 			parent_account = frappe.db.get_value("Account",
 				{"account_name": "Stock Assets", "company": self.company})
+			
 			if parent_account:
 				self.create_account_under = parent_account
 			else:
 				frappe.throw(_("Please enter parent account group for warehouse account"))
+		elif frappe.db.get_value("Account", self.create_account_under, "company") != self.company:
+			frappe.throw(_("Warehouse {0}: Parent account {1} does not bolong to the company {2}")
+				.format(self.name, self.create_account_under, self.company))
+			
 
 	def on_trash(self):
 		# delete bin