changes as per the reviews
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index a2ea096..e7fdd64 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -99,9 +99,10 @@
 			frappe.model.with_doc("Supplier", me.frm.doc.supplier, function() {
 				var supplier = frappe.model.get_doc("Supplier", me.frm.doc.supplier);
 				var internal = supplier.is_internal_supplier;
-				if (internal == 1) {
+				var disabled = supplier.disabled;
+				if (internal == 1 && disabled == 0) {
 					me.frm.add_custom_button("Inter Company Invoice", function() {
-						me.validate_inter_company_invoice(me.frm);
+						me.make_inter_company_invoice(me.frm);
 					}, __("Make"));
 				}
 			});
@@ -144,18 +145,6 @@
 			});
 		}
 	},
-	validate_inter_company_invoice: function(frm) {
-		var me = this;
-		frappe.call({
-			method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.validate_inter_company_invoice",
-			args: {"doc": frm.doc},
-			callback: function(r) {
-				if (r && r.message) {
-					me.make_inter_company_invoice(frm);
-				}
-			}
-		});
-	},
 
 	make_inter_company_invoice: function(frm) {
 		frappe.model.open_mapped_doc({
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 66515e3..67b41a3 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -17,6 +17,8 @@
 from erpnext.buying.utils import check_for_closed_status
 from erpnext.accounts.general_ledger import get_round_off_account_and_cost_center
 from frappe.model.mapper import get_mapped_doc
+from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_invoice,\
+	unlink_inter_company_invoice
 
 form_grid_templates = {
 	"items": "templates/form_grid/item_grid.html"
@@ -73,7 +75,7 @@
 		self.validate_fixed_asset_account()
 		self.create_remarks()
 		self.set_status()
-		self.validate_inter_company_supplier()
+		validate_inter_company_party(self.doctype, self.supplier, self.company, self.inter_company_invoice_reference)
 
 	def validate_cash(self):
 		if not self.cash_bank_account and flt(self.paid_amount):
@@ -120,21 +122,6 @@
 
 		self.party_account_currency = account.account_currency
 
-	def validate_inter_company_supplier(self):
-		if frappe.db.get_value("Supplier", self.supplier, "is_internal_supplier") == 1:
-			if self.inter_company_invoice_reference:
-				doc = frappe.get_doc("Sales Invoice", self.inter_company_invoice_reference)
-				if not frappe.db.get_value("Supplier", {"represents_company": doc.company}, "name") == self.supplier:
-					frappe.throw(_("Invalid Supplier for Inter Company Invoice"))
-				if not frappe.db.get_value("Customer", {"name": doc.customer}, "represents_company") == self.company:
-					frappe.throw(_("Invalid Company for Inter Company Invoice"))
-			else:
-				companies = frappe.db.sql("""select company from `tabAllowed To Transact With`
-					where parenttype = "Supplier" and parent = '{0}'""".format(self.supplier), as_list = 1)
-				companies = [company[0] for company in companies]
-				if not self.company in companies:
-					frappe.throw(_("Supplier not allowed to transact with {0}. Please change the Company.").format(self.company))
-
 	def check_for_closed_status(self):
 		check_list = []
 
@@ -319,12 +306,7 @@
 
 		self.update_project()
 		self.update_fixed_asset()
-		self.update_linked_invoice()
-
-	def update_linked_invoice(self):
-		if self.inter_company_invoice_reference:
-			frappe.db.set_value("Sales Invoice", self.inter_company_invoice_reference,\
-				"inter_company_invoice_reference", self.name)
+		update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
 
 	def update_fixed_asset(self):
 		for d in self.get("items"):
@@ -657,7 +639,7 @@
 		self.update_fixed_asset()
 		frappe.db.set(self, 'status', 'Cancelled')
 
-		self.unlink_inter_company_invoice()
+		unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
 
 	def update_project(self):
 		project_list = []
@@ -696,13 +678,6 @@
 					pi = pi[0][0]
 					frappe.throw(_("Supplier Invoice No exists in Purchase Invoice {0}".format(pi)))
 
-	def unlink_inter_company_invoice(self):
-		if self.inter_company_invoice_reference:
-			frappe.db.set_value("Purchase Invoice", self.name,\
-				"inter_company_invoice_reference", "")
-			frappe.db.set_value("Sales Invoice", self.inter_company_invoice_reference,\
-				"inter_company_invoice_reference", "")
-
 	def update_billing_status_in_pr(self, update_modified=True):
 		updated_pr = []
 		for d in self.get("items"):
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 8e48cc3..77babf4 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -106,9 +106,10 @@
 			frappe.model.with_doc("Customer", me.frm.doc.customer, function() {
 				var customer = frappe.model.get_doc("Customer", me.frm.doc.customer);
 				var internal = customer.is_internal_customer;
-				if (internal == 1) {
+				var disabled = customer.disabled;
+				if (internal == 1 && disabled == 0) {
 					me.frm.add_custom_button("Inter Company Invoice", function() {
-						me.validate_inter_company_invoice(me.frm);
+						me.make_inter_company_invoice();
 					}, __("Make"));
 				}
 			});
@@ -239,24 +240,11 @@
 				me.apply_pricing_rule();
 			})
 	},
-	
-	validate_inter_company_invoice: function(frm) {
-		var me = this;
-		frappe.call({
-			method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.validate_inter_company_invoice",
-			args: {"doc": frm.doc},
-			callback: function(r) {
-				if (r && r.message) {
-					me.make_inter_company_invoice(frm);
-				}
-			}
-		});
-	},
 
-	make_inter_company_invoice: function(frm) {
+	make_inter_company_invoice: function() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.make_inter_company_purchase_invoice",
-			frm: frm
+			frm: me.frm
 		});
 	},
 
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 7a8ee24..115cf14 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -73,7 +73,7 @@
 		self.validate_account_for_change_amount()
 		self.validate_fixed_asset()
 		self.set_income_account_for_fixed_assets()
-		self.validate_inter_company_customer()
+		validate_inter_company_party(self.doctype, self.customer, self.company, self.inter_company_invoice_reference)
 
 		if cint(self.is_pos):
 			self.validate_pos()
@@ -147,32 +147,12 @@
 
 		update_company_current_month_sales(self.company)
 		self.update_project()
-		self.update_linked_invoice()
+		update_linked_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
 
 	def validate_pos_paid_amount(self):
 		if len(self.payments) == 0 and self.is_pos:
 			frappe.throw(_("At least one mode of payment is required for POS invoice."))
 
-	def validate_inter_company_customer(self):
-		if frappe.db.get_value("Customer", self.customer, "is_internal_customer") == 1:
-			if self.inter_company_invoice_reference:
-				doc = frappe.get_doc("Purchase Invoice", self.inter_company_invoice_reference)
-				if not frappe.db.get_value("Customer", {"represents_company": doc.company}, "name") == self.customer:
-					frappe.throw(_("Invalid Customer for Inter Company Invoice"))
-				if not frappe.db.get_value("Supplier", {"name": doc.supplier}, "represents_company") == self.company:
-					frappe.throw(_("Invalid Company for Inter Company Invoice"))
-			else:
-				companies = frappe.db.sql("""select company from `tabAllowed To Transact With`
-					where parenttype = "Customer" and parent = '{0}'""".format(self.customer), as_list = 1)
-				companies = [company[0] for company in companies]
-				if not self.company in companies:
-					frappe.throw(_("Customer not allowed to transact with {0}. Please change the Company.").format(self.company))
-
-	def update_linked_invoice(self):
-		if self.inter_company_invoice_reference:
-			frappe.db.set_value("Purchase Invoice", self.inter_company_invoice_reference,\
-				"inter_company_invoice_reference", self.name)
-
 	def before_cancel(self):
 		self.update_time_sheet(None)
 
@@ -208,7 +188,7 @@
 		update_company_current_month_sales(self.company)
 		self.update_project()
 
-		self.unlink_inter_company_invoice()
+		unlink_inter_company_invoice(self.doctype, self.name, self.inter_company_invoice_reference)
 
 	def update_status_updater_args(self):
 		if cint(self.update_stock):
@@ -931,18 +911,48 @@
 			project.update_billed_amount()
 			project.save()
 
-	def unlink_inter_company_invoice(self):
-		if self.inter_company_invoice_reference:
-			frappe.db.set_value("Sales Invoice", self.name,\
-				"inter_company_invoice_reference", "")
-			frappe.db.set_value("Purchase Invoice", self.inter_company_invoice_reference,\
-				"inter_company_invoice_reference", "")
 
 	def verify_payment_amount_is_positive(self):
 		for entry in self.payments:
 			if entry.amount < 0:
 				frappe.throw(_("Row #{0} (Payment Table): Amount must be positive").format(entry.idx))
 
+def validate_inter_company_party(doctype, party, company, inter_company_invoice_reference):
+	if doctype == "Sales Invoice":
+		partytype, ref_partytype, internal = "Customer", "Supplier", "is_internal_customer"
+		ref_doc =  "Purchase Invoice"
+	else:
+		partytype, ref_partytype, internal = "Supplier", "Customer", "is_internal_supplier"
+		ref_doc =  "Sales Invoice"
+
+	if inter_company_invoice_reference:
+		doc = frappe.get_doc(ref_doc, inter_company_invoice_reference)
+		ref_party = doc.supplier if doctype == "Sales Invoice" else doc.customer
+		if not frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") == party:
+			frappe.throw(_("Invalid {0} for Inter Company Invoice.").format(partytype))
+		if not frappe.db.get_value(ref_partytype, {"name": ref_party}, "represents_company") == company:
+			frappe.throw(_("Invalid Company for Inter Company Invoice."))
+
+	elif frappe.db.get_value(partytype, {"name": party, internal: 1}, "name") == party:
+		companies = frappe.db.sql("""select company from `tabAllowed To Transact With`
+			where parenttype = '{0}' and parent = '{1}'""".format(partytype, party), as_list = 1)
+		companies = [d[0] for d in companies]
+		if not company in companies:
+			frappe.throw(_("{0} not allowed to transact with {1}. Please change the Company.").format(partytype, company))
+
+def update_linked_invoice(doctype, name, inter_company_invoice_reference):
+	if inter_company_invoice_reference:
+		frappe.db.set_value(doctype, inter_company_invoice_reference,\
+			"inter_company_invoice_reference", name)
+
+def unlink_inter_company_invoice(doctype, name, inter_company_invoice_reference):
+	ref_doc = "Purchase Invoice" if doctype == "Sales Invoice" else "Sales Invoice"
+	if inter_company_invoice_reference:
+ 		frappe.db.set_value(doctype, name,\
+			"inter_company_invoice_reference", "")
+		frappe.db.set_value(ref_doc, inter_company_invoice_reference,\
+			"inter_company_invoice_reference", "")
+
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context
 	list_context = get_list_context(context)
@@ -1026,58 +1036,44 @@
 
 def get_inter_company_details(doc, doctype):
 	if doctype == "Sales Invoice":
-		party = frappe.db.get_value("Supplier", {"is_internal_supplier":1, "represents_company": doc.get("company")}, "name")
-		company = frappe.db.get_value("Customer", {"name": doc.get("customer")}, "represents_company")
+		party = frappe.db.get_value("Supplier", {"disabled": 0, "is_internal_supplier": 1, "represents_company": doc.company}, "name")
+		company = frappe.db.get_value("Customer", {"name": doc.customer}, "represents_company")
 	else:
-		party = frappe.db.get_value("Customer", {"is_internal_customer":1, "represents_company": doc.get("company")}, "name")
-		company = frappe.db.get_value("Supplier", {"name": doc.get("supplier")}, "represents_company")
+		party = frappe.db.get_value("Customer", {"disabled": 0, "is_internal_customer": 1, "represents_company": doc.company}, "name")
+		company = frappe.db.get_value("Supplier", {"name": doc.supplier}, "represents_company")
 
 	return {
 		"party": party, 
 		"company": company
 	}
 
-@frappe.whitelist()
-def validate_inter_company_invoice(doc):
-	doc = json.loads(doc)
-	doctype = doc.get("doctype")
+
+def validate_inter_company_invoice(doc, doctype):
+
 	details = get_inter_company_details(doc, doctype)
-	if doctype == "Sales Invoice":
-		buying = frappe.db.get_value("Price List", doc.get("selling_price_list"), "buying")
-		if not buying:
-			frappe.throw(_("Buying and Selling Price List should be same for Inter Company Transactions."))
+	price_list = doc.selling_price_list if doctype == "Sales Invoice" else doc.buying_price_list
+	valid_price_list = frappe.db.get_value("Price List", {"name": price_list, "buying": 1, "selling": 1})
+	if not valid_price_list:
+		frappe.throw(_("Selected Price List should have buying and selling fields checked."))
 
-		supplier = details.get("party")
-		if not supplier:
-			frappe.throw(_("No Supplier found for Inter Company Transactions."))
+	party = details.get("party")
+	if not party:
+		partytype = "Supplier" if doctype == "Sales Invoice" else "Customer"
+		frappe.throw(_("No {0} found for Inter Company Transactions.").format(partytype))
 
-		company = details.get("company")
-		default_currency = frappe.db.get_value("Company", company, "default_currency")
-		if default_currency != doc.get("currency"):
-			frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions."))
-	
-	else:
-		selling = frappe.db.get_value("Price List", doc.get("buying_price_list"), "selling")
-		if not selling:
-			frappe.throw(_("Buying and Selling Price List should be same for Inter Company Transactions."))
+	company = details.get("company")
+	default_currency = frappe.db.get_value("Company", company, "default_currency")
+	if default_currency != doc.currency:
+		frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions."))
 
-		customer = details.get("party")
-		if not customer:
-			frappe.throw(_("No Customer found for Inter Company Transactions."))
-
-		company = details.get("company")
-		default_currency = frappe.db.get_value("Company", company, "default_currency")
-
-		if default_currency != doc.get("currency"):
-			frappe.throw(_("Company currencies of both the companies should match for Inter Company Transactions."))
-
-	return company
+	return
 
 @frappe.whitelist()
 def make_inter_company_purchase_invoice(source_name, target_doc=None):
 	return make_inter_company_invoice("Sales Invoice", source_name, target_doc)
 
 def make_inter_company_invoice(doctype, source_name, target_doc=None):
+
 	from frappe.model.mapper import get_mapped_doc
 	if doctype == "Sales Invoice":
 		source_doc = frappe.get_doc("Sales Invoice", source_name)
@@ -1086,6 +1082,7 @@
 		source_doc = frappe.get_doc("Purchase Invoice", source_name)
 		target_doctype = "Sales Invoice"
 
+	validate_inter_company_invoice(source_doc, doctype)
 	details = get_inter_company_details(source_doc, doctype)
 
 	def set_missing_values(source, target):
@@ -1106,6 +1103,7 @@
 		target_doc.income_account = ""
 		target_doc.expense_account = ""
 		target_doc.cost_center = ""
+		target_doc.warehouse = ""
 
 	doclist = get_mapped_doc(doctype, source_name,	{
 		doctype: {