diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py
index 640a49e..69d396e 100644
--- a/controllers/stock_controller.py
+++ b/controllers/stock_controller.py
@@ -17,28 +17,22 @@
 from __future__ import unicode_literals
 import webnotes
 from webnotes.utils import cint, flt, cstr
+from webnotes import msgprint, _
 import webnotes.defaults
+
 from controllers.accounts_controller import AccountsController
 
 class StockController(AccountsController):
-	def get_gl_entries_for_stock(self, against_stock_account, amount=None, 
-			stock_in_hand_account=None, cost_center=None, warehouse_list=None):
-		if not cost_center:
-			cost_center = self.get_company_default("stock_adjustment_cost_center")
-			
-		acc_diff = {}
-		if warehouse_list:
-			from accounts.utils import get_stock_and_account_difference
-			acc_diff = get_stock_and_account_difference(warehouse_list)
-		elif amount and stock_in_hand_account:
-			acc_diff = {stock_in_hand_account: amount}
-
-		gl_entries = []
-		for account, amount in acc_diff.items():
-			gl_entries += [
+	def get_gl_entries_for_stock(self, against_stock_account, amount, warehouse=None, 
+			stock_in_hand_account=None, cost_center=None):
+		if not stock_in_hand_account and warehouse:
+			stock_in_hand_account = webnotes.conn.get_value("Warehouse", warehouse, "account")
+		
+		if amount:
+			gl_entries = [
 				# stock in hand account
 				self.get_gl_dict({
-					"account": account,
+					"account": stock_in_hand_account,
 					"against": against_stock_account,
 					"debit": amount,
 					"remarks": self.doc.remarks or "Accounting Entry for Stock",
@@ -47,16 +41,38 @@
 				# account against stock in hand
 				self.get_gl_dict({
 					"account": against_stock_account,
-					"against": account,
+					"against": stock_in_hand_account,
 					"credit": amount,
 					"cost_center": cost_center or None,
 					"remarks": self.doc.remarks or "Accounting Entry for Stock",
 				}, self.doc.docstatus == 2),
 			]
 			
-		return gl_entries
+			return gl_entries
 			
+	def sync_stock_account_balance(self, warehouse_list, cost_center=None, posting_date=None):
+		from accounts.utils import get_stock_and_account_difference
+		acc_diff = get_stock_and_account_difference(warehouse_list)
+		
+		if not cost_center:
+			cost_center = self.get_company_default("cost_center")
+		
+		gl_entries = []
+		for account, diff in acc_diff.items():
+			if diff:
+				stock_adjustment_account = self.get_company_default("stock_adjustment_account")
+				gl_entries += self.get_gl_entries_for_stock(stock_adjustment_account, diff, 
+					stock_in_hand_account=account, cost_center=cost_center)
+					
+		if gl_entries:
+			from accounts.general_ledger import make_gl_entries
+
+			if posting_date:
+				for entries in gl_entries:
+					entries["posting_date"] = posting_date
 			
+			make_gl_entries(gl_entries)
+				
 	def get_sl_entries(self, d, args):		
 		sl_dict = {
 			"item_code": d.item_code,
@@ -84,6 +100,17 @@
 		if sl_entries:
 			from webnotes.model.code import get_obj
 			get_obj('Stock Ledger').update_stock(sl_entries, is_amended)
+			
+	def validate_warehouse_with_company(self, warehouse_list):
+		warehouse_list = list(set(filter(lambda x: x not in ["", None], warehouse_list)))
+		valid_warehouses = webnotes.conn.sql_list("""select name from `tabWarehouse` 
+			where company=%s""", self.doc.company)
+		
+		invalid_warehouses = filter(lambda x: x not in valid_warehouses, warehouse_list)
+		if invalid_warehouses:
+			print invalid_warehouses, valid_warehouses, warehouse_list
+			msgprint(_("Following warehouses not belong to the company") + ": " + 
+				self.doc.company + "\n" + "\n".join(invalid_warehouses), raise_exception=1)
 		
 	def get_stock_ledger_entries(self, item_list=None, warehouse_list=None):
 		if not (item_list and warehouse_list):
