new doctype: communication
diff --git a/erpnext/buying/doctype/supplier/supplier.js b/erpnext/buying/doctype/supplier/supplier.js
index 5678e98..2334cdd 100644
--- a/erpnext/buying/doctype/supplier/supplier.js
+++ b/erpnext/buying/doctype/supplier/supplier.js
@@ -15,6 +15,7 @@
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 wn.require('erpnext/setup/doctype/contact_control/contact_control.js');
+wn.require('erpnext/support/doctype/communication/communication.js');
 
 cur_frm.cscript.onload = function(doc,dt,dn){
 
@@ -28,6 +29,7 @@
 	// make contact, history list body
 	//cur_frm.cscript.make_cl_body();
 	cur_frm.cscript.make_hl_body();
+	cur_frm.cscript.make_communication_body();
 }
 
 cur_frm.cscript.refresh = function(doc,dt,dn) {
@@ -44,7 +46,8 @@
 		// make lists
 		cur_frm.cscript.make_address(doc,dt,dn);
 		cur_frm.cscript.make_contact(doc,dt,dn);
-		cur_frm.cscript.make_history(doc,dt,dn);  	
+		cur_frm.cscript.render_communication_list(doc, cdt, cdn);
+		cur_frm.cscript.make_history(doc,dt,dn);
   }
 }
 
@@ -109,44 +112,88 @@
 // Transaction History
 
 cur_frm.cscript.make_po_list = function(parent, doc) {
-	cur_frm.cscript.render_transaction_history(parent, doc, 'Purchase Order', 
-		[
-			{fieldname: 'name', width: '28%', label: 'Id', type: 'Link'},
-			{fieldname: 'status', width: '25%', label: 'Status', type: 'Data'},
-			{fieldname: 'modified', width: '12%', label: 'Last Modified On', 
-				type: 'Date', style: 'text-align: right; color: #777'},
-			{fieldname: 'currency', width: '0%', label: 'Currency', 
-				style: 'display: hidden'},
-			{fieldname: 'grand_total', width: '35%', label: 'Grand Total', 
-				type: 'Currency', style: 'text-align: right'},
-		]);
+	var ListView = wn.views.ListView.extend({
+		init: function(doclistview) {
+			this._super(doclistview);
+			this.fields = this.fields.concat([
+				"`tabPurchase Order`.status",
+				"`tabPurchase Order`.currency",
+				"ifnull(`tabPurchase Order`.grand_total_import, 0) as grand_total_import",
+				
+			]);
+		},
+
+		prepare_data: function(data) {
+			this._super(data);
+			data.grand_total_import = data.currency + " " + fmt_money(data.grand_total_import);
+		},
+
+		columns: [
+			{width: '3%', content: 'docstatus'},
+			{width: '20%', content: 'name'},
+			{width: '30%', content: 'status',
+				css: {'text-align': 'right', 'color': '#777'}},
+			{width: '35%', content: 'grand_total_import', css: {'text-align': 'right'}},
+			{width: '12%', content:'modified', css: {'text-align': 'right'}}
+		],
+	});
+	
+	cur_frm.cscript.render_list(doc, 'Purchase Order', parent, ListView);
 }
 
 cur_frm.cscript.make_pr_list = function(parent, doc) {
-	cur_frm.cscript.render_transaction_history(parent, doc, 'Purchase Receipt', 
-		[
-			{fieldname: 'name', width: '28%', label: 'Id', type: 'Link'},
-			{fieldname: 'status', width: '15%', label: 'Status', type: 'Data'},
-			{fieldname: 'per_billed', width: '10%', label: '% Billed', 
-				type: 'Percentage', style: 'text-align: right'},
-			{fieldname: 'modified', width: '12%', label: 'Last Modified On', 
-				type: 'Date', style: 'text-align: right; color: #777'},
-			{fieldname: 'currency', width: '0%', label: 'Currency', 
-				style: 'display: hidden'},
-			{fieldname: 'grand_total', width: '35%', label: 'Grand Total', 
-				type: 'Currency', style: 'text-align: right'},
-		]);
+	var ListView = wn.views.ListView.extend({
+		init: function(doclistview) {
+			this._super(doclistview);
+			this.fields = this.fields.concat([
+				"`tabPurchase Receipt`.status",
+				"`tabPurchase Receipt`.currency",
+				"ifnull(`tabPurchase Receipt`.grand_total_import, 0) as grand_total_import",
+				"ifnull(`tabPurchase Receipt`.per_billed, 0) as per_billed",
+			]);
+		},
+
+		prepare_data: function(data) {
+			this._super(data);
+			data.grand_total_import = data.currency + " " + fmt_money(data.grand_total_import);
+		},
+
+		columns: [
+			{width: '3%', content: 'docstatus'},
+			{width: '20%', content: 'name'},
+			{width: '20%', content: 'status',
+				css: {'text-align': 'right', 'color': '#777'}},
+			{width: '35%', content: 'grand_total_import', css: {'text-align': 'right'}},
+			{width: '10%', content: 'per_billed', type: 'bar-graph', label: 'Billed'},
+			{width: '12%', content:'modified', css: {'text-align': 'right'}}
+		],
+	});
+	
+	cur_frm.cscript.render_list(doc, 'Purchase Receipt', parent, ListView);
 }
 
 cur_frm.cscript.make_pi_list = function(parent, doc) {
-	cur_frm.cscript.render_transaction_history(parent, doc, 'Purchase Invoice', 
-		[
-			{fieldname: 'name', width: '30%', label: 'Id', type: 'Link'},
-			{fieldname: 'modified', width: '35%', label: 'Last Modified On', 
-				type: 'Date', style: 'text-align: right; color: #777'},
-			{fieldname: 'currency', width: '0%', label: 'Currency', 
-				style: 'display: hidden'},
-			{fieldname: 'grand_total', width: '35%', label: 'Grand Total', 
-				type: 'Currency', style: 'text-align: right'},
-		]);
+	var ListView = wn.views.ListView.extend({
+		init: function(doclistview) {
+			this._super(doclistview);
+			this.fields = this.fields.concat([
+				"`tabPurchase Invoice`.currency",
+				"ifnull(`tabPurchase Invoice`.grand_total_import, 0) as grand_total_import",
+			]);
+		},
+
+		prepare_data: function(data) {
+			this._super(data);
+			data.grand_total_import = data.currency + " " + fmt_money(data.grand_total_import);
+		},
+
+		columns: [
+			{width: '3%', content: 'docstatus'},
+			{width: '30%', content: 'name'},
+			{width: '55%', content: 'grand_total_import', css: {'text-align': 'right'}},
+			{width: '12%', content:'modified', css: {'text-align': 'right'}}
+		],
+	});
+	
+	cur_frm.cscript.render_list(doc, 'Purchase Invoice', parent, ListView);
 }
\ No newline at end of file
diff --git a/erpnext/buying/doctype/supplier/supplier.txt b/erpnext/buying/doctype/supplier/supplier.txt
index 10d5591..938633a 100644
--- a/erpnext/buying/doctype/supplier/supplier.txt
+++ b/erpnext/buying/doctype/supplier/supplier.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-03-27 14:35:52',
+		'creation': '2012-05-15 12:14:41',
 		'docstatus': 0,
-		'modified': '2012-03-27 14:35:52',
+		'modified': '2012-05-31 13:18:29',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
@@ -25,7 +25,7 @@
 		'show_in_menu': 0,
 		'subject': u' ',
 		'tag_fields': u'supplier_type',
-		'version': 87
+		'version': 1
 	},
 
 	# These values are common for all DocField
@@ -55,6 +55,30 @@
 
 	# DocPerm
 	{
+		'amend': 0,
+		'cancel': 0,
+		'create': 0,
+		'doctype': u'DocPerm',
+		'permlevel': 1,
+		'role': u'Purchase Manager',
+		'submit': 0,
+		'write': 0
+	},
+
+	# DocPerm
+	{
+		'amend': 0,
+		'cancel': 0,
+		'create': 0,
+		'doctype': u'DocPerm',
+		'permlevel': 0,
+		'role': u'Purchase Manager',
+		'submit': 0,
+		'write': 0
+	},
+
+	# DocPerm
+	{
 		'doctype': u'DocPerm',
 		'permlevel': 1,
 		'role': u'Purchase Master Manager'
@@ -72,30 +96,6 @@
 		'write': 1
 	},
 
-	# DocPerm
-	{
-		'amend': 0,
-		'cancel': 0,
-		'create': 0,
-		'doctype': u'DocPerm',
-		'permlevel': 1,
-		'role': u'Purchase Manager',
-		'submit': 0,
-		'write': 0
-	},
-
-	# DocPerm
-	{
-		'amend': 0,
-		'cancel': 0,
-		'create': 0,
-		'doctype': u'DocPerm',
-		'permlevel': 0,
-		'role': u'Purchase Manager',
-		'submit': 0,
-		'write': 0
-	},
-
 	# DocField
 	{
 		'colour': u'White:FFF',
@@ -221,6 +221,24 @@
 	# DocField
 	{
 		'doctype': u'DocField',
+		'fieldname': u'communication_history',
+		'fieldtype': u'Section Break',
+		'label': u'Communication History',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'communication_html',
+		'fieldtype': u'HTML',
+		'label': u'Communication HTML',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
 		'fieldname': u'more_info',
 		'fieldtype': u'Section Break',
 		'label': u'More Info',
diff --git a/erpnext/patches/may_2012/remove_communication_log.py b/erpnext/patches/may_2012/remove_communication_log.py
new file mode 100644
index 0000000..3e50c15
--- /dev/null
+++ b/erpnext/patches/may_2012/remove_communication_log.py
@@ -0,0 +1,97 @@
+def execute():
+	import webnotes
+	import webnotes.model.sync
+	webnotes.model.sync.sync('support', 'communication')
+	webnotes.conn.commit()
+	webnotes.conn.begin()
+	
+	# change doctype property setter and custom fields, and save them
+	move_customizations()
+	
+	try:
+		remove_communication_log()
+	except Exception, e:
+		if e.args[0] != 1146:
+			raise e
+
+def move_customizations():
+	import webnotes.model.doc
+	import webnotes.model.doctype
+	res = webnotes.conn.sql("""\
+		delete from `tabProperty Setter`
+		where property='previous_field'
+		and doc_type = 'Communication Log'""")
+	
+	res = webnotes.conn.sql("""\
+		select name from `tabCustom Field`
+		where dt='Communication Log'""")
+	for r in res:
+		d = webnotes.model.doc.Document('Custom Field', r[0])
+		d.dt = 'Communication'
+		d.validate()
+		d.save()
+		d.on_update()
+		
+	res = webnotes.conn.sql("""\
+		select field_name from `tabProperty Setter`
+		where doc_type='Communication Log' and field_name is not null""")
+	
+	
+	doclist = webnotes.model.doctype.get('Communication', 0)
+	field_list = [d.fieldname for d in doclist if d.doctype=='DocField']
+	for r in res:
+		if r[0] in field_list:
+			webnotes.conn.sql("""\
+				update `tabProperty Setter`
+				set doc_type = 'Communication'
+				where field_name=%s and doc_type='Communication Log'""", r[0])
+				
+	webnotes.conn.sql("""\
+		delete from `tabProperty Setter`
+		where doc_type='Communication Log'""")
+
+def remove_communication_log():
+	import webnotes
+	import webnotes.model
+	import webnotes.model.doc
+	
+	# get all communication log records
+	comm_log_list = webnotes.conn.sql("select * from `tabCommunication Log`",
+						as_dict=1)
+
+	# copy it to communication
+	for comm_log in comm_log_list:
+		d = webnotes.model.doc.Document('Communication')
+		
+		for key in comm_log.keys():
+			if key not in webnotes.model.default_fields:
+				d.fields[key] = comm_log[key]
+		
+		parenttype = (comm_log.get('parenttype') or '').lower()
+		if parenttype in d.fields.keys():
+			d.fields[parenttype] = comm_log.get('parent')
+		
+		d.subject = 'Follow Up'
+		d.content = comm_log.get('notes') or ''
+		d.medium = comm_log.get('follow_up_type') or ''
+		d.sales_person = comm_log.get('follow_up_by')
+		d.communication_date = comm_log.get('date')
+		d.category = 'Miscellaneous'
+		d.action = 'No Action'
+		d.save()
+	
+	# delete records with parent type "Customer", "Lead", "Supplier"
+	webnotes.conn.sql("""\
+		delete from `tabCommunication Log`
+		where parenttype in ('Customer', 'Lead', 'Supplier', 
+			'Opportunity', 'Quotation')""")
+	
+	# if all records deleted, drop table communication log
+	# and delete doctype communication log
+	# if for some reason, records remain, dont drop table and dont delete doctype
+	count = webnotes.conn.sql("select count(*) from `tabCommunication Log`")[0][0]
+	if not count:
+		webnotes.model.delete_doc('DocType', 'Communication Log')
+		webnotes.conn.commit()
+		webnotes.conn.sql("drop table `tabCommunication Log`")
+		webnotes.conn.begin()
\ No newline at end of file
diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js
index f64d3f2..cdbf46c 100644
--- a/erpnext/selling/doctype/customer/customer.js
+++ b/erpnext/selling/doctype/customer/customer.js
@@ -15,6 +15,7 @@
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 wn.require('erpnext/setup/doctype/contact_control/contact_control.js');
+wn.require('erpnext/support/doctype/communication/communication.js');
 
 /* ********************************* onload ********************************************* */
 
@@ -31,6 +32,8 @@
   	//cur_frm.cscript.make_sl_body();
 
 	cur_frm.cscript.load_defaults(doc, dt, dn);
+	
+	cur_frm.cscript.make_communication_body();
 }
 
 cur_frm.cscript.load_defaults = function(doc, dt, dn) {
@@ -62,6 +65,7 @@
 		cur_frm.cscript.make_address(doc,dt,dn);
 		cur_frm.cscript.make_contact(doc,dt,dn);
 		cur_frm.cscript.make_history(doc,dt,dn);
+		cur_frm.cscript.render_communication_list(doc, cdt, cdn);
 		//cur_frm.cscript.make_shipping_address(doc,dt,dn);
 	}
 }
@@ -150,61 +154,83 @@
 
 
 // Transaction History
-// functions called by these functions are defined in contact_control.js
+// functions called by these functions are defined in communication.js
 cur_frm.cscript.make_qtn_list = function(parent, doc) {
-	cur_frm.cscript.render_transaction_history(parent, doc, 'Quotation', 
-		[
-			{fieldname: 'name', width: '28%', label: 'Id', type: 'Link'},
-			{fieldname: 'status', width: '25%', label: 'Status', type: 'Data'},
-			{fieldname: 'modified', width: '12%', label: 'Last Modified On', 
-				type: 'Date', style: 'text-align: right; color: #777'},
-			{fieldname: 'currency', width: '0%', label: 'Currency', 
-				style: 'display: hidden'},
-			{fieldname: 'grand_total', width: '35%', label: 'Grand Total', 
-				type: 'Currency', style: 'text-align: right'},
-		]);
+	cur_frm.cscript.get_common_list_view(parent, doc, 'Quotation');
 }
 
 cur_frm.cscript.make_so_list = function(parent, doc) {
-	cur_frm.cscript.render_transaction_history(parent, doc, 'Sales Order', 
-		[
-			{fieldname: 'name', width: '28%', label: 'Id', type: 'Link'},
-			{fieldname: 'status', width: '25%', label: 'Status', type: 'Data'},
-			{fieldname: 'modified', width: '12%', label: 'Last Modified On', 
-				type: 'Date', style: 'text-align: right; color: #777'},
-			{fieldname: 'currency', width: '0%', label: 'Currency', 
-				style: 'display: hidden'},
-			{fieldname: 'grand_total', width: '35%', label: 'Grand Total', 
-				type: 'Currency', style: 'text-align: right'},
-		]);
+	cur_frm.cscript.get_common_list_view(parent, doc, 'Sales Order');
 }
 
 cur_frm.cscript.make_dn_list = function(parent, doc) {
-	cur_frm.cscript.render_transaction_history(parent, doc, 'Delivery Note', 
-		[
-			{fieldname: 'name', width: '28%', label: 'Id', type: 'Link'},
-			{fieldname: 'status', width: '25%', label: 'Status', type: 'Data'},
-			{fieldname: 'modified', width: '12%', label: 'Last Modified On', 
-				type: 'Date', style: 'text-align: right; color: #777'},
-			{fieldname: 'currency', width: '0%', label: 'Currency', 
-				style: 'display: hidden'},
-			{fieldname: 'grand_total', width: '35%', label: 'Grand Total', 
-				type: 'Currency', style: 'text-align: right'},
-		]);
+	cur_frm.cscript.get_common_list_view(parent, doc, 'Delivery Note');
+}
+
+cur_frm.cscript.get_common_list_view = function(parent, doc, doctype) {
+	var ListView = wn.views.ListView.extend({
+		init: function(doclistview) {
+			this._super(doclistview);
+			this.fields = this.fields.concat([
+				"`tab" + doctype + "`.status",
+				"`tab" + doctype + "`.currency",
+				"ifnull(`tab" + doctype + "`.grand_total_export, 0) as grand_total_export",
+				
+			]);
+		},
+
+		prepare_data: function(data) {
+			this._super(data);
+			data.grand_total_export = data.currency + " " + fmt_money(data.grand_total_export)
+		},
+
+		columns: [
+			{width: '3%', content: 'docstatus'},
+			{width: '25%', content: 'name'},
+			{width: '25%', content: 'status'},
+			{width: '35%', content: 'grand_total_export', css: {'text-align': 'right'}},			
+			{width: '12%', content:'modified', css: {'text-align': 'right'}}		
+		],
+	});
+	
+	cur_frm.cscript.render_list(doc, doctype, parent, ListView);
 }
 
 cur_frm.cscript.make_si_list = function(parent, doc) {
-	cur_frm.cscript.render_transaction_history(parent, doc, 'Sales Invoice', 
-		[
-			{fieldname: 'name', width: '28%', label: 'Id', type: 'Link'},
-			{fieldname: 'outstanding_amount', width: '25%',
-				label: 'Outstanding Amount',
-				type: 'Currency', style: 'text-align: right; color: #777'},
-			{fieldname: 'modified', width: '12%', label: 'Last Modified On', 
-				type: 'Date', style: 'text-align: right; color: #777'},
-			{fieldname: 'currency', width: '0%', label: 'Currency', 
-				style: 'display: hidden'},
-			{fieldname: 'grand_total', width: '35%', label: 'Grand Total', 
-				type: 'Currency', style: 'text-align: right'},
-		]);
+	var ListView = wn.views.ListView.extend({
+		init: function(doclistview) {
+			this._super(doclistview);
+			this.fields = this.fields.concat([
+				"ifnull(`tabSales Invoice`.outstanding_amount, 0) as outstanding_amount",
+				"`tabSales Invoice`.currency",
+				"ifnull(`tabSales Invoice`.conversion_rate, 0) as conversion_rate",
+				"ifnull(`tabSales Invoice`.grand_total_export, 0) as grand_total_export",
+				
+			]);
+		},
+
+		prepare_data: function(data) {
+			this._super(data);
+			if (data.outstanding_amount) {
+				data.outstanding_amount = data.currency + " " + 
+					fmt_money(flt(data.outstanding_amount)/flt(data.conversion_rate)) + 
+					" [outstanding]";
+				
+			} else {
+				data.outstanding_amount = '';
+			}
+			data.grand_total_export = data.currency + " " + fmt_money(data.grand_total_export);
+		},
+
+		columns: [
+			{width: '3%', content: 'docstatus'},
+			{width: '25%', content: 'name'},
+			{width: '25%', content: 'outstanding_amount',
+				css: {'text-align': 'right', 'color': '#777'}},
+			{width: '35%', content: 'grand_total_export', css: {'text-align': 'right'}},
+			{width: '12%', content:'modified', css: {'text-align': 'right'}}
+		],
+	});
+	
+	cur_frm.cscript.render_list(doc, 'Sales Invoice', parent, ListView);
 }
\ No newline at end of file
diff --git a/erpnext/selling/doctype/customer/customer.txt b/erpnext/selling/doctype/customer/customer.txt
index 2914492..e8f03d0 100644
--- a/erpnext/selling/doctype/customer/customer.txt
+++ b/erpnext/selling/doctype/customer/customer.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-04-13 11:56:26',
+		'creation': '2012-05-15 12:14:51',
 		'docstatus': 0,
-		'modified': '2012-04-19 17:12:24',
+		'modified': '2012-05-31 11:41:06',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
@@ -305,6 +305,24 @@
 
 	# DocField
 	{
+		'doctype': u'DocField',
+		'fieldname': u'communication_history',
+		'fieldtype': u'Section Break',
+		'label': u'Communication History',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'communication_html',
+		'fieldtype': u'HTML',
+		'label': u'Communication HTML',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
 		'colour': u'White:FFF',
 		'doctype': u'DocField',
 		'fieldname': u'more_info',
diff --git a/erpnext/selling/doctype/lead/lead.js b/erpnext/selling/doctype/lead/lead.js
index a167281..6554a59 100644
--- a/erpnext/selling/doctype/lead/lead.js
+++ b/erpnext/selling/doctype/lead/lead.js
@@ -8,19 +8,20 @@
 // 
 // This program is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
 // GNU General Public License for more details.
 // 
 // You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// along with this program.	If not, see <http://www.gnu.org/licenses/>.
 
 // Module CRM
 
 wn.require('erpnext/utilities/doctype/sms_control/sms_control.js');
+wn.require('erpnext/support/doctype/communication/communication.js');
 
 cur_frm.cscript.onload = function(doc, cdt, cdn) {
-  if(user =='Guest'){
-    hide_field(['status', 'naming_series', 'order_lost_reason',
+	if(user =='Guest'){
+		hide_field(['status', 'naming_series', 'order_lost_reason',
 	'customer', 'rating', 'fax', 'website', 'territory',
 	'TerritoryHelp', 'address_line1', 'address_line2', 'city', 'state',
 	'country', 'pincode', 'address', 'lead_owner', 'market_segment',
@@ -29,29 +30,33 @@
 	'contact_date_ref', 'to_discuss', 'more_info', 'follow_up',
 	'communication_history', 'cc_to', 'subject', 'message', 'lead_attachment_detail',
 	'Create Customer', 'Create Opportunity', 'transaction_date', 'type', 'source']);
-    doc.source = 'Website';
-  }
-  if(!doc.status) set_multiple(dt,dn,{status:'Open'});
+		doc.source = 'Website';
+	}
+	if(!doc.status) set_multiple(dt,dn,{status:'Open'});
 
-  if (!doc.date){ 
-    doc.date = date.obj_to_str(new Date());
-  }
-  // set naming series
-  if(user=='Guest') doc.naming_series = 'WebLead';
-  
-  cur_frm.add_fetch('customer', 'customer_name', 'company_name');	
+	if (!doc.date){ 
+		doc.date = date.obj_to_str(new Date());
+	}
+	// set naming series
+	if(user=='Guest') doc.naming_series = 'WebLead';
+	
+	cur_frm.add_fetch('customer', 'customer_name', 'company_name');
+
+	cur_frm.cscript.make_communication_body();
 }
 
 cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-  // custom buttons
-  //---------------
-  cur_frm.clear_custom_buttons()
-  if(!doc.__islocal && !in_list(['Converted', 'Lead Lost'], doc.status)) {
+	// custom buttons
+	//---------------
+	cur_frm.clear_custom_buttons()
+	if(!doc.__islocal && !in_list(['Converted', 'Lead Lost'], doc.status)) {
 	if (doc.source != 'Existing Customer') cur_frm.add_custom_button('Create Customer', cur_frm.cscript['Create Customer']);
-    cur_frm.add_custom_button('Create Opportunity', cur_frm.cscript['Create Opportunity']);
-    cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
-  }
-  erpnext.hide_naming_series();
+		cur_frm.add_custom_button('Create Opportunity', cur_frm.cscript['Create Opportunity']);
+		cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
+	}
+	erpnext.hide_naming_series();
+	
+	if (!doc.__islocal) cur_frm.cscript.render_communication_list(doc, cdt, cdn);
 }
 
 
@@ -59,90 +64,90 @@
 // ===========================================================
 // ************ Status ******************
 cur_frm.cscript.status = function(doc, cdt, cdn){
-  cur_frm.cscript.refresh(doc, cdt, cdn);
+	cur_frm.cscript.refresh(doc, cdt, cdn);
 }
 
 cur_frm.cscript.TerritoryHelp = function(doc,dt,dn){
-  var call_back = function(){
-    var sb_obj = new SalesBrowser();        
-    sb_obj.set_val('Territory');
-  }
+	var call_back = function(){
+		var sb_obj = new SalesBrowser();				
+		sb_obj.set_val('Territory');
+	}
 
-  loadpage('Sales Browser',call_back);
+	loadpage('Sales Browser',call_back);
 }
 
 //Trigger in Item Table
 //===================================
 cur_frm.cscript.item_code=function(doc,cdt,cdn){
-  var d = locals[cdt][cdn];
-  if (d.item_code) { get_server_fields('get_item_detail',d.item_code,'lead_item_detail',doc,cdt,cdn,1);}
+	var d = locals[cdt][cdn];
+	if (d.item_code) { get_server_fields('get_item_detail',d.item_code,'lead_item_detail',doc,cdt,cdn,1);}
 }
 
 // Create New Customer
 // ===============================================================
 cur_frm.cscript['Create Customer'] = function(){
-  var doc = cur_frm.doc;
-  $c('runserverobj',args={ 'method':'check_status', 'docs':compress_doclist([doc])},
-    function(r,rt){
-      if(r.message == 'Converted'){
-        msgprint("This lead is already converted to customer");
-      }
-      else{
-        n = createLocal("Customer");
-        $c('dt_map', args={
-          'docs':compress_doclist([locals["Customer"][n]]),
-          'from_doctype':'Lead',
-          'to_doctype':'Customer',
-          'from_docname':doc.name,
-          'from_to_list':"[['Lead', 'Customer']]"
-        }, 
-        function(r,rt) {
-          loaddoc("Customer", n);
-        }
-        );
-      }
-    }
-  );
+	var doc = cur_frm.doc;
+	$c('runserverobj',args={ 'method':'check_status', 'docs':compress_doclist([doc])},
+		function(r,rt){
+			if(r.message == 'Converted'){
+				msgprint("This lead is already converted to customer");
+			}
+			else{
+				n = createLocal("Customer");
+				$c('dt_map', args={
+					'docs':compress_doclist([locals["Customer"][n]]),
+					'from_doctype':'Lead',
+					'to_doctype':'Customer',
+					'from_docname':doc.name,
+					'from_to_list':"[['Lead', 'Customer']]"
+				}, 
+				function(r,rt) {
+					loaddoc("Customer", n);
+				}
+				);
+			}
+		}
+	);
 }
 
 // send email
 // ===============================================================
 cur_frm.cscript.send_email = function(doc,cdt,cdn){
-  if(doc.__islocal != 1){
-    $c_obj(make_doclist(doc.doctype, doc.name),'send_mail','',function(r,rt){});
-  }else{
-    msgprint("Please save lead first before sending email")
-  }
+	if(doc.__islocal != 1){
+		$c_obj(make_doclist(doc.doctype, doc.name),'send_mail','',function(r,rt){});
+	}else{
+		msgprint("Please save lead first before sending email")
+	}
 }
 
 // Create New Opportunity
 // ===============================================================
 cur_frm.cscript['Create Opportunity'] = function(){
-  var doc = cur_frm.doc;
-  $c('runserverobj',args={ 'method':'check_status', 'docs':compress_doclist([doc])},
-    function(r,rt){
-      if(r.message == 'Converted'){
-        msgprint("This lead is now converted to customer. Please create enquiry on behalf of customer");
-      }
-      else{
-        n = createLocal("Opportunity");
-        $c('dt_map', args={
-          'docs':compress_doclist([locals["Opportunity"][n]]),
-          'from_doctype':'Lead',
-          'to_doctype':'Opportunity',
-          'from_docname':doc.name,
-          'from_to_list':"[['Lead', 'Opportunity']]"
-        }
-        , function(r,rt) {
-            loaddoc("Opportunity", n);
-          }
-        );
-      }
-    }
-  );
+	var doc = cur_frm.doc;
+	$c('runserverobj',args={ 'method':'check_status', 'docs':compress_doclist([doc])},
+		function(r,rt){
+			if(r.message == 'Converted'){
+				msgprint("This lead is now converted to customer. Please create enquiry on behalf of customer");
+			}
+			else{
+				n = createLocal("Opportunity");
+				$c('dt_map', args={
+					'docs':compress_doclist([locals["Opportunity"][n]]),
+					'from_doctype':'Lead',
+					'to_doctype':'Opportunity',
+					'from_docname':doc.name,
+					'from_to_list':"[['Lead', 'Opportunity']]"
+				}
+				, function(r,rt) {
+						loaddoc("Opportunity", n);
+					}
+				);
+			}
+		}
+	);
 }
 
 //get query select Territory
 cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) {
-  return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY  `tabTerritory`.`name` ASC LIMIT 50';
+	return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY	`tabTerritory`.`name` ASC LIMIT 50';
 }
diff --git a/erpnext/selling/doctype/lead/lead.txt b/erpnext/selling/doctype/lead/lead.txt
index e714858..b6aa839 100644
--- a/erpnext/selling/doctype/lead/lead.txt
+++ b/erpnext/selling/doctype/lead/lead.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-04-02 16:02:08',
+		'creation': '2012-05-15 12:14:52',
 		'docstatus': 0,
-		'modified': '2012-04-30 15:20:50',
+		'modified': '2012-05-30 12:43:03',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
@@ -314,13 +314,13 @@
 	# DocField
 	{
 		'allow_on_submit': 0,
+		'colour': u'White:FFF',
 		'doctype': u'DocField',
-		'fieldname': u'follow_up',
-		'fieldtype': u'Table',
-		'label': u'Communication Log',
+		'fieldname': u'communication_html',
+		'fieldtype': u'HTML',
+		'label': u'Communication HTML',
 		'oldfieldname': u'follow_up',
 		'oldfieldtype': u'Table',
-		'options': u'Communication Log',
 		'permlevel': 0
 	},
 
diff --git a/erpnext/selling/doctype/opportunity/opportunity.js b/erpnext/selling/doctype/opportunity/opportunity.js
index ba4b538..c672aa1 100644
--- a/erpnext/selling/doctype/opportunity/opportunity.js
+++ b/erpnext/selling/doctype/opportunity/opportunity.js
@@ -15,6 +15,7 @@
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 wn.require('erpnext/utilities/doctype/sms_control/sms_control.js');
+wn.require('erpnext/support/doctype/communication/communication.js');
 
 cur_frm.cscript.refresh = function(doc, cdt, cdn){
     erpnext.hide_naming_series();
@@ -25,7 +26,7 @@
 		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);
 	}
-
+	if(!doc.__islocal) cur_frm.cscript.render_communication_list(doc, cdt, cdn);
 }
 
 // ONLOAD
@@ -49,6 +50,7 @@
 
 	// setup fetch
 	cur_frm.cscript.set_fetch();
+	cur_frm.cscript.make_communication_body();
 }
 
 cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
diff --git a/erpnext/selling/doctype/opportunity/opportunity.txt b/erpnext/selling/doctype/opportunity/opportunity.txt
index ddf3b96..0913b62 100644
--- a/erpnext/selling/doctype/opportunity/opportunity.txt
+++ b/erpnext/selling/doctype/opportunity/opportunity.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-04-02 16:02:08',
+		'creation': '2012-05-15 12:14:52',
 		'docstatus': 0,
-		'modified': '2012-04-30 15:34:34',
+		'modified': '2012-05-31 12:42:38',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
@@ -282,12 +282,11 @@
 		'allow_on_submit': 1,
 		'colour': u'White:FFF',
 		'doctype': u'DocField',
-		'fieldname': u'follow_up',
-		'fieldtype': u'Table',
-		'label': u'Communication Log',
+		'fieldname': u'communication_html',
+		'fieldtype': u'HTML',
+		'label': u'Communication HTML',
 		'oldfieldname': u'follow_up',
 		'oldfieldtype': u'Table',
-		'options': u'Communication Log',
 		'permlevel': 0
 	},
 
diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js
index 2807260..e89ad15 100644
--- a/erpnext/selling/doctype/quotation/quotation.js
+++ b/erpnext/selling/doctype/quotation/quotation.js
@@ -25,6 +25,7 @@
 wn.require('erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js');
 wn.require('erpnext/utilities/doctype/sms_control/sms_control.js');
 wn.require('erpnext/setup/doctype/notification_control/notification_control.js');
+wn.require('erpnext/support/doctype/communication/communication.js');
 
 // ONLOAD
 // ===================================================================================
@@ -39,7 +40,7 @@
 
 	if(!doc.company && sys_defaults.company) set_multiple(cdt,cdn,{company:sys_defaults.company});
 	if(!doc.fiscal_year && sys_defaults.fiscal_year) set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year});
-
+	
 	if(doc.quotation_to) {
 		if(doc.quotation_to == 'Customer') {
 			hide_field(['lead', 'lead_name']);
@@ -48,9 +49,11 @@
 			hide_field(['customer','customer_address','contact_person', 'customer_name','contact_display', 'customer_group']);
 		}
 	}
+	cur_frm.cscript.make_communication_body();
+
 }
 
-cur_frm.cscript.onload_post_render = function(doc, dt, dn) {
+cur_frm.cscript.onload_post_render = function(doc, dt, dn) {	
 	var callback = function(doc, dt, dn) {
 		// defined in sales_common.js
 		cur_frm.cscript.update_item_details(doc, dt, dn);
@@ -95,6 +98,8 @@
 	
 	if(doc.customer || doc.lead) $(cur_frm.fields_dict.contact_section.row.wrapper).toggle(true);
 	else $(cur_frm.fields_dict.contact_section.row.wrapper).toggle(false);
+	
+	if (!doc.__islocal) cur_frm.cscript.render_communication_list(doc, cdt, cdn);
 }
 
 
diff --git a/erpnext/selling/doctype/quotation/quotation.txt b/erpnext/selling/doctype/quotation/quotation.txt
index aa2fd65..e5f8e75 100644
--- a/erpnext/selling/doctype/quotation/quotation.txt
+++ b/erpnext/selling/doctype/quotation/quotation.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-04-30 18:40:10',
+		'creation': '2012-05-21 11:43:59',
 		'docstatus': 0,
-		'modified': '2012-04-30 20:30:45',
+		'modified': '2012-05-31 11:43:18',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
@@ -51,8 +51,7 @@
 		'name': '__common__',
 		'parent': u'Quotation',
 		'parentfield': u'permissions',
-		'parenttype': u'DocType',
-		'read': 1
+		'parenttype': u'DocType'
 	},
 
 	# DocType, Quotation
@@ -63,11 +62,19 @@
 
 	# DocPerm
 	{
+		'doctype': u'DocPerm',
+		'permlevel': 0,
+		'role': u'user print'
+	},
+
+	# DocPerm
+	{
 		'amend': 0,
 		'cancel': 0,
 		'create': 0,
 		'doctype': u'DocPerm',
 		'permlevel': 1,
+		'read': 1,
 		'role': u'Sales Manager',
 		'submit': 0,
 		'write': 0
@@ -80,6 +87,7 @@
 		'create': 1,
 		'doctype': u'DocPerm',
 		'permlevel': 0,
+		'read': 1,
 		'role': u'Sales Manager',
 		'submit': 1,
 		'write': 1
@@ -92,6 +100,7 @@
 		'create': 1,
 		'doctype': u'DocPerm',
 		'permlevel': 0,
+		'read': 1,
 		'role': u'Sales User',
 		'submit': 1,
 		'write': 1
@@ -104,6 +113,7 @@
 		'create': 0,
 		'doctype': u'DocPerm',
 		'permlevel': 1,
+		'read': 1,
 		'role': u'Sales User',
 		'submit': 0,
 		'write': 0
@@ -114,6 +124,7 @@
 		'doctype': u'DocPerm',
 		'match': u'customer_name',
 		'permlevel': 0,
+		'read': 1,
 		'role': u'Customer'
 	},
 
@@ -124,6 +135,7 @@
 		'create': 1,
 		'doctype': u'DocPerm',
 		'permlevel': 0,
+		'read': 1,
 		'role': u'Maintenance Manager',
 		'submit': 1,
 		'write': 1
@@ -133,6 +145,7 @@
 	{
 		'doctype': u'DocPerm',
 		'permlevel': 1,
+		'read': 1,
 		'role': u'Maintenance Manager'
 	},
 
@@ -143,6 +156,7 @@
 		'create': 1,
 		'doctype': u'DocPerm',
 		'permlevel': 0,
+		'read': 1,
 		'role': u'Maintenance User',
 		'submit': 1,
 		'write': 1
@@ -152,6 +166,7 @@
 	{
 		'doctype': u'DocPerm',
 		'permlevel': 1,
+		'read': 1,
 		'role': u'Maintenance User'
 	},
 
@@ -1240,12 +1255,11 @@
 		'allow_on_submit': 1,
 		'colour': u'White:FFF',
 		'doctype': u'DocField',
-		'fieldname': u'follow_up',
-		'fieldtype': u'Table',
-		'label': u'Communication Log',
+		'fieldname': u'communication_html',
+		'fieldtype': u'HTML',
+		'label': u'Communication HTML',
 		'oldfieldname': u'follow_up',
 		'oldfieldtype': u'Table',
-		'options': u'Communication Log',
 		'permlevel': 0,
 		'print_hide': 1,
 		'width': u'40px'
diff --git a/erpnext/setup/doctype/contact_control/contact_control.js b/erpnext/setup/doctype/contact_control/contact_control.js
index f9dc2c9..2482660 100755
--- a/erpnext/setup/doctype/contact_control/contact_control.js
+++ b/erpnext/setup/doctype/contact_control/contact_control.js
@@ -9,7 +9,6 @@
 	cur_frm.history_html = $a(cur_frm.fields_dict['history_html'].wrapper,'div');
 }
 
-
 // make history
 // -------------
 cur_frm.cscript.make_history = function(doc,dt,dn){
@@ -50,42 +49,6 @@
 	}
 }
 
-// run list
-// ---------
-cur_frm.cscript.run_list = function(lst,parent,q,q_max,doc,dn,nm){
-	
-	parent.innerHTML = '';
-	$dh(parent);
-	
-	lst.doc = doc;
-	lst.dn = dn;
-	lst.nm = nm;
-	lst.page_len = 10;
-	
-	lst.get_query = function(){
-		this.query = q;
-		this.query_max = q_max;
-	}
-	
-	lst.make(parent);
-	lst.run();
-	
-	lst.onrun = function(){
-		$ds(parent);
-		if(!this.has_data()){
-			parent.innerHTML = '';
-			var dv = $a(parent,'div','help_box');
-			$a(dv,'span').innerHTML = "No " + this.dn + " found. ";
-			
-			var lbl = 'Create the <b>first</b> ' + this.dn + ' for ' + this.doc.name;
-			var sp = $a(dv,'span');
-			sp.nm = this.nm;
-			$(sp).html(lbl).addClass('link_type').click(function(){ newdoc(this.nm); });
-		}
-	}
-}
-
-
 // get sates on country trigger
 // -----------------------------
 cur_frm.cscript.get_states=function(doc,dt,dn){
@@ -120,81 +83,4 @@
 	cur_frm.fields_dict['territory'].get_query = function(doc,dt,dn) {
 		return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s"  ORDER BY  `tabTerritory`.`name` ASC LIMIT 50';
 	}
-}
-
-
-// Transaction History related functions
-cur_frm.cscript.render_transaction_history = function(parent, doc, doctype, args) {
-	$(parent).css({ 'padding-top': '10px' });
-	cur_frm.transaction_list = new wn.ui.Listing({
-		parent: parent,
-		page_length: 10,
-		get_query: function() {
-			return cur_frm.cscript.get_query_transaction_history({
-				parent: doc.doctype.toLowerCase(),
-				parent_name: doc.name,
-				doctype: doctype,
-				fields: (function() {
-					var fields = [];
-					for(var i in args) {
-						fields.push(args[i].fieldname);
-					}
-					return fields.join(", ");
-				})(),
-			});
-		},
-		as_dict: 1,
-		no_result_message: repl('No %(doctype)s created for this %(parent)s', 
-								{ doctype: doctype, parent: doc.doctype }),
-		render_row: function(wrapper, data) {
-			render_html = cur_frm.cscript.render_transaction_history_row(data, args, doctype);
-			$(wrapper).html(render_html);
-		},
-	});
-	cur_frm.transaction_list.run();
-}
-
-cur_frm.cscript.render_transaction_history_row = function(data, args, doctype) {
-	var content = [];
-	var currency = data.currency;
-	for (var a in args) {
-		for (var d in data) {
-			if (args[a].fieldname === d && args[a].fieldname !== 'currency') {
-				if (args[a].type === 'Link') {
-					data[d] = repl('<a href="#!Form/%(doctype)s/%(name)s">\
-						%(name)s</a>', { doctype: doctype, name: data[d]});
-				} else if (args[a].type === 'Currency') {
-					data[d] = currency + " " + fmt_money(data[d]);
-				} else if (args[a].type === 'Percentage') {
-					data[d] = flt(data[d]) + '%';
-				} else if (args[a].type === 'Date') {
-					data[d] = wn.datetime.only_date(data[d]);
-				}
-				if (args[a].style == undefined) {
-					args[a].style = '';
-				}
-				data[d] = repl('\
-					<td width="%(width)s" title="%(title)s" style="%(style)s">\
-					%(content)s</td>',
-					{
-						content: data[d],
-						width: args[a].width,
-						title: args[a].label,
-						style: args[a].style,
-					});
-				content.push(data[d]);
-				break;
-			}
-		}
-	}
-	content = content.join("\n");
-	return '<table><tr>' + content + '</tr></table>';
-}
-
-cur_frm.cscript.get_query_transaction_history = function(args) {
-	var query = repl("\
-		select %(fields)s from `tab%(doctype)s` \
-		where %(parent)s = '%(parent_name)s' \
-		order by modified desc", args);
-	return query;
 }
\ No newline at end of file
diff --git a/erpnext/support/doctype/communication/__init__.py b/erpnext/support/doctype/communication/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/support/doctype/communication/__init__.py
diff --git a/erpnext/support/doctype/communication/communication.js b/erpnext/support/doctype/communication/communication.js
new file mode 100644
index 0000000..a1dd00d
--- /dev/null
+++ b/erpnext/support/doctype/communication/communication.js
@@ -0,0 +1,161 @@
+cur_frm.cscript.refresh = function(doc, dt, dn) {
+	if(!doc.islocal) {
+		var field_list = ['lead', 'customer', 'supplier', 'contact', 'opportunity',
+			'quotation', 'support_ticket'];
+		var hide_list = [];
+		$.each(field_list, function(i, v) {
+			if(!doc[v]) hide_list.push(v);
+		});
+		
+		if(hide_list.length < field_list.length) hide_field(hide_list);
+	}
+}
+
+
+cur_frm.cscript.make_communication_body = function() {
+	var communication_wrapper = cur_frm.fields_dict.communication_html.wrapper;
+	communication_wrapper.innerHTML = '';
+	cur_frm.communication_html = $a(communication_wrapper, 'div');
+}
+
+cur_frm.cscript.render_communication_list = function(doc, dt, dn) {
+	var ListView = wn.views.ListView.extend({
+		init: function(doclistview) {
+			this._super(doclistview);
+			this.fields = this.fields.concat([
+				"`tabCommunication`.communication_date",
+				"`tabCommunication`.category",
+				"`tabCommunication`.subject",
+				"`tabCommunication`.content"
+			]);
+			this.order_by = "`tabCommunication`.communication_date desc";
+		},
+
+		prepare_data: function(data) {
+			this._super(data);
+			data.creation = wn.datetime.str_to_user(data.communication_date);
+
+			data.content = cstr(data.subject) + " | " + cstr(data.content);
+
+			if(data.content && data.content.length > 50) {
+				data.content = '<span title="'+data.content+'">' +
+					data.description.substr(0,50) + '...</span>';
+			}
+
+		},
+
+		columns: [
+			{width: '3%', content: 'docstatus'},
+			{width: '15%', content: 'name'},
+			{width: '15%', content: 'category'},
+			{width: '55%', content: 'content'},
+			{width: '12%', content:'communication_date',
+				css: {'text-align': 'right', 'color':'#777'}}		
+		],
+	});
+	
+	cur_frm.cscript.render_list(doc, 'Communication', cur_frm.communication_html,
+		ListView, function(doctype) {
+			var new_doc = LocalDB.create(doctype);
+			new_doc = locals[doctype][new_doc];
+			new_doc[doc.doctype.toLowerCase()] = doc.name;
+			loaddoc(new_doc.doctype, new_doc.name);
+		});
+}
+
+
+// Render List
+cur_frm.cscript.render_list = function(doc, doctype, wrapper, ListView,
+		new_doc_constructor) {
+	wn.model.with_doctype(doctype, function(r) {
+		if(r && r['403']) {
+			return;
+		}
+		var RecordListView = wn.views.RecordListView.extend({
+			default_docstatus: ['0', '1', '2'],
+			default_filters: [
+				[doctype, doc.doctype.toLowerCase(), '=', doc.name],
+			],
+			new_doc_constructor: new_doc_constructor || null,
+		});
+		var record_list_view = new RecordListView(doctype, wrapper, ListView);
+	});
+}
+
+
+
+// Transaction List related functions
+cur_frm.cscript.render_list2 = function(parent, doc, doctype, args) {
+	$(parent).css({ 'padding-top': '10px' });
+	cur_frm.transaction_list = new wn.ui.Listing({
+		parent: parent,
+		page_length: 10,
+		get_query: function() {
+			return cur_frm.cscript.get_query_list({
+				parent: doc.doctype.toLowerCase(),
+				parent_name: doc.name,
+				doctype: doctype,
+				fields: (function() {
+					var fields = [];
+					for(var i in args) {
+						fields.push(args[i].fieldname);
+					}
+					return fields.join(", ");
+				})(),
+			});
+		},
+		as_dict: 1,
+		no_result_message: repl('No %(doctype)s created for this %(parent)s', 
+								{ doctype: doctype, parent: doc.doctype }),
+		render_row: function(wrapper, data) {
+			render_html = cur_frm.cscript.render_list_row(data, args, doctype);
+			$(wrapper).html(render_html);
+		},
+	});
+	cur_frm.transaction_list.run();
+}
+
+cur_frm.cscript.render_list_row = function(data, args, doctype) {
+	var content = [];
+	var currency = data.currency;
+	for (var a in args) {
+		for (var d in data) {
+			if (args[a].fieldname === d && args[a].fieldname !== 'currency') {
+				if (args[a].type === 'Link') {
+					data[d] = repl('<a href="#!Form/%(doctype)s/%(name)s">\
+						%(name)s</a>', { doctype: doctype, name: data[d]});
+				} else if (args[a].type === 'Currency') {
+					data[d] = currency + " " + fmt_money(data[d]);
+				} else if (args[a].type === 'Percentage') {
+					data[d] = flt(data[d]) + '%';
+				} else if (args[a].type === 'Date') {
+					data[d] = wn.datetime.only_date(data[d]);
+				}
+				if (args[a].style == undefined) {
+					args[a].style = '';
+				}
+				data[d] = repl('\
+					<td width="%(width)s" title="%(title)s" style="%(style)s">\
+					%(content)s</td>',
+					{
+						content: data[d],
+						width: args[a].width,
+						title: args[a].label,
+						style: args[a].style,
+					});
+				content.push(data[d]);
+				break;
+			}
+		}
+	}
+	content = content.join("\n");
+	return '<table><tr>' + content + '</tr></table>';
+}
+
+cur_frm.cscript.get_query_list = function(args) {
+	var query = repl("\
+		select %(fields)s from `tab%(doctype)s` \
+		where %(parent)s = '%(parent_name)s' \
+		order by modified desc", args);
+	return query;
+}
\ No newline at end of file
diff --git a/erpnext/support/doctype/communication/communication.py b/erpnext/support/doctype/communication/communication.py
new file mode 100644
index 0000000..c99422d
--- /dev/null
+++ b/erpnext/support/doctype/communication/communication.py
@@ -0,0 +1,26 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import webnotes
+from webnotes.model.doc import make_autoname
+
+class DocType():
+	def __init__(self, doc, doclist=[]):
+		self.doc = doc
+		self.doclist = doclist
+
+	def autoname(self):
+		self.doc.name = make_autoname(self.doc.naming_series+'.#####')
diff --git a/erpnext/support/doctype/communication/communication.txt b/erpnext/support/doctype/communication/communication.txt
new file mode 100644
index 0000000..1e145b0
--- /dev/null
+++ b/erpnext/support/doctype/communication/communication.txt
@@ -0,0 +1,396 @@
+# DocType, Communication
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2012-05-29 16:56:41',
+		'docstatus': 0,
+		'modified': '2012-05-31 14:46:44',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
+	},
+
+	# These values are common for all DocType
+	{
+		'allow_attach': 1,
+		'description': u'Keep a track of all communications',
+		'doctype': 'DocType',
+		'module': u'Support',
+		'name': '__common__',
+		'version': 1
+	},
+
+	# These values are common for all DocField
+	{
+		'doctype': u'DocField',
+		'name': '__common__',
+		'parent': u'Communication',
+		'parentfield': u'fields',
+		'parenttype': u'DocType'
+	},
+
+	# These values are common for all DocPerm
+	{
+		'doctype': u'DocPerm',
+		'name': '__common__',
+		'parent': u'Communication',
+		'parentfield': u'permissions',
+		'parenttype': u'DocType',
+		'read': 1,
+		'write': 1
+	},
+
+	# DocType, Communication
+	{
+		'doctype': 'DocType',
+		'name': u'Communication'
+	},
+
+	# DocPerm
+	{
+		'create': 1,
+		'doctype': u'DocPerm',
+		'permlevel': 0,
+		'role': u'Support Team'
+	},
+
+	# DocPerm
+	{
+		'create': 1,
+		'doctype': u'DocPerm',
+		'permlevel': 0,
+		'role': u'Sales Manager'
+	},
+
+	# DocPerm
+	{
+		'create': 1,
+		'doctype': u'DocPerm',
+		'permlevel': 0,
+		'role': u'Sales User'
+	},
+
+	# DocPerm
+	{
+		'doctype': u'DocPerm',
+		'permlevel': 1,
+		'role': u'Sales Manager'
+	},
+
+	# DocPerm
+	{
+		'doctype': u'DocPerm',
+		'permlevel': 1,
+		'role': u'Support Manager'
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'basic_info',
+		'fieldtype': u'Section Break',
+		'label': u'Basic Info',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': u'White:FFF',
+		'default': u'COMM-',
+		'doctype': u'DocField',
+		'fieldname': u'naming_series',
+		'fieldtype': u'Select',
+		'hidden': 1,
+		'label': u'Naming Series',
+		'options': u'COMM-',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'category',
+		'fieldtype': u'Select',
+		'label': u'Category',
+		'options': u'\nSales\nComplaint\nHelp\nSuggestion\nMiscellaneous',
+		'permlevel': 0,
+		'reqd': 1
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'action',
+		'fieldtype': u'Select',
+		'label': u'Action',
+		'options': u'\nCreated Opportunity\nSent Quotation\nCreated Support Ticket\nCreated Customer Issue\nNo Action',
+		'permlevel': 0,
+		'reqd': 1
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'column_break2',
+		'fieldtype': u'Column Break',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'subject',
+		'fieldtype': u'Small Text',
+		'label': u'Subject',
+		'permlevel': 0,
+		'reqd': 1
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'section_break1',
+		'fieldtype': u'Section Break',
+		'options': u'simple',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'content',
+		'fieldtype': u'Text Editor',
+		'label': u'Content',
+		'permlevel': 0,
+		'reqd': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'additional_info',
+		'fieldtype': u'Section Break',
+		'label': u'Additional Info',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': u'White:FFF',
+		'doctype': u'DocField',
+		'fieldname': u'column_break3',
+		'fieldtype': u'Column Break',
+		'label': u'Communication With / Related To',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'lead',
+		'fieldtype': u'Link',
+		'hidden': 0,
+		'label': u'Lead',
+		'options': u'Lead',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'contact',
+		'fieldtype': u'Link',
+		'label': u'Contact',
+		'options': u'Contact',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'customer',
+		'fieldtype': u'Link',
+		'label': u'Customer',
+		'options': u'Customer',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'supplier',
+		'fieldtype': u'Link',
+		'label': u'Supplier',
+		'options': u'Supplier',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'opportunity',
+		'fieldtype': u'Link',
+		'label': u'Opportunity',
+		'options': u'Opportunity',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'quotation',
+		'fieldtype': u'Link',
+		'label': u'Quotation',
+		'options': u'Quotation',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'support_ticket',
+		'fieldtype': u'Link',
+		'label': u'Support Ticket',
+		'options': u'Support Ticket',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'column_break1',
+		'fieldtype': u'Column Break',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'next_action',
+		'fieldtype': u'Select',
+		'label': u'Next Action',
+		'options': u'\nFollow Up\nCreate Opportunity\nSend Quotation\nCreate Support Ticket\nCreate Customer Issue',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'next_action_date',
+		'fieldtype': u'Date',
+		'label': u'Next Action Date',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'medium',
+		'fieldtype': u'Select',
+		'label': u'Medium',
+		'options': u'\nChat\nPhone\nEmail\nSMS\nVisit\nOther',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'phone_no',
+		'fieldtype': u'Data',
+		'label': u'Phone No.',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'email_address',
+		'fieldtype': u'Data',
+		'label': u'Email Address',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'section_break2',
+		'fieldtype': u'Section Break',
+		'options': u'simple',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'column_break4',
+		'fieldtype': u'Column Break',
+		'label': u'Communication Carried Out By',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': u'White:FFF',
+		'default': u'__user',
+		'doctype': u'DocField',
+		'fieldname': u'profile',
+		'fieldtype': u'Link',
+		'label': u'Profile',
+		'options': u'Profile',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'sales_person',
+		'fieldtype': u'Link',
+		'label': u'Sales Person',
+		'options': u'Sales Person',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'column_break5',
+		'fieldtype': u'Column Break',
+		'label': u'Communication Carried Out On',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': u'White:FFF',
+		'default': u'Today',
+		'doctype': u'DocField',
+		'fieldname': u'communication_date',
+		'fieldtype': u'Date',
+		'label': u'Date',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'file_list',
+		'fieldtype': u'Text',
+		'hidden': 1,
+		'label': u'File List',
+		'no_copy': 1,
+		'permlevel': 0,
+		'print_hide': 1
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'_user_tags',
+		'fieldtype': u'Data',
+		'hidden': 1,
+		'label': u'User Tags',
+		'no_copy': 1,
+		'permlevel': 0,
+		'print_hide': 1
+	}
+]
\ No newline at end of file
diff --git a/erpnext/support/doctype/communication/listview.js b/erpnext/support/doctype/communication/listview.js
new file mode 100644
index 0000000..7f625f5
--- /dev/null
+++ b/erpnext/support/doctype/communication/listview.js
@@ -0,0 +1,35 @@
+wn.doclistviews['Communication'] = wn.views.ListView.extend({
+	init: function(doclistview) {
+		this._super(doclistview);
+		this.fields = this.fields.concat([
+			"`tabCommunication`.creation",
+			"`tabCommunication`.category",
+			"`tabCommunication`.subject",
+			"`tabCommunication`.content"
+		]);
+		this.order_by = "`tabCommunication`.creation desc";
+		this.stats = this.stats.concat(['category']);
+	},
+
+	prepare_data: function(data) {
+		this._super(data);
+		data.creation = wn.datetime.only_date(data.creation);
+
+		data.content = cstr(data.subject) + " | " + cstr(data.content);
+
+		if(data.content && data.content.length > 50) {
+			data.content = '<span title="'+data.content+'">' +
+				data.description.substr(0,50) + '...</span>';
+		}
+	},
+
+	columns: [
+		{width: '5%', content: 'avatar'},
+		{width: '3%', content: 'docstatus'},
+		{width: '15%', content: 'name'},
+		{width: '15%', content: 'category'},
+		{width: '55%', content: 'content+tags'},
+		{width: '12%', content:'creation',
+			css: {'text-align': 'right', 'color':'#777'}}		
+	],
+});
\ No newline at end of file
diff --git a/erpnext/support/page/support_home/support_home.html b/erpnext/support/page/support_home/support_home.html
index dcabe1c..3e40cb3 100644
--- a/erpnext/support/page/support_home/support_home.html
+++ b/erpnext/support/page/support_home/support_home.html
@@ -19,6 +19,9 @@
 		<div style="width: 48%; float: right;">
 			<h4><a href="#!List/Serial No">Serial No</a></h4>
 			<p class="help">Single unit of an Item</p>
+			<br>
+			<h4><a href="#!List/Communication">Communication</a></h4>
+			<p class="help">Communication Log</p>
 		</div>
 		<div style="clear: both"></div>
 		<hr>
diff --git a/public/js/all-app.js b/public/js/all-app.js
index c5e760e..7ea4206 100644
--- a/public/js/all-app.js
+++ b/public/js/all-app.js
@@ -305,7 +305,7 @@
 if(icon){$('<i>').addClass(icon).appendTo($button);}
 $button.html(label).click(click);return $button}},show_view:function($btn,$div,$btn_unsel,$div_unsel){$btn_unsel.removeClass('btn-info');$btn_unsel.find('i').removeClass('icon-white');$div_unsel.toggle(false);$btn.addClass('btn-info');$btn.find('i').addClass('icon-white');$div.toggle(true);},set_events:function(){var me=this;this.$w.find('.btn-more').click(function(){me.run({append:true});});if(this.title){this.$w.find('h3').html(this.title).toggle(true);}
 if(!(this.hide_refresh||this.no_refresh)){this.add_button('Refresh',function(){me.run();},'icon-refresh');}
-if(this.new_doctype){this.add_button('New '+this.new_doctype,function(){newdoc(me.new_doctype);},'icon-plus');}
+if(this.new_doctype){this.add_button('New '+this.new_doctype,function(){me.new_doc_constructor?me.new_doc_constructor(me.new_doctype):newdoc(me.new_doctype);},'icon-plus');}
 if(me.show_filters){this.add_button('Show Filters',function(){me.filter_list.show_filters();},'icon-search').addClass('btn-filter');}
 if(me.no_toolbar||me.hide_toolbar){me.$w.find('.list-toolbar-wrapper').toggle(false);}},make_filters:function(){this.filter_list=new wn.ui.FilterList({listobj:this,$parent:this.$w.find('.list-filters').toggle(true),doctype:this.doctype,filter_fields:this.filter_fields});},clear:function(){this.data=[];this.$w.find('.result-list').empty();this.$w.find('.result').toggle(true);this.$w.find('.no-result').toggle(false);this.start=0;},run:function(){var me=this;var a0=arguments[0];var a1=arguments[1];if(a0&&typeof a0=='function')
 this.onrun=a0;if(a0&&a0.callback)
@@ -321,7 +321,7 @@
  *	lib/js/wn/ui/filters.js
  */
 wn.ui.FilterList=Class.extend({init:function(opts){wn.require('js/fields.js');$.extend(this,opts);this.filters=[];this.$w=this.$parent;this.set_events();},set_events:function(){var me=this;this.$w.find('.add-filter-btn').bind('click',function(){me.add_filter();});this.$w.find('.search-btn').bind('click',function(){me.listobj.run();});},show_filters:function(){this.$w.find('.show_filters').toggle();if(!this.filters.length)
-this.add_filter();},add_filter:function(fieldname,condition,value){this.filters.push(new wn.ui.Filter({flist:this,fieldname:fieldname,condition:condition,value:value}));if(fieldname){this.$w.find('.show_filters').toggle(true);}},get_filters:function(){var values=[];$.each(this.filters,function(i,f){if(f.field)
+this.add_filter();},add_filter:function(fieldname,condition,value){this.push_new_filter(fieldname,condition,value);if(fieldname){this.$w.find('.show_filters').toggle(true);}},push_new_filter:function(fieldname,condition,value){this.filters.push(new wn.ui.Filter({flist:this,fieldname:fieldname,condition:condition,value:value}));},get_filters:function(){var values=[];$.each(this.filters,function(i,f){if(f.field)
 values.push(f.get_value());})
 return values;},update_filters:function(){var fl=[];$.each(this.filters,function(i,f){if(f.field)fl.push(f);})
 this.filters=fl;},get_filter:function(fieldname){for(var i in this.filters){if(this.filters[i].field.df.fieldname==fieldname)
@@ -969,13 +969,13 @@
    <div style="clear: both"></div>\
   </div>',{label:this.label}));this.appframe=new wn.ui.AppFrame(this.$page.find('.appframe-area'));wn.views.breadcrumbs($('<span>').appendTo(this.appframe.$titlebar),locals.DocType[this.doctype].module);},setup:function(){var me=this;me.can_delete=wn.model.can_delete(me.doctype);me.meta=locals.DocType[me.doctype];me.$page.find('.wnlist-area').empty(),me.setup_docstatus_filter();me.setup_listview();me.init_list();me.init_stats();me.make_report_button();me.add_delete_option();},make_report_button:function(){var me=this;if(wn.boot.profile.can_get_report.indexOf(this.doctype)!=-1){this.appframe.add_button('Build Report',function(){wn.set_route('Report2',me.doctype);},'icon-th')}},setup_docstatus_filter:function(){var me=this;this.can_submit=$.map(locals.DocPerm,function(d){if(d.parent==me.meta.name&&d.submit)return 1
 else return null;}).length;if(this.can_submit){this.$page.find('.show-docstatus').removeClass('hide');this.$page.find('.show-docstatus input').click(function(){me.run();})}},setup_listview:function(){if(this.meta.__listjs){eval(this.meta.__listjs);this.listview=new wn.doclistviews[this.doctype](this);}else{this.listview=new wn.views.ListView(this);}
-this.listview.parent=this;},init_list:function(){this.make({method:'webnotes.widgets.doclistview.get',get_args:this.get_args,parent:this.$page.find('.wnlist-area'),start:0,page_length:20,show_filters:true,show_grid:true,new_doctype:this.doctype,allow_delete:true,no_result_message:this.make_no_result(),columns:this.listview.fields});this.run();},make_no_result:function(){return repl('<div class="well"><p>No %(doctype_label)s found</p>\
+this.listview.parent=this;this.wrapper=this.$page.find('.wnlist-area');this.page_length=20;this.allow_delete=true;},init_list:function(auto_run){this.make({method:'webnotes.widgets.doclistview.get',get_args:this.get_args,parent:this.wrapper,start:0,page_length:this.page_length,show_filters:true,show_grid:true,new_doctype:this.doctype,new_doc_constructor:this.new_doc_constructor||null,allow_delete:this.allow_delete,no_result_message:this.make_no_result(),columns:this.listview.fields});if((auto_run!==false)&&(auto_run!==0))this.run();},make_no_result:function(){return repl('<div class="well"><p>No %(doctype_label)s found</p>\
   %(description)s\
   <hr>\
   <p><button class="btn btn-info btn-small"\
     onclick="newdoc(\'%(doctype)s\');"\
     >Make a new %(doctype_label)s</button>\
-  </p></div>',{doctype_label:get_doctype_label(this.doctype),doctype:this.doctype,description:wn.markdown(locals.DocType[this.doctype].description||'')});},render_row:function(row,data){data.doctype=this.doctype;this.listview.render(row,data,this);},get_query_fields:function(){return this.listview.fields;},get_args:function(){return{doctype:this.doctype,fields:this.get_query_fields(),filters:this.filter_list.get_filters(),docstatus:this.can_submit?$.map(this.$page.find('.show-docstatus :checked'),function(inp){return $(inp).attr('data-docstatus')}):[]}},add_delete_option:function(){var me=this;if(this.can_delete){this.add_button('Delete',function(){me.delete_items();},'icon-remove')}},delete_items:function(){var me=this;var dl=$.map(me.$page.find('.list-delete:checked'),function(e){return $(e).data('name');});if(!dl.length)
+  </p></div>',{doctype_label:get_doctype_label(this.doctype),doctype:this.doctype,description:wn.markdown(locals.DocType[this.doctype].description||'')});},render_row:function(row,data){data.doctype=this.doctype;this.listview.render(row,data,this);},get_query_fields:function(){return this.listview.fields;},get_args:function(){return{doctype:this.doctype,fields:this.get_query_fields(),filters:this.filter_list.get_filters(),docstatus:this.can_submit?$.map(this.$page.find('.show-docstatus :checked'),function(inp){return $(inp).attr('data-docstatus')}):[],order_by:this.listview.order_by||null,}},add_delete_option:function(){var me=this;if(this.can_delete){this.add_button('Delete',function(){me.delete_items();},'icon-remove')}},delete_items:function(){var me=this;var dl=$.map(me.$page.find('.list-delete:checked'),function(e){return $(e).data('name');});if(!dl.length)
 return;if(!confirm('This is PERMANENT action and you cannot undo. Continue?')){return;}
 me.set_working(true);wn.call({method:'webnotes.widgets.doclistview.delete_items',args:{items:dl,doctype:me.doctype},callback:function(){me.set_working(false);me.refresh();}})},init_stats:function(){var me=this
 wn.call({method:'webnotes.widgets.doclistview.get_stats',args:{stats:me.listview.stats,doctype:me.doctype},callback:function(r){$.each(me.listview.stats,function(i,v){me.render_stat(v,r.message[v]);});if(me.listview.stats.length){$('<button class="btn btn-small"><i class="refresh"></i> Refresh</button>').click(function(){me.reload_stats();}).appendTo($('<div class="stat-wrapper">').appendTo(me.$page.find('.layout-side-section')))}}});},render_stat:function(field,stat){var me=this;if(!stat||!stat.length){if(field=='_user_tags'){this.$page.find('.layout-side-section').append('<div class="stat-wrapper"><h4>Tags</h4>\
@@ -1023,6 +1023,7 @@
 for(key in data){if(data[key]==null){data[key]='';}}},add_user_tags:function(parent,data){var me=this;if(data._user_tags){if($(parent).html().length>0){$(parent).append('<br />');}
 $.each(data._user_tags.split(','),function(i,t){if(t){$('<span class="label label-info" style="cursor: pointer; line-height: 200%">'
 +strip(t)+'</span>').click(function(){me.doclistview.set_filter('_user_tags',$(this).text())}).appendTo(parent);}});}},show_hide_check_column:function(){if(!this.doclistview.can_delete){this.columns=$.map(this.columns,function(v,i){if(v.content!='check')return v});}}})
+wn.provide('wn.views.RecordListView');wn.views.RecordListView=wn.views.DocListView.extend({init:function(doctype,wrapper,ListView){this.doctype=doctype;this.wrapper=wrapper;this.listview=new ListView(this);this.listview.parent=this;this.setup();},setup:function(){var me=this;me.page_length=10;$(me.wrapper).empty();me.init_list();},get_args:function(){var args=this._super();$.each((this.default_filters||[]),function(i,f){args.filters.push(f);});args.docstatus=args.docstatus.concat((this.default_docstatus||[]));return args;},});
 /*
  *	lib/js/wn/views/formview.js
  */
diff --git a/public/js/all-web.js b/public/js/all-web.js
index ff2ecc0..6ce12fb 100644
--- a/public/js/all-web.js
+++ b/public/js/all-web.js
@@ -192,7 +192,7 @@
 if(icon){$('<i>').addClass(icon).appendTo($button);}
 $button.html(label).click(click);return $button}},show_view:function($btn,$div,$btn_unsel,$div_unsel){$btn_unsel.removeClass('btn-info');$btn_unsel.find('i').removeClass('icon-white');$div_unsel.toggle(false);$btn.addClass('btn-info');$btn.find('i').addClass('icon-white');$div.toggle(true);},set_events:function(){var me=this;this.$w.find('.btn-more').click(function(){me.run({append:true});});if(this.title){this.$w.find('h3').html(this.title).toggle(true);}
 if(!(this.hide_refresh||this.no_refresh)){this.add_button('Refresh',function(){me.run();},'icon-refresh');}
-if(this.new_doctype){this.add_button('New '+this.new_doctype,function(){newdoc(me.new_doctype);},'icon-plus');}
+if(this.new_doctype){this.add_button('New '+this.new_doctype,function(){me.new_doc_constructor?me.new_doc_constructor(me.new_doctype):newdoc(me.new_doctype);},'icon-plus');}
 if(me.show_filters){this.add_button('Show Filters',function(){me.filter_list.show_filters();},'icon-search').addClass('btn-filter');}
 if(me.no_toolbar||me.hide_toolbar){me.$w.find('.list-toolbar-wrapper').toggle(false);}},make_filters:function(){this.filter_list=new wn.ui.FilterList({listobj:this,$parent:this.$w.find('.list-filters').toggle(true),doctype:this.doctype,filter_fields:this.filter_fields});},clear:function(){this.data=[];this.$w.find('.result-list').empty();this.$w.find('.result').toggle(true);this.$w.find('.no-result').toggle(false);this.start=0;},run:function(){var me=this;var a0=arguments[0];var a1=arguments[1];if(a0&&typeof a0=='function')
 this.onrun=a0;if(a0&&a0.callback)
@@ -208,7 +208,7 @@
  *	lib/js/wn/ui/filters.js
  */
 wn.ui.FilterList=Class.extend({init:function(opts){wn.require('js/fields.js');$.extend(this,opts);this.filters=[];this.$w=this.$parent;this.set_events();},set_events:function(){var me=this;this.$w.find('.add-filter-btn').bind('click',function(){me.add_filter();});this.$w.find('.search-btn').bind('click',function(){me.listobj.run();});},show_filters:function(){this.$w.find('.show_filters').toggle();if(!this.filters.length)
-this.add_filter();},add_filter:function(fieldname,condition,value){this.filters.push(new wn.ui.Filter({flist:this,fieldname:fieldname,condition:condition,value:value}));if(fieldname){this.$w.find('.show_filters').toggle(true);}},get_filters:function(){var values=[];$.each(this.filters,function(i,f){if(f.field)
+this.add_filter();},add_filter:function(fieldname,condition,value){this.push_new_filter(fieldname,condition,value);if(fieldname){this.$w.find('.show_filters').toggle(true);}},push_new_filter:function(fieldname,condition,value){this.filters.push(new wn.ui.Filter({flist:this,fieldname:fieldname,condition:condition,value:value}));},get_filters:function(){var values=[];$.each(this.filters,function(i,f){if(f.field)
 values.push(f.get_value());})
 return values;},update_filters:function(){var fl=[];$.each(this.filters,function(i,f){if(f.field)fl.push(f);})
 this.filters=fl;},get_filter:function(fieldname){for(var i in this.filters){if(this.filters[i].field.df.fieldname==fieldname)