Merge pull request #5612 from shubham7saxena/rfq-sidebar

[minor][bug fix]added sidebar visibility to request for quotation link
diff --git a/erpnext/accounts/doctype/account/account_tree.js b/erpnext/accounts/doctype/account/account_tree.js
index 3252788..b24a17d 100644
--- a/erpnext/accounts/doctype/account/account_tree.js
+++ b/erpnext/accounts/doctype/account/account_tree.js
@@ -27,13 +27,13 @@
 		{fieldtype:'Select', fieldname:'root_type', label:__('Root Type'),
 			options: ['Asset', 'Liability', 'Equity', 'Income', 'Expense'].join('\n')},
 		{fieldtype:'Select', fieldname:'account_type', label:__('Account Type'),
-			options: ['', 'Bank', 'Cash', 'Warehouse', 'Tax', 'Chargeable'].join('\n'),
+			options: ['', 'Bank', 'Cash', 'Stock', 'Tax', 'Chargeable'].join('\n'),
 			description: __("Optional. This setting will be used to filter in various transactions."),
 			depends_on: 'eval:doc.is_group==1'},
 		{fieldtype:'Float', fieldname:'tax_rate', label:__('Tax Rate'),
 			depends_on: 'eval:doc.is_group==1&&doc.account_type=="Tax"'},
 		{fieldtype:'Link', fieldname:'warehouse', label:__('Warehouse'), options:"Warehouse",
-			depends_on: 'eval:(doc.is_group==1&&doc.account_type=="Warehouse")'},
+			depends_on: 'eval:(!doc.is_group&&doc.account_type=="Warehouse")'},
 		{fieldtype:'Link', fieldname:'account_currency', label:__('Currency'), options:"Currency",
 			description: __("Optional. Sets company's default currency, if not specified.")}
 	],
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 1e02415..de65485 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -49,7 +49,7 @@
 				"fieldname": "purchase_receipt",
 				"doctype": "Purchase Invoice Item",
 				"filters": [
-					["Purchase Invoice Item", "parent", "=", self.item],
+					["Purchase Invoice Item", "parent", "=", self.name],
 					["Purchase Invoice Item", "purchase_receipt", "!=", ""]
 				]
 			}
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 2f1ecf1..470ea91 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -237,7 +237,7 @@
 			return {"print_format": pos.get("print_format") }
 
 	def update_time_sheet(self, sales_invoice):
-		for d in self.get("timesheets"):
+		for d in self.timesheets:
 			if d.time_sheet:
 				timesheet = frappe.get_doc("Time Sheet", d.time_sheet)
 				timesheet.sales_invoice = sales_invoice
@@ -246,7 +246,7 @@
 				timesheet.save()
 
 	def validate_time_sheets_are_submitted(self):
-		for data in self.get("timesheets"):
+		for data in self.timesheets:
 			if data.time_sheet:
 				status = frappe.db.get_value("Time Sheet", data.time_sheet, "status")
 				if status not in ['Submitted', 'Payslip']:
diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js
index f3c8c33..6d3ef3d 100644
--- a/erpnext/accounts/page/pos/pos.js
+++ b/erpnext/accounts/page/pos/pos.js
@@ -681,7 +681,7 @@
 		this.page.set_secondary_action(__("New"), function() {
 			me.save_previous_entry();
 			me.create_new();
-		});
+		}).addClass("btn-primary");
 	},
 
 	print_document: function(html){
@@ -876,6 +876,7 @@
 		var me = this;
 		this.customer_validate();
 		this.item_validate();
+		this.validate_mode_of_payments()
 	},
 
 	item_validate: function(){
@@ -883,7 +884,13 @@
 			frappe.throw(__("Select items to save the invoice"))
 		}
 	},
-
+	
+	validate_mode_of_payments: function(){
+		if (this.frm.doc.payments.length === 0){
+			frappe.throw(__("Payment Mode is not configured. Please check, whether account has been set on Mode of Payments or on POS Profile."))
+		}
+	},
+	
 	validate_serial_no: function(){
 		var me = this;
 		var item_code = serial_no = '';
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
index aab006f..f35c3b7 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
@@ -4,7 +4,7 @@
 
 {% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %};
 
-
+cur_frm.add_fetch('contact', 'email_id', 'email_id')
 
 frappe.ui.form.on("Request for Quotation",{
 	setup: function(frm){
@@ -23,7 +23,7 @@
 		];
 		
 		frm.get_field('suppliers').grid.editable_fields = [
-			{fieldname: 'supplier', columns: 5},
+			{fieldname: 'supplier', columns: 4},
 			{fieldname: 'contact', columns: 3},
 			{fieldname: 'email_id', columns: 3}
 		];
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
index 7f1988a..2ce5c5c 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
@@ -3,6 +3,7 @@
  "allow_import": 1, 
  "allow_rename": 0, 
  "autoname": "naming_series:", 
+ "beta": 0, 
  "creation": "2016-02-25 01:24:07.224790", 
  "custom": 0, 
  "docstatus": 0, 
@@ -70,6 +71,33 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "description": "For individual supplier", 
+   "fieldname": "vendor", 
+   "fieldtype": "Link", 
+   "hidden": 1, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Supplier", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Supplier", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "column_break1", 
    "fieldtype": "Column Break", 
    "hidden": 0, 
@@ -603,13 +631,14 @@
  "hide_toolbar": 0, 
  "icon": "icon-shopping-cart", 
  "idx": 0, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 1, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-03-29 06:18:26.398938", 
+ "modified": "2016-06-30 01:57:49.233065", 
  "modified_by": "Administrator", 
  "module": "Buying", 
  "name": "Request for Quotation", 
@@ -757,6 +786,7 @@
    "write": 0
   }
  ], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 1, 
  "search_fields": "status, transaction_date", 
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
index c2aca1c..ddf2c8c 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
@@ -8,6 +8,8 @@
 from frappe.model.mapper import get_mapped_doc
 from frappe.utils import get_url, random_string
 from frappe.utils.user import get_user_fullname
+from frappe.desk.form.load import get_attachments
+from frappe.core.doctype.communication.email import make
 from erpnext.accounts.party import get_party_account_currency, get_party_details
 from erpnext.stock.doctype.material_request.material_request import set_missing_values
 from erpnext.controllers.buying_controller import BuyingController
@@ -34,6 +36,10 @@
 			if not rfq_supplier.email_id:
 				rfq_supplier.email_id = frappe.db.get_value("Contact", rfq_supplier.contact, "email_id")
 
+	def validate_email_id(self, args):
+		if not args.email_id:
+			frappe.throw(_("Row {0}: For supplier {0} email id is required to send email").format(args.idx, args.supplier))
+
 	def on_submit(self):
 		frappe.db.set(self, 'status', 'Submitted')
 
@@ -41,42 +47,61 @@
 		frappe.db.set(self, 'status', 'Cancelled')
 
 	def send_to_supplier(self):
-		link = get_url("/rfq/" + self.name)
 		for rfq_supplier in self.suppliers:
-			if rfq_supplier.email_id:
+			if rfq_supplier.send_email:
+				self.validate_email_id(rfq_supplier)
 
 				# make new user if required
-				update_password_link = self.create_supplier_user(rfq_supplier, link)
+				update_password_link = self.update_supplier_contact(rfq_supplier, self.get_link())
 
-				self.supplier_rfq_mail(rfq_supplier, update_password_link, link)
-			else:
-				frappe.throw(_("For supplier {0} email id is required to send email").format(rfq_supplier.supplier))
+				self.update_supplier_part_no(rfq_supplier)
+				self.supplier_rfq_mail(rfq_supplier, update_password_link, self.get_link())
 
-	def create_supplier_user(self, rfq_supplier, link):
+	def get_link(self):
+		# RFQ link for supplier portal
+		return get_url("/rfq/" + self.name)
+
+	def update_supplier_part_no(self, args):
+		self.vendor = args.supplier
+		for item in self.items:
+			item.supplier_part_no = frappe.db.get_value('Item Supplier',
+				{'parent': item.item_code, 'supplier': args.supplier}, 'supplier_part_no')
+
+	def update_supplier_contact(self, rfq_supplier, link):
 		'''Create a new user for the supplier if not set in contact'''
 		update_password_link = ''
 
-		contact = frappe.get_doc("Contact", rfq_supplier.contact)
-		if not contact.user:
-			if frappe.db.exists("User", rfq_supplier.email_id):
-				user = frappe.get_doc("User", rfq_supplier.email_id)
-			else:
-				user, update_password_link = self.create_user(rfq_supplier, link)
+		if frappe.db.exists("User", rfq_supplier.email_id):
+			user = frappe.get_doc("User", rfq_supplier.email_id)
+		else:
+			user, update_password_link = self.create_user(rfq_supplier, link)
 
-			# set user_id in contact
-			contact = frappe.get_doc('Contact', rfq_supplier.contact)
-			contact.user = user.name
-			contact.save()
+		self.update_contact_of_supplier(rfq_supplier, user)
 
 		return update_password_link
 
+	def update_contact_of_supplier(self, rfq_supplier, user):
+		if rfq_supplier.contact:
+			contact = frappe.get_doc("Contact", rfq_supplier.contact)
+		else:
+			contact = frappe.new_doc("Contact")
+			contact.first_name = rfq_supplier.supplier_name or rfq_supplier.supplier
+			contact.supplier = rfq_supplier.supplier
+
+		if not contact.email_id and not contact.user:
+			contact.email_id = user.name
+			contact.user = user.name
+
+		contact.save(ignore_permissions=True)
+
 	def create_user(self, rfq_supplier, link):
 		user = frappe.get_doc({
 			'doctype': 'User',
 			'send_welcome_email': 0,
 			'email': rfq_supplier.email_id,
-			'first_name': rfq_supplier.supplier_name,
-			'user_type': 'Website User'
+			'first_name': rfq_supplier.supplier_name or rfq_supplier.supplier,
+			'user_type': 'Website User',
+			'redirect_url': link
 		})
 		user.save(ignore_permissions=True)
 		update_password_link = user.reset_password()
@@ -98,12 +123,22 @@
 		subject = _("Request for Quotation")
 		template = "templates/emails/request_for_quotation.html"
 		sender = frappe.session.user not in STANDARD_USERS and frappe.session.user or None
+		message = frappe.get_template(template).render(args)
+		attachments = self.get_attachments()
 
-		frappe.sendmail(recipients=data.email_id, sender=sender, subject=subject,
-			message=frappe.get_template(template).render(args),
-			attachments = [frappe.attach_print('Request for Quotation', self.name)])
+		self.send_email(data, sender, subject, message, attachments)
+
+	def send_email(self, data, sender, subject, message, attachments):
+		make(subject = subject, content=message,recipients=data.email_id, 
+			sender=sender,attachments = attachments, send_email=True)["name"]
+
 		frappe.msgprint(_("Email sent to supplier {0}").format(data.supplier))
 
+	def get_attachments(self):
+		attachments = [d.name for d in get_attachments(self.doctype, self.name)]
+		attachments.append(frappe.attach_print('Request for Quotation', self.name, doc=self))
+		return attachments
+
 @frappe.whitelist()
 def send_supplier_emails(rfq_name):
 	rfq = frappe.get_doc("Request for Quotation", rfq_name)
diff --git a/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json
index 7a23f43..8c6ac91 100644
--- a/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json
+++ b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json
@@ -42,6 +42,31 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "supplier_part_no", 
+   "fieldtype": "Data", 
+   "hidden": 1, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Supplier Part No", 
+   "length": 0, 
+   "no_copy": 1, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "column_break_3", 
    "fieldtype": "Column Break", 
    "hidden": 0, 
@@ -601,8 +626,8 @@
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2016-06-17 12:25:37.655901", 
- "modified_by": "umair@erpnext.com", 
+ "modified": "2016-06-28 14:25:08.330508", 
+ "modified_by": "Administrator", 
  "module": "Buying", 
  "name": "Request for Quotation Item", 
  "name_case": "", 
diff --git a/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json b/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
index 3399b51..5fe7456 100644
--- a/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
+++ b/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
@@ -10,6 +10,32 @@
  "document_type": "", 
  "fields": [
   {
+   "allow_on_submit": 1, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "default": "1", 
+   "fieldname": "send_email", 
+   "fieldtype": "Check", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Send Email", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -141,13 +167,14 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 0, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2016-05-31 19:08:15.397706", 
+ "modified": "2016-06-30 02:01:54.130809", 
  "modified_by": "Administrator", 
  "module": "Buying", 
  "name": "Request for Quotation Supplier", 
diff --git a/erpnext/config/crm.py b/erpnext/config/crm.py
index 52958e3..178ee95 100644
--- a/erpnext/config/crm.py
+++ b/erpnext/config/crm.py
@@ -70,11 +70,6 @@
 			"items": [
 				{
 					"type": "doctype",
-					"name": "Newsletter",
-					"description": _("Newsletters to contacts, leads."),
-				},
-				{
-					"type": "doctype",
 					"name": "Communication",
 					"description": _("Record of all communications of type email, phone, chat, visit, etc."),
 				},
@@ -116,11 +111,6 @@
 					"description": _("Manage Sales Person Tree."),
 					"doctype": "Sales Person",
 				},
-				{
-					"type": "doctype",
-					"name": "Newsletter List",
-					"description": _("Newsletter Mailing List"),
-				},
 			]
 		},
 		{
diff --git a/erpnext/config/desktop.py b/erpnext/config/desktop.py
index 9944db9..fc2be82 100644
--- a/erpnext/config/desktop.py
+++ b/erpnext/config/desktop.py
@@ -157,5 +157,12 @@
 			"is_help": True,
 			"label": _("Learn"),
 			"hidden": 1
+		},
+		{
+			"module_name": "Maintenance",
+			"color": "#FF888B",
+			"icon": "octicon octicon-tools",
+			"type": "module",
+			"label": _("Maintenance")
 		}
 	]
diff --git a/erpnext/config/maintenance.py b/erpnext/config/maintenance.py
new file mode 100644
index 0000000..aa2f87c
--- /dev/null
+++ b/erpnext/config/maintenance.py
@@ -0,0 +1,32 @@
+from frappe import _
+
+def get_data():
+	return [
+		{
+			"label": _("Maintenance"),
+			"icon": "icon-star",
+			"items": [
+				{
+					"type": "doctype",
+					"name": "Maintenance Schedule",
+					"description": _("Plan for maintenance visits."),
+				},
+				{
+					"type": "doctype",
+					"name": "Maintenance Visit",
+					"description": _("Visit report for maintenance call."),
+				},
+				{
+					"type": "report",
+					"name": "Maintenance Schedules",
+					"is_query_report": True,
+					"doctype": "Maintenance Schedule"
+				},
+				{
+					"type": "doctype",
+					"name": "Warranty Claim",
+					"description": _("Warranty Claim against Serial No."),
+				},
+			]
+		}
+	]
\ No newline at end of file
diff --git a/erpnext/config/support.py b/erpnext/config/support.py
index 98fa595..a4a4c22 100644
--- a/erpnext/config/support.py
+++ b/erpnext/config/support.py
@@ -19,27 +19,6 @@
 			]
 		},
 		{
-			"label": _("Maintenance"),
-			"items": [
-				{
-					"type": "doctype",
-					"name": "Maintenance Schedule",
-					"description": _("Plan for maintenance visits."),
-				},
-				{
-					"type": "doctype",
-					"name": "Maintenance Visit",
-					"description": _("Visit report for maintenance call."),
-				},
-				{
-					"type": "report",
-					"name": "Maintenance Schedules",
-					"is_query_report": True,
-					"doctype": "Maintenance Schedule"
-				},
-			]
-		},
-		{
 			"label": _("Warranty"),
 			"items": [
 				{
diff --git a/erpnext/crm/doctype/newsletter/newsletter.js b/erpnext/crm/doctype/newsletter/newsletter.js
deleted file mode 100644
index 9bee9b3..0000000
--- a/erpnext/crm/doctype/newsletter/newsletter.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
-
-cur_frm.cscript.onload = function(doc) {
-	return frappe.call({
-		method: "erpnext.crm.doctype.newsletter.newsletter.get_lead_options",
-		type: "GET",
-		callback: function(r) {
-			set_field_options("lead_source", r.message.sources.join("\n"))
-			set_field_options("lead_status", r.message.statuses.join("\n"))
-		}
-	});
-}
-
-cur_frm.cscript.refresh = function(doc) {
-	erpnext.toggle_naming_series();
-	if(!doc.__islocal && !cint(doc.email_sent) && !doc.__unsaved
-			&& inList(frappe.boot.user.can_write, doc.doctype)) {
-		cur_frm.add_custom_button(__('Send'), function() {
-			return $c_obj(doc, 'send_emails', '', function(r) {
-				cur_frm.refresh();
-			});
-		}, "icon-play", "btn-success");
-	}
-
-	cur_frm.cscript.setup_dashboard();
-
-	if(doc.__islocal && !doc.send_from) {
-		cur_frm.set_value("send_from",
-			repl("%(fullname)s <%(email)s>", frappe.user_info(doc.owner)));
-	}
-}
-
-cur_frm.cscript.setup_dashboard = function() {
-	cur_frm.dashboard.reset();
-	if(!cur_frm.doc.__islocal && cint(cur_frm.doc.email_sent) && cur_frm.doc.__onload && cur_frm.doc.__onload.status_count) {
-		var stat = cur_frm.doc.__onload.status_count;
-		var total = frappe.utils.sum($.map(stat, function(v) { return v; }));
-		if(total) {
-			$.each(stat, function(k, v) {
-				stat[k] = flt(v * 100 / total, 2) + '%';
-			});
-
-			cur_frm.dashboard.add_progress("Status", [
-				{
-					title: stat["Sent"] + "% Sent",
-					width: stat["Sent"],
-					progress_class: "progress-bar-success"
-				},
-				{
-					title: stat["Sending"] + "% Sending",
-					width: stat["Sending"],
-					progress_class: "progress-bar-warning"
-				},
-				{
-					title: stat["Error"] + "% Error",
-					width: stat["Error"],
-					progress_class: "progress-bar-danger"
-				}
-			]);
-		}
-	}
-}
diff --git a/erpnext/crm/doctype/newsletter/newsletter.json b/erpnext/crm/doctype/newsletter/newsletter.json
deleted file mode 100644
index 2515638..0000000
--- a/erpnext/crm/doctype/newsletter/newsletter.json
+++ /dev/null
@@ -1,281 +0,0 @@
-{
- "allow_copy": 0, 
- "allow_import": 0, 
- "allow_rename": 1, 
- "autoname": "field:subject", 
- "beta": 0, 
- "creation": "2013-01-10 16:34:31", 
- "custom": 0, 
- "description": "Create and Send Newsletters", 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "Other", 
- "fields": [
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "newsletter_list", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Newsletter List", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Newsletter List", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "subject", 
-   "fieldtype": "Small Text", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Subject", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "description": "", 
-   "fieldname": "send_from", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 1, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Sender", 
-   "length": 0, 
-   "no_copy": 1, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "email_sent", 
-   "fieldtype": "Check", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Email Sent?", 
-   "length": 0, 
-   "no_copy": 1, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "newsletter_content", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "message", 
-   "fieldtype": "Text Editor", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Message", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "description": "", 
-   "fieldname": "test_the_newsletter", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "description": "A Lead with this email id should exist", 
-   "fieldname": "test_email_id", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Test Email Id", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "test_send", 
-   "fieldtype": "Button", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Test", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "test_send", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }
- ], 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "icon": "icon-envelope", 
- "idx": 1, 
- "in_create": 0, 
- "in_dialog": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 0, 
- "max_attachments": 0, 
- "menu_index": 0, 
- "modified": "2016-05-24 16:01:54.675129", 
- "modified_by": "Administrator", 
- "module": "CRM", 
- "name": "Newsletter", 
- "owner": "Administrator", 
- "permissions": [
-  {
-   "amend": 0, 
-   "apply_user_permissions": 0, 
-   "cancel": 0, 
-   "create": 0, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Newsletter Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
-   "write": 0
-  }
- ], 
- "quick_entry": 1, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "sort_order": "ASC", 
- "title_field": "subject", 
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/newsletter/newsletter.py b/erpnext/crm/doctype/newsletter/newsletter.py
deleted file mode 100755
index dbf7dde..0000000
--- a/erpnext/crm/doctype/newsletter/newsletter.py
+++ /dev/null
@@ -1,189 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-
-import frappe
-import frappe.utils
-from frappe import throw, _
-from frappe.model.document import Document
-from frappe.email.queue import check_email_limit
-from frappe.utils.verified_command import get_signed_params, verify_request
-from frappe.utils.background_jobs import enqueue
-from frappe.utils.scheduler import log
-from frappe.email.queue import send
-from erpnext.crm.doctype.newsletter_list.newsletter_list import add_subscribers
-
-class Newsletter(Document):
-	def onload(self):
-		if self.email_sent:
-			self.get("__onload").status_count = dict(frappe.db.sql("""select status, count(name)
-				from `tabEmail Queue` where reference_doctype=%s and reference_name=%s
-				group by status""", (self.doctype, self.name))) or None
-
-	def test_send(self, doctype="Lead"):
-		self.recipients = frappe.utils.split_emails(self.test_email_id)
-		self.queue_all()
-		frappe.msgprint(_("Scheduled to send to {0}").format(self.test_email_id))
-
-	def send_emails(self):
-		"""send emails to leads and customers"""
-		if self.email_sent:
-			throw(_("Newsletter has already been sent"))
-
-		self.recipients = self.get_recipients()
-
-		if getattr(frappe.local, "is_ajax", False):
-			self.validate_send()
-
-			# using default queue with a longer timeout as this isn't a scheduled task
-			enqueue(send_newsletter, queue='default', timeout=1500, event='send_newsletter', newsletter=self.name)
-
-		else:
-			self.queue_all()
-
-		frappe.msgprint(_("Scheduled to send to {0} recipients").format(len(self.recipients)))
-
-		frappe.db.set(self, "email_sent", 1)
-
-	def queue_all(self):
-		if not self.get("recipients"):
-			# in case it is called via worker
-			self.recipients = self.get_recipients()
-
-		self.validate_send()
-
-		sender = self.send_from or frappe.utils.get_formatted_email(self.owner)
-
-		if not frappe.flags.in_test:
-			frappe.db.auto_commit_on_many_writes = True
-
-		send(recipients = self.recipients, sender = sender,
-			subject = self.subject, message = self.message,
-			reference_doctype = self.doctype, reference_name = self.name,
-			unsubscribe_method = "/api/method/erpnext.crm.doctype.newsletter.newsletter.unsubscribe",
-			unsubscribe_params = {"name": self.newsletter_list},
-			send_priority = 0)
-
-		if not frappe.flags.in_test:
-			frappe.db.auto_commit_on_many_writes = False
-
-	def get_recipients(self):
-		"""Get recipients from Newsletter List"""
-		return [d.email for d in frappe.db.get_all("Newsletter List Subscriber", ["email"],
-			{"unsubscribed": 0, "newsletter_list": self.newsletter_list})]
-
-	def validate_send(self):
-		if self.get("__islocal"):
-			throw(_("Please save the Newsletter before sending"))
-		check_email_limit(self.recipients)
-
-@frappe.whitelist()
-def get_lead_options():
-	return {
-		"sources": ["All"] + filter(None,
-			frappe.db.sql_list("""select distinct source from tabLead""")),
-		"statuses": ["All"] + filter(None,
-			frappe.db.sql_list("""select distinct status from tabLead"""))
-	}
-
-
-@frappe.whitelist(allow_guest=True)
-def unsubscribe(email, name):
-	if not verify_request():
-		return
-
-	subs_id = frappe.db.get_value("Newsletter List Subscriber", {"email": email, "newsletter_list": name})
-	if subs_id:
-		subscriber = frappe.get_doc("Newsletter List Subscriber", subs_id)
-		subscriber.unsubscribed = 1
-		subscriber.save(ignore_permissions=True)
-
-	frappe.db.commit()
-
-	return_unsubscribed_page(email)
-
-def return_unsubscribed_page(email):
-	frappe.respond_as_web_page(_("Unsubscribed"), _("{0} has been successfully unsubscribed from this list.").format(email))
-
-def create_lead(email_id):
-	"""create a lead if it does not exist"""
-	from email.utils import parseaddr
-	from frappe.model.naming import get_default_naming_series
-	real_name, email_id = parseaddr(email_id)
-
-	if frappe.db.get_value("Lead", {"email_id": email_id}):
-		return
-
-	lead = frappe.get_doc({
-		"doctype": "Lead",
-		"email_id": email_id,
-		"lead_name": real_name or email_id,
-		"status": "Lead",
-		"naming_series": get_default_naming_series("Lead"),
-		"company": frappe.db.get_default("Company"),
-		"source": "Email"
-	})
-	lead.insert()
-
-
-@frappe.whitelist(allow_guest=True)
-def subscribe(email):
-	url = frappe.utils.get_url("/api/method/erpnext.crm.doctype.newsletter.newsletter.confirm_subscription") +\
-		"?" + get_signed_params({"email": email})
-
-	messages = (
-		_("Thank you for your interest in subscribing to our updates"),
-		_("Please verify your email id"),
-		url,
-		_("Click here to verify")
-	)
-
-	content = """
-	<p>{0}. {1}.</p>
-	<p><a href="{2}">{3}</a></p>
-	"""
-
-	frappe.sendmail(email, subject=_("Confirm Your Email"), content=content.format(*messages))
-
-@frappe.whitelist(allow_guest=True)
-def confirm_subscription(email):
-	if not verify_request():
-		return
-
-	if not frappe.db.exists("Newsletter List", _("Website")):
-		frappe.get_doc({
-			"doctype": "Newsletter List",
-			"title": _("Website")
-		}).insert(ignore_permissions=True)
-
-
-	frappe.flags.ignore_permissions = True
-
-	add_subscribers(_("Website"), email)
-	frappe.db.commit()
-
-	frappe.respond_as_web_page(_("Confirmed"), _("{0} has been successfully added to our Newsletter list.").format(email))
-
-
-def send_newsletter(newsletter):
-	try:
-		doc = frappe.get_doc("Newsletter", newsletter)
-		doc.queue_all()
-
-	except:
-		frappe.db.rollback()
-
-		# wasn't able to send emails :(
-		doc.db_set("email_sent", 0)
-		frappe.db.commit()
-
-		log("send_newsletter")
-
-		raise
-
-	else:
-		frappe.db.commit()
-
-
-
diff --git a/erpnext/crm/doctype/newsletter/newsletter_list.js b/erpnext/crm/doctype/newsletter/newsletter_list.js
deleted file mode 100644
index e95d295..0000000
--- a/erpnext/crm/doctype/newsletter/newsletter_list.js
+++ /dev/null
@@ -1,10 +0,0 @@
-frappe.listview_settings['Newsletter'] = {
-	add_fields: ["subject", "email_sent"],
-	get_indicator: function(doc) {
-		if(doc.email_sent) {
-			return [__("Sent"), "green", "email_sent,=,Yes"];
-		} else {
-			return [__("Not Sent"), "orange", "email_sent,=,No"];
-		}
-	}
-};
diff --git a/erpnext/crm/doctype/newsletter/test_newsletter.py b/erpnext/crm/doctype/newsletter/test_newsletter.py
deleted file mode 100644
index 2019b65..0000000
--- a/erpnext/crm/doctype/newsletter/test_newsletter.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-from __future__ import unicode_literals
-
-import frappe, unittest
-
-from erpnext.crm.doctype.newsletter.newsletter import unsubscribe
-from urllib import unquote
-
-class TestNewsletter(unittest.TestCase):
-	def setUp(self):
-		if not frappe.get_all("Newsletter List Subscriber"):
-			for email in ["test_subscriber1@example.com", "test_subscriber2@example.com", 
-				"test_subscriber3@example.com"]:
-					frappe.get_doc({
-						"doctype": "Newsletter List Subscriber",
-						"email": email,
-						"newsletter_list": "_Test Newsletter List"
-					}).insert()
-		else:
-			frappe.db.sql("update `tabNewsletter List Subscriber` set unsubscribed = 0")
-
-	def test_send(self):
-		self.send_newsletter()
-		self.assertEquals(len(frappe.get_all("Email Queue")), 3)
-
-	def test_unsubscribe(self):
-		# test unsubscribe
-		self.send_newsletter()
-
-		email = unquote(frappe.local.flags.signed_query_string.split("email=")[1].split("&")[0])
-
-		unsubscribe(email, "_Test Newsletter List")
-
-		self.send_newsletter()
-		self.assertEquals(len(frappe.get_all("Email Queue")), 2)
-
-	def send_newsletter(self):
-		frappe.db.sql("delete from `tabEmail Queue`")
-		frappe.delete_doc("Newsletter", "_Test Newsletting")
-		newsletter = frappe.get_doc({
-			"doctype": "Newsletter",
-			"subject": "_Test Newsletting",
-			"newsletter_list": "_Test Newsletter List",
-			"send_from": "Test Sender <test_sender@example.com>",
-			"message": "Testing my news."
-		}).insert(ignore_permissions=True)
-
-		newsletter.send_emails()
-
-test_dependencies = ["Newsletter List"]
diff --git a/erpnext/crm/doctype/newsletter_list/newsletter_list.js b/erpnext/crm/doctype/newsletter_list/newsletter_list.js
deleted file mode 100644
index 7799627..0000000
--- a/erpnext/crm/doctype/newsletter_list/newsletter_list.js
+++ /dev/null
@@ -1,46 +0,0 @@
-frappe.ui.form.on("Newsletter List", "refresh", function(frm) {
-	if(!frm.is_new()) {
-		frm.add_custom_button(__("View Subscribers"), function() {
-			frappe.route_options = {"newsletter_list": frm.doc.name};
-			frappe.set_route("Report", "Newsletter List Subscriber");
-		}, __("View"));
-
-		frm.add_custom_button(__("Import Subscribers"), function() {
-			frappe.prompt({fieldtype:"Select", options: frm.doc.__onload.import_types,
-				label:__("Import Email From"), fieldname:"doctype", reqd:1}, function(data) {
-					frappe.call({
-						method: "erpnext.crm.doctype.newsletter_list.newsletter_list.import_from",
-						args: {
-							"name": frm.doc.name,
-							"doctype": data.doctype
-						},
-						callback: function(r) {
-							frm.set_value("total_subscribers", r.message);
-						}
-					})
-				}, __("Import Subscribers"), __("Import"));
-		}, __("Action"));
-
-		frm.add_custom_button(__("Add Subscribers"), function() {
-			frappe.prompt({fieldtype:"Text",
-				label:__("Email Ids"), fieldname:"email_list", reqd:1}, function(data) {
-					frappe.call({
-						method: "erpnext.crm.doctype.newsletter_list.newsletter_list.add_subscribers",
-						args: {
-							"name": frm.doc.name,
-							"email_list": data.email_list
-						},
-						callback: function(r) {
-							frm.set_value("total_subscribers", r.message);
-						}
-					})
-				}, __("Add Subscribers"), __("Add"));
-		}, __("Action"));
-
-		frm.add_custom_button(__("New Newsletter"), function() {
-			frappe.route_options = {"newsletter_list": frm.doc.name};
-			frappe.new_doc("Newsletter");
-		}, __("Action"));
-
-	}
-});
diff --git a/erpnext/crm/doctype/newsletter_list/newsletter_list.json b/erpnext/crm/doctype/newsletter_list/newsletter_list.json
deleted file mode 100644
index 597116f..0000000
--- a/erpnext/crm/doctype/newsletter_list/newsletter_list.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
- "allow_copy": 0, 
- "allow_import": 1, 
- "allow_rename": 0, 
- "autoname": "field:title", 
- "creation": "2015-03-18 06:08:32.729800", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "Setup", 
- "fields": [
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "title", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Title", 
-   "length": 0, 
-   "no_copy": 1, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "default": "0", 
-   "fieldname": "total_subscribers", 
-   "fieldtype": "Int", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Total Subscribers", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }
- ], 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "in_create": 0, 
- "in_dialog": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2015-11-16 06:29:50.643141", 
- "modified_by": "Administrator", 
- "module": "CRM", 
- "name": "Newsletter List", 
- "name_case": "", 
- "owner": "Administrator", 
- "permissions": [
-  {
-   "amend": 0, 
-   "apply_user_permissions": 0, 
-   "cancel": 0, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 1, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Newsletter Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
-   "write": 1
-  }
- ], 
- "read_only": 0, 
- "read_only_onload": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC"
-}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/newsletter_list/newsletter_list.py b/erpnext/crm/doctype/newsletter_list/newsletter_list.py
deleted file mode 100644
index 68c445f..0000000
--- a/erpnext/crm/doctype/newsletter_list/newsletter_list.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and contributors
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe.model.document import Document
-from frappe.utils import validate_email_add
-from frappe import _
-from email.utils import parseaddr
-
-class NewsletterList(Document):
-	def onload(self):
-		singles = [d.name for d in frappe.db.get_all("DocType", "name", {"issingle": 1})]
-		self.get("__onload").import_types = [{"value": d.parent, "label": "{0} ({1})".format(d.parent, d.label)} \
-			for d in frappe.db.get_all("DocField", ("parent", "label"), {"options": "Email"}) 
-			if d.parent not in singles]
-
-	def import_from(self, doctype):
-		"""Extract email ids from given doctype and add them to the current list"""
-		meta = frappe.get_meta(doctype)
-		email_field = [d.fieldname for d in meta.fields 
-			if d.fieldtype in ("Data", "Small Text", "Text", "Code") and d.options=="Email"][0]
-		unsubscribed_field = "unsubscribed" if meta.get_field("unsubscribed") else None
-		added = 0
-
-		for user in frappe.db.get_all(doctype, [email_field, unsubscribed_field or "name"]):
-			try:
-				email = parseaddr(user.get(email_field))[1]
-				if email:
-					frappe.get_doc({
-						"doctype": "Newsletter List Subscriber",
-						"newsletter_list": self.name,
-						"email": email,
-						"unsubscribed": user.get(unsubscribed_field) if unsubscribed_field else 0
-					}).insert(ignore_permissions=True)
-
-					added += 1
-			except frappe.UniqueValidationError:
-				pass
-
-		frappe.msgprint(_("{0} subscribers added").format(added))
-
-		return self.update_total_subscribers()
-
-	def update_total_subscribers(self):
-		self.total_subscribers = self.get_total_subscribers()
-		self.db_update()
-		return self.total_subscribers
-
-	def get_total_subscribers(self):
-		return frappe.db.sql("""select count(*) from `tabNewsletter List Subscriber`
-			where newsletter_list=%s""", self.name)[0][0]
-
-	def on_trash(self):
-		for d in frappe.get_all("Newsletter List Subscriber", "name", {"newsletter_list": self.name}):
-			frappe.delete_doc("Newsletter List Subscriber", d.name)
-
-@frappe.whitelist()
-def import_from(name, doctype):
-	nlist = frappe.get_doc("Newsletter List", name)
-	if nlist.has_permission("write"):
-		return nlist.import_from(doctype)
-
-@frappe.whitelist()
-def add_subscribers(name, email_list):
-	if not isinstance(email_list, (list, tuple)):
-		email_list = email_list.replace(",", "\n").split("\n")
-	count = 0
-	for email in email_list:
-		email = email.strip()
-		valid = validate_email_add(email, False)
-
-		if valid:
-			if not frappe.db.get_value("Newsletter List Subscriber",
-				{"newsletter_list": name, "email": email}):
-				frappe.get_doc({
-					"doctype": "Newsletter List Subscriber",
-					"newsletter_list": name,
-					"email": email
-				}).insert(ignore_permissions = frappe.flags.ignore_permissions)
-
-				count += 1
-			else:
-				pass
-		else:
-			frappe.msgprint(_("{0} is not a valid email id").format(email))
-
-	frappe.msgprint(_("{0} subscribers added").format(count))
-
-	return frappe.get_doc("Newsletter List", name).update_total_subscribers()
-
-def restrict_newsletter_list(doc, method):
-	from frappe.limits import get_limits
-
-	newsletter_list_limit = get_limits().get('newsletter_recipients')
-	if not newsletter_list_limit:
-		return
-
-	nl = frappe.get_doc("Newsletter List", doc.newsletter_list)
-	if nl.get_total_subscribers() >= newsletter_list_limit:
-		frappe.throw(_("Please Upgrade to add more than {0} subscribers").format(newsletter_list_limit))
\ No newline at end of file
diff --git a/erpnext/crm/doctype/newsletter_list/test_newsletter_list.py b/erpnext/crm/doctype/newsletter_list/test_newsletter_list.py
deleted file mode 100644
index ebc094e..0000000
--- a/erpnext/crm/doctype/newsletter_list/test_newsletter_list.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors
-# See license.txt
-from __future__ import unicode_literals
-
-import frappe
-import unittest
-
-class TestNewletterList(unittest.TestCase):
-	def test_import(self):
-		new_list = frappe.get_doc({
-			"doctype": "Newsletter List",
-			"title": "_Test Newsletter List 1"
-		}).insert()
-
-		n_leads = frappe.db.sql("select count(distinct email_id) from `tabLead`")[0][0]
-		
-		added = new_list.import_from("Lead")
-		self.assertEquals(added, n_leads)
-
-	def tearDown(self):
-		frappe.delete_doc("Newsletter List", "_Test Newsletter List 1")
-
-test_dependencies = ["Lead"]
-
diff --git a/erpnext/crm/doctype/newsletter_list/test_records.json b/erpnext/crm/doctype/newsletter_list/test_records.json
deleted file mode 100644
index ed2f89e..0000000
--- a/erpnext/crm/doctype/newsletter_list/test_records.json
+++ /dev/null
@@ -1,6 +0,0 @@
-[
-	{
-		"doctype": "Newsletter List",
-		"title": "_Test Newsletter List"
-	}
-]
diff --git a/erpnext/crm/doctype/newsletter_list_subscriber/__init__.py b/erpnext/crm/doctype/newsletter_list_subscriber/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/crm/doctype/newsletter_list_subscriber/__init__.py
+++ /dev/null
diff --git a/erpnext/crm/doctype/newsletter_list_subscriber/newsletter_list_subscriber.json b/erpnext/crm/doctype/newsletter_list_subscriber/newsletter_list_subscriber.json
deleted file mode 100644
index 08208b8..0000000
--- a/erpnext/crm/doctype/newsletter_list_subscriber/newsletter_list_subscriber.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "allow_copy": 0, 
- "allow_import": 1, 
- "allow_rename": 0, 
- "autoname": "hash", 
- "creation": "2015-03-18 06:15:59.321619", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "Document", 
- "fields": [
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "newsletter_list", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Newsletter List", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Newsletter List", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "email", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Email", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "unsubscribed", 
-   "fieldtype": "Check", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Unsubscribed", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }
- ], 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "in_create": 0, 
- "in_dialog": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2015-11-16 06:29:50.675306", 
- "modified_by": "Administrator", 
- "module": "CRM", 
- "name": "Newsletter List Subscriber", 
- "name_case": "", 
- "owner": "Administrator", 
- "permissions": [
-  {
-   "amend": 0, 
-   "apply_user_permissions": 0, 
-   "cancel": 0, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 1, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Newsletter Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
-   "write": 1
-  }
- ], 
- "read_only": 0, 
- "read_only_onload": 0, 
- "sort_field": "modified", 
- "sort_order": "DESC", 
- "title_field": "email"
-}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/newsletter_list_subscriber/newsletter_list_subscriber.py b/erpnext/crm/doctype/newsletter_list_subscriber/newsletter_list_subscriber.py
deleted file mode 100644
index c036adc..0000000
--- a/erpnext/crm/doctype/newsletter_list_subscriber/newsletter_list_subscriber.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and contributors
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe.model.document import Document
-
-class NewsletterListSubscriber(Document):
-	pass
-
-def after_doctype_insert():
-	frappe.db.add_unique("Newsletter List Subscriber", ("newsletter_list", "email"))
diff --git a/erpnext/crm/doctype/newsletter_list_subscriber/test_newsletter_list_subscriber.py b/erpnext/crm/doctype/newsletter_list_subscriber/test_newsletter_list_subscriber.py
deleted file mode 100644
index 24a0788..0000000
--- a/erpnext/crm/doctype/newsletter_list_subscriber/test_newsletter_list_subscriber.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors
-# See license.txt
-from __future__ import unicode_literals
-
-import frappe
-import unittest
-
-# test_records = frappe.get_test_records('Newsletter List Subscriber')
-
-class TestNewsletterListSubscriber(unittest.TestCase):
-	pass
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index a648155..d20e20b 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -137,10 +137,6 @@
 		"validate": "erpnext.shopping_cart.cart.set_customer_in_address"
 	},
 
-	"Newsletter List Subscriber": {
-		"validate": "erpnext.crm.doctype.newsletter_list.newsletter_list.restrict_newsletter_list"
-	},
-
 	# bubble transaction notification on master
 	('Opportunity', 'Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice',
 		'Supplier Quotation', 'Purchase Order', 'Purchase Receipt',
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.js b/erpnext/hr/doctype/salary_slip/salary_slip.js
index 643139a..a62d03e 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.js
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.js
@@ -9,8 +9,7 @@
 		frm.fields_dict["timesheets"].grid.get_field("time_sheet").get_query = function(){
 			return {
 				filters: {
-					employee: frm.doc.employee,
-					make_for: 'Salary Slip'
+					employee: frm.doc.employee
 				}
 			}
 		}
@@ -32,13 +31,10 @@
 	},
 
 	toggle_fields: function(frm) {
-		if(frm.doc.salary_slip_based_on_timesheet) {
-			hide_field(['fiscal_year', 'month', 'total_days_in_month', 'leave_without_pay', 'payment_days'])
-			unhide_field(['start_date', 'end_date', 'hourly_wages', 'timesheets'])
-		}else {
-			unhide_field(['fiscal_year', 'month', 'total_days_in_month', 'leave_without_pay', 'payment_days'])
-			hide_field(['start_date', 'end_date', 'hourly_wages', 'timesheets'])
-		}
+		frm.toggle_display(['start_date', 'end_date', 'hourly_wages', 'timesheets'],
+			cint(frm.doc.salary_slip_based_on_timesheet)==1);
+		frm.toggle_display(['fiscal_year', 'month', 'total_days_in_month', 'leave_without_pay', 'payment_days'],
+			cint(frm.doc.salary_slip_based_on_timesheet)==0);
 	}
 })
 
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index d95cbf4..a15af7d 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -80,12 +80,11 @@
 			self.end_date = m['month_end_date']
 
 	def check_sal_struct(self, joining_date, relieving_date):
-		timesheet = 1 if self.salary_slip_based_on_timesheet else 0
 		struct = frappe.db.sql("""select name from `tabSalary Structure`
 			where employee=%s and is_active = 'Yes'
 			and (from_date <= %s or from_date <= %s)
-			and (to_date is null or to_date >= %s or to_date >= %s) and salary_slip_based_on_timesheet=%s""",
-			(self.employee, self.start_date, joining_date, self.end_date, relieving_date, timesheet))
+			and (to_date is null or to_date >= %s or to_date >= %s) order by from_date desc limit 1""",
+			(self.employee, self.start_date, joining_date, self.end_date, relieving_date))
 
 		if not struct:
 			self.salary_structure = None
diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.js b/erpnext/hr/doctype/salary_structure/salary_structure.js
index 6668067..b04aeb4 100755
--- a/erpnext/hr/doctype/salary_structure/salary_structure.js
+++ b/erpnext/hr/doctype/salary_structure/salary_structure.js
@@ -12,13 +12,27 @@
 }
 
 cur_frm.cscript.refresh = function(doc, dt, dn){
-	if((!doc.__islocal) && (doc.is_active == 'Yes') && (doc.salary_slip_based_on_timesheet == 0)){
+	if((!doc.__islocal) && (doc.is_active == 'Yes') && cint(doc.salary_slip_based_on_timesheet == 0)){
 		cur_frm.add_custom_button(__('Salary Slip'),
 			cur_frm.cscript['Make Salary Slip'], __("Make"));
 		cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
 	}
 }
 
+frappe.ui.form.on('Salary Structure', {
+	refresh: function(frm) {
+		frm.trigger("toggle_fields")
+	},
+
+	salary_slip_based_on_timesheet: function(frm) {
+		frm.trigger("toggle_fields")
+	},
+
+	toggle_fields: function(frm) {
+		frm.toggle_display('time_sheet_earning_detail', cint(frm.doc.salary_slip_based_on_timesheet)==1);
+	}
+})
+
 cur_frm.cscript['Make Salary Slip'] = function() {
 	frappe.model.open_mapped_doc({
 		method: "erpnext.hr.doctype.salary_structure.salary_structure.make_salary_slip",
diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.json b/erpnext/hr/doctype/salary_structure/salary_structure.json
index 9a68f9d..c85a1d4 100644
--- a/erpnext/hr/doctype/salary_structure/salary_structure.json
+++ b/erpnext/hr/doctype/salary_structure/salary_structure.json
@@ -353,7 +353,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "depends_on": "eval:!doc.__islocal", 
+   "depends_on": "", 
    "fieldname": "salary_slip_based_on_timesheet", 
    "fieldtype": "Check", 
    "hidden": 0, 
@@ -379,14 +379,14 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "depends_on": "eval:doc.salary_slip_based_on_timesheet", 
-   "fieldname": "section_break_15", 
+   "fieldname": "time_sheet_earning_detail", 
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
+   "label": "", 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
@@ -779,7 +779,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-06-27 16:23:16.856237", 
+ "modified": "2016-06-29 15:41:48.243771", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Salary Structure", 
diff --git a/erpnext/crm/doctype/newsletter/__init__.py b/erpnext/maintenance/__init__.py
similarity index 100%
rename from erpnext/crm/doctype/newsletter/__init__.py
rename to erpnext/maintenance/__init__.py
diff --git a/erpnext/crm/doctype/newsletter/__init__.py b/erpnext/maintenance/doctype/__init__.py
similarity index 100%
copy from erpnext/crm/doctype/newsletter/__init__.py
copy to erpnext/maintenance/doctype/__init__.py
diff --git a/erpnext/support/doctype/maintenance_schedule/README.md b/erpnext/maintenance/doctype/maintenance_schedule/README.md
similarity index 100%
rename from erpnext/support/doctype/maintenance_schedule/README.md
rename to erpnext/maintenance/doctype/maintenance_schedule/README.md
diff --git a/erpnext/crm/doctype/newsletter/__init__.py b/erpnext/maintenance/doctype/maintenance_schedule/__init__.py
similarity index 100%
copy from erpnext/crm/doctype/newsletter/__init__.py
copy to erpnext/maintenance/doctype/maintenance_schedule/__init__.py
diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
similarity index 91%
rename from erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js
rename to erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
index 7783b1b..cf0ee51 100644
--- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
@@ -1,7 +1,7 @@
 // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-frappe.provide("erpnext.support");
+frappe.provide("erpnext.maintenance");
 
 frappe.ui.form.on_change("Maintenance Schedule", "customer", function(frm) {
 	erpnext.utils.get_party_details(frm) });
@@ -13,7 +13,7 @@
 });
 
 // TODO commonify this code
-erpnext.support.MaintenanceSchedule = frappe.ui.form.Controller.extend({
+erpnext.maintenance.MaintenanceSchedule = frappe.ui.form.Controller.extend({
 	refresh: function() {
 		var me = this;
 
@@ -34,7 +34,7 @@
 		} else if (this.frm.doc.docstatus === 1) {
 			this.frm.add_custom_button(__("Make Maintenance Visit"), function() {
 				frappe.model.open_mapped_doc({
-					method: "erpnext.support.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
+					method: "erpnext.maintenance.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
 					source_name: me.frm.doc.name,
 					frm: me.frm
 				})
@@ -79,7 +79,7 @@
 	},
 });
 
-$.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm}));
+$.extend(cur_frm.cscript, new erpnext.maintenance.MaintenanceSchedule({frm: cur_frm}));
 
 cur_frm.cscript.onload = function(doc, dt, dn) {
 	if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.json b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.json
similarity index 98%
rename from erpnext/support/doctype/maintenance_schedule/maintenance_schedule.json
rename to erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.json
index 63af61d..77ded22 100644
--- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.json
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.json
@@ -3,6 +3,7 @@
  "allow_import": 0, 
  "allow_rename": 0, 
  "autoname": "MS.#####", 
+ "beta": 0, 
  "creation": "2013-01-10 16:34:30", 
  "custom": 0, 
  "docstatus": 0, 
@@ -608,15 +609,16 @@
  "hide_toolbar": 0, 
  "icon": "icon-calendar", 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 1, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-04-06 03:15:16.876595", 
+ "modified": "2016-06-29 12:56:00.801674", 
  "modified_by": "Administrator", 
- "module": "Support", 
+ "module": "Maintenance", 
  "name": "Maintenance Schedule", 
  "owner": "Administrator", 
  "permissions": [
@@ -641,6 +643,7 @@
    "write": 1
   }
  ], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "search_fields": "status,customer,customer_name", 
diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
similarity index 100%
rename from erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
rename to erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
diff --git a/erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
similarity index 100%
rename from erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py
rename to erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
diff --git a/erpnext/support/doctype/maintenance_schedule_detail/README.md b/erpnext/maintenance/doctype/maintenance_schedule_detail/README.md
similarity index 100%
rename from erpnext/support/doctype/maintenance_schedule_detail/README.md
rename to erpnext/maintenance/doctype/maintenance_schedule_detail/README.md
diff --git a/erpnext/crm/doctype/newsletter/__init__.py b/erpnext/maintenance/doctype/maintenance_schedule_detail/__init__.py
similarity index 100%
copy from erpnext/crm/doctype/newsletter/__init__.py
copy to erpnext/maintenance/doctype/maintenance_schedule_detail/__init__.py
diff --git a/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json b/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
similarity index 86%
rename from erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
rename to erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
index af252c1..4ec39be 100644
--- a/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
+++ b/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
@@ -3,10 +3,12 @@
  "allow_import": 0, 
  "allow_rename": 0, 
  "autoname": "hash", 
+ "beta": 0, 
  "creation": "2013-02-22 01:28:05", 
  "custom": 0, 
  "docstatus": 0, 
  "doctype": "DocType", 
+ "document_type": "Document", 
  "fields": [
   {
    "allow_on_submit": 0, 
@@ -16,6 +18,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 1, 
    "label": "Item Code", 
@@ -26,6 +29,7 @@
    "options": "Item", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -41,6 +45,7 @@
    "fieldtype": "Data", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Item Name", 
@@ -50,6 +55,7 @@
    "oldfieldtype": "Data", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -65,6 +71,7 @@
    "fieldtype": "Date", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 1, 
    "label": "Scheduled Date", 
@@ -74,6 +81,7 @@
    "oldfieldtype": "Date", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -89,6 +97,7 @@
    "fieldtype": "Date", 
    "hidden": 1, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Actual Date", 
@@ -98,6 +107,7 @@
    "oldfieldtype": "Date", 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 1, 
    "reqd": 0, 
@@ -113,6 +123,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 1, 
    "label": "Sales Person", 
@@ -123,6 +134,7 @@
    "options": "Sales Person", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -138,6 +150,7 @@
    "fieldtype": "Small Text", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 1, 
    "label": "Serial No", 
@@ -147,6 +160,7 @@
    "oldfieldtype": "Small Text", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "print_width": "160px", 
    "read_only": 1, 
    "report_hide": 0, 
@@ -160,18 +174,21 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:49.853613", 
+ "modified": "2016-06-29 12:56:24.695085", 
  "modified_by": "Administrator", 
- "module": "Support", 
+ "module": "Maintenance", 
  "name": "Maintenance Schedule Detail", 
  "owner": "Administrator", 
  "permissions": [], 
+ "quick_entry": 0, 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.py b/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.py
new file mode 100644
index 0000000..e69b4fb
--- /dev/null
+++ b/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class MaintenanceScheduleDetail(Document):
+	pass
diff --git a/erpnext/support/doctype/maintenance_schedule_item/README.md b/erpnext/maintenance/doctype/maintenance_schedule_item/README.md
similarity index 100%
rename from erpnext/support/doctype/maintenance_schedule_item/README.md
rename to erpnext/maintenance/doctype/maintenance_schedule_item/README.md
diff --git a/erpnext/crm/doctype/newsletter/__init__.py b/erpnext/maintenance/doctype/maintenance_schedule_item/__init__.py
similarity index 100%
copy from erpnext/crm/doctype/newsletter/__init__.py
copy to erpnext/maintenance/doctype/maintenance_schedule_item/__init__.py
diff --git a/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.json b/erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.json
similarity index 92%
rename from erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.json
rename to erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.json
index 6879f06..e62e041 100644
--- a/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.json
+++ b/erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.json
@@ -3,10 +3,12 @@
  "allow_import": 0, 
  "allow_rename": 0, 
  "autoname": "hash", 
+ "beta": 0, 
  "creation": "2013-02-22 01:28:05", 
  "custom": 0, 
  "docstatus": 0, 
  "doctype": "DocType", 
+ "document_type": "Document", 
  "fields": [
   {
    "allow_on_submit": 0, 
@@ -16,6 +18,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 1, 
    "label": "Item Code", 
@@ -42,6 +45,7 @@
    "fieldtype": "Data", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Item Name", 
@@ -67,6 +71,7 @@
    "fieldtype": "Data", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Description", 
@@ -94,6 +99,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "", 
@@ -117,6 +123,7 @@
    "fieldtype": "Date", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 1, 
    "label": "Start Date", 
@@ -142,6 +149,7 @@
    "fieldtype": "Date", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 1, 
    "label": "End Date", 
@@ -167,6 +175,7 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Periodicity", 
@@ -193,6 +202,7 @@
    "fieldtype": "Int", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "No of Visits", 
@@ -218,6 +228,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 0, 
    "label": "Sales Person", 
@@ -244,6 +255,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Reference", 
@@ -267,6 +279,7 @@
    "fieldtype": "Small Text", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Serial No", 
@@ -292,6 +305,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 0, 
    "label": "Sales Order", 
@@ -316,18 +330,21 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2016-02-23 04:59:32.924534", 
+ "modified": "2016-06-29 12:56:08.478478", 
  "modified_by": "Administrator", 
- "module": "Support", 
+ "module": "Maintenance", 
  "name": "Maintenance Schedule Item", 
  "owner": "Administrator", 
  "permissions": [], 
+ "quick_entry": 0, 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.py b/erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.py
new file mode 100644
index 0000000..1dd47fe
--- /dev/null
+++ b/erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class MaintenanceScheduleItem(Document):
+	pass
diff --git a/erpnext/support/doctype/maintenance_visit/README.md b/erpnext/maintenance/doctype/maintenance_visit/README.md
similarity index 100%
rename from erpnext/support/doctype/maintenance_visit/README.md
rename to erpnext/maintenance/doctype/maintenance_visit/README.md
diff --git a/erpnext/crm/doctype/newsletter_list/__init__.py b/erpnext/maintenance/doctype/maintenance_visit/__init__.py
similarity index 100%
rename from erpnext/crm/doctype/newsletter_list/__init__.py
rename to erpnext/maintenance/doctype/maintenance_visit/__init__.py
diff --git a/erpnext/support/doctype/maintenance_visit/maintenance_visit.js b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
similarity index 89%
rename from erpnext/support/doctype/maintenance_visit/maintenance_visit.js
rename to erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
index f9d5e8d..5615886 100644
--- a/erpnext/support/doctype/maintenance_visit/maintenance_visit.js
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
@@ -1,7 +1,7 @@
 // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-frappe.provide("erpnext.support");
+frappe.provide("erpnext.maintenance");
 
 
 frappe.ui.form.on_change("Maintenance Visit", "customer", function(frm) {
@@ -14,13 +14,13 @@
 });
 
 // TODO commonify this code
-erpnext.support.MaintenanceVisit = frappe.ui.form.Controller.extend({
+erpnext.maintenance.MaintenanceVisit = frappe.ui.form.Controller.extend({
 	refresh: function() {
 		if (this.frm.doc.docstatus===0) {
 			cur_frm.add_custom_button(__('Maintenance Schedule'),
 				function() {
 					frappe.model.map_current_doc({
-						method: "erpnext.support.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
+						method: "erpnext.maintenance.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
 						source_doctype: "Maintenance Schedule",
 						get_query_filters: {
 							docstatus: 1,
@@ -58,7 +58,7 @@
 	},
 });
 
-$.extend(cur_frm.cscript, new erpnext.support.MaintenanceVisit({frm: cur_frm}));
+$.extend(cur_frm.cscript, new erpnext.maintenance.MaintenanceVisit({frm: cur_frm}));
 
 cur_frm.cscript.onload = function(doc, dt, dn) {
 	if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
diff --git a/erpnext/support/doctype/maintenance_visit/maintenance_visit.json b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.json
similarity index 98%
rename from erpnext/support/doctype/maintenance_visit/maintenance_visit.json
rename to erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.json
index 973e057..07ff450 100644
--- a/erpnext/support/doctype/maintenance_visit/maintenance_visit.json
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.json
@@ -3,6 +3,7 @@
  "allow_import": 0, 
  "allow_rename": 0, 
  "autoname": "MV.#####", 
+ "beta": 0, 
  "creation": "2013-01-10 16:34:31", 
  "custom": 0, 
  "docstatus": 0, 
@@ -753,15 +754,16 @@
  "hide_toolbar": 0, 
  "icon": "icon-file-text", 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 1, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-04-06 03:15:20.528791", 
+ "modified": "2016-06-29 12:55:51.677519", 
  "modified_by": "Administrator", 
- "module": "Support", 
+ "module": "Maintenance", 
  "name": "Maintenance Visit", 
  "owner": "ashwini@webnotestech.com", 
  "permissions": [
@@ -786,6 +788,7 @@
    "write": 1
   }
  ], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "search_fields": "status,maintenance_type,customer,customer_name,mntc_date,company", 
diff --git a/erpnext/support/doctype/maintenance_visit/maintenance_visit.py b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
similarity index 100%
rename from erpnext/support/doctype/maintenance_visit/maintenance_visit.py
rename to erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
diff --git a/erpnext/support/doctype/maintenance_visit/maintenance_visit_list.js b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit_list.js
similarity index 100%
rename from erpnext/support/doctype/maintenance_visit/maintenance_visit_list.js
rename to erpnext/maintenance/doctype/maintenance_visit/maintenance_visit_list.js
diff --git a/erpnext/support/doctype/maintenance_visit/test_maintenance_visit.py b/erpnext/maintenance/doctype/maintenance_visit/test_maintenance_visit.py
similarity index 100%
rename from erpnext/support/doctype/maintenance_visit/test_maintenance_visit.py
rename to erpnext/maintenance/doctype/maintenance_visit/test_maintenance_visit.py
diff --git a/erpnext/support/doctype/maintenance_visit/test_records.json b/erpnext/maintenance/doctype/maintenance_visit/test_records.json
similarity index 100%
rename from erpnext/support/doctype/maintenance_visit/test_records.json
rename to erpnext/maintenance/doctype/maintenance_visit/test_records.json
diff --git a/erpnext/support/doctype/maintenance_visit_purpose/README.md b/erpnext/maintenance/doctype/maintenance_visit_purpose/README.md
similarity index 100%
rename from erpnext/support/doctype/maintenance_visit_purpose/README.md
rename to erpnext/maintenance/doctype/maintenance_visit_purpose/README.md
diff --git a/erpnext/crm/doctype/newsletter/__init__.py b/erpnext/maintenance/doctype/maintenance_visit_purpose/__init__.py
similarity index 100%
copy from erpnext/crm/doctype/newsletter/__init__.py
copy to erpnext/maintenance/doctype/maintenance_visit_purpose/__init__.py
diff --git a/erpnext/support/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
similarity index 87%
rename from erpnext/support/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
rename to erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
index c89453a..652a4b0 100644
--- a/erpnext/support/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
+++ b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
@@ -3,10 +3,12 @@
  "allow_import": 0, 
  "allow_rename": 0, 
  "autoname": "hash", 
+ "beta": 0, 
  "creation": "2013-02-22 01:28:06", 
  "custom": 0, 
  "docstatus": 0, 
  "doctype": "DocType", 
+ "document_type": "Document", 
  "fields": [
   {
    "allow_on_submit": 0, 
@@ -16,6 +18,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Item Code", 
@@ -26,6 +29,7 @@
    "options": "Item", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -41,6 +45,7 @@
    "fieldtype": "Data", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Item Name", 
@@ -50,6 +55,7 @@
    "oldfieldtype": "Data", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -65,6 +71,7 @@
    "fieldtype": "Small Text", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Serial No", 
@@ -74,6 +81,7 @@
    "oldfieldtype": "Small Text", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -89,6 +97,7 @@
    "fieldtype": "Text Editor", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Description", 
@@ -98,6 +107,7 @@
    "oldfieldtype": "Small Text", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "print_width": "300px", 
    "read_only": 0, 
    "report_hide": 0, 
@@ -115,6 +125,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "", 
@@ -122,6 +133,7 @@
    "no_copy": 0, 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -137,6 +149,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Sales Person", 
@@ -147,6 +160,7 @@
    "options": "Sales Person", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -162,6 +176,7 @@
    "fieldtype": "Small Text", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Work Done", 
@@ -171,6 +186,7 @@
    "oldfieldtype": "Small Text", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -186,6 +202,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Document Type", 
@@ -196,6 +213,7 @@
    "options": "DocType", 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "print_width": "150px", 
    "read_only": 1, 
    "report_hide": 1, 
@@ -213,6 +231,7 @@
    "fieldtype": "Dynamic Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Against Document No", 
@@ -223,6 +242,7 @@
    "options": "prevdoc_doctype", 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "print_width": "160px", 
    "read_only": 1, 
    "report_hide": 1, 
@@ -240,6 +260,7 @@
    "fieldtype": "Data", 
    "hidden": 1, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Against Document Detail No", 
@@ -249,6 +270,7 @@
    "oldfieldtype": "Data", 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "print_width": "160px", 
    "read_only": 1, 
    "report_hide": 1, 
@@ -262,18 +284,21 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:50.082976", 
+ "modified": "2016-06-29 12:56:16.109366", 
  "modified_by": "Administrator", 
- "module": "Support", 
+ "module": "Maintenance", 
  "name": "Maintenance Visit Purpose", 
  "owner": "ashwini@webnotestech.com", 
  "permissions": [], 
+ "quick_entry": 0, 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py
new file mode 100644
index 0000000..a7f0f5b
--- /dev/null
+++ b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class MaintenanceVisitPurpose(Document):
+	pass
diff --git a/erpnext/support/report/maintenance_schedules/__init__.py b/erpnext/maintenance/report/maintenance_schedules/__init__.py
similarity index 100%
rename from erpnext/support/report/maintenance_schedules/__init__.py
rename to erpnext/maintenance/report/maintenance_schedules/__init__.py
diff --git a/erpnext/maintenance/report/maintenance_schedules/maintenance_schedules.json b/erpnext/maintenance/report/maintenance_schedules/maintenance_schedules.json
new file mode 100644
index 0000000..6076f6e
--- /dev/null
+++ b/erpnext/maintenance/report/maintenance_schedules/maintenance_schedules.json
@@ -0,0 +1,17 @@
+{
+ "apply_user_permissions": 1, 
+ "creation": "2013-05-06 14:25:21", 
+ "docstatus": 0, 
+ "doctype": "Report", 
+ "idx": 1, 
+ "is_standard": "Yes", 
+ "modified": "2014-06-29 08:18:17.144598", 
+ "modified_by": "Administrator", 
+ "module": "Support", 
+ "name": "Maintenance Schedules", 
+ "owner": "Administrator", 
+ "query": "SELECT\n    ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.sales_person as \"Sales Person::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.sales_order as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n    `tabMaintenance Schedule Detail` ms_sch, \n    `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc", 
+ "ref_doctype": "Maintenance Schedule", 
+ "report_name": "Maintenance Schedules", 
+ "report_type": "Query Report"
+}
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index e10459f..571f75a 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -160,7 +160,7 @@
 
 	def before_submit(self):
 		self.set_required_items()
-		self.make_timesheets()
+		self.make_time_logs()
 		
 	def before_cancel(self):
 		for data in self.operations:
@@ -240,7 +240,7 @@
 
 		return holidays[holiday_list]
 		
-	def make_timesheets(self):
+	def make_time_logs(self):
 		"""Capacity Planning. Plan time logs based on earliest availablity of workstation after
 			Planned Start Date. Time logs will be created and remain in Draft mode and must be submitted
 			before manufacturing entry can be made."""
@@ -267,7 +267,7 @@
 				# validate operating hours if workstation [not mandatory] is specified
 				self.check_operation_fits_in_working_hours(d)
 				try:
-					time_sheet.validate_timesheets()
+					time_sheet.validate_time_logs()
 				except OverlapError:
 					time_sheet.move_to_next_non_overlapping_slot(d.idx)
 
@@ -319,7 +319,7 @@
 			frappe.throw(_("Capacity Planning Error"))
 
 	def get_start_end_time(self, time_sheet, operation_id):
-		for data in time_sheet.timesheets:
+		for data in time_sheet.time_logs:
 			if data.operation_id == operation_id:
 				return data.from_time, data.to_time
 
@@ -518,7 +518,7 @@
 	if isinstance(args, unicode):
 		args = json.loads(args)
 
-	time_sheet.append('timesheets', args)
+	time_sheet.append('time_logs', args)
 	return time_sheet
 
 @frappe.whitelist()
diff --git a/erpnext/manufacturing/doctype/production_order/test_production_order.py b/erpnext/manufacturing/doctype/production_order/test_production_order.py
index 6ebb8e7..8b86fd7 100644
--- a/erpnext/manufacturing/doctype/production_order/test_production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/test_production_order.py
@@ -89,7 +89,7 @@
 		
 
 		self.assertEqual(prod_order.name, time_sheet_doc.production_order)
-		self.assertEqual((prod_order.qty - d.completed_qty), sum([d.completed_qty for d in time_sheet_doc.timesheets]))
+		self.assertEqual((prod_order.qty - d.completed_qty), sum([d.completed_qty for d in time_sheet_doc.time_logs]))
 
 		manufacturing_settings = frappe.get_doc({
 			"doctype": "Manufacturing Settings",
@@ -106,7 +106,7 @@
 		self.assertEqual(prod_order.operations[0].actual_operating_cost, 100)
 		
 		time_sheet_doc1 = make_timesheet(prod_order.name)
-		self.assertEqual(len(time_sheet_doc1.get('timesheets')), 0)
+		self.assertEqual(len(time_sheet_doc1.get('time_logs')), 0)
 
 		time_sheet_doc.cancel()
 
diff --git a/erpnext/modules.txt b/erpnext/modules.txt
index 8a49547..11a1ebe 100644
--- a/erpnext/modules.txt
+++ b/erpnext/modules.txt
@@ -11,4 +11,5 @@
 Utilities
 Shopping Cart
 Hub Node
-Portal
\ No newline at end of file
+Portal
+Maintenance
\ No newline at end of file
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index bcbe2da..db4076e 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -282,3 +282,4 @@
 erpnext.patches.v7_0.move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet
 erpnext.patches.v7_0.remove_doctypes_and_reports
 erpnext.patches.v7_0.set_is_group_for_warehouse
+erpnext.patches.v7_0.update_maintenance_module_in_doctype
diff --git a/erpnext/patches/v5_0/newsletter.py b/erpnext/patches/v5_0/newsletter.py
index bd95937..c03664b 100644
--- a/erpnext/patches/v5_0/newsletter.py
+++ b/erpnext/patches/v5_0/newsletter.py
@@ -10,9 +10,9 @@
 	frappe.reload_doctype("Lead")
 	frappe.reload_doctype("Contact")
 
-	frappe.reload_doc('crm', 'doctype', 'newsletter_list')
-	frappe.reload_doc('crm', 'doctype', 'newsletter_list_subscriber')
-	frappe.reload_doc('crm', 'doctype', 'newsletter')
+	frappe.reload_doc('email', 'doctype', 'email_group')
+	frappe.reload_doc('email', 'doctype', 'email_group_member')
+	frappe.reload_doc('email', 'doctype', 'newsletter')
 
 	frappe.permissions.reset_perms("Newsletter")
 
@@ -30,7 +30,7 @@
 			user.save()
 
 	# create default lists
-	general = frappe.new_doc("Newsletter List")
+	general = frappe.new_doc("Email Group")
 	general.title = "General"
 	general.insert()
 	general.import_from("Lead")
diff --git a/erpnext/patches/v6_2/remove_newsletter_duplicates.py b/erpnext/patches/v6_2/remove_newsletter_duplicates.py
index 4f25c95..dc5b778 100644
--- a/erpnext/patches/v6_2/remove_newsletter_duplicates.py
+++ b/erpnext/patches/v6_2/remove_newsletter_duplicates.py
@@ -1,12 +1,12 @@
 import frappe
 
 def execute():
-	duplicates = frappe.db.sql("""select newsletter_list, email, count(name)
-		from `tabNewsletter List Subscriber`
-		group by newsletter_list, email
+	duplicates = frappe.db.sql("""select email_group, email, count(name)
+		from `tabEmail Group Member`
+		group by email_group, email
 		having count(name) > 1""")
 
 	# delete all duplicates except 1
-	for newsletter_list, email, count in duplicates:
-		frappe.db.sql("""delete from `tabNewsletter List Subscriber`
-			where newsletter_list=%s and email=%s limit %s""", (newsletter_list, email, count-1))
+	for email_group, email, count in duplicates:
+		frappe.db.sql("""delete from `tabEmail Group Member`
+			where email_group=%s and email=%s limit %s""", (email_group, email, count-1))
diff --git a/erpnext/patches/v7_0/convert_timelog_to_timesheet.py b/erpnext/patches/v7_0/convert_timelog_to_timesheet.py
index 9a77147..eb727e5 100644
--- a/erpnext/patches/v7_0/convert_timelog_to_timesheet.py
+++ b/erpnext/patches/v7_0/convert_timelog_to_timesheet.py
@@ -2,7 +2,7 @@
 
 from erpnext.manufacturing.doctype.production_order.production_order import make_time_sheet, add_timesheet_detail
 
-def execute():	
+def execute():
 	for data in frappe.get_all('Time Log', fields=["*"],
 		filters = [["docstatus", "<", "2"]]):
 		time_sheet = make_time_sheet(data.production_order)
@@ -18,9 +18,9 @@
 		'hours': data.hours,
 		'to_time': data.to_time,
 		'project': data.project,
-		'activity_type': data.activity_type or "Planning",
+		'activity_type': data.activity_type,
 		'operation': data.operation,
 		'operation_id': data.operation_id,
 		'workstation': data.workstation,
 		'completed_qty': data.completed_qty
-	}
\ No newline at end of file
+	}
diff --git a/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py b/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py
index caacfe1..097097d 100644
--- a/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py
+++ b/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py
@@ -9,12 +9,13 @@
 		time_sheet.employee= ""
 		time_sheet.company = frappe.db.get_single_value('Global Defaults', 'default_company')
 		time_sheet.sales_invoice = tlb.sales_invoice
-		for data in tlb.time_logs:
-			args = get_timesheet_data(data)
-			add_timesheet_detail(time_sheet, args)
+		if tlb.get('time_logs'):
+			for data in tlb.time_logs:
+				args = get_timesheet_data(data)
+				add_timesheet_detail(time_sheet, args)
 
-		time_sheet.docstatus = tlb.docstatus
-		time_sheet.save(ignore_permissions=True)
+			time_sheet.docstatus = tlb.docstatus
+			time_sheet.save(ignore_permissions=True)
 
 def get_timesheet_data(data):
 	time_log = frappe.get_doc('Time Log', data.time_log)
diff --git a/erpnext/patches/v7_0/create_warehouse_nestedset.py b/erpnext/patches/v7_0/create_warehouse_nestedset.py
index aaccfb9..0fa1756 100644
--- a/erpnext/patches/v7_0/create_warehouse_nestedset.py
+++ b/erpnext/patches/v7_0/create_warehouse_nestedset.py
@@ -1,48 +1,111 @@
 import frappe
 from frappe import _
+from frappe.utils import cint
+from frappe.utils.nestedset import rebuild_tree
 
 def execute():
+	"""
+	Patch Reference:
+		1. check whether warehouse is associated to company or not
+		2. if warehouse is associated with company
+			a. create warehouse group for company
+			b. set warehouse group as parent to other warehouses and set is_group as 0
+		3. if warehouses is not associated with company
+			a. get distinct companies from stock ledger entries
+			b. if sle have only company,
+				i. set default company to all warehouse
+				ii. repeat 2.a and 2.b
+			c. if have multiple companies,
+				i. create group warehouse without company
+				ii. repeat 2.b
+	"""
+	
 	frappe.reload_doc("stock", "doctype", "warehouse")
-	
-	for company in frappe.get_all("Company", fields=["name", "abbr"]):
-		if not frappe.db.get_value("Warehouse", "{0} - {1}".format(_("All Warehouses"), company.abbr)):
-			create_default_warehouse_group(company)
-		
-		for warehouse in frappe.get_all("Warehouse", filters={"company": company.name}, fields=["name", "create_account_under",
-			"parent_warehouse", "is_group"]):
-			set_parent_to_warehouses(warehouse, company)
-			set_parent_to_warehouse_acounts(warehouse, company)
 
-def set_parent_to_warehouses(warehouse, company):
-	warehouse = frappe.get_doc("Warehouse", warehouse.name)
-	warehouse.is_group = warehouse.is_group
-	
-	if not warehouse.parent_warehouse and warehouse.name != "{0} - {1}".format(_("All Warehouses"), company.abbr):
-		warehouse.parent_warehouse = "{0} - {1}".format(_("All Warehouses"), company.abbr)
-	
-	warehouse.save(ignore_permissions=True)
+	if check_is_warehouse_associated_with_company():
+		for company in frappe.get_all("Company", fields=["name", "abbr"]):
+			make_warehouse_nestedset(company)
+	else:
+		sle_against_companies = frappe.db.sql_list("""select distinct company from `tabStock Ledger Entry`""")
+		company = frappe.defaults.get_defaults().company
 
-def set_parent_to_warehouse_acounts(warehouse, company):
-	account = frappe.db.get_value("Account", {"warehouse": warehouse.name})
-	stock_group = frappe.db.get_value("Account", {"account_type": "Stock",
-		"is_group": 1, "company": company.name})
+		if len(sle_against_companies) == 1:
+			set_company_to_warehouse(company)
+			make_warehouse_nestedset(company)
 
-	if account and account != "{0} - {1}".format(_("All Warehouses"), company.abbr):
-		account = frappe.get_doc("Account", account)
-		
-		if warehouse.create_account_under == stock_group or not warehouse.create_account_under:
-			if not warehouse.parent_warehouse:
-				account.parent_account = "{0} - {1}".format(_("All Warehouses"), company.abbr)
-			else:
-				account.parent_account = frappe.db.get_value("Account", warehouse.parent_warehouse)
+		elif len(sle_against_companies) > 1:
+			make_warehouse_nestedset()
 
-		account.save(ignore_permissions=True)
+def check_is_warehouse_associated_with_company():
+	warehouse_associcated_with_company = False
 
-def create_default_warehouse_group(company):
-	frappe.get_doc({
+	for warehouse in frappe.get_all("Warehouse", fields=["name", "company"]):
+		if warehouse.company:
+			warehouse_associcated_with_company = True
+
+	return warehouse_associcated_with_company
+
+def make_warehouse_nestedset(company=None):
+	validate_parent_account_for_warehouse(company)
+
+	if company:
+		warehouse_group = "{0} - {1}".format(_("All Warehouses"), company.abbr)
+		ignore_mandatory = False
+	else:
+		warehouse_group = _("All Warehouses")
+		ignore_mandatory = True
+
+	if not frappe.db.get_value("Warehouse", warehouse_group):
+		create_default_warehouse_group(company, ignore_mandatory)
+
+	set_parent_to_warehouse(warehouse_group, company)
+	if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
+		set_parent_to_warehouse_acount(company)
+
+def validate_parent_account_for_warehouse(company=None):
+	if not company:
+		return
+
+	if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
+		parent_account = frappe.db.sql("""select name from tabAccount
+			where account_type='Stock' and company=%s and is_group=1
+			and (warehouse is null or warehouse = '')""", company.name)
+
+		if not parent_account:
+			current_parent_accounts_for_warehouse = frappe.db.sql("""select parent_account from tabAccount
+				where account_type='Warehouse' and (warehouse is not null or warehouse != '') """)
+
+			if current_parent_accounts_for_warehouse:
+				frappe.db.set_value("Account", current_parent_accounts_for_warehouse[0][0], "account_type", "Stock")
+
+def create_default_warehouse_group(company=None, ignore_mandatory=False):
+	wh = frappe.get_doc({
 		"doctype": "Warehouse",
 		"warehouse_name": _("All Warehouses"),
 		"is_group": 1,
-		"company": company.name,
+		"company": company.name if company else "",
 		"parent_warehouse": ""
-	}).insert(ignore_permissions=True)
\ No newline at end of file
+	})
+
+	if ignore_mandatory:
+		wh.flags.ignore_mandatory = ignore_mandatory
+
+	wh.insert(ignore_permissions=True)
+
+def set_parent_to_warehouse(warehouse_group, company=None):
+	frappe.db.sql(""" update tabWarehouse set parent_warehouse = %s, is_group = 0
+		where (is_group = 0 or is_group is null or is_group = '') and ifnull(company, '') = %s
+		""",(warehouse_group, company.name if company else ""))
+
+	rebuild_tree("Warehouse", "parent_warehouse")
+
+def set_parent_to_warehouse_acount(company):
+	frappe.db.sql(""" update tabAccount set parent_account = %s
+		where is_group = 0 and account_type = "Warehouse"
+		and (warehouse is not null or warehouse != '') and company = %s
+		""",("{0} - {1}".format(_("All Warehouses"), company.abbr), company.name))
+
+	rebuild_tree("Account", "parent_account")
+
+def set_company_to_warehouse(company):
+	frappe.db.sql("update tabWahouse set company=%s", company)
diff --git a/erpnext/patches/v7_0/update_maintenance_module_in_doctype.py b/erpnext/patches/v7_0/update_maintenance_module_in_doctype.py
new file mode 100644
index 0000000..4c0c6a9
--- /dev/null
+++ b/erpnext/patches/v7_0/update_maintenance_module_in_doctype.py
@@ -0,0 +1,11 @@
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+	frappe.db.set_value("DocType", "Maintenance Schedule", "module", "Maintenance")
+	frappe.db.set_value("DocType", "Maintenance Schedule Detail", "module", "Maintenance")
+	frappe.db.set_value("DocType", "Maintenance Schedule Item", "module", "Maintenance")
+	frappe.db.set_value("DocType", "Maintenance Visit", "module", "Maintenance")
+	frappe.db.set_value("DocType", "Maintenance Visit Purpose", "module", "Maintenance")
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_sheet/test_time_sheet.py b/erpnext/projects/doctype/time_sheet/test_time_sheet.py
index ef3477c..cd627cf 100644
--- a/erpnext/projects/doctype/time_sheet/test_time_sheet.py
+++ b/erpnext/projects/doctype/time_sheet/test_time_sheet.py
@@ -16,8 +16,8 @@
 		time_sheet = make_time_sheet("_T-Employee-0001", True)
 
 		self.assertEquals(time_sheet.total_hours, 2)
-		self.assertEquals(time_sheet.timesheets[0].billing_rate, 50)
-		self.assertEquals(time_sheet.timesheets[0].billing_amount, 100)
+		self.assertEquals(time_sheet.time_logs[0].billing_rate, 50)
+		self.assertEquals(time_sheet.time_logs[0].billing_amount, 100)
 
 	def test_salary_slip_from_timesheet(self):
 		salary_structure = make_salary_structure("_T-Employee-0001")
@@ -58,9 +58,10 @@
 def make_salary_structure(employee):
 	name = frappe.db.get_value('Salary Structure', {'employee': employee, 'salary_slip_based_on_timesheet': 1}, 'name')
 	if name:
-		frappe.delete_doc('Salary Structure', name)
+		salary_structure = frappe.get_doc('Salary Structure', name)
+	else:
+		salary_structure = frappe.new_doc("Salary Structure")
 
-	salary_structure = frappe.new_doc("Salary Structure")
 	salary_structure.salary_slip_based_on_timesheet = 1
 	salary_structure.employee = employee
 	salary_structure.from_date = nowdate()
@@ -89,14 +90,14 @@
 	update_activity_type("_Test Activity Type")
 	time_sheet = frappe.new_doc("Time Sheet")
 	time_sheet.employee = employee
-	time_sheet_detail = time_sheet.append('timesheets', {})
+	time_sheet_detail = time_sheet.append('time_logs', {})
 	time_sheet_detail.billable = billable
 	time_sheet_detail.activity_type = "_Test Activity Type"
 	time_sheet_detail.from_time = now_datetime()
 	time_sheet_detail.hours = 2
 	time_sheet_detail.to_time = time_sheet_detail.from_time + datetime.timedelta(hours= time_sheet_detail.hours)
 
-	for data in time_sheet.get('timesheets'):
+	for data in time_sheet.get('time_logs'):
 		if simulate:
 			while True:
 				try:
diff --git a/erpnext/projects/doctype/time_sheet/time_sheet.js b/erpnext/projects/doctype/time_sheet/time_sheet.js
index 5375f93..a4cb3ae 100644
--- a/erpnext/projects/doctype/time_sheet/time_sheet.js
+++ b/erpnext/projects/doctype/time_sheet/time_sheet.js
@@ -1,11 +1,9 @@
 // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-cur_frm.add_fetch("activity_type", "billing_rate", "billing_rate");
-
 frappe.ui.form.on("Time Sheet", {
 	setup: function(frm) {
-		frm.get_field('timesheets').grid.editable_fields = [
+		frm.get_field('time_logs').grid.editable_fields = [
 			{fieldname: 'activity_type', columns: 2},
 			{fieldname: 'from_time', columns: 2},
 			{fieldname: 'hours', columns: 2},
@@ -18,7 +16,7 @@
 			}
 		}
 
-		frm.fields_dict['timesheets'].grid.get_field('task').get_query = function(frm, cdt, cdn) {
+		frm.fields_dict['time_logs'].grid.get_field('task').get_query = function(frm, cdt, cdn) {
 			child = locals[cdt][cdn];
 			return{
 				filters: {
@@ -29,7 +27,7 @@
 	},
 
 	onload: function(frm){
-		if (frm.doc.__islocal && frm.doc.timesheets) {
+		if (frm.doc.__islocal && frm.doc.time_logs) {
 			frm.set_value("employee", "")
 			calculate_time_and_amount(frm);
 		}
@@ -66,7 +64,7 @@
 })
 
 frappe.ui.form.on("Time Sheet Detail", {
-	timesheets_remove: function(frm) {
+	time_logs_remove: function(frm) {
 		calculate_time_and_amount(frm);
 	},
 
@@ -94,54 +92,64 @@
 	},
 
 	billing_rate: function(frm, cdt, cdn) {
-		var child = locals[cdt][cdn]
-		if(child.hours && child.billing_rate){
-			frappe.mode.set_value(cdt, cdn, 'total_billing_amount', flt(child.billing_rate * child.hours))
-		}
-		calculate_billing_amount(frm, cdt, cdn)
+		calculate_billing_costing_amount(frm, cdt, cdn)
 	},
 
 	costing_rate: function(frm, cdt, cdn) {
-		var child = locals[cdt][cdn]
-		frappe.mode.set_value(cdt, cdn, 'total_costing_amount', flt(child.costing_rate * child.hours))
-		calculate_billing_amount(frm, cdt, cdn)
+		calculate_billing_costing_amount(frm, cdt, cdn)
 	},
 
 	billable: function(frm, cdt, cdn) {
-		calculate_billing_amount(frm, cdt, cdn)
+		calculate_billing_costing_amount(frm, cdt, cdn)
+	},
+
+	activity_type: function(frm, cdt, cdn) {
+		child = locals[cdt][cdn];
+		frappe.call({
+			method: "erpnext.projects.doctype.time_sheet.time_sheet.get_activity_cost",
+			args: {
+				employee: frm.doc.employee,
+				activity_type: child.activity_type
+			},
+			callback: function(r){
+				if(r.message){
+					frappe.model.set_value(cdt, cdn, 'billing_rate', r.message['billing_rate']);
+					frappe.model.set_value(cdt, cdn, 'costing_rate', r.message['costing_rate']);
+					calculate_billing_costing_amount(frm, cdt, cdn)
+				}
+			}
+		})
 	}
 });
 
 calculate_end_time = function(frm, cdt, cdn){
 	var child = locals[cdt][cdn];
 
-	if(!child.from_time) {
-		frappe.model.set_value(cdt, cdn, "from_time", frappe.datetime.now_datetime());
-	}
-
 	var d = moment(child.from_time);
 	d.add(child.hours, "hours");
 	frm._setting_hours = true;
 	frappe.model.set_value(cdt, cdn, "to_time", d.format(moment.defaultDatetimeFormat));
 	frm._setting_hours = false;
 
-	calculate_billing_amount(frm, cdt, cdn)
+	calculate_billing_costing_amount(frm, cdt, cdn)
 }
 
-var calculate_billing_amount = function(frm, cdt, cdn){
+var calculate_billing_costing_amount = function(frm, cdt, cdn){
 	child = locals[cdt][cdn]
-	billing_amount = 0.0
+	billing_amount = costing_amount = 0.0;
 
 	if(child.hours && child.billable){
-		billing_amount = (child.hours * child.billing_rate)	
+		billing_amount = (child.hours * child.billing_rate);
+		costing_amount = flt(child.costing_rate * child.hours);
 	}
 
-	frappe.model.set_value(cdt, cdn, 'billing_amount', billing_amount)
+	frappe.model.set_value(cdt, cdn, 'billing_amount', billing_amount);
+	frappe.model.set_value(cdt, cdn, 'costing_amount', costing_amount);
 	calculate_time_and_amount(frm)
 }
 
 var calculate_time_and_amount = function(frm) {
-	var tl = frm.doc.timesheets || [];
+	var tl = frm.doc.time_logs || [];
 	total_hr = 0;
 	total_billing_amount = 0;
 	for(var i=0; i<tl.length; i++) {
diff --git a/erpnext/projects/doctype/time_sheet/time_sheet.json b/erpnext/projects/doctype/time_sheet/time_sheet.json
index 687e24d..3cd5917 100644
--- a/erpnext/projects/doctype/time_sheet/time_sheet.json
+++ b/erpnext/projects/doctype/time_sheet/time_sheet.json
@@ -426,7 +426,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "timesheets", 
+   "fieldname": "time_logs", 
    "fieldtype": "Table", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
@@ -586,7 +586,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-06-27 01:45:26.226915", 
+ "modified": "2016-06-29 15:16:31.668367", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Time Sheet", 
@@ -611,46 +611,6 @@
    "share": 1, 
    "submit": 1, 
    "write": 1
-  }, 
-  {
-   "amend": 1, 
-   "apply_user_permissions": 0, 
-   "cancel": 1, 
-   "create": 0, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Projects Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 1, 
-   "write": 1
-  }, 
-  {
-   "amend": 0, 
-   "apply_user_permissions": 0, 
-   "cancel": 0, 
-   "create": 1, 
-   "delete": 0, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Manufacturing User", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 0, 
-   "write": 0
   }
  ], 
  "quick_entry": 0, 
diff --git a/erpnext/projects/doctype/time_sheet/time_sheet.py b/erpnext/projects/doctype/time_sheet/time_sheet.py
index da56112..17f0023 100644
--- a/erpnext/projects/doctype/time_sheet/time_sheet.py
+++ b/erpnext/projects/doctype/time_sheet/time_sheet.py
@@ -22,9 +22,9 @@
 		self.total_hours = 0.0
 		self.total_billing_amount = 0.0
 		self.validate_dates()
-		self.validate_timesheets()
+		self.validate_time_logs()
 		self.update_cost()
-		for d in self.get("timesheets"):
+		for d in self.get("time_logs"):
 			self.total_hours += flt(d.hours)
 			if d.billable: self.total_billing_amount += flt(d.billing_amount)
 
@@ -46,8 +46,8 @@
 
 	def set_dates(self):
 		if self.docstatus < 2:
-			start_date = min([d.from_time for d in self.timesheets])
-			end_date = max([d.to_time for d in self.timesheets])
+			start_date = min([d.from_time for d in self.time_logs])
+			end_date = max([d.to_time for d in self.time_logs])
 
 			if start_date and end_date:
 				self.start_date = getdate(start_date)
@@ -73,7 +73,7 @@
 			production_order = frappe.get_doc("Production Order", self.production_order)
 			pending_qty = flt(production_order.qty) - flt(production_order.produced_qty)
 
-		for data in self.timesheets:
+		for data in self.time_logs:
 			if not data.from_time and not data.to_time:
 				frappe.throw(_("Row {0}: From Time and To Time is mandatory.").format(data.idx))
 
@@ -94,7 +94,7 @@
 		if self.production_order:
 			pro = frappe.get_doc('Production Order', self.production_order)
 
-			for timesheet in self.timesheets:
+			for timesheet in self.time_logs:
 				for data in pro.operations:
 					if data.name == timesheet.operation_id:
 						summary = self.get_actual_timesheet_summary(timesheet.operation_id)
@@ -119,7 +119,7 @@
 			(self.production_order, operation_id), as_dict=1)[0]
 
 	def update_task_and_project(self):
-		for data in self.timesheets:
+		for data in self.time_logs:
 			if data.task:
 				task = frappe.get_doc("Task", data.task)
 				task.update_time_and_costing()
@@ -129,12 +129,12 @@
 				frappe.get_doc("Project", data.project).update_project()
 
 	def validate_dates(self):
-		for data in self.timesheets:
+		for data in self.time_logs:
 			if time_diff_in_hours(data.to_time, data.from_time) < 0:
 				frappe.throw(_("To date cannot be before from date"))
 
-	def validate_timesheets(self):
-		for data in self.get('timesheets'):
+	def validate_time_logs(self):
+		for data in self.get('time_logs'):
 			self.validate_overlap(data)
 			self.check_workstation_timings(data)
 
@@ -180,8 +180,8 @@
 
 	def move_to_next_non_overlapping_slot(self, index):
 		from datetime import timedelta
-		if self.timesheets:
-			for data in self.timesheets:
+		if self.time_logs:
+			for data in self.time_logs:
 				if data.idx == index:
 					overlapping = self.get_overlap_for("workstation", data)
 					if not overlapping:
@@ -199,7 +199,7 @@
 			{'workstation': workstation}, as_dict=True)[0]
 
 	def update_cost(self):
-		for data in self.timesheets:
+		for data in self.time_logs:
 			if data.activity_type and not data.billing_amount:
 				rate = get_activity_cost(self.employee, data.activity_type)
 				hours =  data.hours or 0
@@ -253,7 +253,7 @@
 	target.salary_slip_based_on_timesheet = 1
 	target.start_date = doc.start_date
 	target.end_date = doc.end_date
-	
+
 @frappe.whitelist()
 def get_activity_cost(employee=None, activity_type=None):
 	rate = frappe.db.get_values("Activity Cost", {"employee": employee,
@@ -263,7 +263,7 @@
 			["costing_rate", "billing_rate"], as_dict=True)
 
 	return rate[0] if rate else {}
-	
+
 @frappe.whitelist()
 def get_employee_list(doctype, txt, searchfield, start, page_len, filters):
 	return frappe.db.sql("""select distinct(employee) as employee
diff --git a/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.json b/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.json
index 4a0787d..b7bda2c 100644
--- a/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.json
+++ b/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.json
@@ -295,6 +295,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "eval:parent.production_order", 
    "fieldname": "completed_qty", 
    "fieldtype": "Float", 
    "hidden": 0, 
@@ -421,6 +422,7 @@
    "collapsible": 0, 
    "default": "0", 
    "depends_on": "", 
+   "description": "To display value check Billable", 
    "fieldname": "billing_amount", 
    "fieldtype": "Currency", 
    "hidden": 0, 
@@ -447,6 +449,7 @@
    "bold": 0, 
    "collapsible": 0, 
    "default": "0", 
+   "description": "To display value check Billable", 
    "fieldname": "costing_amount", 
    "fieldtype": "Currency", 
    "hidden": 0, 
@@ -479,7 +482,7 @@
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2016-06-24 15:55:30.746870", 
+ "modified": "2016-06-29 17:18:37.442965", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Time Sheet Detail", 
diff --git a/erpnext/public/css/website.css b/erpnext/public/css/website.css
index db8f2fc..065e281 100644
--- a/erpnext/public/css/website.css
+++ b/erpnext/public/css/website.css
@@ -130,6 +130,9 @@
 .cart-container {
   margin: 50px 0px;
 }
+.cart-container .checkout {
+  margin-bottom: 15px;
+}
 .cart-container .cart-item-header .h6 {
   padding: 7px 15px;
 }
@@ -163,12 +166,12 @@
 .cart-container .cart-addresses {
   margin-top: 50px;
 }
-.cart-items .cart-dropdown,
+.cart-items-dropdown .cart-dropdown,
 .item_name_dropdown {
   display: none;
 }
 .cart-dropdown-container {
-  width: 320px;
+  width: 400px;
   padding: 15px;
 }
 .cart-dropdown-container .item-price {
@@ -178,7 +181,11 @@
 .cart-dropdown-container .cart-item-header {
   border-bottom: 1px solid #d1d8dd;
 }
-.cart-dropdown-container .cart-items .cart-dropdown {
+.cart-dropdown-container .cart-items-dropdown {
+  max-height: 350px;
+  overflow: auto;
+}
+.cart-dropdown-container .cart-items-dropdown .cart-dropdown {
   display: block;
   margin-top: 15px;
 }
@@ -196,6 +203,16 @@
 .cart-dropdown-container .col-name-description {
   margin-bottom: 8px;
 }
+.number-spinner {
+  width: 100px;
+  margin-top: 5px;
+}
+.cart-btn {
+  border-color: #ccc;
+}
+.cart-qty {
+  text-align: center;
+}
 .product-list-link .row {
   border-bottom: 1px solid #EBEFF2;
 }
diff --git a/erpnext/public/js/shopping_cart.js b/erpnext/public/js/shopping_cart.js
index 40f5b98..f5819a8 100644
--- a/erpnext/public/js/shopping_cart.js
+++ b/erpnext/public/js/shopping_cart.js
@@ -10,24 +10,29 @@
 		$('.navbar li[data-label="User"] a')
 			.html('<i class="icon-fixed-width icon-user"></i> ' + full_name);
 	}
-	// update login
-	shopping_cart.set_cart_count();
 	
-	$(".shopping-cart").on('shown.bs.dropdown', function() {
-		if (!$('.shopping-cart-menu .cart-container').length) {
-			return frappe.call({
-				method: 'erpnext.shopping_cart.cart.get_shopping_cart_menu',
-				callback: function(r) {
-					if (r.message) {
-						$('.shopping-cart-menu').html(r.message);
-					}
-				}
-			});
-		}
-	});
+	// update login
+	shopping_cart.show_shoppingcart_dropdown();
+	shopping_cart.set_cart_count();
+	shopping_cart.bind_dropdown_cart_buttons();
 });
 
 $.extend(shopping_cart, {
+	show_shoppingcart_dropdown: function() {
+		$(".shopping-cart").on('shown.bs.dropdown', function() {
+			if (!$('.shopping-cart-menu .cart-container').length) {
+				return frappe.call({
+					method: 'erpnext.shopping_cart.cart.get_shopping_cart_menu',
+					callback: function(r) {
+						if (r.message) {
+							$('.shopping-cart-menu').html(r.message);
+						}
+					}
+				});
+			}
+		});
+	},
+	
 	update_cart: function(opts) {
 		if(!full_name || full_name==="Guest") {
 			if(localStorage) {
@@ -82,5 +87,49 @@
 		} else {
 			$badge.remove();
 		}
-	}
+	},
+	
+	shopping_cart_update: function(item_code, newVal, cart_dropdown) {
+		frappe.freeze();
+		shopping_cart.update_cart({
+			item_code: item_code,
+			qty: newVal,
+			with_items: 1,
+			btn: this,
+			callback: function(r) {
+				frappe.unfreeze();
+				if(!r.exc) {
+					$(".cart-items").html(r.message.items);
+					$(".cart-tax-items").html(r.message.taxes);
+					if (cart_dropdown != true) {
+						$(".cart-icon").hide();
+					}					
+				}
+			},
+		});
+	},
+	
+	
+	bind_dropdown_cart_buttons: function() {
+		$(".cart-icon").on('click', '.number-spinner button', function () {
+			var btn = $(this),
+				input = btn.closest('.number-spinner').find('input'),
+				oldValue = input.val().trim(),
+				newVal = 0;
+			
+				if (btn.attr('data-dir') == 'up') {
+					newVal = parseInt(oldValue) + 1;
+				} else {
+					if (oldValue > 1) {
+						newVal = parseInt(oldValue) - 1;
+					}
+			}
+			input.val(newVal);
+			var item_code = input.attr("data-item-code"); 
+			shopping_cart.shopping_cart_update(item_code, newVal, true);
+			return false;
+		});
+		
+	},
+	
 });
diff --git a/erpnext/public/js/website_utils.js b/erpnext/public/js/website_utils.js
index b0fc557..b541606 100644
--- a/erpnext/public/js/website_utils.js
+++ b/erpnext/public/js/website_utils.js
@@ -18,7 +18,7 @@
 erpnext.subscribe_to_newsletter = function(opts, btn) {
 	return frappe.call({
 		type: "POST",
-		method: "erpnext.crm.doctype.newsletter.newsletter.subscribe",
+		method: "frappe.email.doctype.newsletter.newsletter.subscribe",
 		btn: btn,
 		args: {"email": opts.email},
 		callback: opts.callback
diff --git a/erpnext/public/less/website.less b/erpnext/public/less/website.less
index 5d89265..4aa3940 100644
--- a/erpnext/public/less/website.less
+++ b/erpnext/public/less/website.less
@@ -165,6 +165,10 @@
 
 .cart-container {
 	margin: 50px 0px;
+	
+	.checkout {
+		margin-bottom:15px;
+	}
 
 	.cart-item-header .h6 {
 		padding: 7px 15px;
@@ -210,15 +214,16 @@
 	}
 }
 
-.cart-items .cart-dropdown,
+.cart-items-dropdown .cart-dropdown,
 .item_name_dropdown {
-	display:none;
+	display: none;
 
 }
-.cart-dropdown-container {
-	width: 320px;
-	padding: 15px;
 
+.cart-dropdown-container {
+	width: 400px;
+	padding: 15px;
+	
 	.item-price {
 		display: block !important;
 		padding-bottom: 10px;
@@ -227,8 +232,13 @@
 	.cart-item-header {
 		border-bottom: 1px solid #d1d8dd;
 	}
-
-	.cart-items .cart-dropdown {
+	
+	.cart-items-dropdown {
+		max-height: 350px;
+		overflow: auto;	
+	}
+	
+	.cart-items-dropdown .cart-dropdown {
 		display:block;
 	   	margin-top:15px;
 	}
@@ -249,7 +259,18 @@
 	.col-name-description {
 		margin-bottom:8px;
 	}
+}
 
+.number-spinner {
+	width:100px;
+	margin-top:5px;
+}
+
+.cart-btn {
+	border-color: #ccc;
+}
+.cart-qty {
+	text-align:center;
 }
 
 .product-list-link {
@@ -306,5 +327,4 @@
 
 .product-image-wrapper {
 	padding-bottom: 40px;
-}
-
+}
\ No newline at end of file
diff --git a/erpnext/setup/setup_wizard/domainify.py b/erpnext/setup/setup_wizard/domainify.py
index f4cc35a..8bba119 100644
--- a/erpnext/setup/setup_wizard/domainify.py
+++ b/erpnext/setup/setup_wizard/domainify.py
@@ -4,58 +4,62 @@
 from __future__ import unicode_literals
 import frappe
 
-domains = {
-	'Manufacturing': {
-		'desktop_icons': ['Item', 'BOM', 'Customer', 'Supplier', 'Sales Order',
-			'Production Order',  'Stock Entry', 'Purchase Order', 'Task', 'Buying', 'Selling',
-			 'Accounts', 'HR', 'ToDo'],
-		'properties': [
-			{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'collapsible_depends_on', 'value': 'is_stock_item'},
-		],
-		'set_value': [
-			['Stock Settings', None, 'show_barcode_field', 1]
-		]
-	},
+def get_domains():
+	'''Written as a function to prevent data mutation effects'''
+	return {
+		'Manufacturing': {
+			'desktop_icons': ['Item', 'BOM', 'Customer', 'Supplier', 'Sales Order',
+				'Production Order',  'Stock Entry', 'Purchase Order', 'Task', 'Buying', 'Selling',
+				 'Accounts', 'HR', 'ToDo'],
+			'properties': [
+				{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'collapsible_depends_on', 'value': 'is_stock_item'},
+			],
+			'set_value': [
+				['Stock Settings', None, 'show_barcode_field', 1]
+			]
+		},
 
-	'Retail': {
-		'desktop_icons': ['POS', 'Item', 'Customer', 'Sales Invoice',  'Purchase Order', 'Warranty Claim',
-		'Accounts', 'Buying', 'ToDo'],
-		'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
-		'properties': [
-			{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'hidden', 'value': 1},
-			{'doctype': 'Customer', 'fieldname': 'credit_limit_section', 'property': 'hidden', 'value': 1},
-		],
-		'set_value': [
-			['Stock Settings', None, 'show_barcode_field', 1]
-		]
-	},
+		'Retail': {
+			'desktop_icons': ['POS', 'Item', 'Customer', 'Sales Invoice',  'Purchase Order', 'Warranty Claim',
+			'Accounts', 'Buying', 'ToDo'],
+			'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
+			'properties': [
+				{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'hidden', 'value': 1},
+				{'doctype': 'Customer', 'fieldname': 'credit_limit_section', 'property': 'hidden', 'value': 1},
+			],
+			'set_value': [
+				['Stock Settings', None, 'show_barcode_field', 1]
+			]
+		},
 
-	'Distribution': {
-		'desktop_icons': ['Item', 'Customer', 'Supplier', 'Lead', 'Sales Order',
-			 'Sales Invoice', 'CRM', 'Selling', 'Buying', 'Stock', 'Accounts', 'HR', 'ToDo'],
-		'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
-		'properties': [
-			{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'hidden', 'value': 1},
-		],
-		'set_value': [
-			['Stock Settings', None, 'show_barcode_field', 1]
-		]
-	},
+		'Distribution': {
+			'desktop_icons': ['Item', 'Customer', 'Supplier', 'Lead', 'Sales Order',
+				 'Sales Invoice', 'CRM', 'Selling', 'Buying', 'Stock', 'Accounts', 'HR', 'ToDo'],
+			'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
+			'properties': [
+				{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'hidden', 'value': 1},
+			],
+			'set_value': [
+				['Stock Settings', None, 'show_barcode_field', 1]
+			]
+		},
 
-	'Services': {
-		'desktop_icons': ['Project', 'Time Sheet', 'Customer', 'Sales Order', 'Sales Invoice', 'Lead', 'Opportunity',
-			'Expense Claim', 'Employee', 'HR', 'ToDo'],
-		'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
-		'properties': [
-			{'doctype': 'Item', 'fieldname': 'is_stock_item', 'property': 'default', 'value': 0},
-		],
-		'set_value': [
-			['Stock Settings', None, 'show_barcode_field', 0]
-		]
+		'Services': {
+			'desktop_icons': ['Project', 'Time Sheet', 'Customer', 'Sales Order', 'Sales Invoice', 'Lead', 'Opportunity',
+				'Expense Claim', 'Employee', 'HR', 'ToDo'],
+			'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
+			'properties': [
+				{'doctype': 'Item', 'fieldname': 'is_stock_item', 'property': 'default', 'value': 0},
+			],
+			'set_value': [
+				['Stock Settings', None, 'show_barcode_field', 0]
+			]
+		}
 	}
-}
 
 def setup_domain(domain):
+	domains = get_domains()
+
 	if not domain in domains:
 		return
 
@@ -85,4 +89,4 @@
 	from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
 	add_all_roles_to('Administrator')
 
-	frappe.db.sql('delete from `tabProperty Setter`')
\ No newline at end of file
+	frappe.db.sql('delete from `tabProperty Setter`')
diff --git a/erpnext/stock/doctype/warehouse/warehouse.json b/erpnext/stock/doctype/warehouse/warehouse.json
index a32ec1f..86516ff 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.json
+++ b/erpnext/stock/doctype/warehouse/warehouse.json
@@ -39,7 +39,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "default": "1", 
+   "default": "0", 
    "fieldname": "is_group", 
    "fieldtype": "Check", 
    "hidden": 0, 
@@ -588,8 +588,8 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-06-26 17:39:16.856800", 
- "modified_by": "s@s.com", 
+ "modified": "2016-06-29 19:47:24.336215", 
+ "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Warehouse", 
  "owner": "Administrator", 
diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py
index 3b50f30..adef7ce 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -11,9 +11,12 @@
 	nsm_parent_field = 'parent_warehouse'
 
 	def autoname(self):
-		suffix = " - " + frappe.db.get_value("Company", self.company, "abbr")
-		if not self.warehouse_name.endswith(suffix):
-			self.name = self.warehouse_name + suffix
+		if self.company:
+			suffix = " - " + frappe.db.get_value("Company", self.company, "abbr")
+			if not self.warehouse_name.endswith(suffix):
+				self.name = self.warehouse_name + suffix
+		else:
+			self.name = self.warehouse_name
 
 	def onload(self):
 		'''load account name for General Ledger Report'''
@@ -31,6 +34,7 @@
 
 	def update_parent_account(self):
 		if not getattr(self, "__islocal", None) \
+			and cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) \
 			and (self.create_account_under != frappe.db.get_value("Warehouse", self.name, "create_account_under")):
 
 				self.validate_parent_account()
@@ -113,7 +117,7 @@
 		if warehouse_account:
 			frappe.delete_doc("Account", warehouse_account)
 
-		if self.check_sle_exists():
+		if self.check_if_sle_exists():
 			throw(_("Warehouse can not be deleted as stock ledger entry exists for this warehouse."))
 
 		if self.check_if_child_exists():
@@ -251,9 +255,10 @@
 		is_group as expandable
 		from `tab{doctype}`
 		where docstatus < 2
-		and ifnull(`{parent_field}`,'') = %s and `company` = %s
-		order by name""".format(doctype=frappe.db.escape(doctype), parent_field=frappe.db.escape(parent_field)),
-		(parent, company), as_dict=1)
+		and ifnull(`{parent_field}`,'') = %s 
+		and (`company` = %s or company is null or company = '')
+		order by name""".format(doctype=frappe.db.escape(doctype),
+		parent_field=frappe.db.escape(parent_field)), (parent, company), as_dict=1)
 
 	# return warehouses
 	for wh in warehouses:
diff --git a/erpnext/stock/doctype/warehouse/warehouse_tree.js b/erpnext/stock/doctype/warehouse/warehouse_tree.js
index 9069160..0134ca7 100644
--- a/erpnext/stock/doctype/warehouse/warehouse_tree.js
+++ b/erpnext/stock/doctype/warehouse/warehouse_tree.js
@@ -13,7 +13,7 @@
 	fields:[
 		{fieldtype:'Data', fieldname: 'name_field',
 			label:__('New Warehouse Name'), reqd:true},
-		{fieldtype:'Check', fieldname:'is_group', label:__('Group Node'),
+		{fieldtype:'Check', fieldname:'is_group', label:__('Is Group'),
 			description: __("Further nodes can be only created under 'Group' type nodes")}
 	],
 	onrender: function(node) {
diff --git a/erpnext/support/doctype/maintenance_schedule/__init__.py b/erpnext/support/doctype/maintenance_schedule/__init__.py
deleted file mode 100644
index baffc48..0000000
--- a/erpnext/support/doctype/maintenance_schedule/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from __future__ import unicode_literals
diff --git a/erpnext/support/doctype/maintenance_schedule_detail/__init__.py b/erpnext/support/doctype/maintenance_schedule_detail/__init__.py
deleted file mode 100644
index baffc48..0000000
--- a/erpnext/support/doctype/maintenance_schedule_detail/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from __future__ import unicode_literals
diff --git a/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.py b/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.py
deleted file mode 100644
index 16013b5..0000000
--- a/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-
-from frappe.model.document import Document
-
-class MaintenanceScheduleDetail(Document):
-	pass
\ No newline at end of file
diff --git a/erpnext/support/doctype/maintenance_schedule_item/__init__.py b/erpnext/support/doctype/maintenance_schedule_item/__init__.py
deleted file mode 100644
index baffc48..0000000
--- a/erpnext/support/doctype/maintenance_schedule_item/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from __future__ import unicode_literals
diff --git a/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.py b/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.py
deleted file mode 100644
index 22feec3..0000000
--- a/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-
-from frappe.model.document import Document
-
-class MaintenanceScheduleItem(Document):
-	pass
\ No newline at end of file
diff --git a/erpnext/support/doctype/maintenance_visit/__init__.py b/erpnext/support/doctype/maintenance_visit/__init__.py
deleted file mode 100644
index baffc48..0000000
--- a/erpnext/support/doctype/maintenance_visit/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from __future__ import unicode_literals
diff --git a/erpnext/support/doctype/maintenance_visit_purpose/__init__.py b/erpnext/support/doctype/maintenance_visit_purpose/__init__.py
deleted file mode 100644
index baffc48..0000000
--- a/erpnext/support/doctype/maintenance_visit_purpose/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from __future__ import unicode_literals
diff --git a/erpnext/support/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py b/erpnext/support/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py
deleted file mode 100644
index cb0c519..0000000
--- a/erpnext/support/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-
-from frappe.model.document import Document
-
-class MaintenanceVisitPurpose(Document):
-	pass
\ No newline at end of file
diff --git a/erpnext/support/report/maintenance_schedules/maintenance_schedules.json b/erpnext/support/report/maintenance_schedules/maintenance_schedules.json
deleted file mode 100644
index 2be7446..0000000
--- a/erpnext/support/report/maintenance_schedules/maintenance_schedules.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "apply_user_permissions": 1, 
- "creation": "2013-05-06 14:25:21", 
- "docstatus": 0, 
- "doctype": "Report", 
- "idx": 1, 
- "is_standard": "Yes", 
- "modified": "2014-06-03 07:18:17.144598", 
- "modified_by": "Administrator", 
- "module": "Support", 
- "name": "Maintenance Schedules", 
- "owner": "Administrator", 
- "query": "SELECT\n    ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.sales_person as \"Sales Person::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.prevdoc_docname as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n    `tabMaintenance Schedule Detail` ms_sch, \n    `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc", 
- "ref_doctype": "Maintenance Schedule", 
- "report_name": "Maintenance Schedules", 
- "report_type": "Query Report"
-}
\ No newline at end of file
diff --git a/erpnext/templates/includes/cart.js b/erpnext/templates/includes/cart.js
index d56721d..dbb93a9 100644
--- a/erpnext/templates/includes/cart.js
+++ b/erpnext/templates/includes/cart.js
@@ -16,9 +16,9 @@
 		shopping_cart.bind_address_select();
 		shopping_cart.bind_place_order();
 		shopping_cart.bind_change_qty();
-
+		shopping_cart.bind_dropdown_cart_buttons();
 	},
-
+	
 	bind_address_select: function() {
 		$(".cart-addresses").find('input[data-address-name]').on("click", function() {
 			if($(this).prop("checked")) {
@@ -54,21 +54,26 @@
 		// bind update button
 		$(".cart-items").on("change", ".cart-qty", function() {
 			var item_code = $(this).attr("data-item-code");
-			frappe.freeze();
-			shopping_cart.update_cart({
-				item_code: item_code,
-				qty: $(this).val(),
-				with_items: 1,
-				btn: this,
-				callback: function(r) {
-					frappe.unfreeze();
-					if(!r.exc) {
-						$(".cart-items").html(r.message.items);
-						$(".cart-tax-items").html(r.message.taxes);
-						$(".cart-icon").hide();
-					}
-				},
-			});
+			var newVal = $(this).val();
+			shopping_cart.shopping_cart_update(item_code, newVal);
+		});
+		
+		$(".cart-items").on('click', '.number-spinner button', function () {  
+			var btn = $(this),
+				input = btn.closest('.number-spinner').find('input'),
+				oldValue = input.val().trim(),
+				newVal = 0;
+	
+			if (btn.attr('data-dir') == 'up') {
+				newVal = parseInt(oldValue) + 1;
+			} else {
+				if (oldValue > 1) {
+					newVal = parseInt(oldValue) - 1;
+				}
+			}
+			input.val(newVal);
+			var item_code = input.attr("data-item-code"); 
+			shopping_cart.shopping_cart_update(item_code, newVal);
 		});
 	},
 	
@@ -143,7 +148,7 @@
 	}
 });
 
-$(document).ready(function() {
+frappe.ready(function() {
 	$(".cart-icon").hide();
 	shopping_cart.bind_events();
 });
diff --git a/erpnext/templates/includes/cart/cart_dropdown.html b/erpnext/templates/includes/cart/cart_dropdown.html
index 18148ad..071b281 100644
--- a/erpnext/templates/includes/cart/cart_dropdown.html
+++ b/erpnext/templates/includes/cart/cart_dropdown.html
@@ -11,8 +11,8 @@
 	</div>
 	
 	{% if doc.items %}
-	<div class="cart-items">
-		{% include "templates/includes/cart/cart_items.html" %}
+	<div class="cart-items-dropdown">
+		{% include "templates/includes/cart/cart_items_dropdown.html" %}
 	</div>
 	<div class="checkout-btn">
 	<a href="/cart" class="btn btn-block btn-primary">{{ _("Checkout") }}</a>
diff --git a/erpnext/templates/includes/cart/cart_items.html b/erpnext/templates/includes/cart/cart_items.html
index 976467d..b2e6858 100644
--- a/erpnext/templates/includes/cart/cart_items.html
+++ b/erpnext/templates/includes/cart/cart_items.html
@@ -1,4 +1,5 @@
 {% from "erpnext/templates/includes/order/order_macros.html" import item_name_and_description %}
+{% from "erpnext/templates/includes/order/order_macros.html" import item_name_and_description_cart %}
 
 {% for d in doc.items %}
 <div class="row checkout">
@@ -6,10 +7,21 @@
         {{ item_name_and_description(d) }}
     </div>
     <div class="col-sm-2 col-xs-3 text-right col-qty">
-        <span style="max-width: 50px; display: inline-block">
+        <span style="display: inline-block">
+			<div class="input-group number-spinner">
+                <span class="input-group-btn">
+                    <button class="btn btn-default cart-btn" data-dir="dwn">
+                        –</button>
+                </span>
             <input class="form-control text-right cart-qty"
             value = "{{ d.get_formatted('qty') }}"
-            data-item-code="{{ d.item_code }}"></span>    	
+            data-item-code="{{ d.item_code }}">
+                <span class="input-group-btn">
+                    <button class="btn btn-default cart-btn" data-dir="up" style="margin-left:-2px;">
+                        +</button>
+                </span>
+			</div>
+		</span>    	
 	</div>
     <div class="col-sm-2 col-xs-3 text-right col-amount">
         {{ d.get_formatted("amount") }}
@@ -17,14 +29,4 @@
             _("Rate: {0}").format(d.get_formatted("rate")) }}</p>
     </div>
 </div>
-
-<div class="row cart-dropdown">
-    <div class="col-sm-8 col-xs-8 col-name-description">
-        {{ item_name_and_description(d) }}
-    </div>
-    <div class="col-sm-4 col-xs-4 text-right col-amount">
-        {{ d.get_formatted("amount") }}
-
-    </div>
-</div>
 {% endfor %}
\ No newline at end of file
diff --git a/erpnext/templates/includes/cart/cart_items_dropdown.html b/erpnext/templates/includes/cart/cart_items_dropdown.html
new file mode 100644
index 0000000..9a3dbf8
--- /dev/null
+++ b/erpnext/templates/includes/cart/cart_items_dropdown.html
@@ -0,0 +1,13 @@
+{% from "erpnext/templates/includes/order/order_macros.html" import item_name_and_description_cart %}
+
+{% for d in doc.items %}
+<div class="row cart-dropdown">
+    <div class="col-sm-8 col-xs-8 col-name-description">
+        {{ item_name_and_description_cart(d) }}
+    </div>
+    <div class="col-sm-4 col-xs-4 text-right col-amount">
+        {{ d.get_formatted("amount") }}
+
+    </div>
+</div>
+{% endfor %}
\ No newline at end of file
diff --git a/erpnext/templates/includes/navbar/navbar_items.html b/erpnext/templates/includes/navbar/navbar_items.html
index 9cdbd98..c7af2fd 100644
--- a/erpnext/templates/includes/navbar/navbar_items.html
+++ b/erpnext/templates/includes/navbar/navbar_items.html
@@ -1,12 +1,12 @@
 {% extends 'frappe/templates/includes/navbar/navbar_items.html' %}
 
 {% block navbar_right_extension %}
-	<li class="dropdown shopping-cart">
+	<li class="shopping-cart">
 		<div class="cart-icon small">
 			<a class="dropdown-toggle" href="#" data-toggle="dropdown" id="navLogin">
 				Cart <span class="badge-wrapper" id="cart-count"></span>
 			</a>
-			<div class="dropdown-menu shopping-cart-menu"></div>
+			<div id="cart-overlay" class="dropdown-menu shopping-cart-menu"></div>
 		</div>
 	 </li>
 {% endblock %}
\ No newline at end of file
diff --git a/erpnext/templates/includes/order/order_macros.html b/erpnext/templates/includes/order/order_macros.html
index 3f8affe..41be449 100644
--- a/erpnext/templates/includes/order/order_macros.html
+++ b/erpnext/templates/includes/order/order_macros.html
@@ -12,15 +12,29 @@
             <div class="text-muted small item-description">{{ d.description }}</div>
         </div>
     </div>
-
+{% endmacro %}
+{% macro item_name_and_description_cart(d) %}
     <div class="row item_name_dropdown">
         <div class="col-xs-4 col-sm-4 order-image-col">
             <div class="order-image">
-              <span class="cart-count-badge pull-right small"> {{ d.get_formatted('qty') }} </span>{{ product_image_square(d.image) }}
+             {{ product_image_square(d.image) }}
             </div>
         </div>
         <div class="col-xs-8 col-sm-8">
-            {{ d.item_code }}
+           {{ d.item_code|truncate(25) }}			
+			<div class="input-group number-spinner">
+                <span class="input-group-btn">
+                    <button class="btn btn-default cart-btn" data-dir="dwn">
+                        –</button>
+                </span>
+            <input class="form-control text-right cart-qty"
+            value = "{{ d.get_formatted('qty') }}"
+            data-item-code="{{ d.item_code }}">
+                <span class="input-group-btn">
+                    <button class="btn btn-default cart-btn" data-dir="up">
+                        +</button>
+                </span>
+			</div>
         </div>
     </div>
 {% endmacro %}
\ No newline at end of file
diff --git a/erpnext/templates/pages/cart.html b/erpnext/templates/pages/cart.html
index 35e4989..7f6bf01 100644
--- a/erpnext/templates/pages/cart.html
+++ b/erpnext/templates/pages/cart.html
@@ -30,7 +30,7 @@
 				<div class="col-sm-8 col-xs-6 h6 text-uppercase">
 				{{ _("Item") }}
 				</div>
-				<div class="col-sm-2 col-xs-3 text-right h6 text-uppercase">
+				<div class="col-sm-2 col-xs-3 text-center h6 text-uppercase">
 				{{ _("Qty") }}
 				</div>
 				<div class="col-sm-2 col-xs-3 text-right h6 text-uppercase">