diff --git a/erpnext/utilities/page/__init__.py b/erpnext/utilities/page/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/utilities/page/__init__.py
+++ /dev/null
diff --git a/erpnext/utilities/page/leaderboard/__init__.py b/erpnext/utilities/page/leaderboard/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/utilities/page/leaderboard/__init__.py
+++ /dev/null
diff --git a/erpnext/utilities/page/leaderboard/leaderboard.css b/erpnext/utilities/page/leaderboard/leaderboard.css
deleted file mode 100644
index 1f4fc51..0000000
--- a/erpnext/utilities/page/leaderboard/leaderboard.css
+++ /dev/null
@@ -1,54 +0,0 @@
-.list-filters {
-	overflow-y: hidden;
-	padding: 5px
-}
-
-.list-filter-item {
-	min-width: 150px;
-	float: left;
-	margin:5px;
-}
-
-.list-item_content{
-	flex: 1;
-	padding-right: 15px;
-	align-items: center;
-}
-
-.select-time, .select-doctype, .select-filter, .select-sort {
-	background: #f0f4f7;
-}
-
-.select-time:focus, .select-doctype:focus, .select-filter:focus, .select-sort:focus {
-	background: #f0f4f7;
-}
-
-.header-btn-base{
-	border:none;
-	outline:0;
-	vertical-align:middle;
-	overflow:hidden;
-	text-decoration:none;
-	color:inherit;
-	background-color:inherit;
-	cursor:pointer;
-	white-space:nowrap;
-}
-
-.header-btn-grey,.header-btn-grey:hover{
-	color:#000!important;
-	background-color:#bbb!important
-}
-
-.header-btn-round{
-	border-radius:4px
-}
-
-.item-title-bold{
-	font-weight: bold;
-}
-
-/*
-.header-btn-base:hover {
-	box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)
-}*/
diff --git a/erpnext/utilities/page/leaderboard/leaderboard.js b/erpnext/utilities/page/leaderboard/leaderboard.js
deleted file mode 100644
index 43d0e6e..0000000
--- a/erpnext/utilities/page/leaderboard/leaderboard.js
+++ /dev/null
@@ -1,307 +0,0 @@
-frappe.pages["leaderboard"].on_page_load = function (wrapper) {
-	frappe.leaderboard = new frappe.Leaderboard(wrapper);
-}
-
-frappe.Leaderboard = Class.extend({
-
-	init: function (parent) {
-		frappe.ui.make_app_page({
-			parent: parent,
-			title: "Leaderboard",
-			single_column: false
-		});
-
-		this.parent = parent;
-		this.page = this.parent.page;
-		this.page.sidebar.html(`<ul class="module-sidebar-nav overlay-sidebar nav nav-pills nav-stacked"></ul>`);
-		this.$sidebar_list = this.page.sidebar.find('ul');
-
-		// const list of doctypes
-		this.doctypes = ["Customer", "Item", "Supplier", "Sales Partner","Sales Person"];
-		this.timespans = ["Week", "Month", "Quarter", "Year"];
-		this.filters = {
-			"Customer": ["total_sales_amount", "total_qty_sold", "outstanding_amount", ],
-			"Item": ["total_sales_amount", "total_qty_sold", "total_purchase_amount",
-				"total_qty_purchased", "available_stock_qty", "available_stock_value"],
-			"Supplier": ["total_purchase_amount", "total_qty_purchased", "outstanding_amount"],
-			"Sales Partner": ["total_sales_amount", "total_commission"],
-			"Sales Person": ["total_sales_amount"],
-		};
-
-		// for saving current selected filters
-		// TODO: revert to 0 index for doctype and timespan, and remove preset down
-		const _initial_doctype = this.doctypes[0];
-		const _initial_timespan = this.timespans[0];
-		const _initial_filter = this.filters[_initial_doctype];
-
-		this.options = {
-			selected_doctype: _initial_doctype,
-			selected_filter: _initial_filter,
-			selected_filter_item: _initial_filter[0],
-			selected_timespan: _initial_timespan,
-		};
-
-		this.message = null;
-		this.make();
-	},
-
-	make: function () {
-		var me = this;
-
-		var $container = $(`<div class="leaderboard page-main-content">
-			<div class="leaderboard-graph"></div>
-			<div class="leaderboard-list"></div>
-		</div>`).appendTo(this.page.main);
-
-		this.$graph_area = $container.find('.leaderboard-graph');
-
-		this.doctypes.map(doctype => {
-			this.get_sidebar_item(doctype).appendTo(this.$sidebar_list);
-		});
-
-		this.company_select = this.page.add_field({
-			fieldname: 'company',
-			label: __('Company'),
-			fieldtype:'Link',
-			options:'Company',
-			default:frappe.defaults.get_default('company'),
-			reqd: 1,
-			change: function() {
-				me.options.selected_company = this.value;
-				me.make_request($container);
-			}
-		});
-		this.timespan_select = this.page.add_select(__("Timespan"),
-			this.timespans.map(d => {
-				return {"label": __(d), value: d }
-			})
-		);
-
-		this.type_select = this.page.add_select(__("Type"),
-			me.options.selected_filter.map(d => {
-				return {"label": __(frappe.model.unscrub(d)), value: d }
-			})
-		);
-
-		this.$sidebar_list.on('click', 'li', function(e) {
-			let $li = $(this);
-			let doctype = $li.find('span').attr("doctype-value");
-
-			me.options.selected_company = frappe.defaults.get_default('company');
-			me.options.selected_doctype = doctype;
-			me.options.selected_filter = me.filters[doctype];
-			me.options.selected_filter_item = me.filters[doctype][0];
-
-			me.type_select.empty().add_options(
-				me.options.selected_filter.map(d => {
-					return {"label": __(frappe.model.unscrub(d)), value: d }
-				})
-			);
-
-			me.$sidebar_list.find('li').removeClass('active');
-			$li.addClass('active');
-
-			me.make_request($container);
-		});
-
-		this.timespan_select.on("change", function() {
-			me.options.selected_timespan = this.value;
-			me.make_request($container);
-		});
-
-		this.type_select.on("change", function() {
-			me.options.selected_filter_item = this.value
-			me.make_request($container);
-		});
-
-		// now get leaderboard
-		this.$sidebar_list.find('li:first').trigger('click');
-	},
-
-	make_request: function ($container) {
-		var me = this;
-
-		frappe.model.with_doctype(me.options.selected_doctype, function () {
-			me.get_leaderboard(me.get_leaderboard_data, $container);
-		});
-	},
-
-	get_leaderboard: function (notify, $container) {
-		var me = this;
-		if(!me.options.selected_company) {
-			frappe.throw(__("Please select Company"));
-		}
-		frappe.call({
-			method: "erpnext.utilities.page.leaderboard.leaderboard.get_leaderboard",
-			args: {
-				doctype: me.options.selected_doctype,
-				timespan: me.options.selected_timespan,
-				company: me.options.selected_company,
-				field: me.options.selected_filter_item,
-			},
-			callback: function (r) {
-				let results = r.message || [];
-
-				let graph_items = results.slice(0, 10);
-
-				me.$graph_area.show().empty();
-				let args = {
-					data: {
-						datasets: [
-							{
-								values: graph_items.map(d=>d.value)
-							}
-						],
-						labels: graph_items.map(d=>d.name)
-					},
-					colors: ['light-green'],
-					format_tooltip_x: d=>d[me.options.selected_filter_item],
-					type: 'bar',
-					height: 140
-				};
-				new frappe.Chart('.leaderboard-graph', args);
-
-				notify(me, r, $container);
-			}
-		});
-	},
-
-	get_leaderboard_data: function (me, res, $container) {
-		if (res && res.message) {
-			me.message = null;
-			$container.find(".leaderboard-list").html(me.render_list_view(res.message));
-		} else {
-			me.$graph_area.hide();
-			me.message = __("No items found.");
-			$container.find(".leaderboard-list").html(me.render_list_view());
-		}
-	},
-
-	render_list_view: function (items = []) {
-		var me = this;
-
-		var html =
-			`${me.render_message()}
-			 <div class="result" style="${me.message ? "display:none;" : ""}">
-			 	${me.render_result(items)}
-			 </div>`;
-
-		return $(html);
-	},
-
-	render_result: function (items) {
-		var me = this;
-
-		var html =
-			`${me.render_list_header()}
-			${me.render_list_result(items)}`;
-
-		return html;
-	},
-
-	render_list_header: function () {
-		var me = this;
-		const _selected_filter = me.options.selected_filter
-			.map(i => frappe.model.unscrub(i));
-		const fields = ['name', me.options.selected_filter_item];
-
-		const html =
-			`<div class="list-headers">
-				<div class="list-item list-item--head" data-list-renderer="${"List"}">
-					${
-					fields.map(filter => {
-							const col = frappe.model.unscrub(filter);
-							return (
-								`<div class="leaderboard-item list-item_content ellipsis text-muted list-item__content--flex-2
-									header-btn-base
-									${(col && _selected_filter.indexOf(col) !== -1) ? "text-right" : ""}">
-									<span class="list-col-title ellipsis">
-										${col}
-									</span>
-								</div>`);
-						}).join("")
-					}
-				</div>
-			</div>`;
-		return html;
-	},
-
-	render_list_result: function (items) {
-		var me = this;
-
-		let _html = items.map((item, index) => {
-			const $value = $(me.get_item_html(item));
-
-			let item_class = "";
-			if(index == 0) {
-				item_class = "first";
-			} else if (index == 1) {
-				item_class = "second";
-			} else if(index == 2) {
-				item_class = "third";
-			}
-			const $item_container = $(`<div class="list-item-container  ${item_class}">`).append($value);
-			return $item_container[0].outerHTML;
-		}).join("");
-
-		let html =
-			`<div class="result-list">
-				<div class="list-items">
-					${_html}
-				</div>
-			</div>`;
-
-		return html;
-	},
-
-	render_message: function () {
-		var me = this;
-
-		let html =
-			`<div class="no-result text-center" style="${me.message ? "" : "display:none;"}">
-				<div class="msg-box no-border">
-					<p>No Item found</p>
-				</div>
-			</div>`;
-
-		return html;
-	},
-
-	get_item_html: function (item) {
-		var me = this;
-		const company = me.options.selected_company;
-		const currency = frappe.get_doc(":Company", company).default_currency;
-		const fields = ['name','value'];
-
-		const html =
-			`<div class="list-item">
-				${
-			fields.map(col => {
-					let val = item[col];
-					if(col=="name") {
-						var formatted_value = `<a class="grey list-id ellipsis"
-							href="#Form/${me.options.selected_doctype}/${item["name"]}"> ${val} </a>`
-					} else {
-						var formatted_value = `<span class="text-muted ellipsis">
-							${(me.options.selected_filter_item.indexOf('qty') == -1) ? format_currency(val, currency) : val}</span>`
-					}
-
-					return (
-						`<div class="list-item_content ellipsis list-item__content--flex-2
-							${(col == "value") ? "text-right" : ""}">
-							${formatted_value}
-						</div>`);
-					}).join("")
-				}
-			</div>`;
-
-		return html;
-	},
-
-	get_sidebar_item: function(item) {
-		return $(`<li class="strong module-sidebar-item">
-			<a class="module-link">
-			<span doctype-value="${item}">${ __(item) }</span></a>
-		</li>`);
-	}
-});
diff --git a/erpnext/utilities/page/leaderboard/leaderboard.json b/erpnext/utilities/page/leaderboard/leaderboard.json
deleted file mode 100644
index 8ccef7d..0000000
--- a/erpnext/utilities/page/leaderboard/leaderboard.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "content": null, 
- "creation": "2017-06-06 02:54:24.785360", 
- "docstatus": 0, 
- "doctype": "Page", 
- "idx": 0, 
- "modified": "2017-09-12 14:05:26.422064", 
- "modified_by": "Administrator", 
- "module": "Utilities", 
- "name": "leaderboard", 
- "owner": "Administrator", 
- "page_name": "leaderboard", 
- "roles": [], 
- "script": null, 
- "standard": "Yes", 
- "style": null, 
- "system_page": 0, 
- "title": "Leaderboard"
-}
\ No newline at end of file
diff --git a/erpnext/utilities/page/leaderboard/leaderboard.py b/erpnext/utilities/page/leaderboard/leaderboard.py
deleted file mode 100644
index 87cf2a4..0000000
--- a/erpnext/utilities/page/leaderboard/leaderboard.py
+++ /dev/null
@@ -1,153 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# MIT License. See license.txt
-
-from __future__ import unicode_literals, print_function
-import frappe
-from frappe.utils import add_to_date
-
-@frappe.whitelist()
-def get_leaderboard(doctype, timespan, company, field):
-	"""return top 10 items for that doctype based on conditions"""
-	from_date = get_from_date(timespan)
-	records = []
-	if doctype == "Customer":
-		records = get_all_customers(from_date, company, field)
-	elif  doctype == "Item":
-		records = get_all_items(from_date, company, field)
-	elif  doctype == "Supplier":
-		records = get_all_suppliers(from_date, company, field)
-	elif  doctype == "Sales Partner":
-		records = get_all_sales_partner(from_date, company, field)
-	elif doctype == "Sales Person":
-		records = get_all_sales_person(from_date, company)
-
-	return records
-
-def get_all_customers(from_date, company, field):
-	if field == "outstanding_amount":
-		return frappe.db.sql("""
-			select customer as name, sum(outstanding_amount) as value
-			FROM `tabSales Invoice`
-			where docstatus = 1 and posting_date >= %s and company = %s
-			group by customer
-			order by value DESC
-			limit 20
-		""", (from_date, company), as_dict=1)
-	else:
-		if field == "total_sales_amount":
-			select_field = "sum(so_item.base_net_amount)"
-		elif field == "total_qty_sold":
-			select_field = "sum(so_item.stock_qty)"
-
-		return frappe.db.sql("""
-			select so.customer as name, {0} as value
-			FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item
-				ON so.name = so_item.parent
-			where so.docstatus = 1 and so.transaction_date >= %s and so.company = %s
-			group by so.customer
-			order by value DESC
-			limit 20
-		""".format(select_field), (from_date, company), as_dict=1)
-
-def get_all_items(from_date, company, field):
-	if field in ("available_stock_qty", "available_stock_value"):
-		return frappe.db.sql("""
-			select item_code as name, {0} as value
-			from tabBin
-			group by item_code
-			order by value desc
-			limit 20
-		""".format("sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"), as_dict=1)
-	else:
-		if field == "total_sales_amount":
-			select_field = "sum(order_item.base_net_amount)"
-			select_doctype = "Sales Order"
-		elif field == "total_purchase_amount":
-			select_field = "sum(order_item.base_net_amount)"
-			select_doctype = "Purchase Order"
-		elif field == "total_qty_sold":
-			select_field = "sum(order_item.stock_qty)"
-			select_doctype = "Sales Order"
-		elif field == "total_qty_purchased":
-			select_field = "sum(order_item.stock_qty)"
-			select_doctype = "Purchase Order"
-
-		return frappe.db.sql("""
-			select order_item.item_code as name, {0} as value
-			from `tab{1}` sales_order join `tab{1} Item` as order_item
-				on sales_order.name = order_item.parent
-			where sales_order.docstatus = 1
-				and sales_order.company = %s and sales_order.transaction_date >= %s
-			group by order_item.item_code
-			order by value desc
-			limit 20
-		""".format(select_field, select_doctype), (company, from_date), as_dict=1)
-
-def get_all_suppliers(from_date, company, field):
-	if field == "outstanding_amount":
-		return frappe.db.sql("""
-			select supplier as name, sum(outstanding_amount) as value
-			FROM `tabPurchase Invoice`
-			where docstatus = 1 and posting_date >= %s and company = %s
-			group by supplier
-			order by value DESC
-			limit 20""", (from_date, company), as_dict=1)
-	else:
-		if field == "total_purchase_amount":
-			select_field = "sum(purchase_order_item.base_net_amount)"
-		elif field == "total_qty_purchased":
-			select_field = "sum(purchase_order_item.stock_qty)"
-
-		return frappe.db.sql("""
-			select purchase_order.supplier as name, {0} as value
-			FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
-				as purchase_order_item ON purchase_order.name = purchase_order_item.parent
-			where purchase_order.docstatus = 1 and  purchase_order.modified >= %s
-				and  purchase_order.company = %s
-			group by purchase_order.supplier
-			order by value DESC
-			limit 20""".format(select_field), (from_date, company), as_dict=1)
-
-def get_all_sales_partner(from_date, company, field):
-	if field == "total_sales_amount":
-		select_field = "sum(base_net_total)"
-	elif field == "total_commission":
-		select_field = "sum(total_commission)"
-
-	return frappe.db.sql("""
-		select sales_partner as name, {0} as value
-		from `tabSales Order`
-	 	where ifnull(sales_partner, '') != '' and docstatus = 1
-			and transaction_date >= %s and company = %s
-	 	group by sales_partner
-	 	order by value DESC
-	 	limit 20
-	""".format(select_field), (from_date, company), as_dict=1)
-
-def get_all_sales_person(from_date, company):
-	return frappe.db.sql("""
-		select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
-		from `tabSales Order` as sales_order join `tabSales Team` as sales_team
-			on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
-	 	where sales_order.docstatus = 1
-			and sales_order.transaction_date >= %s
-			and sales_order.company = %s
-	 	group by sales_team.sales_person
-	 	order by value DESC
-	 	limit 20
-	""", (from_date, company), as_dict=1)
-
-def get_from_date(seleted_timespan):
-	"""return string for ex:this week as date:string"""
-	days = months = years = 0
-	if "month" == seleted_timespan.lower():
-		months = -1
-	elif "quarter" == seleted_timespan.lower():
-		months = -3
-	elif "year" == seleted_timespan.lower():
-		years = -1
-	else:
-		days = -7
-
-	return add_to_date(None, years=years, months=months, days=days,
-		as_string=True, as_datetime=True)
\ No newline at end of file
