Balance Sheet
diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.html b/erpnext/accounts/report/balance_sheet/balance_sheet.html
new file mode 100644
index 0000000..a6a33f5
--- /dev/null
+++ b/erpnext/accounts/report/balance_sheet/balance_sheet.html
@@ -0,0 +1,46 @@
+<style>
+	.balance-sheet-important td {
+		font-weight: bold;
+	}
+
+	.balance-sheet-blank-row td {
+		height: 37px;
+	}
+</style>
+
+<h2 class="text-center">{%= __("Balance Sheet") %}</h2>
+<h4 class="text-center">{%= filters.fiscal_year %}</h3>
+<hr>
+<table class="table table-bordered">
+	<thead>
+		<tr>
+			<th style="width: 40%"></th>
+			{% for(var i=2, l=report.columns.length; i<l; i++) { %}
+				<th class="text-right">{%= report.columns[i].label %}</th>
+			{% } %}
+		</tr>
+	</thead>
+	<tbody>
+		{% for(var j=0, k=data.length; j<k; j++) { %}
+			{%
+				var row = data[j];
+				var row_class = data[j].parent_account ? "" : "balance-sheet-important";
+				row_class += data[j].account_name ? "" : " balance-sheet-blank-row";
+			%}
+			<tr class="{%= row_class %}">
+				<td>
+					<span style="padding-left: {%= cint(data[j].indent) * 7 %}%">{%= row.account_name %}</span>
+				</td>
+				{% for(var i=2, l=report.columns.length; i<l; i++) { %}
+					<td class="text-right">
+						{% var fieldname = report.columns[i].field; %}
+						{% if (!is_null(row[fieldname])) { %}
+							{%= format_currency(row[fieldname]) %}
+						{% } %}
+					</td>
+				{% } %}
+			</tr>
+		{% } %}
+	</tbody>
+</table>
+<p class="text-right text-muted">Printed On {%= dateutil.str_to_user(dateutil.get_datetime_as_string()) %}</p>
diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.js b/erpnext/accounts/report/balance_sheet/balance_sheet.js
index 9bdd298..378a687 100644
--- a/erpnext/accounts/report/balance_sheet/balance_sheet.js
+++ b/erpnext/accounts/report/balance_sheet/balance_sheet.js
@@ -1,7 +1,9 @@
 // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-frappe.query_reports["Balance Sheet"] = {
+frappe.provide("erpnext.balance_sheet");
+
+erpnext.balance_sheet = frappe.query_reports["Balance Sheet"] = {
 	"filters": [
 		{
 			"fieldname":"company",
@@ -26,6 +28,44 @@
 			"options": "Yearly\nQuarterly\nMonthly",
 			"default": "Yearly",
 			"reqd": 1
+		},
+		{
+			"fieldname": "depth",
+			"label": __("Depth"),
+			"fieldtype": "Select",
+			"options": "3\n4\n5",
+			"default": "3"
 		}
-	]
+	],
+	"formatter": function(row, cell, value, columnDef, dataContext) {
+		if (columnDef.df.fieldname=="account") {
+			var link = $("<a></a>")
+				.text(dataContext.account_name)
+				.attr("onclick", 'erpnext.balance_sheet.open_general_ledger("' + dataContext.account + '")');
+
+			var span = $("<span></span>")
+				.css("padding-left", (cint(dataContext.indent) * 21) + "px")
+				.append(link);
+
+			value = span.wrap("<p></p>").parent().html();
+
+		} else {
+			value = frappe.query_reports["Balance Sheet"].default_formatter(row, cell, value, columnDef, dataContext);
+		}
+
+		if (!dataContext.parent_account) {
+			value = $(value).css("font-weight", "bold").wrap("<p></p>").parent().html();
+		}
+
+		return value;
+	},
+	"open_general_ledger": function(account) {
+		if (!account) return;
+
+		frappe.route_options = {
+			"account": account,
+			"company": frappe.query_report.filters_by_name.company.get_value()
+		};
+		frappe.set_route("query-report", "General Ledger");
+	}
 }
diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.py b/erpnext/accounts/report/balance_sheet/balance_sheet.py
index dc71e92..3bf424c 100644
--- a/erpnext/accounts/report/balance_sheet/balance_sheet.py
+++ b/erpnext/accounts/report/balance_sheet/balance_sheet.py
@@ -2,40 +2,76 @@
 # License: GNU General Public License v3. See license.txt
 
 from __future__ import unicode_literals
+import babel.dates
 import frappe
-from frappe.utils import cstr, flt
+from frappe.utils import (cstr, flt, cint,
+	getdate, get_first_day, get_last_day, add_months, add_days, now_datetime)
 from frappe import _
 
 def execute(filters=None):
 	company = filters.company
 	fiscal_year = filters.fiscal_year
-	depth = 3
-	end_date = frappe.db.get_value("Fiscal Year", fiscal_year, "year_end_date")
+	depth = cint(filters.depth) or 3
+	start_date, end_date = frappe.db.get_value("Fiscal Year", fiscal_year, ["year_start_date", "year_end_date"])
+	period_list = get_period_list(start_date, end_date, filters.get("periodicity") or "Yearly", fiscal_year)
 
-	for root_type, balance_must_be in (("Asset", "Debit"), ("Liability", "Credit"), ("Equity", "Credit")):
+	out = []
+	for (root_type, balance_must_be) in (("Asset", "Debit"), ("Liability", "Credit"), ("Equity", "Credit")):
+		data = []
 		accounts, account_gl_entries = get_accounts_and_gl_entries(root_type, company, end_date)
 		if accounts:
 			accounts, accounts_map = filter_accounts(accounts, depth=depth)
 
 			for d in accounts:
-				d.debit = d.credit = 0
 				for account_name in ([d.name] + (d.invisible_children or [])):
 					for each in account_gl_entries.get(account_name, []):
-						d.debit += flt(each.debit)
-						d.credit += flt(each.credit)
+						for period_start_date, period_end_date, period_key, period_label in period_list:
+							each.posting_date = getdate(each.posting_date)
+
+							# check if posting date is within the period
+							if ((not period_start_date or (each.posting_date >= period_start_date))
+								and (each.posting_date <= period_end_date)):
+
+								d[period_key] = d.get(period_key, 0.0) + flt(each.debit) - flt(each.credit)
 
 			for d in reversed(accounts):
 				if d.parent_account:
-					accounts_map[d.parent_account]["debit"] += d.debit
-					accounts_map[d.parent_account]["credit"] += d.credit
+					for period_start_date, period_end_date, period_key, period_label in period_list:
+						accounts_map[d.parent_account][period_key] = accounts_map[d.parent_account].get(period_key, 0.0) + d.get(period_key, 0.0)
 
-			for d in accounts:
-				d.balance = d["debit"] - d["credit"]
-				if d.balance:
-					d.balance *= (1 if balance_must_be=="Debit" else -1)
-				print (" " * d["indent"] * 2) + d["account_name"], d["balance"], balance_must_be
+			for i, d in enumerate(accounts):
+				has_value = False
+				row = {"account_name": d["account_name"], "account": d["name"], "indent": d["indent"], "parent_account": d["parent_account"]}
+				for period_start_date, period_end_date, period_key, period_label in period_list:
+					if d.get(period_key):
+						d[period_key] *= (1 if balance_must_be=="Debit" else -1)
 
-	return [], []
+					row[period_key] = d.get(period_key, 0.0)
+					if row[period_key]:
+						has_value = True
+
+				if has_value:
+					data.append(row)
+
+		if data:
+			row = {"account_name": _("Total ({0})").format(balance_must_be), "account": None}
+			for period_start_date, period_end_date, period_key, period_label in period_list:
+				if period_key in data[0]:
+					row[period_key] = data[0].get(period_key, 0.0)
+					data[0][period_key] = ""
+
+			data.append(row)
+
+			# blank row after Total
+			data.append({})
+
+		out.extend(data)
+
+	columns = [{"fieldname": "account", "label": _("Account"), "fieldtype": "Link", "options": "Account", "width": 300}]
+	for period_start_date, period_end_date, period_key, period_label in period_list:
+		columns.append({"fieldname": period_key, "label": period_label, "fieldtype": "Currency", "width": 150})
+
+	return columns, out
 
 def get_accounts_and_gl_entries(root_type, company, end_date):
 	# root lft, rgt
@@ -97,3 +133,57 @@
 	add_to_data(None, 0)
 
 	return data, accounts_map
+
+def get_period_list(start_date, end_date, periodicity, fiscal_year):
+	"""Get a list of tuples that represents (period_start_date, period_end_date, period_key)
+		Periodicity can be (Yearly, Quarterly, Monthly)"""
+
+	start_date = getdate(start_date)
+	end_date = getdate(end_date)
+	today = now_datetime().date()
+
+	if periodicity == "Yearly":
+		period_list = [(None, end_date, fiscal_year, fiscal_year)]
+	else:
+		months_to_add = {
+			"Half-yearly": 6,
+			"Quarterly": 3,
+			"Monthly": 1
+		}[periodicity]
+
+		period_list = []
+
+		# start with first day, so as to avoid year start dates like 2-April if every they occur
+		next_date = get_first_day(start_date)
+
+		for i in xrange(12 / months_to_add):
+			next_date = add_months(next_date, months_to_add)
+
+			if next_date == get_first_day(next_date):
+				# if first day, get the last day of previous month
+				next_date = add_days(next_date, -1)
+			else:
+				# get the last day of the month
+				next_date = get_last_day(next_date)
+
+			# checking in the middle of the fiscal year? don't show future periods
+			if next_date > today:
+				break
+
+			elif next_date <= end_date:
+				key = next_date.strftime("%b_%Y").lower()
+				label = babel.dates.format_date(next_date, "MMM YYYY", locale=(frappe.local.lang or "").replace("-", "_"))
+				period_list.append((None, next_date, key, label))
+
+				# if it ends before a full year
+				if next_date == end_date:
+					break
+
+			else:
+				# if it ends before a full year
+				key = end_date.strftime("%b_%Y").lower()
+				label = babel.dates.format_date(end_date, "MMM YYYY", locale=(frappe.local.lang or "").replace("-", "_"))
+				period_list.append((None, end_date, key, label))
+				break
+
+	return period_list
diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py
index 2d757f1..0e3e2d4 100644
--- a/erpnext/config/accounts.py
+++ b/erpnext/config/accounts.py
@@ -196,6 +196,12 @@
 					"is_query_report": True
 				},
 				{
+					"type": "report",
+					"name": "Balance Sheet",
+					"doctype": "GL Entry",
+					"is_query_report": True
+				},
+				{
 					"type": "page",
 					"name": "financial-analytics",
 					"label": _("Financial Analytics"),