diff --git a/website/templates/pages/blog.html b/website/doctype/blog_post/templates/blog.html
similarity index 100%
rename from website/templates/pages/blog.html
rename to website/doctype/blog_post/templates/blog.html
diff --git a/website/templates/html/blog_page.html b/website/doctype/blog_post/templates/blog_post.html
similarity index 100%
rename from website/templates/html/blog_page.html
rename to website/doctype/blog_post/templates/blog_post.html
diff --git a/website/templates/html/blog_footer.html b/website/doctype/blog_post/templates/includes/blog_footer.html
similarity index 100%
rename from website/templates/html/blog_footer.html
rename to website/doctype/blog_post/templates/includes/blog_footer.html
diff --git a/website/templates/html/blog_subscribe.html b/website/doctype/blog_post/templates/includes/blog_subscribe.html
similarity index 100%
rename from website/templates/html/blog_subscribe.html
rename to website/doctype/blog_post/templates/includes/blog_subscribe.html
diff --git a/website/templates/html/blogger.html b/website/doctype/blog_post/templates/includes/blogger.html
similarity index 100%
rename from website/templates/html/blogger.html
rename to website/doctype/blog_post/templates/includes/blogger.html
diff --git a/website/templates/html/comment.html b/website/doctype/blog_post/templates/includes/comment.html
similarity index 100%
rename from website/templates/html/comment.html
rename to website/doctype/blog_post/templates/includes/comment.html
diff --git a/website/templates/pages/writers.html b/website/doctype/blogger/templates/writers.html
similarity index 100%
rename from website/templates/pages/writers.html
rename to website/doctype/blogger/templates/writers.html
diff --git a/website/helpers/cart.py b/website/helpers/cart.py
deleted file mode 100644
index fc7d062..0000000
--- a/website/helpers/cart.py
+++ /dev/null
@@ -1,462 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import webnotes
-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()
-	webnotes.add_cookies["cart_count"] = cstr(len(quotation.doclist.get(
-		{"parentfield": "quotation_details"})) or "")
-
-@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 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.add_cookies["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 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 = webnotes.load_json(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 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
-		
-	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.cookies[b"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/website/helpers/contact.py b/website/helpers/contact.py
deleted file mode 100644
index 35446a3..0000000
--- a/website/helpers/contact.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-
-import webnotes
-from webnotes.utils import now
-
-max_communications_per_hour = 300
-
-@webnotes.whitelist(allow_guest=True)
-def send_message(subject="Website Query", message="", sender="", status="Open"):
-	if not message:
-		webnotes.response["message"] = 'Please write something'
-		return
-		
-	if not sender:
-		webnotes.response["message"] = 'Email Id Required'
-		return
-
-	# make lead / communication
-	from selling.doctype.lead.get_leads import add_sales_communication
-	message = add_sales_communication(subject or "Website Query", message, sender, sender, 
-		mail=None, status=status)
-	
-	# guest method, cap max writes per hour
-	if webnotes.conn.sql("""select count(*) from `tabCommunication`
-		where TIMEDIFF(%s, modified) < '01:00:00'""", now())[0][0] > max_communications_per_hour:
-		webnotes.response["message"] = "Sorry: we believe we have received an unreasonably high number of requests of this kind. Please try later"
-		return
-	
-	webnotes.response.status = "okay"
diff --git a/website/helpers/product.py b/website/helpers/product.py
deleted file mode 100644
index 031339a..0000000
--- a/website/helpers/product.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
-# 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 build_html, delete_page_cache
-from website.helpers.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.cookies.get("selling_price_list").value
-
-	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, ref_currency from
-		`tabItem Price` where parent=%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["ref_currency"])
-		
-		price["ref_currency"] = not cint(webnotes.conn.get_default("hide_currency_symbol")) \
-			and (webnotes.conn.get_value("Currency", price.ref_currency, "symbol") or price.ref_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(r):
-	scrub_item_for_list(r)
-	r.template = "app/website/templates/html/product_in_grid.html"
-	return build_html(r)
-
-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
diff --git a/website/helpers/transaction.py b/website/helpers/transaction.py
deleted file mode 100644
index 8943575..0000000
--- a/website/helpers/transaction.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import webnotes
-from webnotes.utils import cint, formatdate
-import json
-
-def get_transaction_list(doctype, start):
-	# find customer id
-	customer = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user}, 
-		"customer")
-		
-	if customer:
-		transactions = webnotes.conn.sql("""select name, creation, currency, grand_total_export 
-			from `tab%s` where customer=%s and docstatus=1
-			order by creation desc
-			limit %s, 20""" % (doctype, "%s", "%s"), (customer, cint(start)), as_dict=True)
-		for doc in transactions:
-			doc.items = ", ".join(webnotes.conn.sql_list("""select item_name
-				from `tab%s Item` where parent=%s limit 5""" % (doctype, "%s"), doc.name))
-			doc.creation = formatdate(doc.creation)
-		return transactions
-	else:
-		return []
-		
-def get_common_args():
-	return {
-		"global_number_format": webnotes.conn.get_default("number_format") or "#,###.##",
-		"currency": webnotes.conn.get_default("currency"),
-		"currency_symbols": json.dumps(dict(webnotes.conn.sql("""select name, symbol
-			from tabCurrency where ifnull(enabled,0)=1""")))
-	}
-
-@webnotes.whitelist()
-def get_orders(start=0):
-	return get_transaction_list("Sales Order", start)
-		
-def order_list_args():
-	args = get_common_args()
-	args.update({
-		"title": "My Orders",
-		"method": "website.helpers.transaction.get_orders",
-		"icon": "icon-list",
-		"empty_list_message": "No Orders Yet",
-		"page": "order",
-	})
-	return args
-
-@webnotes.whitelist()
-def get_invoices(start=0):
-	return get_transaction_list("Sales Invoice", start)
-
-def invoice_list_args():
-	args = get_common_args()
-	args.update({
-		"title": "Invoices",
-		"method": "website.helpers.transaction.get_invoices",
-		"icon": "icon-file-text",
-		"empty_list_message": "No Invoices Found",
-		"page": "invoice"
-	})
-	return args
-
-@webnotes.whitelist()
-def get_shipments(start=0):
-	return get_transaction_list("Delivery Note", start)
-
-def shipment_list_args():
-	args = get_common_args()
-	args.update({
-		"title": "Shipments",
-		"method": "website.helpers.transaction.get_shipments",
-		"icon": "icon-truck",
-		"empty_list_message": "No Shipments Found",
-		"page": "shipment"
-	})
-	return args
-	
-@webnotes.whitelist()
-def get_tickets(start=0):
-	tickets = webnotes.conn.sql("""select name, subject, status, creation 
-		from `tabSupport Ticket` where raised_by=%s 
-		order by modified desc
-		limit %s, 20""", (webnotes.session.user, cint(start)), as_dict=True)
-	for t in tickets:
-		t.creation = formatdate(t.creation)
-	
-	return tickets
-	
-def ticket_list_args():
-	return {
-		"title": "My Tickets",
-		"method": "website.helpers.transaction.get_tickets",
-		"icon": "icon-ticket",
-		"empty_list_message": "No Tickets Raised",
-		"page": "ticket"
-	}
-	
-def get_transaction_args(doctype, name):
-	customer = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user}, 
-		"customer")
-		
-	bean = webnotes.bean(doctype, name)
-	if bean.doc.customer != customer:
-		return {
-			"doc": {"name": "Not Allowed"}
-		}
-	else:
-		return {
-			"doc": bean.doc,
-			"doclist": bean.doclist,
-			"webnotes": webnotes,
-			"utils": webnotes.utils
-		}
-
-def get_order_args():	
-	args = get_transaction_args("Sales Order", webnotes.form_dict.name)
-	args.update({
-		"parent_link": "orders",
-		"parent_title": "My Orders"
-	})
-	return args
-	
-def get_invoice_args():
-	args = get_transaction_args("Sales Invoice", webnotes.form_dict.name)
-	args.update({
-		"parent_link": "invoices",
-		"parent_title": "Invoices"
-	})
-	return args
-
-def get_shipment_args():
-	args = get_transaction_args("Delivery Note", webnotes.form_dict.name)
-	args.update({
-		"parent_link": "shipments",
-		"parent_title": "Shipments"
-	})
-	return args
diff --git a/website/templates/html/partner_page.html b/website/templates/html/partner_page.html
deleted file mode 100644
index e5aac35..0000000
--- a/website/templates/html/partner_page.html
+++ /dev/null
@@ -1,26 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% block content %}
-	<div class="col-md-12" itemscope itemtype="http://schema.org/Organization">
-		<div class="row">
-			<div class="col-md-4">
-				{% if logo -%}
-				<img itemprop="brand" src="{{ logo }}" class="partner-logo" 
-					alt="{{ partner_name }}" title="{{ partner_name }}" />
-				<br><br>
-				{%- endif %}
-				<address>
-					{% if partner_website -%}<p><a href="{{ partner_website }}" 
-						target="_blank">{{ partner_website }}</a></p>{%- endif %}
-					{% if partner_address -%}<p itemprop="address">{{ partner_address }}</p>{%- endif %}
-					{% if phone -%}<p itemprop="telephone">{{ phone }}</p>{%- endif %}
-					{% if email -%}<p itemprop="email"><span class="icon-envelope"></span> {{ email }}</p>{%- endif %}
-				</address>
-			</div>
-			<div class="col-md-8">
-				<h3 itemprop="name" style="margin-top: 0px;">{{ partner_name }}</h3>
-				<p>{{ description }}</p>
-			</div>
-		</div>
-	</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/html/product_breadcrumbs.html b/website/templates/html/product_breadcrumbs.html
deleted file mode 100644
index 6d26748..0000000
--- a/website/templates/html/product_breadcrumbs.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{% if obj.parent_groups and len(obj.parent_groups) > 1 %}
-<div class="col-md-12">
-	<div class="clearfix">
-		<ul class="breadcrumb">
-			{% for ig in obj.parent_groups[:-1] %}
-			<li><a href="{{ ig.page_name }}.html">{{ ig.name }}</a></li>
-			{% endfor %}
-			<li class="active">{{ obj.parent_groups[-1].name }}</li>
-		</ul>
-	</div>
-</div>
-{% endif %}
\ No newline at end of file
diff --git a/website/templates/html/product_group.html b/website/templates/html/product_group.html
deleted file mode 100644
index 4bf52c5..0000000
--- a/website/templates/html/product_group.html
+++ /dev/null
@@ -1,42 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% block content %}
-{% include 'app/website/templates/html/product_search_box.html' %}
-{% include 'app/website/templates/html/product_breadcrumbs.html' %}
-<div class="col-md-12">
-	{% if slideshow %}<!-- slideshow -->
-	{% include "app/website/templates/html/slideshow.html" %}
-	{% endif %}
-	{% if description %}<!-- description -->
-	<div>{{ description or ""}}</div>
-	{% else %}
-	<h3>{{ name }}</h3>
-	{% endif %}
-</div>
-<div class="col-md-12">
-	{% if sub_groups %}
-	<hr />
-	<div class="row">
-	{% for d in sub_groups %}
-		<div class="col-md-4">
-			<a href="{{ d.page_name }}">{{ d.name }} ({{ d.count }})</a>
-		</div>
-	{% endfor %}
-	</div>
-	<hr />
-	{% endif %}
-	{% if items %}
-	<div id="search-list" class="row">
-		{% for item in items %}
-			{{ item }}
-		{% endfor %}
-	</div>
-		{% if len(items)==100 %}
-			<div class="alert info">Showing top 100 items.</div>
-		{% endif %}
-	{% else %}
-		<div class="alert">No items listed.</div>
-	{% endif %}
-</div>
-
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/html/product_in_grid.html b/website/templates/html/product_in_grid.html
deleted file mode 100644
index adb2f74..0000000
--- a/website/templates/html/product_in_grid.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<div class="col-md-3">
-	<div style="height: 120px; overflow: hidden;">
-		<a href="{{ page_name }}">
-		{%- if website_image -%}
-		<img class="product-image" style="width: 80%; margin: auto;" src="{{ website_image }}">
-		{%- else -%}
-		{% include 'app/website/templates/html/product_missing_image.html' %}
-		{%- endif -%}
-		</a>
-	</div>
-	<div style="height: 100px; overflow: hidden; font-size: 80%;">
-		<h4 style="margin-bottom: 2px;"><a href="{{ page_name }}">{{ item_name }}</a></h4>
-	</div>
-</div>
\ No newline at end of file
diff --git a/website/templates/html/product_in_list.html b/website/templates/html/product_in_list.html
deleted file mode 100644
index b3e5b86..0000000
--- a/website/templates/html/product_in_list.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- TODO product listing -->
-<div class="col-md-12">
-	<div style="height: 120px; overflow: hidden;">
-		<a href="{{ page_name }}">
-		{%- if website_image -%}
-		<img class="product-image" style="width: 80%; margin: auto;" src="{{ website_image }}">
-		{%- else -%}
-		{% include 'app/website/templates/html/product_missing_image.html' %}
-		{%- endif -%}
-		</a>
-	</div>
-	<div style="height: 100px; overflow: hidden; font-size: 80%;">
-		<h4 style="margin-bottom: 2px;"><a href="{{ page_name }}">{{ item_name }}</a></h4>
-	</div>
-</div>
\ No newline at end of file
diff --git a/website/templates/html/product_missing_image.html b/website/templates/html/product_missing_image.html
deleted file mode 100644
index 81b8935..0000000
--- a/website/templates/html/product_missing_image.html
+++ /dev/null
@@ -1 +0,0 @@
-<div class="missing-image"><i class="icon-camera"></i></div>
\ No newline at end of file
diff --git a/website/templates/html/product_page.html b/website/templates/html/product_page.html
deleted file mode 100644
index 5ac0b48..0000000
--- a/website/templates/html/product_page.html
+++ /dev/null
@@ -1,74 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% block javascript %}
-	{% include "app/website/templates/js/product_page.js" %}
-{% endblock %}
-
-{% block css %}
-	{% include "app/website/templates/css/product_page.css" %}
-{% endblock %}
-
-{% block content %}
-	{% include 'app/website/templates/html/product_search_box.html' %}
-	{% include 'app/website/templates/html/product_breadcrumbs.html' %}
-	<div class="col-md-12 product-page-content" itemscope itemtype="http://schema.org/Product">
-		<div class="row">
-			<div class="col-md-6">
-				{% if slideshow %}
-					{% include "app/website/templates/html/slideshow.html" %}
-				{% else %}
-					{% if website_image %}
-					<image itemprop="image" class="item-main-image"
-						src="{{ website_image }}" />
-					{% else %}
-					<div class="img-area">
-						{% include 'app/website/templates/html/product_missing_image.html' %}
-					</div>
-					{% endif %}
-				{% endif %}
-			</div>
-			<div class="col-md-6">
-				<h3 itemprop="name" style="margin-top: 0px;">{{ item_name }}</h3>
-				<p class="help">Item Code: <span itemprop="productID">{{ name }}</span></p>
-				<h4>Product Description</h4>
-				<div itemprop="description">
-				{{ web_long_description or description or "[No description given]" }}
-				</div>
-				<div style="min-height: 100px; margin: 10px 0;">
-					<div class="item-price-info" style="display: none;">
-						<h4 class="item-price" itemprop="price"></h4>
-						<div class="item-stock" itemprop="availablity"></div>
-						<div id="item-add-to-cart">
-							<button class="btn btn-primary">
-								<i class="icon-shopping-cart"></i> Add to Cart</button>
-						</div>
-						<div id="item-update-cart" class="input-group col-md-4" style="display: none;
-							padding-left: 0px; padding-right: 0px;">
-							<input class="form-control" type="text">
-							<div class="input-group-btn">
-								<button class="btn btn-primary">
-									<i class="icon-ok"></i></button>
-							</div>
-						</div>
-					</div>
-				</div>
-			</div>
-		</div>
-		{% if obj.doclist.get({"doctype":"Item Website Specification"}) -%}
-		<div class="row" style="margin-top: 20px">
-			<div class="col-md-12">
-				<h4>Specifications</h4>
-				<table class="table table-bordered" style="width: 100%">
-				{% for d in obj.doclist.get(
-					{"doctype":"Item Website Specification"}) -%}
-					<tr>
-						<td style="width: 30%;">{{ d.label }}</td>
-						<td>{{ d.description }}</td>
-					</tr>
-				{%- endfor %}
-				</table>
-			</div>
-		</div>
-		{%- endif %}
-	</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/html/product_search_box.html b/website/templates/html/product_search_box.html
deleted file mode 100644
index d808bf6..0000000
--- a/website/templates/html/product_search_box.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<div class="col-md-12 clearfix">
-	<div class="pull-right" style="margin-top: 15px; margin-bottom: 15px;">
-		<form class="form-search">
-			<div class="input-group col-md-4 col-md-offset-8">
-				<input class="form-control" type="text" id="product-search" placeholder="Product Search...">
-				<span class="input-group-btn">
-					<button class="btn btn-default" type="button" id="btn-product-search">
-						<i class="icon-search"></i></button>
-				</span>
-			</div>
-		</form>
-	</div>
-	<script>
-		// redirect to product search page
-		$(document).ready(function() {
-			$('.dropdown-toggle').dropdown()
-			$("#btn-product-search").click(function() {
-				var txt = $("#product-search").val();
-				if(txt) {
-					window.location.href="product_search.html?q=" + txt;
-				}
-				return false;
-			});
-			$("#product-search").keypress(function(e) {
-				if(e.which==13) $("#product-search-btn").click();
-			})
-		})
-	</script>
-</div>
\ No newline at end of file
diff --git a/website/templates/js/blog_page.js b/website/templates/js/blog_page.js
index 665dbf4..3d45925 100644
--- a/website/templates/js/blog_page.js
+++ b/website/templates/js/blog_page.js
@@ -14,6 +14,7 @@
 			.parent().append("<div class='alert alert-warning'>Comments are closed.</div>")
 	}
 	$(".add-comment").click(function() {
+		$(this).toggle(false);
 		$("#comment-form").toggle();
 		$("#comment-form input, #comment-form, textarea").val("");
 	})
diff --git a/website/templates/js/cart.js b/website/templates/js/cart.js
index 20090ca..63c6463 100644
--- a/website/templates/js/cart.js
+++ b/website/templates/js/cart.js
@@ -7,7 +7,7 @@
 	wn.cart.bind_events();
 	return wn.call({
 		type: "POST",
-		method: "website.helpers.cart.get_cart_quotation",
+		method: "selling.utils.cart.get_cart_quotation",
 		callback: function(r) {
 			console.log(r);
 			$("#cart-container").removeClass("hide");
@@ -194,7 +194,7 @@
 		return wn.call({
 			btn: btn,
 			type: "POST",
-			method: "website.helpers.cart.apply_shipping_rule",
+			method: "selling.utils.cart.apply_shipping_rule",
 			args: { shipping_rule: rule },
 			callback: function(r) {
 				if(!r.exc) {
@@ -242,7 +242,7 @@
 				
 				return wn.call({
 					type: "POST",
-					method: "website.helpers.cart.update_cart_address",
+					method: "selling.utils.cart.update_cart_address",
 					args: {
 						address_fieldname: $address_wrapper.attr("data-fieldname"),
 						address_name: $(this).attr("data-address-name")
@@ -273,7 +273,7 @@
 	place_order: function() {
 		return wn.call({
 			type: "POST",
-			method: "website.helpers.cart.place_order",
+			method: "selling.utils.cart.place_order",
 			callback: function(r) {
 				if(r.exc) {
 					var msg = "";
diff --git a/website/templates/js/product_list.js b/website/templates/js/product_list.js
index 729499c..2856bde 100644
--- a/website/templates/js/product_list.js
+++ b/website/templates/js/product_list.js
@@ -15,7 +15,7 @@
 		url: "server.py",
 		dataType: "json",
 		data: {
-			cmd: "website.helpers.product.get_product_list",
+			cmd: "selling.utils.product.get_product_list",
 			start: window.start,
 			search: window.search,
 			product_group: window.product_group
diff --git a/website/templates/js/product_page.js b/website/templates/js/product_page.js
index b8c65ec..b2a122e 100644
--- a/website/templates/js/product_page.js
+++ b/website/templates/js/product_page.js
@@ -7,7 +7,7 @@
 	
 	wn.call({
 		type: "POST",
-		method: "website.helpers.product.get_product_info",
+		method: "selling.utils.product.get_product_info",
 		args: {
 			item_code: "{{ name }}"
 		},
diff --git a/website/templates/pages/address.html b/website/templates/pages/address.html
index 6544b12..6d4273c 100644
--- a/website/templates/pages/address.html
+++ b/website/templates/pages/address.html
@@ -89,7 +89,7 @@
 			wn.call({
 				btn: $(this),
 				type: "POST",
-				method: "website.helpers.cart.save_address",
+				method: "selling.utils.cart.save_address",
 				args: { fields: fields, address_fieldname: get_url_arg("address_fieldname") },
 				callback: function(r) {
 					if(r.exc) {
diff --git a/website/templates/pages/addresses.html b/website/templates/pages/addresses.html
index 04fc47b..b19780a 100644
--- a/website/templates/pages/addresses.html
+++ b/website/templates/pages/addresses.html
@@ -26,7 +26,7 @@
 	
 	var fetch_addresses = function() {
 		wn.call({
-			method: "website.helpers.cart.get_addresses",
+			method: "selling.utils.cart.get_addresses",
 			callback: function(r) {
 				$("#address-list .progress").remove();
 				var $list = $("#address-list");
diff --git a/website/templates/pages/messages.html b/website/templates/pages/messages.html
deleted file mode 100644
index e1ea8d0..0000000
--- a/website/templates/pages/messages.html
+++ /dev/null
@@ -1,31 +0,0 @@
-{% extends "app/website/templates/html/transactions.html" %}
-
-{% block javascript -%}
-{{ super() }}
-
-var render = function(doc) {
-	doc.sender = doc.sender ? doc.sender : "To ";
-	doc.recipients = doc.recipients ? (" to " + doc.recipients) : "";
-	doc.content = remove_script_and_style(doc.content);
-	
-	if(!is_html(doc.content)) {
-		doc.content = doc.content.replace("\n", "<br>");
-	}
-		
-	$(repl('<a class="list-group-item">\
-			<div class="row col-md-12">%(subject)s</div>\
-			<div class="row text-muted">\
-				<div class="col-md-6">%(sender)s%(recipients)s</div>\
-				<div class="col-md-6 text-right">%(creation)s</div>\
-			</div>\
-			<div class="row col-md-12 msg-content" style="display: none;"><hr>%(content)s</div>\
-		</a>', doc))
-		.appendTo($list)
-		.on("click", function() {
-			$(this).find(".msg-content").toggle();
-		});
-	
-	
-}
-
-{%- endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/partners.html b/website/templates/pages/partners.html
deleted file mode 100644
index 50a095d..0000000
--- a/website/templates/pages/partners.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% set title="Partners" %}
-
-{% block content %}
-	<div class="col-md-12">
-		<h2 id="blog-title">{{ title }}</h2>
-		<hr>
-		{% for partner_info in partners %}
-		<div class="row">
-			<div class="col-md-3">
-				{% if partner_info.logo -%}
-				<a href="{{ partner_info.page_name }}">
-					<img itemprop="brand" src="{{ partner_info.logo }}" class="partner-logo" 
-						alt="{{ partner_info.partner_name }}" title="{{ partner_info.partner_name }}" />
-				</a>
-				{%- endif %}
-			</div>
-			<div class="col-md-9">
-				<a href="{{ partner_info.page_name }}">
-					<h4>{{ partner_info.partner_name }}</h4>
-				</a>
-				<p style="color: #999">{{ partner_info.territory }} - {{ partner_info.partner_type }}</p>
-				<p>{{ partner_info.introduction }}</p>
-			</div>
-		</div>
-		<hr>
-		{% endfor %}
-	</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/product_search.html b/website/templates/pages/product_search.html
deleted file mode 100644
index e969f75..0000000
--- a/website/templates/pages/product_search.html
+++ /dev/null
@@ -1,33 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% set title="Product Search" %}
-
-{% block javascript %}
-{% include "app/website/templates/js/product_list.js" %}
-{% endblock %}
-
-{% block content %}
-<script>
-$(document).ready(function() {
-	var txt = get_url_arg("q");
-	$(".search-results").html("Search results for: " + txt);
-	window.search = txt;
-	window.start = 0;
-	window.get_product_list();
-});
-</script>
-
-{% include 'app/website/templates/html/product_search_box.html' %}
-<div class="col-md-12">
-	<h3 class="search-results">Search Results</h3>
-	<div id="search-list" class="row">
-		
-	</div>
-	<div style="text-align: center;">
-		<div class="more-btn" 
-			style="display: none; text-align: center;">
-			<button class="btn">More...</button>
-		</div>
-	</div>
-</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/ticket.html b/website/templates/pages/ticket.html
deleted file mode 100644
index 6622ed1..0000000
--- a/website/templates/pages/ticket.html
+++ /dev/null
@@ -1,67 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% set title=doc.name %}
-
-{% set status_label = {
-	"Open": "label-success",
-	"To Reply": "label-danger",
-	"Closed": "label-default"
-} %}
-
-{% block content %}
-<div class="col-md-12">
-    <ul class="breadcrumb">
-    	<li><a href="index">Home</a></li>
-    	<li><a href="account">My Account</a></li>
-    	<li><a href="tickets">My Tickets</a></li>
-    	<li class="active"><i class="icon-ticket icon-fixed-width"></i> {{ doc.name }}</li>
-    </ul>
-	<h3><i class="icon-ticket icon-fixed-width"></i> {{ doc.name }}</h3>
-	{% if doc.name == "Not Allowed" -%}
-		<script>ask_to_login();</script>
-	{% else %}
-	<hr>
-	{%- if doc.status -%}
-	{% if doc.status == "Waiting for Customer" -%}
-		{% set status = "To Reply" %}
-	{% else %}
-		{% set status = doc.status %}
-	{%- endif -%}
-	<div class="row">
-		<div class="col-md-2" style="margin-bottom: 7px;">
-			<span class="label {{ status_label.get(status) or 'label-default' }}">{{ status }}</span>
-		</div>
-		<div class="col-md-8">
-			<div class="row col-md-12">{{ doc.subject }}</div>
-		</div>
-		<div class="col-md-2 pull-right">
-			<span class="text-muted">{{ utils.formatdate(doc.creation) }}</span>
-		</div>
-	</div>
-	<br>
-	<h4>Messages</h4>
-	{%- if doclist.get({"doctype":"Communication"}) -%}
-	<div>
-		<table class="table table-bordered table-striped">
-			<tbody>
-				{%- for comm in doclist.get({"doctype":"Communication"}) %}
-				<tr>
-					<td>
-					<h5 style="text-transform: none">
-						{{ comm.sender }} on {{ utils.formatdate(doc.modified) }}</h5>
-					<hr>
-					<p>{{ webnotes.utils.is_html(comm.content) and comm.content or
-						comm.content.replace("\n", "<br>")}}</p>
-					</td>
-				</tr>
-				{% endfor -%}
-			</tbody>
-		</table>
-	</div>
-	{%- else -%}
-	<div class="alert">No messages</div>
-	{%- endif -%}
-	{%- endif -%}
-	{% endif -%}
-</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/tickets.html b/website/templates/pages/tickets.html
deleted file mode 100644
index 166dbcd..0000000
--- a/website/templates/pages/tickets.html
+++ /dev/null
@@ -1,31 +0,0 @@
-{% extends "app/website/templates/html/transactions.html" %}
-
-{% block javascript -%}
-{{ super() }}
-
-var status_label = {
-	"Open": "label-success",
-	"Waiting for Customer": "label-danger",
-	"Closed": "label-default"
-}
-
-var render = function(doc) {
-	doc.status = doc.status.trim();
-	doc.label_class = status_label[doc.status] || "label-default";
-	if(doc.status==="Waiting for Customer") doc.status = "To Reply";
-	
-	$(repl('<a href="{{ page }}?name=%(name)s" class="list-group-item">\
-			<div class="row">\
-				<div class="col-md-2" style="margin-bottom: 7px;"><span class="label %(label_class)s">\
-					%(status)s</span></div>\
-				<div class="col-md-8">\
-					<div class="row col-md-12">%(name)s</div>\
-					<div class="row col-md-12 text-muted">%(subject)s</div>\
-				</div>\
-				<div class="col-md-2 pull-right">\
-					<span class="text-muted">%(creation)s</span>\
-				</div>\
-			</div>\
-		</a>', doc)).appendTo($list);
-};
-{%- endblock %}
\ No newline at end of file
