diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js
index acf5973..7dbbeab 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.js
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js
@@ -8,10 +8,10 @@
 frappe.ui.form.on("Journal Entry", {
 	refresh: function(frm) {
 		erpnext.toggle_naming_series();
-		cur_frm.cscript.voucher_type(frm.doc);
+		frm.cscript.voucher_type(frm.doc);
 
 		if(frm.doc.docstatus==1) {
-			cur_frm.add_custom_button(__('View Ledger'), function() {
+			frm.add_custom_button(__('View Ledger'), function() {
 				frappe.route_options = {
 					"voucher_no": frm.doc.name,
 					"from_date": frm.doc.posting_date,
@@ -22,34 +22,22 @@
 				frappe.set_route("query-report", "General Ledger");
 			}, "icon-table");
 		}
-		
+
+		if (frm.doc.__islocal) {
+			frm.add_custom_button(__('Quick Entry'), function() {
+				return erpnext.journal_entry.quick_entry(frm);
+			});
+		}
+
 		// hide /unhide fields based on currency
 		erpnext.journal_entry.toggle_fields_based_on_currency(frm);
 	},
-	
+
 	multi_currency: function(frm) {
 		erpnext.journal_entry.toggle_fields_based_on_currency(frm);
 	}
 })
 
-erpnext.journal_entry.toggle_fields_based_on_currency = function(frm) {
-	var fields = ["currency_section", "account_currency", "exchange_rate", "debit", "credit"];
-	
-	var grid = frm.get_field("accounts").grid;
-	if(grid) grid.set_column_disp(fields, frm.doc.multi_currency);
-	
-	// dynamic label
-	var field_label_map = {
-		"debit_in_account_currency": "Debit", 
-		"credit_in_account_currency": "Credit"
-	};
-	
-	$.each(field_label_map, function (fieldname, label) {
-		var df = frappe.meta.get_docfield("Journal Entry Account", fieldname, frm.doc.name);
-		df.label = frm.doc.multi_currency ? (label + " in Account Currency") : label;
-	})
-}
-
 erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
 	onload: function() {
 		this.load_defaults();
@@ -69,28 +57,19 @@
 				}
 			);
 
-			if(!this.frm.doc.amended_from) this.frm.doc.posting_date = get_today();
+			if(!this.frm.doc.amended_from) this.frm.doc.posting_date = this.frm.posting_date || get_today();
 		}
 	},
 
 	setup_queries: function() {
 		var me = this;
-		
+
 		me.frm.set_query("account", "accounts", function(doc, cdt, cdn) {
-			var filters = {
-				company: me.frm.doc.company,
-				is_group: 0
-			};
-			if(!doc.multi_currency) {
-				$.extend(filters, {
-					account_currency: frappe.get_doc(":Company", me.frm.doc.company).default_currency
-				});
-			}
-			return { filters: filters };
+			return erpnext.journal_entry.account_query(me.frm);
 		});
-		
+
 		me.frm.set_query("cost_center", "accounts", function(doc, cdt, cdn) {
-			return { 
+			return {
 				filters: {
 					company: me.frm.doc.company,
 					is_group: 0
@@ -132,22 +111,22 @@
 
 			if(in_list(["Sales Invoice", "Purchase Invoice"], jvd.reference_type)) {
 				out.filters.push([jvd.reference_type, "outstanding_amount", "!=", 0]);
-				
+
 				// account filter
 				frappe.model.validate_missing(jvd, "account");
-				
+
 				party_account_field = jvd.reference_type==="Sales Invoice" ? "debit_to": "credit_to";
 				out.filters.push([jvd.reference_type, party_account_field, "=", jvd.account]);
 			} else {
 				// party_type and party mandatory
 				frappe.model.validate_missing(jvd, "party_type");
 				frappe.model.validate_missing(jvd, "party");
-				
+
 				out.filters.push([jvd.reference_type, "per_billed", "<", 100]);
 			}
-			
+
 			if(jvd.party_type && jvd.party) {
-				out.filters.push([jvd.reference_type, 
+				out.filters.push([jvd.reference_type,
 					(jvd.reference_type.indexOf("Sales")===0 ? "customer" : "supplier"), "=", jvd.party]);
 			}
 
@@ -244,6 +223,7 @@
 }
 
 cur_frm.cscript.posting_date = function(doc, cdt, cdn){
+	cur_frm.posting_date = cur_frm.doc.posting_date;
 	erpnext.get_fiscal_year(doc.company, doc.posting_date);
 }
 
@@ -347,17 +327,17 @@
 			});
 		}
 	},
-	
+
 	account: function(frm, dt, dn) {
 		var d = locals[dt][dn];
 		if(d.account) {
 			if(!frm.doc.company) frappe.throw(__("Please select Company first"));
 			if(!frm.doc.posting_date) frappe.throw(__("Please select Posting Date first"));
-			
+
 			return frappe.call({
 				method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_account_balance_and_party_type",
 				args: {
-					account: d.account, 
+					account: d.account,
 					date: frm.doc.posting_date,
 					company: frm.doc.company,
 					debit: flt(d.debit_in_account_currency),
@@ -373,23 +353,23 @@
 			});
 		}
 	},
-	
+
 	debit_in_account_currency: function(frm, cdt, cdn) {
 		erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn);
 	},
-	
+
 	credit_in_account_currency: function(frm, cdt, cdn) {
 		erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn);
 	},
-	
+
 	debit: function(frm, dt, dn) {
 		cur_frm.cscript.update_totals(frm.doc);
 	},
-	
+
 	credit: function(frm, dt, dn) {
 		cur_frm.cscript.update_totals(frm.doc);
 	},
-	
+
 	exchange_rate: function(frm, cdt, cdn) {
 		erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn);
 	}
@@ -399,41 +379,132 @@
 	cur_frm.cscript.update_totals(frm.doc);
 });
 
-erpnext.journal_entry.set_debit_credit_in_company_currency = function(frm, cdt, cdn) {
-	erpnext.journal_entry.set_exchange_rate(frm, cdt, cdn);
-	
-	var row = locals[cdt][cdn];
-	
-	frappe.model.set_value(cdt, cdn, "debit", 
-		flt(flt(row.debit_in_account_currency)*row.exchange_rate), precision("debit", row));
-	frappe.model.set_value(cdt, cdn, "credit", 
-		flt(flt(row.credit_in_account_currency)*row.exchange_rate), precision("credit", row));
-}
+$.extend(erpnext.journal_entry, {
+	toggle_fields_based_on_currency: function(frm) {
+		var fields = ["currency_section", "account_currency", "exchange_rate", "debit", "credit"];
 
-erpnext.journal_entry.set_exchange_rate = function(frm, cdt, cdn) {
-	var company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency;
-	var row = locals[cdt][cdn];
-	
-	if(row.account_currency == company_currency || !frm.doc.multi_currency) {
-		frappe.model.set_value(cdt, cdn, "exchange_rate", 1);
-	} else if (!row.exchange_rate || row.account_type == "Bank") {
-		frappe.call({
-			method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_exchange_rate",
-			args: {
-				account: row.account, 
-				account_currency: row.account_currency,
-				company: frm.doc.company,
-				reference_type: cstr(row.reference_type),
-				reference_name: cstr(row.reference_name),
-				debit: flt(row.debit_in_account_currency),
-				credit: flt(row.credit_in_account_currency),
-				exchange_rate: row.exchange_rate
-			},
-			callback: function(r) {
-				if(r.message) {
-					frappe.model.set_value(cdt, cdn, "exchange_rate", r.message);
-				}
-			}
+		var grid = frm.get_field("accounts").grid;
+		if(grid) grid.set_column_disp(fields, frm.doc.multi_currency);
+
+		// dynamic label
+		var field_label_map = {
+			"debit_in_account_currency": "Debit",
+			"credit_in_account_currency": "Credit"
+		};
+
+		$.each(field_label_map, function (fieldname, label) {
+			var df = frappe.meta.get_docfield("Journal Entry Account", fieldname, frm.doc.name);
+			df.label = frm.doc.multi_currency ? (label + " in Account Currency") : label;
 		})
+	},
+
+	set_debit_credit_in_company_currency: function(frm, cdt, cdn) {
+		erpnext.journal_entry.set_exchange_rate(frm, cdt, cdn);
+
+		var row = locals[cdt][cdn];
+
+		frappe.model.set_value(cdt, cdn, "debit",
+			flt(flt(row.debit_in_account_currency)*row.exchange_rate), precision("debit", row));
+
+		frappe.model.set_value(cdt, cdn, "credit",
+			flt(flt(row.credit_in_account_currency)*row.exchange_rate), precision("credit", row));
+	},
+
+	set_exchange_rate: function(frm, cdt, cdn) {
+		var company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency;
+		var row = locals[cdt][cdn];
+
+		if(row.account_currency == company_currency || !frm.doc.multi_currency) {
+			frappe.model.set_value(cdt, cdn, "exchange_rate", 1);
+		} else if (!row.exchange_rate || row.account_type == "Bank") {
+			frappe.call({
+				method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_exchange_rate",
+				args: {
+					account: row.account,
+					account_currency: row.account_currency,
+					company: frm.doc.company,
+					reference_type: cstr(row.reference_type),
+					reference_name: cstr(row.reference_name),
+					debit: flt(row.debit_in_account_currency),
+					credit: flt(row.credit_in_account_currency),
+					exchange_rate: row.exchange_rate
+				},
+				callback: function(r) {
+					if(r.message) {
+						frappe.model.set_value(cdt, cdn, "exchange_rate", r.message);
+					}
+				}
+			})
+		}
+	},
+
+	quick_entry: function(frm) {
+		var naming_series_options = frm.fields_dict.naming_series.df.options;
+		var naming_series_default = frm.fields_dict.naming_series.df.default || naming_series_options.split("\n")[0];
+
+		var dialog = new frappe.ui.Dialog({
+			title: __("Quick Journal Entry"),
+			fields: [
+				{fieldtype: "Currency", fieldname: "debit", label: __("Amount"), reqd: 1},
+				{fieldtype: "Link", fieldname: "debit_account", label: __("Debit Account"), reqd: 1,
+					options: "Account",
+					get_query: function() {
+						return erpnext.journal_entry.account_query(frm);
+					}
+				},
+				{fieldtype: "Link", fieldname: "credit_account", label: __("Credit Account"), reqd: 1,
+					options: "Account",
+					get_query: function() {
+						return erpnext.journal_entry.account_query(frm);
+					}
+				},
+				{fieldtype: "Date", fieldname: "posting_date", label: __("Date"), reqd: 1,
+					default: frm.doc.posting_date},
+				{fieldtype: "Select", fieldname: "naming_series", label: __("Series"), reqd: 1,
+					options: naming_series_options, default: naming_series_default},
+			]
+		});
+
+		dialog.set_primary_action(__("Save"), function() {
+			var btn = this;
+			var values = dialog.get_values();
+
+			frm.set_value("posting_date", values.posting_date);
+			frm.set_value("naming_series", values.naming_series);
+
+			// clear table is used because there might've been an error while adding child
+			// and cleanup didn't happen
+			frm.clear_table("accounts");
+
+			// using grid.add_new_row() to add a row in UI as well as locals
+			// this is required because triggers try to refresh the grid
+
+			var debit_row = frm.fields_dict.accounts.grid.add_new_row();
+			frappe.model.set_value(debit_row.doctype, debit_row.name, "account", values.debit_account);
+			frappe.model.set_value(debit_row.doctype, debit_row.name, "debit_in_account_currency", values.debit);
+
+			var credit_row = frm.fields_dict.accounts.grid.add_new_row();
+			frappe.model.set_value(credit_row.doctype, credit_row.name, "account", values.credit_account);
+			frappe.model.set_value(credit_row.doctype, credit_row.name, "credit_in_account_currency", values.debit);
+
+			frm.save();
+
+			dialog.hide();
+		});
+
+		dialog.show();
+	},
+
+	account_query: function(frm) {
+		var filters = {
+			company: frm.doc.company,
+			is_group: 0
+		};
+		if(!frm.doc.multi_currency) {
+			$.extend(filters, {
+				account_currency: frappe.get_doc(":Company", frm.doc.company).default_currency
+			});
+		}
+		return { filters: filters };
 	}
-}
\ No newline at end of file
+});
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index 08d4f32..4d33f81 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -12,6 +12,12 @@
 			var today = get_today(),
 				currency = frappe.defaults.get_user_default("currency");
 
+			$.each(["posting_date", "transaction_date"], function(i, fieldname) {
+				if (me.frm.fields_dict[fieldname] && !me.frm.doc[fieldname] && me.frm[fieldname]) {
+					me.frm.set_value(fieldname, me.frm[fieldname]);
+				}
+			});
+
 			$.each({
 				posting_date: today,
 				transaction_date: today,
@@ -277,12 +283,18 @@
 	},
 
 	transaction_date: function() {
+		if (this.frm.doc.transaction_date) {
+			this.frm.transaction_date = this.frm.doc.transaction_date;
+		}
+
 		erpnext.get_fiscal_year(this.frm.doc.company, this.frm.doc.transaction_date);
 	},
 
 	posting_date: function() {
 		var me = this;
 		if (this.frm.doc.posting_date) {
+			this.frm.posting_date = this.frm.doc.posting_date;
+
 			if ((this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.customer) ||
 				(this.frm.doc.doctype == "Purchase Invoice" && this.frm.doc.supplier)) {
 				return frappe.call({
@@ -429,7 +441,7 @@
 		setup_field_label_map(["total", "net_total", "total_taxes_and_charges", "discount_amount",
 			"grand_total", "taxes_and_charges_added", "taxes_and_charges_deducted",
 			"rounded_total", "in_words", "paid_amount", "write_off_amount"], this.frm.doc.currency);
-			
+
 		setup_field_label_map(["outstanding_amount", "total_advance"], this.frm.doc.party_account_currency);
 
 		cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency
