[mapper]
diff --git a/selling/doctype/lead/lead.js b/selling/doctype/lead/lead.js
index b3c200d..40cf454 100644
--- a/selling/doctype/lead/lead.js
+++ b/selling/doctype/lead/lead.js
@@ -55,8 +55,8 @@
 		
 		this.frm.__is_customer = this.frm.__is_customer || this.frm.doc.__is_customer;
 		if(!this.frm.doc.__islocal && !this.frm.__is_customer) {
-			this.frm.add_custom_button("Create Customer", this.frm.cscript['Create Customer']);
-			this.frm.add_custom_button("Create Opportunity", this.frm.cscript['Create Opportunity']);
+			this.frm.add_custom_button("Create Customer", this.create_customer);
+			this.frm.add_custom_button("Create Opportunity", this.create_opportunity);
 			this.frm.add_custom_button("Send SMS", this.frm.cscript.send_sms);
 		}
 		
@@ -93,21 +93,21 @@
 			// note: render_address_row is defined in contact_control.js
 		}
 		this.frm.address_list.run();
+	}, 
+	
+	create_customer: function() {
+		wn.model.open_mapped_doc({
+			method: "selling.doctype.lead.lead.make_customer",
+			source_name: cur_frm.doc.name
+		})
+	}, 
+	
+	create_opportunity: function() {
+		wn.model.open_mapped_doc({
+			method: "selling.doctype.lead.lead.make_opportunity",
+			source_name: cur_frm.doc.name
+		})
 	}
 });
 
-$.extend(cur_frm.cscript, new erpnext.LeadController({frm: cur_frm}));
-
-cur_frm.cscript['Create Customer'] = function(){
-	wn.model.open_mapped_doc({
-		method: "selling.doctype.lead.lead.make_customer",
-		source_name: cur_frm.doc.name
-	})
-}
-
-cur_frm.cscript['Create Opportunity'] = function(){
-	wn.model.open_mapped_doc({
-		method: "selling.doctype.lead.lead.make_opportunity",
-		source_name: cur_frm.doc.name
-	})
-}
\ No newline at end of file
+$.extend(cur_frm.cscript, new erpnext.LeadController({frm: cur_frm}));
\ No newline at end of file
diff --git a/selling/doctype/opportunity/opportunity.js b/selling/doctype/opportunity/opportunity.js
index c3843cf..bc10c9b 100644
--- a/selling/doctype/opportunity/opportunity.js
+++ b/selling/doctype/opportunity/opportunity.js
@@ -35,6 +35,13 @@
 				'address_display', 'contact_display', 'contact_mobile', 'contact_email', 
 				'territory', 'customer_group']);
 		}
+	}, 
+	
+	create_quotation: function() {
+		wn.model.open_mapped_doc({
+			method: "selling.doctype.opportunity.opportunity.make_quotation",
+			source_name: cur_frm.doc.name
+		})
 	}
 });
 
@@ -54,7 +61,7 @@
 	
 	cur_frm.clear_custom_buttons();
 	if(doc.docstatus === 1 && doc.status!=="Opportunity Lost") {
-		cur_frm.add_custom_button('Create Quotation', cur_frm.cscript['Create Quotation']);
+		cur_frm.add_custom_button('Create Quotation', cur_frm.cscript.create_quotation);
 		cur_frm.add_custom_button('Opportunity Lost', cur_frm.cscript['Declare Opportunity Lost']);
 		cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
 	}
@@ -168,24 +175,15 @@
 cur_frm.cscript.lead = function(doc, cdt, cdn) {
 	cur_frm.toggle_display("contact_info", doc.customer || doc.lead);
 	
-	if(doc.lead) {
-		cur_frm.call({
-			doc: cur_frm.doc,
-			method: "set_lead_defaults",
-			callback: function(r) {
-				if(!r.exc) {
-					cur_frm.refresh_fields();
-				}
-			}
-		});
-		unhide_field(['customer_name', 'address_display','contact_mobile', 'contact_email', 
-			'territory']);	
-	}
+	wn.model.map_current_doc({
+		method: "selling.doctype.lead.lead.make_opportunity",
+		source_name: cur_frm.doc.lead
+	})
+	
+	unhide_field(['customer_name', 'address_display','contact_mobile', 
+		'contact_email', 'territory']);	
 }
 
-
-//item getquery
-//=======================================
 cur_frm.fields_dict['enquiry_details'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
 	if (doc.enquiry_type == 'Maintenance')
 	 	return erpnext.queries.item({
@@ -197,25 +195,6 @@
 		});
 }
 
-// Create New Quotation
-cur_frm.cscript['Create Quotation'] = function(){
-	n = wn.model.make_new_doc_and_get_name("Quotation");
-	$c('dt_map', args={
-		'docs':wn.model.compress([locals["Quotation"][n]]),
-		'from_doctype':'Opportunity',
-		'to_doctype':'Quotation',
-		'from_docname':cur_frm.docname,
-		'from_to_list':"[['Opportunity', 'Quotation'],['Opportunity Item','Quotation Item']]"
-	}
-	, function(r,rt) {
-		loaddoc("Quotation", n);
-		}
-	);
-}
-
-
-// declare enquiry	lost
-//-------------------------
 cur_frm.cscript['Declare Opportunity Lost'] = function(){
 	var dialog = new wn.ui.Dialog({
 		title: "Set as Lost",
diff --git a/selling/doctype/opportunity/opportunity.py b/selling/doctype/opportunity/opportunity.py
index c569157..cced9ab 100644
--- a/selling/doctype/opportunity/opportunity.py
+++ b/selling/doctype/opportunity/opportunity.py
@@ -66,7 +66,6 @@
 
 			contact_det = sql("select contact_name, contact_no, email_id from `tabContact` where customer = '%s' and is_customer = 1 and is_primary_contact = 'Yes' and docstatus != 2" %(name), as_dict = 1)
 
-			
 			ret['contact_person'] = contact_det and contact_det[0]['contact_name'] or ''
 			ret['contact_no']		 = contact_det and contact_det[0]['contact_no'] or ''
 			ret['email_id']			 = contact_det and contact_det[0]['email_id'] or ''
@@ -175,4 +174,32 @@
 			return 'true'
 
 	def on_trash(self):
-		self.delete_events()
\ No newline at end of file
+		self.delete_events()
+		
+@webnotes.whitelist()
+def make_quotation(source_name, target_doclist=None):
+	from webnotes.model.mapper import get_mapped_doclist
+	
+	doclist = get_mapped_doclist("Opportunity", source_name, {
+		"Opportunity": {
+			"doctype": "Quotation", 
+			"field_map": {
+				"enquiry_from": "quotation_to", 
+				"enquiry_type": "order_type", 
+				"name": "enq_no", 
+			},
+			"validation": {
+				"docstatus": ["=", 1]
+			}
+		}, 
+		"Opportunity Item": {
+			"doctype": "Quotation Item", 
+			"field_map": {
+				"parent": "prevdoc_docname", 
+				"parenttype": "prevdoc_doctype", 
+				"uom": "stock_uom"
+			}
+		}
+	}, target_doclist)
+		
+	return [d.fields for d in doclist]
\ No newline at end of file