diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 0bdcf1d..ee555f4 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -551,15 +551,20 @@
 		let value = '';
 		if(frm.fields_dict.from_warehouse.disp_status === "Write") {
 			value = cstr(item.s_warehouse) || '';
-			return ['Source Warehouse', value];
+			return {
+				type: 'Source Warehouse',
+				name: value
+			};
 		} else {
 			value = cstr(item.t_warehouse) || '';
-			return ['Target Warehouse', value];
+			return {
+				type: 'Target Warehouse',
+				name: value
+			};
 		}
 	}
 
 	if(d && d.has_batch_no && !d.batch_no) {
-		// show_modal_with_oldest_batch(d, d.item_code, d.qty, get_warehouse(d), 1);
 		erpnext.stock.show_batch_serial_modal(frm, d, d.item_code, d.qty, get_warehouse(d), 1);
 	} else if(d && d.has_serial_no && !d.serial_no && frm.doc.purpose !== 'Material Receipt') {
 		erpnext.stock.show_batch_serial_modal(frm, d, d.item_code, d.qty, get_warehouse(d), 0);
@@ -575,8 +580,22 @@
 		{fieldname: 'item_code', read_only: 1, fieldtype:'Link', options: 'Item',
 			label: __('Item Code'), 'default': item_code},
 		{fieldtype:'Column Break'},
-		{fieldname: 'warehouse', fieldtype:'Link',
-			options: 'Warehouse', label: __(warehouse_details[0]), 'default': warehouse_details[1]},
+		{
+			fieldname: 'warehouse',
+			fieldtype:'Link',
+			options: 'Warehouse',
+			label: __(warehouse_details.type),
+			default: warehouse_details.name,
+			onchange: function(e) {
+				warehouse_details.name = this.get_value();
+				var batches = this.layout.fields_dict.batches;
+				if(batches) {
+					batches.grid.df.data = [];
+					batches.grid.refresh();
+					batches.grid.add_new_row(null, null, null);
+				}
+			}
+		},
 		{fieldtype:'Column Break'},
 		{fieldname: 'qty', fieldtype:'Float', label: __(has_batch ? 'Total Qty' : 'Qty'), 'default': qty},
 	];
@@ -587,14 +606,76 @@
 			{fieldtype:'Section Break', label: __('Batches')},
 			{fieldname: 'batches', fieldtype: 'Table',
 				fields: [
-					{fieldtype:'Link', fieldname:'batch_no', options: 'Batch',
-						label: __('Select Batch'), in_list_view:1, get_query: function() {
+					{
+						fieldtype:'Link',
+						fieldname:'batch_no',
+						options: 'Batch',
+						label: __('Select Batch'),
+						in_list_view:1,
+						get_query: function() {
 							return {filters: {item: item_code }};
-						}},
-					{fieldtype:'Float', read_only:1, fieldname:'available_qty',
-						label: __('Available'), in_list_view:1, 'default': 0},
-					{fieldtype:'Float', fieldname:'selected_qty',
-						label: __('Qty'), in_list_view:1, 'default': 0},
+						},
+						onchange: function(e) {
+							if(this.get_value().length === 0) {
+								this.grid_row.on_grid_fields_dict
+									.available_qty.set_value(0);
+								return;
+							}
+							if(warehouse_details.name) {
+								frappe.call({
+									method: 'erpnext.stock.doctype.batch.batch.get_batch_qty',
+									args: {
+										batch_no: this.doc.batch_no,
+										warehouse: warehouse_details.name,
+										item_code: item_code
+									},
+									callback: (r) => {
+										this.grid_row.on_grid_fields_dict
+											.available_qty.set_value(r.message || 0);
+									}
+								});
+
+							} else {
+								frappe.throw(__("Please select a warehouse to get available quantities"));
+							}
+							// e.stopImmediatePropagation();
+						}
+					},
+					{
+						fieldtype:'Float',
+						read_only:1,
+						fieldname:'available_qty',
+						label: __('Available'),
+						in_list_view:1,
+						default: 0,
+						onchange: function() {
+							this.grid_row.on_grid_fields_dict.selected_qty.set_value('0');
+						}
+					},
+					{
+						fieldtype:'Float',
+						fieldname:'selected_qty',
+						label: __('Qty'),
+						in_list_view:1,
+						'default': 0,
+						onchange: function(e) {
+							var batch_no = this.grid_row.on_grid_fields_dict.batch_no.get_value();
+							var available_qty = this.grid_row.on_grid_fields_dict.available_qty.get_value();
+							var selected_qty = this.grid_row.on_grid_fields_dict.selected_qty.get_value();
+
+							if(batch_no.length === 0 && parseInt(selected_qty)!==0) {
+								frappe.throw(__("Please select a batch"));
+							}
+							if(warehouse_details.type === 'Source Warehouse' &&
+								parseFloat(available_qty) < parseFloat(selected_qty)) {
+									this.set_value('0');
+									frappe.throw(__(`For transfer from source, selected quantity cannot be
+										greater than available quantity`));
+							} else {
+								this.grid.refresh();
+							}
+						}
+					},
 				],
 				in_place_edit: true,
 				data: data,
@@ -627,14 +708,14 @@
 
 	erpnext.stock.bind_batch_serial_dialog_qty(dialog, warehouse_details);
 
-	let map_item_values = (item, values, attribute) => {
+	let map_item_values = (item, values, attribute, qty_field, warehouse) => {
 		item[attribute] = values[attribute];
-		if(warehouse_details[0] === 'Source Warehouse') {
-			item.s_warehouse = values.warehouse;
+		if(warehouse_details.type === 'Source Warehouse') {
+			item.s_warehouse = values.warehouse || warehouse;
 		} else {
-			item.t_warehouse = values.warehouse;
+			item.t_warehouse = values.warehouse || warehouse;
 		}
-		item.qty = values.qty;
+		item.qty = values[qty_field];
 	}
 
 	let validate_batch_dialog = (values) => {
@@ -659,11 +740,13 @@
 
 		values.batches.map((batch, i) => {
 			if(i === 0) {
-				map_item_values(item, values, 'batch_no');
+				map_item_values(item, batch, 'batch_no',
+					'selected_qty', values.warehouse);
 			} else {
 				let row = frm.add_child("items");
 				row.item_code = item.item_code;
-				map_item_values(row, values, 'batch_no');
+				map_item_values(row, batch, 'batch_no',
+					'selected_qty', values.warehouse);
 			}
 		});
 	}
@@ -682,7 +765,7 @@
 		if (!validate_serial_no_dialog(values)) {
 			return;
 		}
-		map_item_values(item, values, 'serial_no');
+		map_item_values(item, values, 'serial_no', 'qty');
 	}
 
 	dialog.set_primary_action(__('Get Items'), function() {
@@ -701,7 +784,6 @@
 	let serial_no_list_field = dialog.fields_dict.serial_no;
 	let batches_field = dialog.fields_dict.batches;
 
-	let warehouse_field = dialog.fields_dict.warehouse;
 	let qty_field = dialog.fields_dict.qty;
 	let item_code = dialog.get_value('item_code');
 
@@ -718,26 +800,6 @@
 		}
 	}
 
-	function set_available_qty(item_code, batch_no, warehouse, fields) {
-		if(warehouse) {
-			frappe.call({
-				method: 'erpnext.stock.doctype.batch.batch.get_batch_qty',
-				args: {
-					batch_no: batch_no,
-					warehouse: warehouse,
-					item_code: item_code
-				},
-				callback: (r) => {
-					let value = r.message ? r.message : '0';
-					fields[1].set_value(value);
-					fields[2].set_value('0');
-				}
-			});
-		} else {
-			frappe.throw(__("Please select a warehouse to get available quantities"));
-		}
-	}
-
 	if(serial_no_link) {
 		let serial_list = [];
 		serial_no_link.$input.on('awesomplete-selectcomplete', function() {
@@ -769,63 +831,8 @@
 	}
 
 	if(batches_field) {
-		batches_field.grid.add_new_row(null, null, true);
-		batches_field.grid.wrapper.on('change', 'input[data-fieldname="selected_qty"]', function() {
-			// check if batch is selected
-			if($(this).val().length !== 0) {
-				let $row = $(this).closest('.grid-row');
-
-				let $batch = $row.find('input[data-fieldname="batch_no"]');
-				if($batch.val() === '') {
-					$(this).val('').trigger('change');
-					frappe.throw(__("Please select a batch"));
-				} else {
-					// check if greater than available if source
-					let $available = $row.find('input[data-fieldname="available_qty"]');
-					if(warehouse_details[0] === 'Source Warehouse' &&
-						parseInt($available.val()) < parseInt($(this).val())) {
-
-						$(this).val('').trigger('change');
-						frappe.throw(__(`For transfer from source, selected quantity cannot be
-							greater than available quantity`));
-					}
-				}
-			}
-
-		});
-		batches_field.grid.wrapper.on('change', 'input[data-fieldname="batch_no"]', function() {
-			let $row = $(this).closest('.grid-row');
-			let name = $row.attr('data-name');
-			let row = batches_field.grid.grid_rows_by_docname[name];
-			if(row.doc.batch_no) {
-				if(warehouse_field.get_value().length > 0) {
-					set_available_qty(item_code, row.doc.batch_no, warehouse_field.get_value(), row.on_grid_fields);
-				} else {
-					frappe.throw(__("Please select a warehouse to get available quantities"));
-				}
-			}
-		});
-
 		batches_field.grid.wrapper.on('change', function() {
 			update_quantity(1);
 		});
-
-		batches_field.grid.wrapper.on('change', 'input', function() {
-			let fieldname = $(this).attr('data-fieldname');
-			let $row = $(this).closest('.grid-row');
-			let name = $row.attr('data-name');
-			let row = batches_field.grid.grid_rows_by_docname[name];
-
-			let field = row.on_grid_fields_dict[fieldname];
-			field.$input.trigger('blur');
-			row.doc[fieldname] = field.get_value();
-			batches_field.grid.set_value(fieldname, row.doc[fieldname], row.doc);
-		});
-
-		warehouse_field.$input.on('change', function() {
-			batches_field.grid.df.data = [];
-			batches_field.grid.refresh();
-			batches_field.grid.add_new_row(null, null, true);
-		});
 	}
 }
\ No newline at end of file
