diff --git a/erpnext/selling/doctype/lead/lead.js b/erpnext/selling/doctype/lead/lead.js
index 4ab1067..41f679e 100644
--- a/erpnext/selling/doctype/lead/lead.js
+++ b/erpnext/selling/doctype/lead/lead.js
@@ -14,12 +14,12 @@
 	onload: function() {
 		if(cur_frm.fields_dict.lead_owner.df.options.match(/^Profile/)) {
 			cur_frm.fields_dict.lead_owner.get_query = function(doc,cdt,cdn) {
-				return { query:"core.doctype.profile.profile.profile_query" } }
+				return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
 		}
 
 		if(cur_frm.fields_dict.contact_by.df.options.match(/^Profile/)) {
 			cur_frm.fields_dict.contact_by.get_query = function(doc,cdt,cdn) {
-				return { query:"core.doctype.profile.profile.profile_query" } }
+				return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
 		}
 
 		if(in_list(user_roles,'System Manager')) {
diff --git a/erpnext/selling/doctype/sales_order/templates/__init__.py b/erpnext/selling/doctype/sales_order/templates/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/selling/doctype/sales_order/templates/__init__.py
+++ /dev/null
diff --git a/erpnext/selling/doctype/sales_order/templates/pages/__init__.py b/erpnext/selling/doctype/sales_order/templates/pages/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/selling/doctype/sales_order/templates/pages/__init__.py
+++ /dev/null
diff --git a/erpnext/selling/doctype/sales_order/templates/pages/order.html b/erpnext/selling/doctype/sales_order/templates/pages/order.html
deleted file mode 100644
index 45867ea..0000000
--- a/erpnext/selling/doctype/sales_order/templates/pages/order.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% extends "templates/sale.html" %}
-
-{% block status -%}
-	{% if doc.status %}{{ doc.status }}{% endif %}
-{%- endblock %}
\ No newline at end of file
diff --git a/erpnext/selling/doctype/sales_order/templates/pages/order.py b/erpnext/selling/doctype/sales_order/templates/pages/order.py
deleted file mode 100644
index e172c09..0000000
--- a/erpnext/selling/doctype/sales_order/templates/pages/order.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import webnotes
-from webnotes import _
-
-no_cache = True
-
-def get_context():
-	from erpnext.templates.utils import get_transaction_context
-	context = get_transaction_context("Sales Order", webnotes.form_dict.name)
-	modify_status(context.get("doc"))
-	context.update({
-		"parent_link": "orders",
-		"parent_title": "My Orders"
-	})
-	return context
-	
-def modify_status(doc):
-	doc.status = []
-	if 0 < doc.per_billed < 100:
-		doc.status.append(("label-warning", "icon-ok", _("Partially Billed")))
-	elif doc.per_billed == 100:
-		doc.status.append(("label-success", "icon-ok", _("Billed")))
-	
-	if 0 < doc.per_delivered < 100:
-		doc.status.append(("label-warning", "icon-truck", _("Partially Delivered")))
-	elif doc.per_delivered == 100:
-		doc.status.append(("label-success", "icon-truck", _("Delivered")))
-	doc.status = " " + " ".join(('<span class="label %s"><i class="icon-fixed-width %s"></i> %s</span>' % s 
-			for s in doc.status))
diff --git a/erpnext/selling/doctype/sales_order/templates/pages/orders.html b/erpnext/selling/doctype/sales_order/templates/pages/orders.html
deleted file mode 100644
index 0467f34..0000000
--- a/erpnext/selling/doctype/sales_order/templates/pages/orders.html
+++ /dev/null
@@ -1 +0,0 @@
-{% extends "templates/sales_transactions.html" %}
\ No newline at end of file
diff --git a/erpnext/selling/doctype/sales_order/templates/pages/orders.py b/erpnext/selling/doctype/sales_order/templates/pages/orders.py
deleted file mode 100644
index 5d28d5b..0000000
--- a/erpnext/selling/doctype/sales_order/templates/pages/orders.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import webnotes
-
-no_cache = True
-
-def get_context():
-	from erpnext.templates.utils import get_currency_context
-	context = get_currency_context()
-	context.update({
-		"title": "My Orders",
-		"method": "selling.doctype.sales_order.templates.pages.orders.get_orders",
-		"icon": "icon-list",
-		"empty_list_message": "No Orders Yet",
-		"page": "order",
-	})
-	return context
-	
-@webnotes.whitelist()
-def get_orders(start=0):
-	from erpnext.templates.utils import get_transaction_list
-	from erpnext.selling.doctype.sales_order.templates.pages.order import modify_status
-	orders = get_transaction_list("Sales Order", start, ["per_billed", "per_delivered"])
-	for d in orders:
-		modify_status(d)
-		
-	return orders
-	
\ No newline at end of file
diff --git a/erpnext/selling/doctype/shopping_cart_price_list/__init__.py b/erpnext/selling/doctype/shopping_cart_price_list/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/selling/doctype/shopping_cart_price_list/__init__.py
+++ /dev/null
diff --git a/erpnext/selling/doctype/shopping_cart_price_list/shopping_cart_price_list.py b/erpnext/selling/doctype/shopping_cart_price_list/shopping_cart_price_list.py
deleted file mode 100644
index e5468e5..0000000
--- a/erpnext/selling/doctype/shopping_cart_price_list/shopping_cart_price_list.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import webnotes
-
-class DocType:
-	def __init__(self, d, dl):
-		self.doc, self.doclist = d, dl
\ No newline at end of file
diff --git a/erpnext/selling/doctype/shopping_cart_price_list/shopping_cart_price_list.txt b/erpnext/selling/doctype/shopping_cart_price_list/shopping_cart_price_list.txt
deleted file mode 100644
index 7cd61f7..0000000
--- a/erpnext/selling/doctype/shopping_cart_price_list/shopping_cart_price_list.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-[
- {
-  "creation": "2013-06-20 16:00:18", 
-  "docstatus": 0, 
-  "modified": "2013-12-20 19:21:47", 
-  "modified_by": "Administrator", 
-  "owner": "Administrator"
- }, 
- {
-  "doctype": "DocType", 
-  "istable": 1, 
-  "module": "Selling", 
-  "name": "__common__"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "selling_price_list", 
-  "fieldtype": "Link", 
-  "in_list_view": 1, 
-  "label": "Price List", 
-  "name": "__common__", 
-  "options": "Price List", 
-  "parent": "Shopping Cart Price List", 
-  "parentfield": "fields", 
-  "parenttype": "DocType", 
-  "permlevel": 0, 
-  "reqd": 1
- }, 
- {
-  "doctype": "DocType", 
-  "name": "Shopping Cart Price List"
- }, 
- {
-  "doctype": "DocField"
- }
-]
\ No newline at end of file
diff --git a/erpnext/selling/doctype/shopping_cart_settings/__init__.py b/erpnext/selling/doctype/shopping_cart_settings/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/selling/doctype/shopping_cart_settings/__init__.py
+++ /dev/null
diff --git a/erpnext/selling/doctype/shopping_cart_settings/shopping_cart_settings.js b/erpnext/selling/doctype/shopping_cart_settings/shopping_cart_settings.js
deleted file mode 100644
index 7505dc2..0000000
--- a/erpnext/selling/doctype/shopping_cart_settings/shopping_cart_settings.js
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
-
-$.extend(cur_frm.cscript, {
-	onload: function() {
-		if(cur_frm.doc.__quotation_series) {
-			cur_frm.fields_dict.quotation_series.df.options = cur_frm.doc.__quotation_series;
-		}
-	}
-});
\ No newline at end of file
diff --git a/erpnext/selling/doctype/shopping_cart_settings/shopping_cart_settings.py b/erpnext/selling/doctype/shopping_cart_settings/shopping_cart_settings.py
deleted file mode 100644
index 923936e..0000000
--- a/erpnext/selling/doctype/shopping_cart_settings/shopping_cart_settings.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import webnotes
-from webnotes import _, msgprint
-from webnotes.utils import comma_and
-from webnotes.model.controller import DocListController
-
-class ShoppingCartSetupError(webnotes.ValidationError): pass
-
-class DocType(DocListController):
-	def onload(self):
-		self.doc.fields["__quotation_series"] = webnotes.get_doctype("Quotation").get_options("naming_series")
-	
-	def validate(self):
-		if self.doc.enabled:
-			self.validate_price_lists()
-			self.validate_tax_masters()
-			self.validate_exchange_rates_exist()
-			
-	def on_update(self):
-		webnotes.conn.set_default("shopping_cart_enabled", self.doc.fields.get("enabled") or 0)
-		webnotes.conn.set_default("shopping_cart_quotation_series", self.doc.fields.get("quotation_series"))
-			
-	def validate_overlapping_territories(self, parentfield, fieldname):
-		# for displaying message
-		doctype = self.meta.get_field(parentfield).options
-		
-		# specify atleast one entry in the table
-		self.validate_table_has_rows(parentfield, raise_exception=ShoppingCartSetupError)
-		
-		territory_name_map = self.get_territory_name_map(parentfield, fieldname)
-		for territory, names in territory_name_map.items():
-			if len(names) > 1:
-				msgprint(_("Error for") + " " + _(doctype) + ": " + comma_and(names) +
-					" " + _("have a common territory") + ": " + territory,
-					raise_exception=ShoppingCartSetupError)
-					
-		return territory_name_map
-		
-	def validate_price_lists(self):
-		territory_name_map = self.validate_overlapping_territories("price_lists",
-			"selling_price_list")
-		
-		# validate that a Shopping Cart Price List exists for the root territory
-		# as a catch all!
-		from erpnext.setup.utils import get_root_of
-		root_territory = get_root_of("Territory")
-		
-		if root_territory not in territory_name_map.keys():
-			msgprint(_("Please specify a Price List which is valid for Territory") + 
-				": " + root_territory, raise_exception=ShoppingCartSetupError)
-		
-	def validate_tax_masters(self):
-		self.validate_overlapping_territories("sales_taxes_and_charges_masters", 
-			"sales_taxes_and_charges_master")
-		
-	def get_territory_name_map(self, parentfield, fieldname):
-		territory_name_map = {}
-		
-		# entries in table
-		names = [doc.fields.get(fieldname) for doc in self.doclist.get({"parentfield": parentfield})]
-		
-		if names:
-			# for condition in territory check
-			parenttype = self.meta.get_field(fieldname, parentfield=parentfield).options
-		
-			# to validate territory overlap
-			# make a map of territory: [list of names]
-			# if list against each territory has more than one element, raise exception
-			territory_name = webnotes.conn.sql("""select `territory`, `parent` 
-				from `tabApplicable Territory`
-				where `parenttype`=%s and `parent` in (%s)""" %
-				("%s", ", ".join(["%s"]*len(names))), tuple([parenttype] + names))
-		
-			for territory, name in territory_name:
-				territory_name_map.setdefault(territory, []).append(name)
-				
-				if len(territory_name_map[territory]) > 1:
-					territory_name_map[territory].sort(key=lambda val: names.index(val))
-		
-		return territory_name_map
-					
-	def validate_exchange_rates_exist(self):
-		"""check if exchange rates exist for all Price List currencies (to company's currency)"""
-		company_currency = webnotes.conn.get_value("Company", self.doc.company, "default_currency")
-		if not company_currency:
-			msgprint(_("Please specify currency in Company") + ": " + self.doc.company,
-				raise_exception=ShoppingCartSetupError)
-		
-		price_list_currency_map = webnotes.conn.get_values("Price List", 
-			[d.selling_price_list for d in self.doclist.get({"parentfield": "price_lists"})],
-			"currency")
-		
-		# check if all price lists have a currency
-		for price_list, currency in price_list_currency_map.items():
-			if not currency:
-				webnotes.throw("%s: %s" % (_("Currency is missing for Price List"), price_list))
-			
-		expected_to_exist = [currency + "-" + company_currency 
-			for currency in price_list_currency_map.values()
-			if currency != company_currency]
-			
-		if expected_to_exist:
-			exists = webnotes.conn.sql_list("""select name from `tabCurrency Exchange`
-				where name in (%s)""" % (", ".join(["%s"]*len(expected_to_exist)),),
-				tuple(expected_to_exist))
-		
-			missing = list(set(expected_to_exist).difference(exists))
-		
-			if missing:
-				msgprint(_("Missing Currency Exchange Rates for" + ": " + comma_and(missing)),
-					raise_exception=ShoppingCartSetupError)
-				
-	def get_name_from_territory(self, territory, parentfield, fieldname):
-		name = None
-		territory_name_map = self.get_territory_name_map(parentfield, fieldname)
-		
-		if territory_name_map.get(territory):
-			name = territory_name_map.get(territory)
-		else:
-			territory_ancestry = self.get_territory_ancestry(territory)
-			for ancestor in territory_ancestry:
-				if territory_name_map.get(ancestor):
-					name = territory_name_map.get(ancestor)
-					break
-		
-		return name
-				
-	def get_price_list(self, billing_territory):
-		price_list = self.get_name_from_territory(billing_territory, "price_lists", "selling_price_list")
-		return price_list and price_list[0] or None
-		
-	def get_tax_master(self, billing_territory):
-		tax_master = self.get_name_from_territory(billing_territory, "sales_taxes_and_charges_masters", 
-			"sales_taxes_and_charges_master")
-		return tax_master and tax_master[0] or None
-		
-	def get_shipping_rules(self, shipping_territory):
-		return self.get_name_from_territory(shipping_territory, "shipping_rules", "shipping_rule")
-		
-	def get_territory_ancestry(self, territory):
-		from erpnext.setup.utils import get_ancestors_of
-		
-		if not hasattr(self, "_territory_ancestry"):
-			self._territory_ancestry = {}
-			
-		if not self._territory_ancestry.get(territory):
-			self._territory_ancestry[territory] = get_ancestors_of("Territory", territory)
-
-		return self._territory_ancestry[territory]
\ No newline at end of file
diff --git a/erpnext/selling/doctype/shopping_cart_settings/shopping_cart_settings.txt b/erpnext/selling/doctype/shopping_cart_settings/shopping_cart_settings.txt
deleted file mode 100644
index f52cc60..0000000
--- a/erpnext/selling/doctype/shopping_cart_settings/shopping_cart_settings.txt
+++ /dev/null
@@ -1,129 +0,0 @@
-[
- {
-  "creation": "2013-06-19 15:57:32", 
-  "docstatus": 0, 
-  "modified": "2013-12-20 19:21:47", 
-  "modified_by": "Administrator", 
-  "owner": "Administrator"
- }, 
- {
-  "description": "Default settings for Shopping Cart", 
-  "doctype": "DocType", 
-  "icon": "icon-shopping-cart", 
-  "issingle": 1, 
-  "module": "Selling", 
-  "name": "__common__"
- }, 
- {
-  "doctype": "DocField", 
-  "name": "__common__", 
-  "parent": "Shopping Cart Settings", 
-  "parentfield": "fields", 
-  "parenttype": "DocType", 
-  "permlevel": 0
- }, 
- {
-  "create": 1, 
-  "doctype": "DocPerm", 
-  "email": 1, 
-  "name": "__common__", 
-  "parent": "Shopping Cart Settings", 
-  "parentfield": "permissions", 
-  "parenttype": "DocType", 
-  "permlevel": 0, 
-  "print": 1, 
-  "read": 1, 
-  "role": "Website Manager", 
-  "write": 1
- }, 
- {
-  "doctype": "DocType", 
-  "name": "Shopping Cart Settings"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "enabled", 
-  "fieldtype": "Check", 
-  "label": "Enable Shopping Cart"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "section_break_2", 
-  "fieldtype": "Section Break"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "company", 
-  "fieldtype": "Link", 
-  "label": "Company", 
-  "options": "Company", 
-  "reqd": 1
- }, 
- {
-  "description": "<a href=\"#Sales Browser/Territory\">Add / Edit</a>", 
-  "doctype": "DocField", 
-  "fieldname": "default_territory", 
-  "fieldtype": "Link", 
-  "label": "Default Territory", 
-  "options": "Territory", 
-  "reqd": 1
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "column_break_4", 
-  "fieldtype": "Column Break"
- }, 
- {
-  "description": "<a href=\"#Sales Browser/Customer Group\">Add / Edit</a>", 
-  "doctype": "DocField", 
-  "fieldname": "default_customer_group", 
-  "fieldtype": "Link", 
-  "label": "Default Customer Group", 
-  "options": "Customer Group", 
-  "reqd": 1
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "quotation_series", 
-  "fieldtype": "Select", 
-  "label": "Quotation Series", 
-  "reqd": 1
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "section_break_6", 
-  "fieldtype": "Section Break"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "price_lists", 
-  "fieldtype": "Table", 
-  "label": "Shopping Cart Price Lists", 
-  "options": "Shopping Cart Price List", 
-  "reqd": 0
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "shipping_rules", 
-  "fieldtype": "Table", 
-  "label": "Shopping Cart Shipping Rules", 
-  "options": "Shopping Cart Shipping Rule", 
-  "reqd": 0
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "column_break_10", 
-  "fieldtype": "Column Break"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "sales_taxes_and_charges_masters", 
-  "fieldtype": "Table", 
-  "label": "Shopping Cart Taxes and Charges Masters", 
-  "options": "Shopping Cart Taxes and Charges Master", 
-  "reqd": 0
- }, 
- {
-  "doctype": "DocPerm"
- }
-]
\ No newline at end of file
diff --git a/erpnext/selling/doctype/shopping_cart_settings/test_shopping_cart_settings.py b/erpnext/selling/doctype/shopping_cart_settings/test_shopping_cart_settings.py
deleted file mode 100644
index be67f6f..0000000
--- a/erpnext/selling/doctype/shopping_cart_settings/test_shopping_cart_settings.py
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import webnotes
-import unittest
-from erpnext.selling.doctype.shopping_cart_settings.shopping_cart_settings import ShoppingCartSetupError
-
-class TestShoppingCartSettings(unittest.TestCase):
-	def setUp(self):
-		webnotes.conn.sql("""delete from `tabSingles` where doctype="Shipping Cart Settings" """)
-		webnotes.conn.sql("""delete from `tabShopping Cart Price List`""")
-		webnotes.conn.sql("""delete from `tabShopping Cart Taxes and Charges Master`""")
-		webnotes.conn.sql("""delete from `tabShopping Cart Shipping Rule`""")
-		
-	def get_cart_settings(self):
-		return webnotes.bean({"doctype": "Shopping Cart Settings",
-			"company": "_Test Company"})
-		
-	def test_price_list_territory_overlap(self):
-		cart_settings = self.get_cart_settings()
-		
-		def _add_price_list(price_list):
-			cart_settings.doclist.append({
-				"doctype": "Shopping Cart Price List",
-				"parentfield": "price_lists",
-				"selling_price_list": price_list
-			})
-		
-		for price_list in ("_Test Price List Rest of the World", "_Test Price List India",
-			"_Test Price List"):
-			_add_price_list(price_list)
-		
-		controller = cart_settings.make_controller()
-		controller.validate_overlapping_territories("price_lists", "selling_price_list")
-		
-		_add_price_list("_Test Price List 2")
-		
-		controller = cart_settings.make_controller()
-		self.assertRaises(ShoppingCartSetupError, controller.validate_overlapping_territories,
-			"price_lists", "selling_price_list")
-			
-		return cart_settings
-		
-	def test_taxes_territory_overlap(self):
-		cart_settings = self.get_cart_settings()
-		
-		def _add_tax_master(tax_master):
-			cart_settings.doclist.append({
-				"doctype": "Shopping Cart Taxes and Charges Master",
-				"parentfield": "sales_taxes_and_charges_masters",
-				"sales_taxes_and_charges_master": tax_master
-			})
-		
-		for tax_master in ("_Test Sales Taxes and Charges Master", "_Test India Tax Master"):
-			_add_tax_master(tax_master)
-			
-		controller = cart_settings.make_controller()
-		controller.validate_overlapping_territories("sales_taxes_and_charges_masters",
-			"sales_taxes_and_charges_master")
-			
-		_add_tax_master("_Test Sales Taxes and Charges Master 2")
-		
-		controller = cart_settings.make_controller()
-		self.assertRaises(ShoppingCartSetupError, controller.validate_overlapping_territories,
-			"sales_taxes_and_charges_masters", "sales_taxes_and_charges_master")
-		
-	def test_exchange_rate_exists(self):
-		webnotes.conn.sql("""delete from `tabCurrency Exchange`""")
-		
-		cart_settings = self.test_price_list_territory_overlap()
-		controller = cart_settings.make_controller()
-		self.assertRaises(ShoppingCartSetupError, controller.validate_exchange_rates_exist)
-		
-		from erpnext.setup.doctype.currency_exchange.test_currency_exchange import test_records as \
-			currency_exchange_records
-		webnotes.bean(currency_exchange_records[0]).insert()
-		controller.validate_exchange_rates_exist()
-		
diff --git a/erpnext/selling/doctype/shopping_cart_shipping_rule/__init__.py b/erpnext/selling/doctype/shopping_cart_shipping_rule/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/selling/doctype/shopping_cart_shipping_rule/__init__.py
+++ /dev/null
diff --git a/erpnext/selling/doctype/shopping_cart_shipping_rule/shopping_cart_shipping_rule.py b/erpnext/selling/doctype/shopping_cart_shipping_rule/shopping_cart_shipping_rule.py
deleted file mode 100644
index e5468e5..0000000
--- a/erpnext/selling/doctype/shopping_cart_shipping_rule/shopping_cart_shipping_rule.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import webnotes
-
-class DocType:
-	def __init__(self, d, dl):
-		self.doc, self.doclist = d, dl
\ No newline at end of file
diff --git a/erpnext/selling/doctype/shopping_cart_shipping_rule/shopping_cart_shipping_rule.txt b/erpnext/selling/doctype/shopping_cart_shipping_rule/shopping_cart_shipping_rule.txt
deleted file mode 100644
index 91b41c2..0000000
--- a/erpnext/selling/doctype/shopping_cart_shipping_rule/shopping_cart_shipping_rule.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-[
- {
-  "creation": "2013-07-03 13:15:34", 
-  "docstatus": 0, 
-  "modified": "2013-12-20 19:21:47", 
-  "modified_by": "Administrator", 
-  "owner": "Administrator"
- }, 
- {
-  "doctype": "DocType", 
-  "istable": 1, 
-  "module": "Selling", 
-  "name": "__common__"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "shipping_rule", 
-  "fieldtype": "Link", 
-  "in_list_view": 1, 
-  "label": "Shipping Rule", 
-  "name": "__common__", 
-  "options": "Shipping Rule", 
-  "parent": "Shopping Cart Shipping Rule", 
-  "parentfield": "fields", 
-  "parenttype": "DocType", 
-  "permlevel": 0, 
-  "reqd": 1
- }, 
- {
-  "doctype": "DocType", 
-  "name": "Shopping Cart Shipping Rule"
- }, 
- {
-  "doctype": "DocField"
- }
-]
\ No newline at end of file
diff --git a/erpnext/selling/doctype/shopping_cart_taxes_and_charges_master/__init__.py b/erpnext/selling/doctype/shopping_cart_taxes_and_charges_master/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/selling/doctype/shopping_cart_taxes_and_charges_master/__init__.py
+++ /dev/null
diff --git a/erpnext/selling/doctype/shopping_cart_taxes_and_charges_master/shopping_cart_taxes_and_charges_master.py b/erpnext/selling/doctype/shopping_cart_taxes_and_charges_master/shopping_cart_taxes_and_charges_master.py
deleted file mode 100644
index e5468e5..0000000
--- a/erpnext/selling/doctype/shopping_cart_taxes_and_charges_master/shopping_cart_taxes_and_charges_master.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import webnotes
-
-class DocType:
-	def __init__(self, d, dl):
-		self.doc, self.doclist = d, dl
\ No newline at end of file
diff --git a/erpnext/selling/doctype/shopping_cart_taxes_and_charges_master/shopping_cart_taxes_and_charges_master.txt b/erpnext/selling/doctype/shopping_cart_taxes_and_charges_master/shopping_cart_taxes_and_charges_master.txt
deleted file mode 100644
index ba44199..0000000
--- a/erpnext/selling/doctype/shopping_cart_taxes_and_charges_master/shopping_cart_taxes_and_charges_master.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-[
- {
-  "creation": "2013-06-20 16:57:03", 
-  "docstatus": 0, 
-  "modified": "2013-12-20 19:21:47", 
-  "modified_by": "Administrator", 
-  "owner": "Administrator"
- }, 
- {
-  "doctype": "DocType", 
-  "istable": 1, 
-  "module": "Selling", 
-  "name": "__common__"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "sales_taxes_and_charges_master", 
-  "fieldtype": "Link", 
-  "in_list_view": 1, 
-  "label": "Tax Master", 
-  "name": "__common__", 
-  "options": "Sales Taxes and Charges Master", 
-  "parent": "Shopping Cart Taxes and Charges Master", 
-  "parentfield": "fields", 
-  "parenttype": "DocType", 
-  "permlevel": 0, 
-  "reqd": 1
- }, 
- {
-  "doctype": "DocType", 
-  "name": "Shopping Cart Taxes and Charges Master"
- }, 
- {
-  "doctype": "DocField"
- }
-]
\ No newline at end of file
diff --git a/erpnext/selling/page/selling_home/selling_home.js b/erpnext/selling/page/selling_home/selling_home.js
index a64ed48..54b4edc 100644
--- a/erpnext/selling/page/selling_home/selling_home.js
+++ b/erpnext/selling/page/selling_home/selling_home.js
@@ -66,12 +66,6 @@
 				"description": wn._("Settings for Selling Module")
 			},
 			{
-				"route":"Form/Shopping Cart Settings",
-				"label":wn._("Shopping Cart Settings"),
-				"description":wn._("Setup of Shopping Cart."),
-				doctype:"Shopping Cart Settings"
-			},
-			{
 				label: wn._("Sales Taxes and Charges Master"),
 				description: wn._("Sales taxes template."),
 				doctype:"Sales Taxes and Charges Master"
diff --git a/erpnext/selling/utils/__init__.py b/erpnext/selling/utils.py
similarity index 99%
rename from erpnext/selling/utils/__init__.py
rename to erpnext/selling/utils.py
index c73d76e..7949e47 100644
--- a/erpnext/selling/utils/__init__.py
+++ b/erpnext/selling/utils.py
@@ -207,4 +207,4 @@
 	if out.get("warehouse"):
 		out["actual_qty"] = get_available_qty(opts.item_code, out.get("warehouse")).get("actual_qty")
 	
-	return out
+	return out
\ No newline at end of file
diff --git a/erpnext/selling/utils/cart.py b/erpnext/selling/utils/cart.py
deleted file mode 100644
index f23a571..0000000
--- a/erpnext/selling/utils/cart.py
+++ /dev/null
@@ -1,462 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import webnotes, json
-from webnotes import msgprint, _
-import webnotes.defaults
-from webnotes.utils import flt, get_fullname, fmt_money, cstr
-
-class WebsitePriceListMissingError(webnotes.ValidationError): pass
-
-def set_cart_count(quotation=None):
-	if not quotation:
-		quotation = _get_cart_quotation()
-	cart_count = cstr(len(quotation.doclist.get({"parentfield": "quotation_details"})))
-	webnotes._response.set_cookie("cart_count", cart_count)
-
-@webnotes.whitelist()
-def get_cart_quotation(doclist=None):
-	party = get_lead_or_customer()
-	
-	if not doclist:
-		quotation = _get_cart_quotation(party)
-		doclist = quotation.doclist
-		set_cart_count(quotation)
-	
-	return {
-		"doclist": decorate_quotation_doclist(doclist),
-		"addresses": [{"name": address.name, "display": address.display} 
-			for address in get_address_docs(party)],
-		"shipping_rules": get_applicable_shipping_rules(party)
-	}
-	
-@webnotes.whitelist()
-def place_order():
-	quotation = _get_cart_quotation()
-	controller = quotation.make_controller()
-	for fieldname in ["customer_address", "shipping_address_name"]:
-		if not quotation.doc.fields.get(fieldname):
-			msgprint(_("Please select a") + " " + _(controller.meta.get_label(fieldname)), raise_exception=True)
-	
-	quotation.ignore_permissions = True
-	quotation.submit()
-	
-	from erpnext.selling.doctype.quotation.quotation import _make_sales_order
-	sales_order = webnotes.bean(_make_sales_order(quotation.doc.name, ignore_permissions=True))
-	sales_order.ignore_permissions = True
-	sales_order.insert()
-	sales_order.submit()
-	webnotes._response.set_cookie("cart_count", "")
-	
-	return sales_order.doc.name
-
-@webnotes.whitelist()
-def update_cart(item_code, qty, with_doclist=0):
-	quotation = _get_cart_quotation()
-	
-	qty = flt(qty)
-	if qty == 0:
-		quotation.set_doclist(quotation.doclist.get({"item_code": ["!=", item_code]}))
-		if not quotation.doclist.get({"parentfield": "quotation_details"}) and \
-			not quotation.doc.fields.get("__islocal"):
-				quotation.__delete = True
-			
-	else:
-		quotation_items = quotation.doclist.get({"item_code": item_code})
-		if not quotation_items:
-			quotation.doclist.append({
-				"doctype": "Quotation Item",
-				"parentfield": "quotation_details",
-				"item_code": item_code,
-				"qty": qty
-			})
-		else:
-			quotation_items[0].qty = qty
-	
-	apply_cart_settings(quotation=quotation)
-
-	if hasattr(quotation, "__delete"):
-		webnotes.delete_doc("Quotation", quotation.doc.name, ignore_permissions=True)
-		quotation = _get_cart_quotation()
-	else:
-		quotation.ignore_permissions = True
-		quotation.save()
-	
-	set_cart_count(quotation)
-	
-	if with_doclist:
-		return get_cart_quotation(quotation.doclist)
-	else:
-		return quotation.doc.name
-		
-@webnotes.whitelist()
-def update_cart_address(address_fieldname, address_name):
-	from erpnext.utilities.transaction_base import get_address_display
-	
-	quotation = _get_cart_quotation()
-	address_display = get_address_display(webnotes.doc("Address", address_name).fields)
-	
-	if address_fieldname == "shipping_address_name":
-		quotation.doc.shipping_address_name = address_name
-		quotation.doc.shipping_address = address_display
-		
-		if not quotation.doc.customer_address:
-			address_fieldname == "customer_address"
-	
-	if address_fieldname == "customer_address":
-		quotation.doc.customer_address = address_name
-		quotation.doc.address_display = address_display
-		
-	
-	apply_cart_settings(quotation=quotation)
-	
-	quotation.ignore_permissions = True
-	quotation.save()
-		
-	return get_cart_quotation(quotation.doclist)
-
-@webnotes.whitelist()
-def get_addresses():
-	return [d.fields for d in get_address_docs()]
-	
-@webnotes.whitelist()
-def save_address(fields, address_fieldname=None):
-	party = get_lead_or_customer()
-	fields = json.loads(fields)
-	
-	if fields.get("name"):
-		bean = webnotes.bean("Address", fields.get("name"))
-	else:
-		bean = webnotes.bean({"doctype": "Address", "__islocal": 1})
-	
-	bean.doc.fields.update(fields)
-	
-	party_fieldname = party.doctype.lower()
-	bean.doc.fields.update({
-		party_fieldname: party.name,
-		(party_fieldname + "_name"): party.fields[party_fieldname + "_name"]
-	})
-	bean.ignore_permissions = True
-	bean.save()
-	
-	if address_fieldname:
-		update_cart_address(address_fieldname, bean.doc.name)
-	
-	return bean.doc.name
-	
-def get_address_docs(party=None):
-	from webnotes.model.doclist import objectify
-	from erpnext.utilities.transaction_base import get_address_display
-	
-	if not party:
-		party = get_lead_or_customer()
-		
-	address_docs = objectify(webnotes.conn.sql("""select * from `tabAddress`
-		where `%s`=%s order by name""" % (party.doctype.lower(), "%s"), party.name, 
-		as_dict=True, update={"doctype": "Address"}))
-	
-	for address in address_docs:
-		address.display = get_address_display(address.fields)
-		address.display = (address.display).replace("\n", "<br>\n")
-		
-	return address_docs
-	
-def get_lead_or_customer():
-	customer = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user}, "customer")
-	if customer:
-		return webnotes.doc("Customer", customer)
-	
-	lead = webnotes.conn.get_value("Lead", {"email_id": webnotes.session.user})
-	if lead:
-		return webnotes.doc("Lead", lead)
-	else:
-		lead_bean = webnotes.bean({
-			"doctype": "Lead",
-			"email_id": webnotes.session.user,
-			"lead_name": get_fullname(webnotes.session.user),
-			"territory": guess_territory(),
-			"status": "Open" # TODO: set something better???
-		})
-		
-		if webnotes.session.user != "Guest":
-			lead_bean.ignore_permissions = True
-			lead_bean.insert()
-			
-		return lead_bean.doc
-		
-def guess_territory():
-	territory = None
-	geoip_country = webnotes.session.get("session_country")
-	if geoip_country:
-		territory = webnotes.conn.get_value("Territory", geoip_country)
-	
-	return territory or \
-		webnotes.conn.get_value("Shopping Cart Settings", None, "territory") or \
-		"All Territories"
-
-def decorate_quotation_doclist(doclist):
-	for d in doclist:
-		if d.item_code:
-			d.fields.update(webnotes.conn.get_value("Item", d.item_code, 
-				["website_image", "description", "page_name"], as_dict=True))
-			d.formatted_rate = fmt_money(d.export_rate, currency=doclist[0].currency)
-			d.formatted_amount = fmt_money(d.export_amount, currency=doclist[0].currency)
-		elif d.charge_type:
-			d.formatted_tax_amount = fmt_money(d.tax_amount / doclist[0].conversion_rate,
-				currency=doclist[0].currency)
-
-	doclist[0].formatted_grand_total_export = fmt_money(doclist[0].grand_total_export,
-		currency=doclist[0].currency)
-	
-	return [d.fields for d in doclist]
-
-def _get_cart_quotation(party=None):
-	if not party:
-		party = get_lead_or_customer()
-		
-	quotation = webnotes.conn.get_value("Quotation", 
-		{party.doctype.lower(): party.name, "order_type": "Shopping Cart", "docstatus": 0})
-	
-	if quotation:
-		qbean = webnotes.bean("Quotation", quotation)
-	else:
-		qbean = webnotes.bean({
-			"doctype": "Quotation",
-			"naming_series": webnotes.defaults.get_user_default("shopping_cart_quotation_series") or "QTN-CART-",
-			"quotation_to": party.doctype,
-			"company": webnotes.defaults.get_user_default("company"),
-			"order_type": "Shopping Cart",
-			"status": "Draft",
-			"docstatus": 0,
-			"__islocal": 1,
-			(party.doctype.lower()): party.name
-		})
-		
-		if party.doctype == "Customer":
-			qbean.doc.contact_person = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user,
-				"customer": party.name})
-			qbean.run_method("set_contact_fields")
-		
-		qbean.run_method("onload_post_render")
-		apply_cart_settings(party, qbean)
-	
-	return qbean
-
-def update_party(fullname, company_name=None, mobile_no=None, phone=None):
-	party = get_lead_or_customer()
-
-	if party.doctype == "Lead":
-		party.company_name = company_name
-		party.lead_name = fullname
-		party.mobile_no = mobile_no
-		party.phone = phone
-	else:
-		party.customer_name = company_name or fullname
-		party.customer_type == "Company" if company_name else "Individual"
-		
-		contact_name = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user,
-			"customer": party.name})
-		contact = webnotes.bean("Contact", contact_name)
-		contact.doc.first_name = fullname
-		contact.doc.last_name = None
-		contact.doc.customer_name = party.customer_name
-		contact.doc.mobile_no = mobile_no
-		contact.doc.phone = phone
-		contact.ignore_permissions = True
-		contact.save()
-	
-	party_bean = webnotes.bean(party.fields)
-	party_bean.ignore_permissions = True
-	party_bean.save()
-	
-	qbean = _get_cart_quotation(party)
-	if not qbean.doc.fields.get("__islocal"):
-		qbean.doc.customer_name = company_name or fullname
-		qbean.run_method("set_contact_fields")
-		qbean.ignore_permissions = True
-		qbean.save()
-
-def apply_cart_settings(party=None, quotation=None):
-	if not party:
-		party = get_lead_or_customer()
-	if not quotation:
-		quotation = _get_cart_quotation(party)
-	
-	cart_settings = webnotes.get_obj("Shopping Cart Settings")
-	
-	billing_territory = get_address_territory(quotation.doc.customer_address) or \
-		party.territory or "All Territories"
-		
-	set_price_list_and_rate(quotation, cart_settings, billing_territory)
-	
-	quotation.run_method("calculate_taxes_and_totals")
-	
-	set_taxes(quotation, cart_settings, billing_territory)
-	
-	_apply_shipping_rule(party, quotation, cart_settings)
-	
-def set_price_list_and_rate(quotation, cart_settings, billing_territory):
-	"""set price list based on billing territory"""
-	quotation.doc.selling_price_list = cart_settings.get_price_list(billing_territory)
-	
-	# reset values
-	quotation.doc.price_list_currency = quotation.doc.currency = \
-		quotation.doc.plc_conversion_rate = quotation.doc.conversion_rate = None
-	for item in quotation.doclist.get({"parentfield": "quotation_details"}):
-		item.ref_rate = item.adj_rate = item.export_rate = item.export_amount = None
-	
-	# refetch values
-	quotation.run_method("set_price_list_and_item_details")
-	
-	# set it in cookies for using in product page
-	webnotes.local._response.set_cookie("selling_price_list", quotation.doc.selling_price_list)
-	
-def set_taxes(quotation, cart_settings, billing_territory):
-	"""set taxes based on billing territory"""
-	quotation.doc.charge = cart_settings.get_tax_master(billing_territory)
-
-	# clear table
-	quotation.set_doclist(quotation.doclist.get({"parentfield": ["!=", "other_charges"]}))
-	
-	# append taxes
-	controller = quotation.make_controller()
-	controller.append_taxes_from_master("other_charges", "charge")
-	quotation.set_doclist(controller.doclist)
-
-@webnotes.whitelist()
-def apply_shipping_rule(shipping_rule):
-	quotation = _get_cart_quotation()
-	
-	quotation.doc.shipping_rule = shipping_rule
-	
-	apply_cart_settings(quotation=quotation)
-	
-	quotation.ignore_permissions = True
-	quotation.save()
-	
-	return get_cart_quotation(quotation.doclist)
-	
-def _apply_shipping_rule(party=None, quotation=None, cart_settings=None):
-	shipping_rules = get_shipping_rules(party, quotation, cart_settings)
-	
-	if not shipping_rules:
-		return
-		
-	elif quotation.doc.shipping_rule not in shipping_rules:
-		quotation.doc.shipping_rule = shipping_rules[0]
-	
-	quotation.run_method("apply_shipping_rule")
-	quotation.run_method("calculate_taxes_and_totals")
-	
-def get_applicable_shipping_rules(party=None, quotation=None):
-	shipping_rules = get_shipping_rules(party, quotation)
-	
-	if shipping_rules:
-		rule_label_map = webnotes.conn.get_values("Shipping Rule", shipping_rules, "label")
-		# we need this in sorted order as per the position of the rule in the settings page
-		return [[rule, rule_label_map.get(rule)] for rule in shipping_rules]
-		
-def get_shipping_rules(party=None, quotation=None, cart_settings=None):
-	if not party:
-		party = get_lead_or_customer()
-	if not quotation:
-		quotation = _get_cart_quotation()
-	if not cart_settings:
-		cart_settings = webnotes.get_obj("Shopping Cart Settings")
-		
-	# set shipping rule based on shipping territory	
-	shipping_territory = get_address_territory(quotation.doc.shipping_address_name) or \
-		party.territory
-	
-	shipping_rules = cart_settings.get_shipping_rules(shipping_territory)
-	
-	return shipping_rules
-	
-def get_address_territory(address_name):
-	"""Tries to match city, state and country of address to existing territory"""
-	territory = None
-
-	if address_name:
-		address_fields = webnotes.conn.get_value("Address", address_name, 
-			["city", "state", "country"])
-		for value in address_fields:
-			territory = webnotes.conn.get_value("Territory", value)
-			if territory:
-				break
-	
-	return territory
-	
-import unittest
-test_dependencies = ["Item", "Price List", "Contact", "Shopping Cart Settings"]
-
-class TestCart(unittest.TestCase):
-	def tearDown(self):
-		return
-		
-		cart_settings = webnotes.bean("Shopping Cart Settings")
-		cart_settings.ignore_permissions = True
-		cart_settings.doc.enabled = 0
-		cart_settings.save()
-	
-	def enable_shopping_cart(self):
-		return
-		if not webnotes.conn.get_value("Shopping Cart Settings", None, "enabled"):
-			cart_settings = webnotes.bean("Shopping Cart Settings")
-			cart_settings.ignore_permissions = True
-			cart_settings.doc.enabled = 1
-			cart_settings.save()
-			
-	def test_get_lead_or_customer(self):
-		webnotes.session.user = "test@example.com"
-		party1 = get_lead_or_customer()
-		party2 = get_lead_or_customer()
-		self.assertEquals(party1.name, party2.name)
-		self.assertEquals(party1.doctype, "Lead")
-		
-		webnotes.session.user = "test_contact_customer@example.com"
-		party = get_lead_or_customer()
-		self.assertEquals(party.name, "_Test Customer")
-		
-	def test_add_to_cart(self):
-		self.enable_shopping_cart()
-		webnotes.session.user = "test@example.com"
-		
-		update_cart("_Test Item", 1)
-		
-		quotation = _get_cart_quotation()
-		quotation_items = quotation.doclist.get({"parentfield": "quotation_details", "item_code": "_Test Item"})
-		self.assertTrue(quotation_items)
-		self.assertEquals(quotation_items[0].qty, 1)
-		
-		return quotation
-		
-	def test_update_cart(self):
-		self.test_add_to_cart()
-
-		update_cart("_Test Item", 5)
-		
-		quotation = _get_cart_quotation()
-		quotation_items = quotation.doclist.get({"parentfield": "quotation_details", "item_code": "_Test Item"})
-		self.assertTrue(quotation_items)
-		self.assertEquals(quotation_items[0].qty, 5)
-		
-		return quotation
-		
-	def test_remove_from_cart(self):
-		quotation0 = self.test_add_to_cart()
-		
-		update_cart("_Test Item", 0)
-		
-		quotation = _get_cart_quotation()
-		self.assertEquals(quotation0.doc.name, quotation.doc.name)
-		
-		quotation_items = quotation.doclist.get({"parentfield": "quotation_details", "item_code": "_Test Item"})
-		self.assertEquals(quotation_items, [])
-		
-	def test_place_order(self):
-		quotation = self.test_update_cart()
-		sales_order_name = place_order()
-		sales_order = webnotes.bean("Sales Order", sales_order_name)
-		self.assertEquals(sales_order.doclist.getone({"item_code": "_Test Item"}).prevdoc_docname, quotation.doc.name)
-		
\ No newline at end of file
diff --git a/erpnext/selling/utils/product.py b/erpnext/selling/utils/product.py
deleted file mode 100644
index 98b7d6a..0000000
--- a/erpnext/selling/utils/product.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-
-import webnotes
-from webnotes.utils import cstr, cint, fmt_money
-from webnotes.webutils import delete_page_cache
-from erpnext.selling.utils.cart import _get_cart_quotation
-
-@webnotes.whitelist(allow_guest=True)
-def get_product_info(item_code):
-	"""get product price / stock info"""
-	if not cint(webnotes.conn.get_default("shopping_cart_enabled")):
-		return {}
-	
-	cart_quotation = _get_cart_quotation()
-	
-	price_list = webnotes.local.request.cookies.get("selling_price_list")
-
-	warehouse = webnotes.conn.get_value("Item", item_code, "website_warehouse")
-	if warehouse:
-		in_stock = webnotes.conn.sql("""select actual_qty from tabBin where
-			item_code=%s and warehouse=%s""", (item_code, warehouse))
-		if in_stock:
-			in_stock = in_stock[0][0] > 0 and 1 or 0
-	else:
-		in_stock = -1
-		
-	price = price_list and webnotes.conn.sql("""select ref_rate, currency from
-		`tabItem Price` where item_code=%s and price_list=%s""", 
-		(item_code, price_list), as_dict=1) or []
-	
-	price = price and price[0] or None
-	qty = 0
-
-	if price:
-		price["formatted_price"] = fmt_money(price["ref_rate"], currency=price["currency"])
-		
-		price["currency"] = not cint(webnotes.conn.get_default("hide_currency_symbol")) \
-			and (webnotes.conn.get_value("Currency", price.currency, "symbol") or price.currency) \
-			or ""
-		
-		if webnotes.session.user != "Guest":
-			item = cart_quotation.doclist.get({"item_code": item_code})
-			if item:
-				qty = item[0].qty
-
-	return {
-		"price": price,
-		"stock": in_stock,
-		"uom": webnotes.conn.get_value("Item", item_code, "stock_uom"),
-		"qty": qty
-	}
-
-@webnotes.whitelist(allow_guest=True)
-def get_product_list(search=None, start=0, limit=10):
-	# base query
-	query = """select name, item_name, page_name, website_image, item_group, 
-			web_long_description as website_description
-		from `tabItem` where docstatus = 0 and show_in_website = 1 """
-	
-	# search term condition
-	if search:
-		query += """and (web_long_description like %(search)s or
-				item_name like %(search)s or name like %(search)s)"""
-		search = "%" + cstr(search) + "%"
-	
-	# order by
-	query += """order by weightage desc, modified desc limit %s, %s""" % (start, limit)
-
-	data = webnotes.conn.sql(query, {
-		"search": search,
-	}, as_dict=1)
-	
-	return [get_item_for_list_in_html(r) for r in data]
-
-
-def get_product_list_for_group(product_group=None, start=0, limit=10):
-	child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(product_group)])
-
-	# base query
-	query = """select name, item_name, page_name, website_image, item_group, 
-			web_long_description as website_description
-		from `tabItem` where docstatus = 0 and show_in_website = 1
-		and (item_group in (%s)
-			or name in (select parent from `tabWebsite Item Group` where item_group in (%s))) """ % (child_groups, child_groups)
-	
-	query += """order by weightage desc, modified desc limit %s, %s""" % (start, limit)
-
-	data = webnotes.conn.sql(query, {"product_group": product_group}, as_dict=1)
-
-	return [get_item_for_list_in_html(r) for r in data]
-
-def get_child_groups(item_group_name):
-	item_group = webnotes.doc("Item Group", item_group_name)
-	return webnotes.conn.sql("""select name 
-		from `tabItem Group` where lft>=%(lft)s and rgt<=%(rgt)s
-			and show_in_website = 1""", item_group.fields)
-
-def get_group_item_count(item_group):
-	child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(item_group)])
-	return webnotes.conn.sql("""select count(*) from `tabItem` 
-		where docstatus = 0 and show_in_website = 1
-		and (item_group in (%s)
-			or name in (select parent from `tabWebsite Item Group` 
-				where item_group in (%s))) """ % (child_groups, child_groups))[0][0]
-
-def get_item_for_list_in_html(context):
-	return webnotes.get_template("templates/includes/product_in_grid.html").render(context)
-
-def scrub_item_for_list(r):
-	if not r.website_description:
-		r.website_description = "No description given"
-	if len(r.website_description.split(" ")) > 24:
-		r.website_description = " ".join(r.website_description.split(" ")[:24]) + "..."
-
-def get_parent_item_groups(item_group_name):
-	item_group = webnotes.doc("Item Group", item_group_name)
-	return webnotes.conn.sql("""select name, page_name from `tabItem Group`
-		where lft <= %s and rgt >= %s 
-		and ifnull(show_in_website,0)=1
-		order by lft asc""", (item_group.lft, item_group.rgt), as_dict=True)
-		
-def invalidate_cache_for(item_group):
-	for i in get_parent_item_groups(item_group):
-		if i.page_name:
-			delete_page_cache(i.page_name)
\ No newline at end of file
