diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py
index 6428835..992d8fc 100644
--- a/erpnext/stock/doctype/batch/batch.py
+++ b/erpnext/stock/doctype/batch/batch.py
@@ -66,6 +66,15 @@
 	return out
 
 @frappe.whitelist()
+def get_oldest_batch_qty(item_code, warehouse):
+	'''Returns the oldest batch and qty for the given item_code and warehouse'''
+	batches = get_batch_qty(item_code = item_code, warehouse = warehouse)
+	oldest_date = min([frappe.get_value('Batch', batch.batch_no, 'expiry_date') for batch in batches])
+	for batch in batches:
+		if (frappe.get_value('Batch', batch.batch_no, 'expiry_date') == oldest_date):
+			return batch
+
+@frappe.whitelist()
 def split_batch(batch_no, item_code, warehouse, qty, new_batch_id = None):
 	'''Split the batch into a new batch'''
 	batch = frappe.get_doc(dict(doctype='Batch', item=item_code, batch_id=new_batch_id)).insert()
@@ -129,4 +138,4 @@
 	# 	if batch.expiry_date == oldest_expiry_date:
 	# 		batch_no = batch.batch_no
 
-	return batch_no
\ No newline at end of file
+	return batch_no
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 26c793e..53fac4d 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -43,7 +43,6 @@
 		});
 	},
 	refresh: function(frm) {
-		erpnext.select_batch_and_serial_no(frm);
 		if(!frm.doc.docstatus) {
 			frm.add_custom_button(__('Make Material Request'), function() {
 				frappe.model.with_doctype('Material Request', function() {
@@ -77,8 +76,7 @@
 		frm.fields_dict.items.grid.refresh();
 		frm.cscript.toggle_related_fields(frm.doc);
 	},
-	before_save: function(frm) {
-		console.log("before_save");
+	validate: function(frm) {
 		erpnext.select_batch_and_serial_no(frm);
 	},
 	company: function(frm) {
@@ -576,8 +574,8 @@
 
 	// get_warehouse();
 
-	let show_modal = (item_code, qty, warehouse, has_batch, has_serial) => {
-		// get_warehouse(i);
+	let show_modal = (item, item_code, qty, warehouse, has_batch, has_serial, oldest = undefined) => {
+		let data = oldest ? [oldest] : []
 		let fields = [
 			{fieldname: 'item_code', read_only: 1, fieldtype:'Link', options: 'Item',
 				label: __('Item Code'), 'default': item_code},
@@ -598,8 +596,7 @@
 						{fieldtype:'Float', fieldname:'selected_qty',
 							label: __('Qty'), in_list_view:1},
 					],
-					data: [],
-					// data_length: 3,
+					data: data,
 					get_data: function() {
 						return this.data;
 					},
@@ -621,33 +618,108 @@
 				{fieldname: 'serial_no', fieldtype: 'Small Text', label: __('Serial No')}
 			)
 		}
-		let d = new frappe.ui.Dialog({
+		let dialog = new frappe.ui.Dialog({
+			title: __("Select Batches"),
 			fields: fields
 		});
 
-		d.set_primary_action(__('Get Items'), function() {
-			var values = d.get_values();
-			d.hide();
+		item_temp = {};
+		Object.assign(item_temp, item);
+
+		let validate_dialog_values = () => {
+			var values = dialog.get_values();
+
+			values.batches.map((batch) => {
+				if (batch.batch_no && batch.selected_qty) {
+					if (parseInt(batch.selected_qty) > parseInt(batch.available_qty)) {
+						frappe.throw(__("Cannot select more than the available qty"));
+						return false;
+					}
+				} else {
+					if (!batch.batch_no) {
+						frappe.throw(__("Please select batch_no"));
+						return false;
+					} else {
+						frappe.throw(__("Please select qty"));
+						return false;
+					}
+				}
+			});
+
+			// validate total_qty
+			return true;
+		}
+
+		dialog.set_primary_action(__('Get Items'), function() {
+
+			if (!validate_dialog_values()) {
+				return;
+			}
+
+			var values = dialog.get_values();
+
+			values.batches.map((batch, i) => {
+				if (i === 0) {
+					item.batch_no = batch.batch_no;
+					item.qty = batch.selected_qty;
+					console.log("item", item, frm.doc.items);
+				} else {
+					var row = frappe.model.add_child(frm.doc, "Stock Entry Detail", "items");
+					Object.assign(row, item_temp);
+					row.idx = i+1;
+					row.batch_no = batch.batch_no;
+					row.qty = batch.selected_qty;
+					console.log("row", row, frm.doc.items);
+				}
+				refresh_field("items");
+			});
+
+
+			refresh_field("items");
+			dialog.hide();
 		})
 
-		d.show();
+		dialog.show();
 	}
 
-	show_modal("_Test FG Item", 10, 'Stores - A', 1, 0);
+	// show_modal("_Test FG Item", 10, 'Stores - A', 1, 0);
+
+	let show_modal_with_oldest_batch = (item, item_code, qty, warehouse, has_batch, has_serial_no) => {
+		frappe.call({
+			method: 'erpnext.stock.doctype.batch.batch.get_oldest_batch_qty',
+			args: {
+				warehouse: warehouse,
+				item_code: item_code
+			},
+			callback: (r) => {
+				if (r.message) {
+					oldest = {name: 'batch 1'};
+					oldest.batch_no = r.message.batch_no;
+					oldest.available_qty = r.message.qty;
+					// if required overall qty is less than available qty in oldest batch, preselect
+					if (parseInt(qty) < parseInt(r.message.qty)) {
+						oldest.selected_qty = qty;
+					}
+					show_modal(item, item_code, qty, warehouse, has_batch, has_serial_no, oldest);
+				}
+			}
+		});
+	}
 
 	frm.doc.items.forEach(function(d){
 		if(d.has_batch_no && !d.batch_no) {
 			console.log("item code, ");
-
 		}
 	});
 
 	frm.doc.items.forEach(function(d) {
 		if(d.has_batch_no && !d.batch_no) {
-			show_modal(d.item_code, d.qty, get_warehouse(d), 1, 0);
+			// console.log(d.item_code, get_warehouse(d));
+			show_modal_with_oldest_batch(d, d.item_code, d.qty, get_warehouse(d), 1, 0);
+			// show_modal(d, d.item_code, d.qty, get_warehouse(d), 1, 0 , oldest);
 		}
 		if(d.has_serial_no && !d.serial_no) {
-			show_modal(d.item_code, d.qty, get_warehouse(d), 0, 1);
+			show_modal(d, d.item_code, d.qty, get_warehouse(d), 0, 1);
 		}
 	});
 
