[Enhancement] Time log wages and multiple active salary structure
diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.js b/erpnext/accounts/doctype/accounts_settings/accounts_settings.js
new file mode 100644
index 0000000..0627675
--- /dev/null
+++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Accounts Settings', {
+	refresh: function(frm) {
+
+	}
+});
diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json
index 1ba9221..d46c2d5 100644
--- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json
+++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json
@@ -2,11 +2,13 @@
  "allow_copy": 0, 
  "allow_import": 0, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2013-06-24 15:49:57", 
  "custom": 0, 
  "description": "Settings for Accounts", 
  "docstatus": 0, 
  "doctype": "DocType", 
+ "document_type": "Other", 
  "fields": [
   {
    "allow_on_submit": 0, 
@@ -18,6 +20,7 @@
    "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Make Accounting Entry For Every Stock Movement", 
@@ -42,6 +45,7 @@
    "fieldtype": "Date", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Accounts Frozen Upto", 
@@ -66,6 +70,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Role Allowed to Set Frozen Accounts & Edit Frozen Entries", 
@@ -91,6 +96,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Credit Controller", 
@@ -115,6 +121,7 @@
    "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Check Supplier Invoice Number Uniqueness", 
@@ -136,13 +143,14 @@
  "hide_toolbar": 0, 
  "icon": "icon-cog", 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 1, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2015-12-24 21:42:01.274459", 
+ "modified": "2016-06-27 15:18:27.566087", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Accounts Settings", 
@@ -169,6 +177,9 @@
    "write": 1
   }
  ], 
+ "quick_entry": 1, 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "sort_order": "ASC", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index be8a846..d64a024 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -429,4 +429,30 @@
 			["Asset", "company", "=", doc.company]
 		]
 	}
-});
\ No newline at end of file
+});
+
+frappe.ui.form.on('Sales Invoice', {
+	setup: function(frm){
+		frm.fields_dict["timesheets"].grid.get_field("time_sheet").get_query = function(doc, cdt, cdn){
+			return {
+				filters: [
+					["Time Sheet", "status", "in", ["Submitted", "Payslip"]]
+				]
+			}
+		}
+	}
+})
+
+frappe.ui.form.on('Sales Invoice Timesheet', {
+	time_sheet: function(frm){
+		frm.call({
+			method: "calculate_billing_amount_from_timesheet",
+			doc: frm.doc,
+			callback: function(r, rt) {
+				refresh_field('total_billing_amount')
+			}
+		})
+	}
+})
+
+cur_frm.add_fetch("time_sheet", "total_billing_amount", "billing_amount");
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index 357dec2..c68c262 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -1069,6 +1069,85 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "collapsible_depends_on": "", 
+   "depends_on": "eval:doc.total_billing_amount > 0", 
+   "fieldname": "time_sheet_list", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Time Sheet List", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "timesheets", 
+   "fieldtype": "Table", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Time Sheets", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Sales Invoice Timesheet", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "default": "0", 
+   "fieldname": "total_billing_amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Total Billing Amount", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "2", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "section_break_30", 
    "fieldtype": "Section Break", 
    "hidden": 0, 
@@ -3597,7 +3676,7 @@
  "istable": 0, 
  "max_attachments": 0, 
  "menu_index": 0, 
- "modified": "2016-06-10 12:57:08.818701", 
+ "modified": "2016-06-27 15:13:36.523798", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Sales Invoice", 
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 2584d40..8f7c341 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -79,9 +79,10 @@
 
 		self.set_against_income_account()
 		self.validate_c_form()
-		self.validate_time_logs_are_submitted()
+		self.validate_time_sheets_are_submitted()
 		self.validate_multiple_billing("Delivery Note", "dn_detail", "amount", "items")
 		self.update_packing_list()
+		self.calculate_billing_amount_from_timesheet()
 
 	def before_save(self):
 		set_account_for_mode_of_payment(self)
@@ -125,11 +126,10 @@
 		if not cint(self.is_pos) == 1 and not self.is_return:
 			self.update_against_document_in_jv()
 
-		self.update_time_log_batch(self.name)
-
+		self.update_time_sheet(self.name)
 
 	def before_cancel(self):
-		self.update_time_log_batch(None)
+		self.update_time_sheet(None)
 
 	def on_cancel(self):
 		self.check_close_sales_order("sales_order")
@@ -217,20 +217,21 @@
 		if pos:
 			return {"print_format": pos.get("print_format") }
 
-	def update_time_log_batch(self, sales_invoice):
-		for d in self.get("items"):
-			if d.time_log_batch:
-				tlb = frappe.get_doc("Time Log Batch", d.time_log_batch)
-				tlb.sales_invoice = sales_invoice
-				tlb.flags.ignore_validate_update_after_submit = True
-				tlb.save()
+	def update_time_sheet(self, sales_invoice):
+		for d in self.get("timesheets"):
+			if d.time_sheet:
+				timesheet = frappe.get_doc("Time Sheet", d.time_sheet)
+				timesheet.sales_invoice = sales_invoice
+				timesheet.flags.ignore_validate_update_after_submit = True
+				timesheet.set_status()
+				timesheet.save()
 
-	def validate_time_logs_are_submitted(self):
-		for d in self.get("items"):
-			if d.time_log_batch:
-				docstatus = frappe.db.get_value("Time Log Batch", d.time_log_batch, "docstatus")
-				if docstatus!=1:
-					frappe.throw(_("Time Log Batch {0} must be 'Submitted'").format(d.time_log_batch))
+	def validate_time_sheets_are_submitted(self):
+		for data in self.get("timesheets"):
+			if data.time_sheet:
+				status = frappe.db.get_value("Time Sheet", data.time_sheet, "status")
+				if status not in ['Submitted', 'Payslip']:
+					frappe.throw(_("Time Sheet {0} is already completed or cancelled").format(data.time_sheet))
 
 	def set_pos_fields(self, for_validate=False):
 		"""Set retail related fields from POS Profiles"""
@@ -450,6 +451,13 @@
 		else:
 			self.set('packed_items', [])
 
+	def calculate_billing_amount_from_timesheet(self):
+		total_billing_amount = 0.0
+		for data in self.timesheets:
+			if data.billing_amount:
+				total_billing_amount += data.billing_amount
+
+		self.total_billing_amount = total_billing_amount
 
 	def get_warehouse(self):
 		user_pos_profile = frappe.db.sql("""select name, warehouse from `tabPOS Profile`
diff --git a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
index 021b18b..2b3232c 100644
--- a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
+++ b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
@@ -3,6 +3,7 @@
  "allow_import": 0, 
  "allow_rename": 0, 
  "autoname": "hash", 
+ "beta": 0, 
  "creation": "2013-06-04 11:02:19", 
  "custom": 0, 
  "docstatus": 0, 
@@ -1421,31 +1422,6 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "time_log_batch", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Time Log Batch", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Time Log Batch", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
    "fieldname": "sales_order", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -1676,18 +1652,20 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2016-04-06 12:26:19.052860", 
+ "modified": "2016-06-24 16:01:59.719026", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Sales Invoice Item", 
  "owner": "Administrator", 
  "permissions": [], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "sort_field": "modified", 
diff --git a/erpnext/projects/doctype/time_log/__init__.py b/erpnext/accounts/doctype/sales_invoice_timesheet/__init__.py
similarity index 100%
copy from erpnext/projects/doctype/time_log/__init__.py
copy to erpnext/accounts/doctype/sales_invoice_timesheet/__init__.py
diff --git a/erpnext/accounts/doctype/sales_invoice_timesheet/sales_invoice_timesheet.json b/erpnext/accounts/doctype/sales_invoice_timesheet/sales_invoice_timesheet.json
new file mode 100644
index 0000000..45ae82c
--- /dev/null
+++ b/erpnext/accounts/doctype/sales_invoice_timesheet/sales_invoice_timesheet.json
@@ -0,0 +1,87 @@
+{
+ "allow_copy": 0, 
+ "allow_import": 0, 
+ "allow_rename": 0, 
+ "beta": 0, 
+ "creation": "2016-06-14 19:21:34.321662", 
+ "custom": 0, 
+ "docstatus": 0, 
+ "doctype": "DocType", 
+ "document_type": "", 
+ "fields": [
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "time_sheet", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Time Sheet", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Time Sheet", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "billing_amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Billing Amount", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "2", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }
+ ], 
+ "hide_heading": 0, 
+ "hide_toolbar": 0, 
+ "idx": 0, 
+ "image_view": 0, 
+ "in_create": 0, 
+ "in_dialog": 0, 
+ "is_submittable": 0, 
+ "issingle": 0, 
+ "istable": 1, 
+ "max_attachments": 0, 
+ "modified": "2016-06-15 23:56:06.131202", 
+ "modified_by": "Administrator", 
+ "module": "Accounts", 
+ "name": "Sales Invoice Timesheet", 
+ "name_case": "", 
+ "owner": "Administrator", 
+ "permissions": [], 
+ "quick_entry": 1, 
+ "read_only": 0, 
+ "read_only_onload": 0, 
+ "sort_field": "modified", 
+ "sort_order": "DESC", 
+ "track_seen": 0
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/sales_invoice_timesheet/sales_invoice_timesheet.py b/erpnext/accounts/doctype/sales_invoice_timesheet/sales_invoice_timesheet.py
new file mode 100644
index 0000000..afc05ab
--- /dev/null
+++ b/erpnext/accounts/doctype/sales_invoice_timesheet/sales_invoice_timesheet.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class SalesInvoiceTimesheet(Document):
+	pass
diff --git a/erpnext/change_log/v5/v5_6_0.md b/erpnext/change_log/v5/v5_6_0.md
index 0ef5a3a..4fb4115 100644
--- a/erpnext/change_log/v5/v5_6_0.md
+++ b/erpnext/change_log/v5/v5_6_0.md
@@ -3,4 +3,4 @@
   Now additional costs like shipping charges, operating costs etc can be added in Stock Entry in item valuation
 - **Update Finished Goods** in Production Order can now use the items from **Transfer Materials for Manufacture** step instead of items from the Bill of Materials. This can be configured in Manufacturing Settings
 - Added field **Tax ID** in Customer
-- Bug fixes in Item, Time Log Batch, Pricing Rule, Salary Slip, Address and Stock Entry
+- Bug fixes in Item, Time Sheet, Pricing Rule, Salary Slip, Address and Stock Entry
diff --git a/erpnext/config/manufacturing.py b/erpnext/config/manufacturing.py
index 2ae49fe..fbc9fb1 100644
--- a/erpnext/config/manufacturing.py
+++ b/erpnext/config/manufacturing.py
@@ -23,8 +23,8 @@
 				},
 				{
 					"type": "doctype",
-					"name": "Time Log",
-					"description": _("Time Logs for manufacturing."),
+					"name": "Time Sheet",
+					"description": _("Time Sheet for manufacturing."),
 				},
 
 			]
diff --git a/erpnext/config/projects.py b/erpnext/config/projects.py
index 3deaeba..c2542fa 100644
--- a/erpnext/config/projects.py
+++ b/erpnext/config/projects.py
@@ -31,13 +31,8 @@
 			"items": [
 				{
 					"type": "doctype",
-					"name": "Time Log",
-					"description": _("Time Log for tasks."),
-				},
-				{
-					"type": "doctype",
-					"name": "Time Log Batch",
-					"description": _("Batch Time Logs for billing."),
+					"name": "Time Sheet",
+					"description": _("Time Sheet for tasks."),
 				},
 				{
 					"type": "doctype",
@@ -58,8 +53,8 @@
 				{
 					"type": "report",
 					"is_query_report": True,
-					"name": "Daily Time Log Summary",
-					"doctype": "Time Log"
+					"name": "Daily Time Sheet Summary",
+					"doctype": "Time Sheet"
 				},
 				{
 					"type": "report",
diff --git a/erpnext/docs/assets/img/project/time_log_batch.gif b/erpnext/docs/assets/img/project/time_sheet.gif
similarity index 100%
rename from erpnext/docs/assets/img/project/time_log_batch.gif
rename to erpnext/docs/assets/img/project/time_sheet.gif
Binary files differ
diff --git a/erpnext/docs/assets/img/project/time_log_batch_make_invoice.png b/erpnext/docs/assets/img/project/time_sheet_make_invoice.png
similarity index 100%
rename from erpnext/docs/assets/img/project/time_log_batch_make_invoice.png
rename to erpnext/docs/assets/img/project/time_sheet_make_invoice.png
Binary files differ
diff --git a/erpnext/docs/assets/img/project/time_log_batch_sales_invoice.png b/erpnext/docs/assets/img/project/time_sheet_sales_invoice.png
similarity index 100%
rename from erpnext/docs/assets/img/project/time_log_batch_sales_invoice.png
rename to erpnext/docs/assets/img/project/time_sheet_sales_invoice.png
Binary files differ
diff --git a/erpnext/docs/user/manual/de/projects/time-log-batch.md b/erpnext/docs/user/manual/de/projects/time-log-batch.md
index bfc6fa8..6aa85cb 100644
--- a/erpnext/docs/user/manual/de/projects/time-log-batch.md
+++ b/erpnext/docs/user/manual/de/projects/time-log-batch.md
@@ -9,17 +9,17 @@
 
 Öffnen Sie einfach Ihre Übersicht der Zeitprotokolle und kreuzen Sie die Artikel an, die Sie dem Zeitprotokollstapel hinzufügen möchten. Klicken Sie dann auf die Schaltfläche "Zeitprotokollstapel erstellen" und diese Zeitprotokolle werden ausgewählt.
 
-<img class="screenshot" alt="Zeitprotokoll - Kalender aufziehen" src="{{docs_base_url}}/assets/img/project/time_log_batch.gif">
+<img class="screenshot" alt="Zeitprotokoll - Kalender aufziehen" src="{{docs_base_url}}/assets/img/project/time_sheet.gif">
 
 ### Ausgangsrechnungen erstellen
 
 * Sobald Sie einen Zeitprotokollstapel übertragen haben, sollte die Schaltfläche "Rechnung erstellen" erscheinen.
 
-<img class="screenshot" alt="Zeitprotokoll - Kalender aufziehen" src="{{docs_base_url}}/assets/img/project/time_log_batch_make_invoice.png">
+<img class="screenshot" alt="Zeitprotokoll - Kalender aufziehen" src="{{docs_base_url}}/assets/img/project/time_sheet_make_invoice.png">
 
 * Klicken Sie auf diese Schaltfläche und erstellen Sie eine Ausgangsrechnung zu einem Zeitprotokollstapel.
 
-<img class="screenshot" alt="Zeitprotokoll - Kalender aufziehen" src="{{docs_base_url}}/assets/img/project/time_log_batch_sales_invoice.png">
+<img class="screenshot" alt="Zeitprotokoll - Kalender aufziehen" src="{{docs_base_url}}/assets/img/project/time_sheet_sales_invoice.png">
 
 * Wenn Sie die Ausgangsrechnung "übertragen", wird die Nummer der Ausgangsrechnung in den Zeitprotokollen und im Zeitprotokollstapel aktualisiert und ihr Status wird auf "abgerechnet" geändert.
 
diff --git a/erpnext/docs/user/manual/en/projects/time-log-batch.md b/erpnext/docs/user/manual/en/projects/time-log-batch.md
index d48633a..f4f76dc 100644
--- a/erpnext/docs/user/manual/en/projects/time-log-batch.md
+++ b/erpnext/docs/user/manual/en/projects/time-log-batch.md
@@ -1,23 +1,23 @@
-You can bill Time Logs by batching them together. This gives you the flexiblity to manage your customer billing in the way you want. To create a new Time Log Batch, go to 
+You can bill Time Logs by batching them together. This gives you the flexiblity to manage your customer billing in the way you want. To create a new Time Sheet, go to 
 
-> Projects > Time Log Batch > New Time Log Batch
+> Projects > Time Sheet > New Time Sheet
 
 OR
 
-Just open your Time Log list and check the Items to you want to add to the Time Log. Then click on "Make Time Log Batch" button and these Time Logs will be selected.
+Just open your Time Log list and check the Items to you want to add to the Time Log. Then click on "Make Time Sheet" button and these Time Logs will be selected.
 
-<img class="screenshot" alt="Time Log - Drag Calender" src="{{docs_base_url}}/assets/img/project/time_log_batch.gif">
+<img class="screenshot" alt="Time Log - Drag Calender" src="{{docs_base_url}}/assets/img/project/time_sheet.gif">
 
 ###Making Sales Invoice
 
-* After submitting the Time Log Batch, "Make Invoice" button shall appear.
+* After submitting the Time Sheet, "Make Invoice" button shall appear.
 
-<img class="screenshot" alt="Time Log - Drag Calender" src="{{docs_base_url}}/assets/img/project/time_log_batch_make_invoice.png">
+<img class="screenshot" alt="Time Log - Drag Calender" src="{{docs_base_url}}/assets/img/project/time_sheet_make_invoice.png">
 
-* Click on that button to raise a Sales Invoice against the Time Log Batch.
+* Click on that button to raise a Sales Invoice against the Time Sheet.
 
-<img class="screenshot" alt="Time Log - Drag Calender" src="{{docs_base_url}}/assets/img/project/time_log_batch_sales_invoice.png">
+<img class="screenshot" alt="Time Log - Drag Calender" src="{{docs_base_url}}/assets/img/project/time_sheet_sales_invoice.png">
 
-* When you "Submit" the Sales Invoice, the Sales Invoice number will get updated in the Time Logs and Time Log Batch and their status will change to "Billed".
+* When you "Submit" the Sales Invoice, the Sales Invoice number will get updated in the Time Logs and Time Sheet and their status will change to "Billed".
 
 {next}
\ No newline at end of file
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 047ec8d..a648155 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -41,7 +41,7 @@
 
 email_append_to = ["Job Applicant", "Opportunity", "Issue"]
 
-calendars = ["Task", "Production Order", "Time Log", "Leave Application", "Sales Order", "Holiday List"]
+calendars = ["Task", "Production Order", "Leave Application", "Sales Order", "Holiday List"]
 
 fixtures = ["Web Form"]
 
diff --git a/erpnext/hr/doctype/employee/employee_links.py b/erpnext/hr/doctype/employee/employee_links.py
index 0e13c31..2ea6191 100644
--- a/erpnext/hr/doctype/employee/employee_links.py
+++ b/erpnext/hr/doctype/employee/employee_links.py
@@ -9,7 +9,7 @@
 		},
 		{
 			'label': _('Payroll'),
-			'items': ['Salary Structure', 'Salary Slip']
+			'items': ['Salary Structure', 'Salary Slip', 'Time Sheet']
 		},
 		{
 			'label': _('Expense'),
diff --git a/erpnext/hr/doctype/hr_settings/hr_settings.json b/erpnext/hr/doctype/hr_settings/hr_settings.json
index 599aacc..ba2c38b 100644
--- a/erpnext/hr/doctype/hr_settings/hr_settings.json
+++ b/erpnext/hr/doctype/hr_settings/hr_settings.json
@@ -166,7 +166,7 @@
    "bold": 0, 
    "collapsible": 0, 
    "default": "1", 
-   "description": "Check if you want to send salary slip in mail to each employee while submitting salary slip", 
+   "description": "", 
    "fieldname": "email_salary_slip_to_employee", 
    "fieldtype": "Check", 
    "hidden": 0, 
@@ -200,7 +200,7 @@
  "issingle": 1, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-06-25 17:43:06.643469", 
+ "modified": "2016-06-27 16:20:59.737869", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "HR Settings", 
@@ -220,8 +220,6 @@
    "print": 1, 
    "read": 1, 
    "report": 0, 
-   "restrict": 0, 
-   "restricted": 0, 
    "role": "System Manager", 
    "set_user_permissions": 0, 
    "share": 1, 
diff --git a/erpnext/hr/doctype/process_payroll/process_payroll.js b/erpnext/hr/doctype/process_payroll/process_payroll.js
index 3da896c..1c60a5f 100644
--- a/erpnext/hr/doctype/process_payroll/process_payroll.js
+++ b/erpnext/hr/doctype/process_payroll/process_payroll.js
@@ -58,7 +58,8 @@
 	});
 }
 
-
-frappe.ui.form.on("Process Payroll", "refresh", function(frm) {
-	frm.disable_save();
-});
+frappe.ui.form.on("Process Payroll", {
+	refresh: function(frm) {
+		frm.disable_save();
+	}
+})
diff --git a/erpnext/hr/doctype/process_payroll/process_payroll.json b/erpnext/hr/doctype/process_payroll/process_payroll.json
index e3f16a5..7285765 100644
--- a/erpnext/hr/doctype/process_payroll/process_payroll.json
+++ b/erpnext/hr/doctype/process_payroll/process_payroll.json
@@ -2,6 +2,7 @@
  "allow_copy": 1, 
  "allow_import": 0, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2012-03-27 14:35:59", 
  "custom": 0, 
  "docstatus": 0, 
@@ -184,6 +185,55 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "section_break_8", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "salary_slip_based_on_timesheet", 
+   "fieldtype": "Check", 
+   "hidden": 1, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Salary Slip Based on Timesheet", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "select_payroll_year_and_month", 
    "fieldtype": "Section Break", 
    "hidden": 0, 
@@ -503,13 +553,14 @@
  "hide_toolbar": 1, 
  "icon": "icon-cog", 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 1, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-04-26 07:22:41.792785", 
+ "modified": "2016-06-22 18:14:02.418857", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Process Payroll", 
@@ -536,8 +587,10 @@
    "write": 1
   }
  ], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "sort_field": "modified", 
- "sort_order": "DESC"
+ "sort_order": "DESC", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/hr/doctype/process_payroll/process_payroll.py b/erpnext/hr/doctype/process_payroll/process_payroll.py
index de41530..c80c660 100644
--- a/erpnext/hr/doctype/process_payroll/process_payroll.py
+++ b/erpnext/hr/doctype/process_payroll/process_payroll.py
@@ -15,20 +15,18 @@
 			Returns list of active employees based on selected criteria
 			and for which salary structure exists
 		"""
-
 		cond = self.get_filter_condition()
 		cond += self.get_joining_releiving_condition()
 
 		emp_list = frappe.db.sql("""
 			select t1.name
 			from `tabEmployee` t1, `tabSalary Structure` t2
-			where t1.docstatus!=2 and t2.docstatus != 2
-			and t1.name = t2.employee
+			where t1.docstatus!=2 and t2.docstatus != 2 and 
+			ifnull(t2.salary_slip_based_on_timesheet,0) = 0 and t1.name = t2.employee
 		%s """% cond)
 
 		return emp_list
 
-
 	def get_filter_condition(self):
 		self.check_mandatory()
 
@@ -67,6 +65,7 @@
 					""", (emp[0], self.month, self.fiscal_year, self.company)):
 				ss = frappe.get_doc({
 					"doctype": "Salary Slip",
+					"salary_slip_based_on_timesheet": 0,
 					"fiscal_year": self.fiscal_year,
 					"employee": emp[0],
 					"month": self.month,
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.js b/erpnext/hr/doctype/salary_slip/salary_slip.js
index 88796a2..643139a 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.js
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.js
@@ -2,13 +2,51 @@
 // License: GNU General Public License v3. See license.txt
 
 cur_frm.add_fetch('employee', 'company', 'company');
+cur_frm.add_fetch('time_sheet', 'total_hours', 'working_hours');
 
 frappe.ui.form.on("Salary Slip", {
+	setup: function(frm) {
+		frm.fields_dict["timesheets"].grid.get_field("time_sheet").get_query = function(){
+			return {
+				filters: {
+					employee: frm.doc.employee,
+					make_for: 'Salary Slip'
+				}
+			}
+		}
+	},
+
 	company: function(frm) {
 		var company = locals[':Company'][frm.doc.company];
 		if(!frm.doc.letter_head && company.default_letter_head) {
 			frm.set_value('letter_head', company.default_letter_head);
 		}
+	},
+
+	refresh: function(frm) {
+		frm.trigger("toggle_fields")
+	},
+
+	salary_slip_based_on_timesheet: function(frm) {
+		frm.trigger("toggle_fields")
+	},
+
+	toggle_fields: function(frm) {
+		if(frm.doc.salary_slip_based_on_timesheet) {
+			hide_field(['fiscal_year', 'month', 'total_days_in_month', 'leave_without_pay', 'payment_days'])
+			unhide_field(['start_date', 'end_date', 'hourly_wages', 'timesheets'])
+		}else {
+			unhide_field(['fiscal_year', 'month', 'total_days_in_month', 'leave_without_pay', 'payment_days'])
+			hide_field(['start_date', 'end_date', 'hourly_wages', 'timesheets'])
+		}
+	}
+})
+
+
+frappe.ui.form.on("Salary Slip Timesheet", {
+	time_sheet: function(frm, cdt, cdn) {
+		doc = frm.doc;
+		cur_frm.cscript.fiscal_year(doc, cdt, cdn)
 	}
 })
 
@@ -38,7 +76,13 @@
 		});
 }
 
-cur_frm.cscript.month = cur_frm.cscript.employee = cur_frm.cscript.fiscal_year;
+cur_frm.cscript.month = cur_frm.cscript.salary_slip_based_on_timesheet = cur_frm.cscript.fiscal_year;
+cur_frm.cscript.start_date = cur_frm.cscript.end_date = cur_frm.cscript.fiscal_year;
+
+cur_frm.cscript.employee = function(doc,dt,dn){
+	doc.salary_structure = ''
+	cur_frm.cscript.fiscal_year(doc, dt, dn)
+}
 
 cur_frm.cscript.leave_without_pay = function(doc,dt,dn){
 	if (doc.employee && doc.fiscal_year && doc.month) {
@@ -56,7 +100,7 @@
 	calculate_net_pay(doc, dt, dn);
 }
 
-cur_frm.cscript.e_modified_amount = function(doc,dt,dn){
+cur_frm.cscript.earning_amount = function(doc,dt,dn){
 	calculate_earning_total(doc, dt, dn);
 	calculate_net_pay(doc, dt, dn);
 }
@@ -67,7 +111,7 @@
 }
 // Trigger on earning modified amount and depends on lwp
 // ------------------------------------------------------------------------
-cur_frm.cscript.d_modified_amount = function(doc,dt,dn){
+cur_frm.cscript.deduction_amount = function(doc,dt,dn){
 	calculate_ded_total(doc, dt, dn);
 	calculate_net_pay(doc, dt, dn);
 }
@@ -85,17 +129,17 @@
 	var total_earn = 0;
 	for(var i = 0; i < tbl.length; i++){
 		if(cint(tbl[i].e_depends_on_lwp) == 1) {
-			tbl[i].e_modified_amount =  Math.round(tbl[i].e_amount)*(flt(doc.payment_days) /
+			tbl[i].earning_amount =  Math.round(tbl[i].e_amount)*(flt(doc.payment_days) /
 				cint(doc.total_days_in_month)*100)/100;
-			refresh_field('e_modified_amount', tbl[i].name, 'earnings');
+			refresh_field('earning_amount', tbl[i].name, 'earnings');
 		} else if(reset_amount) {
-			tbl[i].e_modified_amount = tbl[i].e_amount;
-			refresh_field('e_modified_amount', tbl[i].name, 'earnings');
+			tbl[i].earning_amount = tbl[i].e_amount;
+			refresh_field('earning_amount', tbl[i].name, 'earnings');
 		}
-		total_earn += flt(tbl[i].e_modified_amount);
+		total_earn += flt(tbl[i].earning_amount);
 	}
 	doc.gross_pay = total_earn + flt(doc.arrear_amount) + flt(doc.leave_encashment_amount);
-	refresh_many(['e_modified_amount', 'gross_pay']);
+	refresh_many(['earning_amount', 'gross_pay']);
 }
 
 // Calculate deduction total
@@ -106,13 +150,13 @@
 	var total_ded = 0;
 	for(var i = 0; i < tbl.length; i++){
 		if(cint(tbl[i].d_depends_on_lwp) == 1) {
-			tbl[i].d_modified_amount = Math.round(tbl[i].d_amount)*(flt(doc.payment_days)/cint(doc.total_days_in_month)*100)/100;
-			refresh_field('d_modified_amount', tbl[i].name, 'deductions');
+			tbl[i].deduction_amount = Math.round(tbl[i].d_amount)*(flt(doc.payment_days)/cint(doc.total_days_in_month)*100)/100;
+			refresh_field('deduction_amount', tbl[i].name, 'deductions');
 		} else if(reset_amount) {
-			tbl[i].d_modified_amount = tbl[i].d_amount;
-			refresh_field('d_modified_amount', tbl[i].name, 'earnings');
+			tbl[i].deduction_amount = tbl[i].d_amount;
+			refresh_field('deduction_amount', tbl[i].name, 'earnings');
 		}
-		total_ded += flt(tbl[i].d_modified_amount);
+		total_ded += flt(tbl[i].deduction_amount);
 	}
 	doc.total_deduction = total_ded;
 	refresh_field('total_deduction');
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.json b/erpnext/hr/doctype/salary_slip/salary_slip.json
index a31e7b0..04c214a 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.json
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.json
@@ -2,6 +2,7 @@
  "allow_copy": 0, 
  "allow_import": 0, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2013-01-10 16:34:15", 
  "custom": 0, 
  "docstatus": 0, 
@@ -65,7 +66,7 @@
    "bold": 0, 
    "collapsible": 0, 
    "fieldname": "employee_name", 
-   "fieldtype": "Data", 
+   "fieldtype": "Read Only", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
@@ -76,10 +77,11 @@
    "no_copy": 0, 
    "oldfieldname": "employee_name", 
    "oldfieldtype": "Data", 
+   "options": "employee.employee_name", 
    "permlevel": 0, 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 1, 
+   "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
    "search_index": 0, 
@@ -171,6 +173,31 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "column_break1", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "oldfieldtype": "Column Break", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0, 
+   "width": "50%"
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "company", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -221,8 +248,8 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "column_break1", 
-   "fieldtype": "Column Break", 
+   "fieldname": "section_break_10", 
+   "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
@@ -230,8 +257,8 @@
    "in_list_view": 0, 
    "length": 0, 
    "no_copy": 0, 
-   "oldfieldtype": "Column Break", 
    "permlevel": 0, 
+   "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
    "read_only": 0, 
@@ -239,41 +266,40 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
-   "unique": 0, 
-   "width": "50%"
+   "unique": 0
   }, 
   {
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "month", 
-   "fieldtype": "Select", 
+   "depends_on": "", 
+   "fieldname": "salary_slip_based_on_timesheet", 
+   "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
-   "in_filter": 1, 
-   "in_list_view": 1, 
-   "label": "Month", 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Salary Slip Based on Timesheet", 
    "length": 0, 
    "no_copy": 0, 
-   "oldfieldname": "month", 
-   "oldfieldtype": "Select", 
-   "options": "\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12", 
+   "options": "", 
    "permlevel": 0, 
+   "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 1, 
+   "reqd": 0, 
+   "search_index": 0, 
    "set_only_once": 0, 
-   "unique": 0, 
-   "width": "37%"
+   "unique": 0
   }, 
   {
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "", 
    "fieldname": "fiscal_year", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -301,6 +327,139 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "month", 
+   "fieldtype": "Select", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 1, 
+   "in_list_view": 1, 
+   "label": "Month", 
+   "length": 0, 
+   "no_copy": 0, 
+   "oldfieldname": "month", 
+   "oldfieldtype": "Select", 
+   "options": "\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 1, 
+   "set_only_once": 0, 
+   "unique": 0, 
+   "width": "37%"
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "start_date", 
+   "fieldtype": "Date", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Start Date", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "default": "Today", 
+   "depends_on": "", 
+   "fieldname": "end_date", 
+   "fieldtype": "Date", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "End Date", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "column_break_15", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "salary_structure", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Salary Structure", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Salary Structure", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
    "fieldname": "total_days_in_month", 
    "fieldtype": "Float", 
    "hidden": 0, 
@@ -327,6 +486,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "", 
    "fieldname": "leave_without_pay", 
    "fieldtype": "Float", 
    "hidden": 0, 
@@ -353,6 +513,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "", 
    "fieldname": "payment_days", 
    "fieldtype": "Float", 
    "hidden": 0, 
@@ -379,6 +540,159 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "hourly_wages", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "timesheets", 
+   "fieldtype": "Table", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Salary Slip Timesheet", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Salary Slip Timesheet", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "column_break_20", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "total_working_hours", 
+   "fieldtype": "Float", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Total Working Hours", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "hour_rate", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Hour Rate", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "2", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "section_break_26", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "bank_name", 
    "fieldtype": "Data", 
    "hidden": 0, 
@@ -431,6 +745,30 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "column_break_01", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "amended_from", 
    "fieldtype": "Link", 
    "hidden": 0, 
@@ -614,52 +952,6 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "column_break_25", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "column_break_26", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
    "fieldname": "arrear_amount", 
    "fieldtype": "Currency", 
    "hidden": 0, 
@@ -741,6 +1033,29 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "column_break_25", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "total_deduction", 
    "fieldtype": "Currency", 
    "hidden": 0, 
@@ -849,13 +1164,14 @@
  "hide_toolbar": 0, 
  "icon": "icon-file-text", 
  "idx": 9, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 1, 
  "issingle": 0, 
  "istable": 0, 
- "max_attachments": 0,
- "modified": "2016-04-26 06:02:06.940543", 
+ "max_attachments": 0, 
+ "modified": "2016-06-27 16:22:46.063078", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Salary Slip", 
@@ -923,6 +1239,7 @@
    "write": 0
   }
  ], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "sort_field": "modified", 
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index d1fac25..d95cbf4 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -20,14 +20,16 @@
 		self.name = make_autoname('Sal Slip/' +self.employee + '/.#####')
 
 	def validate(self):
+		self.validate_dates()
 		self.check_existing()
+		self.set_month_dates()
 
 		if not (len(self.get("earnings")) or len(self.get("deductions"))):
 			self.get_emp_and_leave_details()
 		else:
 			self.get_leave_details(lwp = self.leave_without_pay)
 
-		if not self.net_pay:
+		if self.salary_slip_based_on_timesheet or not self.net_pay:
 			self.calculate_net_pay()
 
 		company_currency = get_company_currency(self.company)
@@ -35,38 +37,85 @@
 
 		set_employee_name(self)
 
+	def validate_dates(self):
+		if date_diff(self.end_date, self.start_date) < 0:
+			frappe.throw(_("To date cannot be before From date"))
+
 	def get_emp_and_leave_details(self):
 		if self.employee:
+			self.set("earnings", [])
+			self.set("deductions", [])
+
+			self.set_month_dates()
+			self.validate_dates()
 			joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
 				["date_of_joining", "relieving_date"])
 
 			self.get_leave_details(joining_date, relieving_date)
-
 			struct = self.check_sal_struct(joining_date, relieving_date)
+
 			if struct:
-				self.set("earnings", [])
-				self.set("deduction", [])
-				self.pull_sal_struct(struct)
+				ss_doc = frappe.get_doc('Salary Structure', struct)
+				self.salary_slip_based_on_timesheet = ss_doc.salary_slip_based_on_timesheet or 0
+				self.set_time_sheet()
+				self.pull_sal_struct(ss_doc)
+
+	def set_time_sheet(self):
+		if self.salary_slip_based_on_timesheet and not self.get('timesheets'):
+			self.set("timesheets", [])
+
+			timesheets = frappe.db.sql(""" select * from `tabTime Sheet` where employee = %(employee)s and (status = 'Submitted' or
+				status = 'Billed')""", {'employee': self.employee}, as_dict=1)
+
+			for data in timesheets:
+				self.append('timesheets', {
+					'time_sheet': data.name,
+					'working_hours': data.total_hours
+				})
+
+	def set_month_dates(self):
+		if self.month and not self.salary_slip_based_on_timesheet:
+			m = get_month_details(self.fiscal_year, self.month)
+			self.start_date = m['month_start_date']
+			self.end_date = m['month_end_date']
 
 	def check_sal_struct(self, joining_date, relieving_date):
-		m = get_month_details(self.fiscal_year, self.month)
-
+		timesheet = 1 if self.salary_slip_based_on_timesheet else 0
 		struct = frappe.db.sql("""select name from `tabSalary Structure`
 			where employee=%s and is_active = 'Yes'
 			and (from_date <= %s or from_date <= %s)
-			and (to_date is null or to_date >= %s or to_date >= %s)""",
-			(self.employee, m.month_start_date, joining_date, m.month_end_date, relieving_date))
+			and (to_date is null or to_date >= %s or to_date >= %s) and salary_slip_based_on_timesheet=%s""",
+			(self.employee, self.start_date, joining_date, self.end_date, relieving_date, timesheet))
 
 		if not struct:
-			msgprint(_("No active Salary Structure found for employee {0} and the month")
+			self.salary_structure = None
+			msgprint(_("No active or default Salary Structure found for employee {0} and the month")
 				.format(self.employee))
-			self.employee = None
 
 		return struct and struct[0][0] or ''
 
-	def pull_sal_struct(self, struct):
+	def pull_sal_struct(self, ss_doc):
 		from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip
-		make_salary_slip(struct, self)
+		make_salary_slip(ss_doc.name, self)
+
+		if self.salary_slip_based_on_timesheet:
+			self.salary_structure = ss_doc.name
+			self.hour_rate = ss_doc.hour_rate
+			self.total_working_hours = sum([d.working_hours or 0.0 for d in self.timesheets]) or 0.0
+			self.add_earning_for_hourly_wages(ss_doc.earning_type)
+
+	def add_earning_for_hourly_wages(self, earning_type):
+		default_type = False
+		for data in self.earnings:
+			if data.earning_type == earning_type:
+				data.earning_amount = self.hour_rate * self.total_working_hours
+				default_type = True
+				break
+
+		if not default_type:
+			earnings = self.append('earnings', {})
+			earnings.earning_type = earning_type
+			earnings.earning_amount = self.hour_rate * self.total_working_hours
 
 	def pull_emp_details(self):
 		emp = frappe.db.get_value("Employee", self.employee, ["bank_name", "bank_ac_no"], as_dict=1)
@@ -81,40 +130,41 @@
 
 		if not self.month:
 			self.month = "%02d" % getdate(nowdate()).month
+			self.set_month_dates()
 
 		if not joining_date:
 			joining_date, relieving_date = frappe.db.get_value("Employee", self.employee,
 				["date_of_joining", "relieving_date"])
 
-		m = get_month_details(self.fiscal_year, self.month)
-		holidays = self.get_holidays_for_employee(m['month_start_date'], m['month_end_date'])
+		holidays = self.get_holidays_for_employee(self.start_date, self.end_date)
 
-		working_days = m["month_days"]
+		working_days = date_diff(self.end_date, self.start_date) + 1
 		if not cint(frappe.db.get_value("HR Settings", None, "include_holidays_in_total_working_days")):
 			working_days -= len(holidays)
 			if working_days < 0:
 				frappe.throw(_("There are more holidays than working days this month."))
 
 		if not lwp:
-			lwp = self.calculate_lwp(holidays, m)
+			lwp = self.calculate_lwp(holidays, working_days)
 		self.total_days_in_month = working_days
 		self.leave_without_pay = lwp
-		payment_days = flt(self.get_payment_days(m, joining_date, relieving_date)) - flt(lwp)
+		payment_days = flt(self.get_payment_days(joining_date, relieving_date)) - flt(lwp)
 		self.payment_days = payment_days > 0 and payment_days or 0
 
-	def get_payment_days(self, month, joining_date, relieving_date):
-		start_date = month['month_start_date']
+	def get_payment_days(self, joining_date, relieving_date):
+		start_date = getdate(self.start_date)
+
 		if joining_date:
-			if joining_date > month['month_start_date']:
+			if joining_date > getdate(self.start_date):
 				start_date = joining_date
-			elif joining_date > month['month_end_date']:
+			elif joining_date > getdate(self.end_date):
 				return
 
-		end_date = month['month_end_date']
+		end_date = getdate(self.end_date)
 		if relieving_date:
-			if relieving_date > start_date and relieving_date < month['month_end_date']:
+			if relieving_date > start_date and relieving_date < getdate(self.end_date):
 				end_date = relieving_date
-			elif relieving_date < month['month_start_date']:
+			elif relieving_date < getdate(self.start_date):
 				frappe.throw(_("Employee relieved on {0} must be set as 'Left'")
 					.format(relieving_date))
 
@@ -142,10 +192,10 @@
 
 		return holidays
 
-	def calculate_lwp(self, holidays, m):
+	def calculate_lwp(self, holidays, working_days):
 		lwp = 0
-		for d in range(m['month_days']):
-			dt = add_days(cstr(m['month_start_date']), d)
+		for d in range(working_days):
+			dt = add_days(cstr(self.start_date), d)
 			if dt not in holidays:
 				leave = frappe.db.sql("""
 					select t1.name, t1.half_day
@@ -161,38 +211,43 @@
 		return lwp
 
 	def check_existing(self):
-		ret_exist = frappe.db.sql("""select name from `tabSalary Slip`
-			where month = %s and fiscal_year = %s and docstatus != 2
-			and employee = %s and name != %s""",
-			(self.month, self.fiscal_year, self.employee, self.name))
-		if ret_exist:
-			self.employee = ''
-			frappe.throw(_("Salary Slip of employee {0} already created for this month").format(self.employee))
+		if not self.salary_slip_based_on_timesheet:
+			ret_exist = frappe.db.sql("""select name from `tabSalary Slip`
+						where month = %s and fiscal_year = %s and docstatus != 2
+						and employee = %s and name != %s""",
+						(self.month, self.fiscal_year, self.employee, self.name))
+			if ret_exist:
+				self.employee = ''
+				frappe.throw(_("Salary Slip of employee {0} already created for this period").format(self.employee))
+		else:
+			for data in self.timesheets:
+				if frappe.db.get_value('Time Sheet', data.time_sheet, 'status') == 'Payrolled':
+					frappe.throw(_("Salary Slip of employee {0} already created for time sheet {1}").format(self.employee, data.time_sheet))
 
 	def calculate_earning_total(self):
 		self.gross_pay = flt(self.arrear_amount) + flt(self.leave_encashment_amount)
 		for d in self.get("earnings"):
 			if cint(d.e_depends_on_lwp) == 1:
-				d.e_modified_amount = rounded((flt(d.e_amount) * flt(self.payment_days)
-					/ cint(self.total_days_in_month)), self.precision("e_modified_amount", "earnings"))
+				d.earning_amount = rounded((flt(d.e_amount) * flt(self.payment_days)
+					/ cint(self.total_days_in_month)), self.precision("earning_amount", "earnings"))
 			elif not self.payment_days:
-				d.e_modified_amount = 0
-			elif not d.e_modified_amount:
-				d.e_modified_amount = d.e_amount
-			self.gross_pay += flt(d.e_modified_amount)
+				d.earning_amount = 0
+			elif not d.earning_amount:
+				d.earning_amount = d.e_amount
+			self.gross_pay += flt(d.earning_amount)
 
 	def calculate_ded_total(self):
 		self.total_deduction = 0
 		for d in self.get('deductions'):
 			if cint(d.d_depends_on_lwp) == 1:
-				d.d_modified_amount = rounded((flt(d.d_amount) * flt(self.payment_days)
-					/ cint(self.total_days_in_month)), self.precision("d_modified_amount", "deductions"))
+				d.deduction_amount = rounded((flt(d.d_amount) * flt(self.payment_days)
+					/ cint(self.total_days_in_month)), self.precision("deduction_amount", "deductions"))
 			elif not self.payment_days:
-				d.d_modified_amount = 0
-			elif not d.d_modified_amount:
-				d.d_modified_amount = d.d_amount
+				d.deduction_amount = 0
+			elif not d.deduction_amount:
+				d.deduction_amount = d.d_amount
 
-			self.total_deduction += flt(d.d_modified_amount)
+			self.total_deduction += flt(d.deduction_amount)
 
 	def calculate_net_pay(self):
 		disable_rounded_total = cint(frappe.db.get_value("Global Defaults", None, "disable_rounded_total"))
@@ -204,16 +259,28 @@
 			self.precision("net_pay") if disable_rounded_total else 0)
 
 	def on_submit(self):
+		self.update_status(self.name)
 		if(frappe.db.get_single_value("HR Settings", "email_salary_slip_to_employee")):
 			self.email_salary_slip()
-
+			
+	def on_cancel(self):
+		self.update_status()
 
 	def email_salary_slip(self):
 		receiver = frappe.db.get_value("Employee", self.employee, "company_email") or \
 			frappe.db.get_value("Employee", self.employee, "personal_email")
 		if receiver:
-			subj = 'Salary Slip - ' + cstr(self.month) +'/'+cstr(self.fiscal_year)
+			subj = 'Salary Slip - from {0} to {1}, fiscal year {2}'.format(self.start_date, self.end_date, self.fiscal_year)
 			frappe.sendmail([receiver], subject=subj, message = _("Please see attachment"),
 				attachments=[frappe.attach_print(self.doctype, self.name, file_name=self.name)], reference_doctype= self.doctype, reference_name= self.name)
 		else:
 			msgprint(_("{0}: Employee email not found, hence email not sent").format(self.employee_name))
+
+	def update_status(self, salary_slip=None):
+		for data in self.timesheets:
+			if data.time_sheet:
+				timesheet = frappe.get_doc('Time Sheet', data.time_sheet)
+				timesheet.salary_slip = salary_slip
+				timesheet.flags.ignore_validate_update_after_submit = True
+				timesheet.set_status()
+				timesheet.save()
\ No newline at end of file
diff --git a/erpnext/hr/doctype/salary_slip/test_records.json b/erpnext/hr/doctype/salary_slip/test_records.json
index da8d95d..6e978a6 100644
--- a/erpnext/hr/doctype/salary_slip/test_records.json
+++ b/erpnext/hr/doctype/salary_slip/test_records.json
@@ -5,14 +5,14 @@
    {
     "d_amount": 100, 
     "d_depends_on_lwp": 0, 
-    "d_type": "_Test Professional Tax", 
+    "deduction_type": "_Test Professional Tax", 
     "doctype": "Salary Slip Deduction", 
     "parentfield": "deductions"
    }, 
    {
     "d_amount": 50, 
     "d_depends_on_lwp": 1, 
-    "d_type": "_Test TDS", 
+    "deduction_type": "_Test TDS", 
     "doctype": "Salary Slip Deduction", 
     "parentfield": "deductions"
    }
@@ -23,14 +23,14 @@
     "doctype": "Salary Slip Earning", 
     "e_amount": 15000, 
     "e_depends_on_lwp": 1, 
-    "e_type": "_Test Basic Salary", 
+    "earning_type": "_Test Basic Salary", 
     "parentfield": "earnings"
    }, 
    {
     "doctype": "Salary Slip Earning", 
     "e_amount": 500, 
     "e_depends_on_lwp": 0, 
-    "e_type": "_Test Allowance", 
+    "earning_type": "_Test Allowance", 
     "parentfield": "earnings"
    }
   ], 
diff --git a/erpnext/hr/doctype/salary_slip/test_salary_slip.py b/erpnext/hr/doctype/salary_slip/test_salary_slip.py
index 4ddaecc..4facd50 100644
--- a/erpnext/hr/doctype/salary_slip/test_salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/test_salary_slip.py
@@ -4,7 +4,7 @@
 
 import unittest
 import frappe
-from frappe.utils import today
+from frappe.utils import today, now_datetime, getdate, cstr
 from erpnext.hr.doctype.employee.employee import make_salary_structure
 from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip
 from erpnext.hr.doctype.leave_application.test_leave_application import make_allocation_record
@@ -35,10 +35,10 @@
 
 		self.assertEquals(ss.total_days_in_month, 31)
 		self.assertEquals(ss.payment_days, 30)
-		self.assertEquals(ss.earnings[0].e_modified_amount, 14516.13)
-		self.assertEquals(ss.earnings[1].e_modified_amount, 500)
-		self.assertEquals(ss.deductions[0].d_modified_amount, 100)
-		self.assertEquals(ss.deductions[1].d_modified_amount, 48.39)
+		self.assertEquals(ss.earnings[0].earning_amount, 14516.13)
+		self.assertEquals(ss.earnings[1].earning_amount, 500)
+		self.assertEquals(ss.deductions[0].deduction_amount, 100)
+		self.assertEquals(ss.deductions[1].deduction_amount, 48.39)
 		self.assertEquals(ss.gross_pay, 15016.13)
 		self.assertEquals(ss.net_pay, 14867.74)
 
@@ -49,10 +49,10 @@
 
 		self.assertEquals(ss.total_days_in_month, 29)
 		self.assertEquals(ss.payment_days, 28)
-		self.assertEquals(ss.earnings[0].e_modified_amount, 14482.76)
-		self.assertEquals(ss.earnings[1].e_modified_amount, 500)
-		self.assertEquals(ss.deductions[0].d_modified_amount, 100)
-		self.assertEquals(ss.deductions[1].d_modified_amount, 48.28)
+		self.assertEquals(ss.earnings[0].earning_amount, 14482.76)
+		self.assertEquals(ss.earnings[1].earning_amount, 500)
+		self.assertEquals(ss.deductions[0].deduction_amount, 100)
+		self.assertEquals(ss.deductions[1].deduction_amount, 48.28)
 		self.assertEquals(ss.gross_pay, 14982.76)
 		self.assertEquals(ss.net_pay, 14834.48)
 
@@ -153,6 +153,13 @@
 
 		return salary_slip
 
+	def make_activity_for_employee(self):
+		activity_type = frappe.get_doc("Activity Type", "_Test Activity Type")
+		activity_type.billing_rate = 50
+		activity_type.costing_rate = 20
+		activity_type.wage_rate = 25
+		activity_type.save()
+
 test_dependencies = ["Leave Application", "Holiday List"]
 
 test_records = frappe.get_test_records('Salary Slip')
diff --git a/erpnext/hr/doctype/salary_slip_deduction/salary_slip_deduction.json b/erpnext/hr/doctype/salary_slip_deduction/salary_slip_deduction.json
index a0e722e..72fd657 100644
--- a/erpnext/hr/doctype/salary_slip_deduction/salary_slip_deduction.json
+++ b/erpnext/hr/doctype/salary_slip_deduction/salary_slip_deduction.json
@@ -2,19 +2,22 @@
  "allow_copy": 0, 
  "allow_import": 0, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2013-02-22 01:27:48", 
  "custom": 0, 
  "docstatus": 0, 
  "doctype": "DocType", 
+ "document_type": "Setup", 
  "fields": [
   {
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "d_type", 
+   "fieldname": "deduction_type", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Type", 
@@ -25,6 +28,7 @@
    "options": "Deduction Type", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "print_width": "200px", 
    "read_only": 0, 
    "report_hide": 0, 
@@ -42,6 +46,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Default Amount", 
@@ -52,6 +57,7 @@
    "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -67,6 +73,7 @@
    "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Depends on Leave Without Pay", 
@@ -74,6 +81,7 @@
    "no_copy": 0, 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -85,10 +93,11 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "d_modified_amount", 
+   "fieldname": "deduction_amount", 
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Amount", 
@@ -97,6 +106,7 @@
    "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -108,18 +118,22 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:55.610195", 
+ "modified": "2016-06-27 16:02:25.613138", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Salary Slip Deduction", 
  "owner": "Administrator", 
  "permissions": [], 
+ "quick_entry": 1, 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "sort_order": "ASC", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/hr/doctype/salary_slip_earning/salary_slip_earning.json b/erpnext/hr/doctype/salary_slip_earning/salary_slip_earning.json
index 6d897b0..3301dd8 100644
--- a/erpnext/hr/doctype/salary_slip_earning/salary_slip_earning.json
+++ b/erpnext/hr/doctype/salary_slip_earning/salary_slip_earning.json
@@ -2,19 +2,22 @@
  "allow_copy": 0, 
  "allow_import": 0, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2013-02-22 01:27:48", 
  "custom": 0, 
  "docstatus": 0, 
  "doctype": "DocType", 
+ "document_type": "Setup", 
  "fields": [
   {
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "e_type", 
+   "fieldname": "earning_type", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Type", 
@@ -25,6 +28,7 @@
    "options": "Earning Type", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "print_width": "", 
    "read_only": 0, 
    "report_hide": 0, 
@@ -42,6 +46,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Default Amount", 
@@ -52,6 +57,7 @@
    "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -67,6 +73,7 @@
    "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Depends on Leave Without Pay", 
@@ -74,6 +81,7 @@
    "no_copy": 0, 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -85,10 +93,11 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "e_modified_amount", 
+   "fieldname": "earning_amount", 
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Amount", 
@@ -97,6 +106,7 @@
    "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -108,18 +118,22 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:55.649418", 
+ "modified": "2016-06-27 15:56:04.146109", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Salary Slip Earning", 
  "owner": "Administrator", 
  "permissions": [], 
+ "quick_entry": 1, 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "sort_order": "ASC", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log/__init__.py b/erpnext/hr/doctype/salary_slip_timesheet/__init__.py
similarity index 100%
copy from erpnext/projects/doctype/time_log/__init__.py
copy to erpnext/hr/doctype/salary_slip_timesheet/__init__.py
diff --git a/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.json b/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.json
new file mode 100644
index 0000000..a503e73
--- /dev/null
+++ b/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.json
@@ -0,0 +1,87 @@
+{
+ "allow_copy": 0, 
+ "allow_import": 0, 
+ "allow_rename": 0, 
+ "beta": 0, 
+ "creation": "2016-06-14 19:22:29.811658", 
+ "custom": 0, 
+ "docstatus": 0, 
+ "doctype": "DocType", 
+ "document_type": "", 
+ "fields": [
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "time_sheet", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Time Sheet", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Time Sheet", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "working_hours", 
+   "fieldtype": "Float", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Working Hours", 
+   "length": 0, 
+   "no_copy": 1, 
+   "permlevel": 0, 
+   "precision": "3", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }
+ ], 
+ "hide_heading": 0, 
+ "hide_toolbar": 0, 
+ "idx": 0, 
+ "image_view": 0, 
+ "in_create": 0, 
+ "in_dialog": 0, 
+ "is_submittable": 0, 
+ "issingle": 0, 
+ "istable": 1, 
+ "max_attachments": 0, 
+ "modified": "2016-06-15 17:59:57.876373", 
+ "modified_by": "Administrator", 
+ "module": "HR", 
+ "name": "Salary Slip Timesheet", 
+ "name_case": "", 
+ "owner": "Administrator", 
+ "permissions": [], 
+ "quick_entry": 1, 
+ "read_only": 0, 
+ "read_only_onload": 0, 
+ "sort_field": "modified", 
+ "sort_order": "DESC", 
+ "track_seen": 0
+}
\ No newline at end of file
diff --git a/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.py b/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.py
new file mode 100644
index 0000000..1bbfc53
--- /dev/null
+++ b/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class SalarySlipTimesheet(Document):
+	pass
diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.js b/erpnext/hr/doctype/salary_structure/salary_structure.js
index 77f516e..6668067 100755
--- a/erpnext/hr/doctype/salary_structure/salary_structure.js
+++ b/erpnext/hr/doctype/salary_structure/salary_structure.js
@@ -12,7 +12,7 @@
 }
 
 cur_frm.cscript.refresh = function(doc, dt, dn){
-	if((!doc.__islocal) && (doc.is_active == 'Yes')){
+	if((!doc.__islocal) && (doc.is_active == 'Yes') && (doc.salary_slip_based_on_timesheet == 0)){
 		cur_frm.add_custom_button(__('Salary Slip'),
 			cur_frm.cscript['Make Salary Slip'], __("Make"));
 		cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
@@ -52,7 +52,11 @@
 	}
 	doc.total_earning = total_earn;
 	doc.total_deduction = total_ded;
-	doc.net_pay = flt(total_earn) - flt(total_ded);
+	doc.net_pay = 0.0
+	if(doc.salary_slip_based_on_timesheet == 0){
+		doc.net_pay = flt(total_earn) - flt(total_ded);
+	}
+
 	refresh_many(['total_earning', 'total_deduction', 'net_pay']);
 }
 
diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.json b/erpnext/hr/doctype/salary_structure/salary_structure.json
index e832697..9a68f9d 100644
--- a/erpnext/hr/doctype/salary_structure/salary_structure.json
+++ b/erpnext/hr/doctype/salary_structure/salary_structure.json
@@ -2,6 +2,7 @@
  "allow_copy": 0, 
  "allow_import": 1, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2013-03-07 18:50:29", 
  "custom": 0, 
  "docstatus": 0, 
@@ -273,6 +274,33 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "default": "No", 
+   "fieldname": "is_default", 
+   "fieldtype": "Select", 
+   "hidden": 1, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Is Default", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Yes\nNo", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
    "fieldname": "from_date", 
    "fieldtype": "Date", 
    "hidden": 0, 
@@ -325,6 +353,136 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "eval:!doc.__islocal", 
+   "fieldname": "salary_slip_based_on_timesheet", 
+   "fieldtype": "Check", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Salary Slip Based on Timesheet", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "eval:doc.salary_slip_based_on_timesheet", 
+   "fieldname": "section_break_15", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "description": "Earning type for timesheet based payroll.", 
+   "fieldname": "earning_type", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Earning Type", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Earning Type", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "column_break_17", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "hour_rate", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Hour Rate", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "2", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
    "description": "Salary breakup based on Earning and Deduction.", 
    "fieldname": "earning_deduction", 
    "fieldtype": "Section Break", 
@@ -333,7 +491,7 @@
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Monthly Earning & Deduction", 
+   "label": "", 
    "length": 0, 
    "no_copy": 0, 
    "oldfieldname": "earning_deduction", 
@@ -379,6 +537,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "", 
    "fieldname": "earnings", 
    "fieldtype": "Table", 
    "hidden": 0, 
@@ -397,7 +556,7 @@
    "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
-   "reqd": 1, 
+   "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
    "unique": 0
@@ -460,7 +619,8 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "section_break0", 
+   "depends_on": "", 
+   "fieldname": "net_pay_detail", 
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
@@ -612,13 +772,14 @@
  "hide_toolbar": 0, 
  "icon": "icon-file-text", 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-03-18 16:10:30.031811", 
+ "modified": "2016-06-27 16:23:16.856237", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Salary Structure", 
@@ -649,7 +810,7 @@
    "apply_user_permissions": 0, 
    "cancel": 0, 
    "create": 1, 
-   "delete": 0, 
+   "delete": 1, 
    "email": 1, 
    "export": 0, 
    "if_owner": 0, 
@@ -665,10 +826,12 @@
    "write": 1
   }
  ], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "sort_field": "modified", 
  "sort_order": "DESC", 
  "timeline_field": "employee", 
- "title_field": "employee_name"
+ "title_field": "employee_name", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.py b/erpnext/hr/doctype/salary_structure/salary_structure.py
index 69f341b..4538ff7 100644
--- a/erpnext/hr/doctype/salary_structure/salary_structure.py
+++ b/erpnext/hr/doctype/salary_structure/salary_structure.py
@@ -16,7 +16,7 @@
 		self.name = make_autoname(self.employee + '/.SST' + '/.#####')
 		
 	def validate(self):
-		self.check_existing()
+		self.check_overlap()
 		self.validate_amount()
 		self.validate_employee()
 		self.validate_joining_date()
@@ -48,43 +48,44 @@
 		for li in list1:
 			child = self.append(tab_fname, {})
 			if(tab_fname == 'earnings'):
-				child.e_type = cstr(li[0])
+				child.earning_type = cstr(li[0])
 				child.modified_value = 0
 			elif(tab_fname == 'deductions'):
-				child.d_type = cstr(li[0])
+				child.deduction_type = cstr(li[0])
 				child.d_modified_amt = 0
 
 	def make_earn_ded_table(self):
 		self.make_table('Earning Type','earnings','Salary Structure Earning')
 		self.make_table('Deduction Type','deductions', 'Salary Structure Deduction')
 
-	def check_existing(self):
-		ret = self.get_other_active_salary_structure()
-
-		if ret and self.is_active=='Yes':
-			frappe.throw(_("Another Salary Structure {0} is active for employee {1}. Please make its status 'Inactive' to proceed.").format(ret, self.employee))
-
-	def get_other_active_salary_structure(self):
-		ret = frappe.db.sql("""select name from `tabSalary Structure` where is_active = 'Yes'
-			and employee = %s and name!=%s""", (self.employee,self.name))
-
-		return ret[0][0] if ret else None
-
-	def before_test_insert(self):
-		"""Make any existing salary structure for employee inactive."""
-		ret = self.get_other_active_salary_structure()
-		if ret:
-			frappe.db.set_value("Salary Structure", ret, "is_active", "No")
+	def check_overlap(self):
+		existing = frappe.db.sql("""select name from `tabSalary Structure`
+			where employee = %(employee)s and
+			(
+				(%(from_date)s > from_date and %(from_date)s < to_date) or
+				(%(to_date)s > from_date and %(to_date)s < to_date) or
+				(%(from_date)s <= from_date and %(to_date)s >= to_date))
+			and name!=%(name)s
+			and docstatus < 2""",
+			{
+				"employee": self.employee,
+				"from_date": self.from_date,
+				"to_date": self.to_date,
+				"name": self.name or "No Name"
+			}, as_dict=True)
+			
+		if existing:
+			frappe.throw(_("Salary structure {0} already exist, more than one salary structure for same period is not allowed").format(existing[0].name))
 
 	def validate_amount(self):
-		if flt(self.net_pay) < 0:
+		if flt(self.net_pay) < 0 and self.salary_slip_based_on_timesheet:
 			frappe.throw(_("Net pay cannot be negative"))
 
 	def validate_employee(self):
 		old_employee = frappe.db.get_value("Salary Structure", self.name, "employee")
 		if old_employee and self.employee != old_employee:
 			frappe.throw(_("Employee can not be changed"))
-			
+
 	def validate_joining_date(self):
 		joining_date = getdate(frappe.db.get_value("Employee", self.employee, "date_of_joining"))
 		if getdate(self.from_date) < joining_date:
@@ -93,6 +94,7 @@
 @frappe.whitelist()
 def make_salary_slip(source_name, target_doc=None):
 	def postprocess(source, target):
+		target.salary_structure = source.name
 		target.run_method("pull_emp_details")
 		target.run_method("get_leave_details")
 		target.run_method("calculate_net_pay")
@@ -109,7 +111,7 @@
 			"field_map": [
 				["depend_on_lwp", "d_depends_on_lwp"],
 				["d_modified_amt", "d_amount"],
-				["d_modified_amt", "d_modified_amount"]
+				["d_modified_amt", "deduction_amount"]
 			],
 			"add_if_empty": True
 		},
@@ -117,8 +119,8 @@
 			"doctype": "Salary Slip Earning",
 			"field_map": [
 				["depend_on_lwp", "e_depends_on_lwp"],
-				["modified_value", "e_modified_amount"],
-				["modified_value", "e_amount"]
+				["modified_value", "e_amount"],
+				["modified_value", "earning_amount"]
 			],
 			"add_if_empty": True
 		}
diff --git a/erpnext/hr/doctype/salary_structure/test_records.json b/erpnext/hr/doctype/salary_structure/test_records.json
index 3af83f1..b0272da 100644
--- a/erpnext/hr/doctype/salary_structure/test_records.json
+++ b/erpnext/hr/doctype/salary_structure/test_records.json
@@ -6,10 +6,10 @@
 		"from_date": "2014-02-01",
 		"earnings": [
 			{
-				"e_type": "_Test Basic Salary"
+				"earning_type": "_Test Basic Salary"
 			},
 			{
-				"e_type": "_Test Allowance"
+				"earning_type": "_Test Allowance"
 			}
 		]
 	}
diff --git a/erpnext/hr/doctype/salary_structure_deduction/salary_structure_deduction.json b/erpnext/hr/doctype/salary_structure_deduction/salary_structure_deduction.json
index 3a718aa..fa06776 100644
--- a/erpnext/hr/doctype/salary_structure_deduction/salary_structure_deduction.json
+++ b/erpnext/hr/doctype/salary_structure_deduction/salary_structure_deduction.json
@@ -2,19 +2,22 @@
  "allow_copy": 0, 
  "allow_import": 0, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2013-02-22 01:27:48", 
  "custom": 0, 
  "docstatus": 0, 
  "doctype": "DocType", 
+ "document_type": "Setup", 
  "fields": [
   {
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "d_type", 
+   "fieldname": "deduction_type", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Type", 
@@ -25,6 +28,7 @@
    "options": "Deduction Type", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "print_width": "200px", 
    "read_only": 0, 
    "report_hide": 0, 
@@ -42,6 +46,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Amount", 
@@ -52,6 +57,7 @@
    "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -67,6 +73,7 @@
    "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Reduce Deduction for Leave Without Pay (LWP)", 
@@ -76,6 +83,7 @@
    "oldfieldtype": "Check", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -87,18 +95,21 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:55.793274", 
+ "modified": "2016-06-27 15:36:26.491643", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Salary Structure Deduction", 
  "owner": "Administrator", 
  "permissions": [], 
+ "quick_entry": 1, 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/hr/doctype/salary_structure_earning/salary_structure_earning.json b/erpnext/hr/doctype/salary_structure_earning/salary_structure_earning.json
index 8dfcb0a..2cbd8b9 100644
--- a/erpnext/hr/doctype/salary_structure_earning/salary_structure_earning.json
+++ b/erpnext/hr/doctype/salary_structure_earning/salary_structure_earning.json
@@ -2,6 +2,7 @@
  "allow_copy": 0, 
  "allow_import": 0, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2013-02-22 01:27:48", 
  "custom": 0, 
  "docstatus": 0, 
@@ -11,10 +12,11 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "e_type", 
+   "fieldname": "earning_type", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Type", 
@@ -25,6 +27,7 @@
    "options": "Earning Type", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "print_width": "200px", 
    "read_only": 0, 
    "report_hide": 0, 
@@ -42,6 +45,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Amount", 
@@ -52,6 +56,7 @@
    "options": "Company:company:default_currency", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -67,6 +72,7 @@
    "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Reduce Earning for Leave Without Pay (LWP)", 
@@ -76,6 +82,7 @@
    "oldfieldtype": "Check", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -87,18 +94,22 @@
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:55.830492", 
+ "modified": "2016-06-27 15:28:58.884891", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Salary Structure Earning", 
  "owner": "Administrator", 
  "permissions": [], 
+ "quick_entry": 1, 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "sort_order": "ASC", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py b/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py
index 8b02348..da5d0fd 100644
--- a/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py
+++ b/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py
@@ -42,12 +42,12 @@
 		_("Payment Days") + ":Float:120"
 	]
 	
-	earning_types = frappe.db.sql_list("""select distinct e_type from `tabSalary Slip Earning`
-		where e_modified_amount != 0 and parent in (%s)""" % 
+	earning_types = frappe.db.sql_list("""select distinct earning_type from `tabSalary Slip Earning`
+		where earning_amount != 0 and parent in (%s)""" % 
 		(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]))
 		
-	ded_types = frappe.db.sql_list("""select distinct d_type from `tabSalary Slip Deduction`
-		where d_modified_amount != 0 and parent in (%s)""" % 
+	ded_types = frappe.db.sql_list("""select distinct deduction_type from `tabSalary Slip Deduction`
+		where deduction_amount != 0 and parent in (%s)""" % 
 		(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]))
 		
 	columns = columns + [(e + ":Currency:120") for e in earning_types] + \
@@ -83,25 +83,25 @@
 	return conditions, filters
 	
 def get_ss_earning_map(salary_slips):
-	ss_earnings = frappe.db.sql("""select parent, e_type, e_modified_amount 
+	ss_earnings = frappe.db.sql("""select parent, earning_type, earning_amount 
 		from `tabSalary Slip Earning` where parent in (%s)""" %
 		(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]), as_dict=1)
 	
 	ss_earning_map = {}
 	for d in ss_earnings:
-		ss_earning_map.setdefault(d.parent, frappe._dict()).setdefault(d.e_type, [])
-		ss_earning_map[d.parent][d.e_type] = flt(d.e_modified_amount)
+		ss_earning_map.setdefault(d.parent, frappe._dict()).setdefault(d.earning_type, [])
+		ss_earning_map[d.parent][d.earning_type] = flt(d.earning_amount)
 	
 	return ss_earning_map
 
 def get_ss_ded_map(salary_slips):
-	ss_deductions = frappe.db.sql("""select parent, d_type, d_modified_amount 
+	ss_deductions = frappe.db.sql("""select parent, deduction_type, deduction_amount 
 		from `tabSalary Slip Deduction` where parent in (%s)""" %
 		(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]), as_dict=1)
 	
 	ss_ded_map = {}
 	for d in ss_deductions:
-		ss_ded_map.setdefault(d.parent, frappe._dict()).setdefault(d.d_type, [])
-		ss_ded_map[d.parent][d.d_type] = flt(d.d_modified_amount)
+		ss_ded_map.setdefault(d.parent, frappe._dict()).setdefault(d.deduction_type, [])
+		ss_ded_map[d.parent][d.deduction_type] = flt(d.deduction_amount)
 	
 	return ss_ded_map
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.js b/erpnext/manufacturing/doctype/production_order/production_order.js
index ba7026e..00ce673 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.js
+++ b/erpnext/manufacturing/doctype/production_order/production_order.js
@@ -16,6 +16,10 @@
 			});
 			erpnext.production_order.set_default_warehouse(frm);
 		}
+		
+		// formatter for production order operation
+		frm.set_indicator_formatter('operation',
+			function(doc) { return (frm.doc.qty==doc.completed_qty) ? "green" : "orange" })
 
 		erpnext.production_order.set_custom_buttons(frm);
 		erpnext.production_order.setup_company_filter(frm);
@@ -33,6 +37,15 @@
 		if (frm.doc.docstatus===1) {
 			frm.trigger('show_progress');
 		}
+		
+		if(frm.doc.docstatus == 1){
+			frm.add_custom_button(__('Make Timesheet'), function(){
+				frappe.model.open_mapped_doc({
+					method: "erpnext.manufacturing.doctype.production_order.production_order.make_timesheet",
+					frm: cur_frm
+				})
+			})
+		}
 	},
 	show_progress: function(frm) {
 		var bars = [];
@@ -90,7 +103,7 @@
 	time_in_mins: function(frm, cdt, cdn) {
 		erpnext.production_order.calculate_cost(frm.doc);
 		erpnext.production_order.calculate_total_cost(frm);
-	}
+	},
 });
 
 erpnext.production_order = {
@@ -112,9 +125,9 @@
 
 			// opertions
 			if ((doc.operations || []).length) {
-				frm.add_custom_button(__('Time Logs'), function() {
+				frm.add_custom_button(__('Time Sheet'), function() {
 					frappe.route_options = {"production_order": frm.doc.name};
-					frappe.set_route("List", "Time Log");
+					frappe.set_route("List", "Time Sheet");
 				}, __("View"));
 			}
 
@@ -252,32 +265,6 @@
 	qty: function() {
 		frappe.ui.form.trigger("Production Order", 'bom_no')
 	},
-	show_time_logs: function(doc, cdt, cdn) {
-		var child = locals[cdt][cdn]
-		frappe.route_options = {"operation_id": child.name};
-		frappe.set_route("List", "Time Log");
-	},
-
-	make_time_log: function(doc, cdt, cdn){
-		var child = locals[cdt][cdn]
-		frappe.call({
-			method:"erpnext.manufacturing.doctype.production_order.production_order.make_time_log",
-			args: {
-				"name": doc.name,
-				"operation": child.operation,
-				"from_time": child.planned_start_time,
-				"to_time": child.planned_end_time,
-				"project": doc.project,
-				"workstation": child.workstation,
-				"qty": flt(doc.qty) - flt(child.completed_qty),
-				"operation_id": child.name
-			},
-			callback: function(r) {
-				var doclist = frappe.model.sync(r.message);
-				frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
-			}
-		});
-	}
 });
 
 cur_frm.cscript['Stop Production Order'] = function() {
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.json b/erpnext/manufacturing/doctype/production_order/production_order.json
index 7088126..447ed0a 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.json
+++ b/erpnext/manufacturing/doctype/production_order/production_order.json
@@ -1084,13 +1084,14 @@
  "hide_toolbar": 0, 
  "icon": "icon-cogs", 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 1, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-05-11 12:17:29.480533", 
+ "modified": "2016-06-23 10:20:22.075476", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Production Order", 
@@ -1115,6 +1116,26 @@
    "share": 1, 
    "submit": 1, 
    "write": 1
+  }, 
+  {
+   "amend": 0, 
+   "apply_user_permissions": 0, 
+   "cancel": 0, 
+   "create": 0, 
+   "delete": 0, 
+   "email": 0, 
+   "export": 0, 
+   "if_owner": 0, 
+   "import": 0, 
+   "permlevel": 0, 
+   "print": 0, 
+   "read": 1, 
+   "report": 1, 
+   "role": "Stock User", 
+   "set_user_permissions": 0, 
+   "share": 0, 
+   "submit": 0, 
+   "write": 0
   }
  ], 
  "quick_entry": 1, 
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index 6c8dfd5..e10459f 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -4,14 +4,16 @@
 from __future__ import unicode_literals
 import frappe
 
+import json
 from frappe.utils import flt, get_datetime, getdate, date_diff, cint, nowdate
 from frappe import _
 from frappe.model.document import Document
+from frappe.model.mapper import get_mapped_doc
 from erpnext.manufacturing.doctype.bom.bom import validate_bom_no
 from dateutil.relativedelta import relativedelta
 from erpnext.stock.doctype.item.item import validate_end_of_life
 from erpnext.manufacturing.doctype.workstation.workstation import WorkstationHolidayError, NotInWorkingHoursError
-from erpnext.projects.doctype.time_log.time_log import OverlapError
+from erpnext.projects.doctype.time_sheet.time_sheet import OverlapError
 from erpnext.stock.doctype.stock_entry.stock_entry import get_additional_costs
 from erpnext.manufacturing.doctype.manufacturing_settings.manufacturing_settings import get_mins_between_operations
 from erpnext.stock.stock_balance import get_planned_qty, update_bin_qty
@@ -158,6 +160,11 @@
 
 	def before_submit(self):
 		self.set_required_items()
+		self.make_timesheets()
+		
+	def before_cancel(self):
+		for data in self.operations:
+			data.time_sheet = None
 
 	def on_submit(self):
 		if not self.wip_warehouse:
@@ -166,7 +173,6 @@
 			frappe.throw(_("For Warehouse is required before Submit"))
 
 		self.update_reserved_qty_for_production()
-		self.make_time_logs()
 		self.update_completed_qty_in_material_request()
 		self.update_planned_qty()
 
@@ -175,7 +181,7 @@
 
 		frappe.db.set(self,'status', 'Cancelled')
 		self.clear_required_items()
-		self.delete_time_logs()
+		self.delete_time_sheet()
 		self.update_completed_qty_in_material_request()
 		self.update_planned_qty()
 
@@ -233,8 +239,8 @@
 			holidays[holiday_list] = holiday_list_days
 
 		return holidays[holiday_list]
-
-	def make_time_logs(self):
+		
+	def make_timesheets(self):
 		"""Capacity Planning. Plan time logs based on earliest availablity of workstation after
 			Planned Start Date. Time logs will be created and remain in Draft mode and must be submitted
 			before manufacturing entry can be made."""
@@ -242,72 +248,80 @@
 		if not self.operations:
 			return
 
-		time_logs = []
+		time_sheets = []
 		plan_days = frappe.db.get_single_value("Manufacturing Settings", "capacity_planning_for_days") or 30
+		
+		time_sheet = make_time_sheet(self.name)
+		workstation_list = []
+		last_workstation_idx = {}
 
 		for i, d in enumerate(self.operations):
-			self.set_operation_start_end_time(i, d)
-
-			time_log = make_time_log(self.name, d.operation, d.planned_start_time, d.planned_end_time,
-				flt(self.qty) - flt(d.completed_qty), self.project, d.workstation, operation_id=d.name)
-
 			if d.workstation:
+				last_workstation_idx[d.workstation] = i # set last row index of workstation
+				self.set_start_end_time_for_workstation(d, workstation_list, last_workstation_idx.get(d.workstation))
+				
+				args = self.get_operations_data(d)
+				add_timesheet_detail(time_sheet, args)
+				original_start_time = d.planned_start_time
+
 				# validate operating hours if workstation [not mandatory] is specified
 				self.check_operation_fits_in_working_hours(d)
-
-			original_start_time = time_log.from_time
-			while True:
-				_from_time = time_log.from_time
-
 				try:
-					time_log.save()
-					break
-				except WorkstationHolidayError:
-					time_log.move_to_next_day()
-				except NotInWorkingHoursError:
-					time_log.move_to_next_working_slot()
+					time_sheet.validate_timesheets()
 				except OverlapError:
-					time_log.move_to_next_non_overlapping_slot()
+					time_sheet.move_to_next_non_overlapping_slot(d.idx)
 
-				# reset end time
-				time_log.to_time = get_datetime(time_log.from_time) + relativedelta(minutes=d.time_in_mins)
+				from_time, to_time = self.get_start_end_time(time_sheet, d.name)
 
-				if date_diff(time_log.from_time, original_start_time) > plan_days:
-					frappe.msgprint(_("Unable to find Time Slot in the next {0} days for Operation {1}").format(plan_days, d.operation))
+				if date_diff(from_time, original_start_time) > plan_days:
+					frappe.throw(_("Unable to find Time Slot in the next {0} days for Operation {1}").format(plan_days, d.operation))
 					break
 
-				# if time log needs to be moved, make sure that the from time is not the same
-				if _from_time == time_log.from_time:
-					frappe.throw(_("Capacity Planning Error"))
+				d.planned_start_time = from_time
+				d.planned_end_time = to_time
+				d.db_update()
 
-			d.planned_start_time = time_log.from_time
-			d.planned_end_time = time_log.to_time
-			d.db_update()
-
-			if time_log.name:
-				time_logs.append(time_log.name)
+		if time_sheet:
+			time_sheet.save()
+			time_sheets.append(time_sheet.name)
 
 		self.planned_end_date = self.operations[-1].planned_end_time
-
-		if time_logs:
+		if time_sheets:
 			frappe.local.message_log = []
-			frappe.msgprint(_("Time Logs created:") + "\n" + "\n".join(time_logs))
+			frappe.msgprint(_("Time Sheet created:") + "\n" + "\n".join(time_sheets))
 
-	def set_operation_start_end_time(self, i, d):
+	def get_operations_data(self, data):
+		return {
+			'from_time': data.planned_start_time,
+			'hours': data.time_in_mins / 60,
+			'to_time': data.planned_end_time,
+			'project': self.project,
+			'operation': data.operation,
+			'operation_id': data.name,
+			'workstation': data.workstation,
+			'completed_qty': flt(self.qty) - flt(data.completed_qty)
+		}
+
+	def set_start_end_time_for_workstation(self, data, workstation_list, index):
 		"""Set start and end time for given operation. If first operation, set start as
 		`planned_start_date`, else add time diff to end time of earlier operation."""
-		if self.planned_start_date:
-			if i==0:
-				# first operation at planned_start date
-				d.planned_start_time = self.planned_start_date
-			else:
-				d.planned_start_time = get_datetime(self.operations[i-1].planned_end_time)\
-					+ get_mins_between_operations()
 
-			d.planned_end_time = get_datetime(d.planned_start_time) + relativedelta(minutes = d.time_in_mins)
+		if data.workstation not in workstation_list:
+			data.planned_start_time = self.planned_start_date
+			workstation_list.append(data.workstation)
+		else:
+			data.planned_start_time = get_datetime(self.operations[index-1].planned_end_time)\
+								+ get_mins_between_operations()
 
-			if d.planned_start_time == d.planned_end_time:
-				frappe.throw(_("Capacity Planning Error"))
+		data.planned_end_time = get_datetime(data.planned_start_time) + relativedelta(minutes = data.time_in_mins)
+
+		if data.planned_start_time == data.planned_end_time:
+			frappe.throw(_("Capacity Planning Error"))
+
+	def get_start_end_time(self, time_sheet, operation_id):
+		for data in time_sheet.timesheets:
+			if data.operation_id == operation_id:
+				return data.from_time, data.to_time
 
 	def check_operation_fits_in_working_hours(self, d):
 		"""Raises expection if operation is longer than working hours in the given workstation."""
@@ -336,9 +350,9 @@
 			self.actual_start_date = None
 			self.actual_end_date = None
 
-	def delete_time_logs(self):
-		for time_log in frappe.get_all("Time Log", ["name"], {"production_order": self.name}):
-			frappe.delete_doc("Time Log", time_log.name)
+	def delete_time_sheet(self):
+		for time_sheet in frappe.get_all("Time Sheet", ["name"], {"production_order": self.name}):
+			frappe.delete_doc("Time Sheet", time_sheet.name)
 
 	def validate_production_item(self):
 		if frappe.db.get_value("Item", self.production_item, "has_variants"):
@@ -490,22 +504,22 @@
 	return data
 
 @frappe.whitelist()
-def make_time_log(name, operation, from_time=None, to_time=None, qty=None,  project=None, workstation=None, operation_id=None):
-	time_log =  frappe.new_doc("Time Log")
-	time_log.for_manufacturing = 1
-	time_log.from_time = from_time
-	time_log.to_time = to_time
-	time_log.production_order = name
-	time_log.project = project
-	time_log.operation_id = operation_id
-	time_log.operation = operation
-	time_log.workstation= workstation
-	time_log.activity_type= "Manufacturing"
-	time_log.completed_qty = flt(qty)
+def make_time_sheet(production_order):
+	time_sheet = frappe.new_doc("Time Sheet")
+	time_sheet.employee = ""
+	time_sheet.production_order = production_order
+	return time_sheet
 
-	if from_time and to_time :
-		time_log.calculate_total_hours()
-	return time_log
+@frappe.whitelist()	
+def add_timesheet_detail(time_sheet, args):
+	if isinstance(time_sheet, unicode):
+		time_sheet = frappe.get_doc('Time Sheet', time_sheet)
+
+	if isinstance(args, unicode):
+		args = json.loads(args)
+
+	time_sheet.append('timesheets', args)
+	return time_sheet
 
 @frappe.whitelist()
 def get_default_warehouse():
@@ -514,3 +528,33 @@
 	fg_warehouse = frappe.db.get_single_value("Manufacturing Settings",
 		"default_fg_warehouse")
 	return {"wip_warehouse": wip_warehouse, "fg_warehouse": fg_warehouse}
+
+@frappe.whitelist()
+def make_timesheet(source_name, target_doc=None):
+	def postprocess(source, target):
+		target.production_order = source.name
+		target.naming_series = 'TS-'
+
+	def update_item(source, target, source_parent):
+		target.completed_qty = source_parent.qty - source.completed_qty
+
+	doc = get_mapped_doc("Production Order", source_name, {
+		"Production Order": {
+			"doctype": "Time Sheet",
+			"validation": {
+				"docstatus": ["=", 1]
+			}
+		},
+		"Production Order Operation": {
+			"doctype": "Time Sheet Detail",
+			"field_map": {
+				"name": "operation_id",
+				"operation": "operation",
+				"workstation": "workstation"
+			},
+			"postprocess": update_item,
+			"condition": lambda doc: doc.status != 'Completed'
+		}
+	}, target_doc, postprocess)
+
+	return doc
diff --git a/erpnext/manufacturing/doctype/production_order/test_production_order.py b/erpnext/manufacturing/doctype/production_order/test_production_order.py
index 1879e78..6ebb8e7 100644
--- a/erpnext/manufacturing/doctype/production_order/test_production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/test_production_order.py
@@ -10,7 +10,6 @@
 from erpnext.manufacturing.doctype.production_order.production_order \
 	import make_stock_entry, ItemHasVariantError
 from erpnext.stock.doctype.stock_entry import test_stock_entry
-from erpnext.projects.doctype.time_log.time_log import OverProductionLoggedError
 from erpnext.stock.utils import get_bin
 
 class TestProductionOrder(unittest.TestCase):
@@ -72,25 +71,25 @@
 
 		self.assertRaises(StockOverProductionError, s.submit)
 
-	def test_make_time_log(self):
-		from erpnext.projects.doctype.time_log.test_time_log import make_time_log_test_record
+	def test_make_time_sheet(self):
+		from erpnext.manufacturing.doctype.production_order.production_order import make_timesheet
 		prod_order = make_prod_order_test_record(item="_Test FG Item 2",
 			planned_start_date=now(), qty=1, do_not_save=True)
 
 		prod_order.set_production_order_operations()
 		prod_order.insert()
 		prod_order.submit()
-
+		
 		d = prod_order.operations[0]
-
 		d.completed_qty = flt(d.completed_qty)
 
-		time_log = make_time_log_test_record(hours=1, production_order= prod_order.name, operation= d.operation,
-			completed_qty= prod_order.qty - d.completed_qty, operation_id=d.name, for_manufacturing=1, simulate=True)
+		name = frappe.db.get_value('Time Sheet', {'production_order': prod_order.name}, 'name')
+		time_sheet_doc = frappe.get_doc('Time Sheet', name)
+		time_sheet_doc.submit()
+		
 
-		self.assertEqual(prod_order.name, time_log.production_order)
-		self.assertEqual((prod_order.qty - d.completed_qty), time_log.completed_qty)
-		self.assertEqual(time_diff_in_hours(d.planned_end_time, d.planned_start_time),time_log.hours)
+		self.assertEqual(prod_order.name, time_sheet_doc.production_order)
+		self.assertEqual((prod_order.qty - d.completed_qty), sum([d.completed_qty for d in time_sheet_doc.timesheets]))
 
 		manufacturing_settings = frappe.get_doc({
 			"doctype": "Manufacturing Settings",
@@ -105,8 +104,11 @@
 
 		self.assertEqual(prod_order.operations[0].actual_operation_time, 60)
 		self.assertEqual(prod_order.operations[0].actual_operating_cost, 100)
+		
+		time_sheet_doc1 = make_timesheet(prod_order.name)
+		self.assertEqual(len(time_sheet_doc1.get('timesheets')), 0)
 
-		time_log.cancel()
+		time_sheet_doc.cancel()
 
 		prod_order.load_from_db()
 		self.assertEqual(prod_order.operations[0].status, "Pending")
@@ -115,11 +117,6 @@
 		self.assertEqual(flt(prod_order.operations[0].actual_operation_time), 0)
 		self.assertEqual(flt(prod_order.operations[0].actual_operating_cost), 0)
 
-		time_log2 = make_time_log_test_record(from_time= add_days(time_log.to_time, 1) ,production_order= prod_order.name, operation= d.operation,
-			completed_qty= 5, operation_id=d.name, for_manufacturing=1, do_not_save=True)
-
-		self.assertRaises(OverProductionLoggedError, time_log2.save)
-
 	def test_planned_operating_cost(self):
 		prod_order = make_prod_order_test_record(item="_Test FG Item 2",
 			planned_start_date=now(), qty=1, do_not_save=True)
diff --git a/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json b/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json
index 923e534..6542cc9 100644
--- a/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json
+++ b/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json
@@ -2,6 +2,7 @@
  "allow_copy": 0, 
  "allow_import": 0, 
  "allow_rename": 0, 
+ "beta": 0, 
  "creation": "2014-10-16 14:35:41.950175", 
  "custom": 0, 
  "docstatus": 0, 
@@ -16,6 +17,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "", 
@@ -24,6 +26,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -39,6 +42,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Operation", 
@@ -50,6 +54,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -65,6 +70,7 @@
    "fieldtype": "Text Editor", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Operation Description", 
@@ -75,6 +81,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -90,6 +97,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -97,6 +105,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -113,6 +122,7 @@
    "fieldtype": "Float", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Completed Qty", 
@@ -121,6 +131,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -137,6 +148,7 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Status", 
@@ -146,6 +158,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -161,6 +174,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Workstation", 
@@ -172,30 +186,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 1, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "eval:(doc.docstatus==1)", 
-   "fieldname": "show_time_logs", 
-   "fieldtype": "Button", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Show Time Logs", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -211,6 +202,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Estimated Time and Cost", 
@@ -219,6 +211,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -234,6 +227,7 @@
    "fieldtype": "Datetime", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Planned Start Time", 
@@ -242,6 +236,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -257,6 +252,7 @@
    "fieldtype": "Datetime", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Planned End Time", 
@@ -265,6 +261,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -280,6 +277,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -287,6 +285,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -303,6 +302,7 @@
    "fieldtype": "Float", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Operation Time", 
@@ -313,6 +313,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -328,6 +329,7 @@
    "fieldtype": "Float", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Hour Rate", 
@@ -338,6 +340,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -353,6 +356,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Planned Operating Cost", 
@@ -362,6 +366,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -377,6 +382,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Actual Time and Cost", 
@@ -385,6 +391,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -400,6 +407,7 @@
    "fieldtype": "Datetime", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Actual Start Time", 
@@ -408,6 +416,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -424,6 +433,7 @@
    "fieldtype": "Datetime", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Actual End Time", 
@@ -432,6 +442,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -447,6 +458,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -454,6 +466,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -470,6 +483,7 @@
    "fieldtype": "Float", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Actual Operation Time", 
@@ -478,6 +492,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -494,6 +509,7 @@
    "fieldtype": "Currency", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Actual Operating Cost", 
@@ -503,55 +519,36 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
    "unique": 0
-  }, 
-  {
-   "allow_on_submit": 1, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "eval:(doc.docstatus==1 && doc.status!=\"Completed\")", 
-   "fieldname": "make_time_log", 
-   "fieldtype": "Button", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Make Time Log", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
   }
  ], 
  "hide_heading": 0, 
  "hide_toolbar": 0, 
+ "idx": 0, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:52.476364", 
+ "modified": "2016-06-24 16:12:08.380635", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Production Order Operation", 
  "name_case": "", 
  "owner": "Administrator", 
  "permissions": [], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "sort_field": "modified", 
- "sort_order": "DESC"
+ "sort_order": "DESC", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 65e755e..0af9713 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -276,3 +276,8 @@
 erpnext.patches.v7_0.create_warehouse_nestedset
 erpnext.patches.v7_0.system_settings_setup_complete
 erpnext.patches.v7_0.merge_account_type_stock_and_warehouse_to_stock
+erpnext.patches.v7_0.set_naming_series_for_timesheet
+erpnext.patches.v7_0.convert_timelogbatch_to_timesheet
+erpnext.patches.v7_0.convert_timelog_to_timesheet
+erpnext.patches.v7_0.move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet
+erpnext.patches.v7_0.remove_doctypes_and_reports
diff --git a/erpnext/patches/v5_0/rename_table_fieldnames.py b/erpnext/patches/v5_0/rename_table_fieldnames.py
index 37176f2..d9af7b8 100644
--- a/erpnext/patches/v5_0/rename_table_fieldnames.py
+++ b/erpnext/patches/v5_0/rename_table_fieldnames.py
@@ -182,8 +182,8 @@
 	"Territory": [
 		["target_details", "targets"]
 	],
-	"Time Log Batch": [
-		["time_log_batch_details", "time_logs"]
+	"Time Sheet": [
+		["time_sheet_details", "time_logs"]
 	],
 	"Workstation": [
 		["workstation_operation_hours", "working_hours"]
diff --git a/erpnext/patches/v7_0/convert_timelog_to_timesheet.py b/erpnext/patches/v7_0/convert_timelog_to_timesheet.py
new file mode 100644
index 0000000..9a77147
--- /dev/null
+++ b/erpnext/patches/v7_0/convert_timelog_to_timesheet.py
@@ -0,0 +1,26 @@
+import frappe
+
+from erpnext.manufacturing.doctype.production_order.production_order import make_time_sheet, add_timesheet_detail
+
+def execute():	
+	for data in frappe.get_all('Time Log', fields=["*"],
+		filters = [["docstatus", "<", "2"]]):
+		time_sheet = make_time_sheet(data.production_order)
+		args = get_timesheet_data(data)
+		add_timesheet_detail(time_sheet, args)
+		time_sheet.docstatus = data.docstatus
+		time_sheet.company = frappe.db.get_single_value('Global Defaults', 'default_company')
+		time_sheet.save(ignore_permissions=True)
+
+def get_timesheet_data(data):
+	return {
+		'from_time': data.from_time,
+		'hours': data.hours,
+		'to_time': data.to_time,
+		'project': data.project,
+		'activity_type': data.activity_type or "Planning",
+		'operation': data.operation,
+		'operation_id': data.operation_id,
+		'workstation': data.workstation,
+		'completed_qty': data.completed_qty
+	}
\ No newline at end of file
diff --git a/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py b/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py
new file mode 100644
index 0000000..caacfe1
--- /dev/null
+++ b/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py
@@ -0,0 +1,32 @@
+import frappe
+from frappe.utils import cint
+from erpnext.manufacturing.doctype.production_order.production_order import add_timesheet_detail
+
+def execute():	
+	for tlb in frappe.get_all('Time Log Batch', fields=["*"], 
+		filters = [["docstatus", "<", "2"]]):
+		time_sheet = frappe.new_doc('Time Sheet')
+		time_sheet.employee= ""
+		time_sheet.company = frappe.db.get_single_value('Global Defaults', 'default_company')
+		time_sheet.sales_invoice = tlb.sales_invoice
+		for data in tlb.time_logs:
+			args = get_timesheet_data(data)
+			add_timesheet_detail(time_sheet, args)
+
+		time_sheet.docstatus = tlb.docstatus
+		time_sheet.save(ignore_permissions=True)
+
+def get_timesheet_data(data):
+	time_log = frappe.get_doc('Time Log', data.time_log)
+
+	return {
+		'from_time': time_log.from_time,
+		'hours': time_log.hours,
+		'to_time': time_log.to_time,
+		'project': time_log.project,
+		'activity_type': time_log.activity_type,
+		'operation': time_log.operation,
+		'operation_id': time_log.operation_id,
+		'workstation': time_log.workstation,
+		'completed_qty': time_log.completed_qty
+	}
\ No newline at end of file
diff --git a/erpnext/patches/v7_0/move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet.py b/erpnext/patches/v7_0/move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet.py
new file mode 100644
index 0000000..55b51b7
--- /dev/null
+++ b/erpnext/patches/v7_0/move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet.py
@@ -0,0 +1,16 @@
+import frappe
+
+from erpnext.manufacturing.doctype.production_order.production_order import add_timesheet_detail
+
+def execute():
+	for si in frappe.db.sql(""" select sales_invoice as name from `tabTime Sheet`
+		where sales_invoice is not null and docstatus < 2""", as_dict=True):
+		si_doc = frappe.get_doc('Sales Invoice', si.name)
+		for item in si_doc.items:
+			if item.time_log_batch:
+				ts = si_doc.append('timesheets',{})
+				ts.time_sheet = item.time_log_batch
+				ts.billing_amount = frappe.db.get_value('Time Log Batch', item.time_log_batch, 'total_billing_amount')
+		si_doc.ignore_validate_update_after_submit = True
+		si_doc.update_time_sheet(ts.time_sheet)
+		si_doc.save()
\ No newline at end of file
diff --git a/erpnext/patches/v7_0/remove_doctypes_and_reports.py b/erpnext/patches/v7_0/remove_doctypes_and_reports.py
new file mode 100644
index 0000000..978c363
--- /dev/null
+++ b/erpnext/patches/v7_0/remove_doctypes_and_reports.py
@@ -0,0 +1,9 @@
+import frappe
+
+def execute():
+	for doctype in ['Time Log Batch', 'Time Log Batch Detail', 'Time Log']:
+		frappe.delete_doc('DocType', doctype)
+		
+	report = "Daily Time Log Summary"
+	if frappe.db.exists("Report", report):
+		frappe.delete_doc('Report', report)
\ No newline at end of file
diff --git a/erpnext/patches/v7_0/set_naming_series_for_timesheet.py b/erpnext/patches/v7_0/set_naming_series_for_timesheet.py
new file mode 100644
index 0000000..0746213
--- /dev/null
+++ b/erpnext/patches/v7_0/set_naming_series_for_timesheet.py
@@ -0,0 +1,14 @@
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+
+import frappe
+from frappe.custom.doctype.property_setter.property_setter import make_property_setter
+
+def execute():
+	frappe.reload_doctype('Time Sheet')
+	frappe.reload_doctype('Time Sheet Detail')
+	
+	make_property_setter('Time Sheet', "naming_series", "options", 'TS-', "Text")
+	make_property_setter('Time Sheet', "naming_series", "default", 'TS-', "Text")
\ No newline at end of file
diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js
index b3f63b7..5cef75c 100644
--- a/erpnext/projects/doctype/project/project.js
+++ b/erpnext/projects/doctype/project/project.js
@@ -67,7 +67,7 @@
 	},
 	show_dashboard: function(frm) {
 		frm.dashboard.show_heatmap = true;
-		frm.dashboard.heatmap_message = __('This is based on the Time Logs created against this project');
+		frm.dashboard.heatmap_message = __('This is based on the Time Sheet created against this project');
 		frm.dashboard.show_dashboard();
 
 		if(frm.doc.__onload.activity_summary.length) {
@@ -82,9 +82,9 @@
 						sum: sum
 					}));
 
-			section.on('click', '.time-log-link', function() {
+			section.on('click', '.time-sheet-link', function() {
 				var activity_type = $(this).attr('data-activity_type');
-				frappe.set_route('List', 'Time Log',
+				frappe.set_route('List', 'Time Sheet',
 					{'activity_type': activity_type, 'project': frm.doc.name});
 			});
 		}
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index dbe2eb3..ccc0cfe 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -28,7 +28,7 @@
 
 		self.set_onload('links', self.meta.get_links_setup())
 		self.set_onload('activity_summary', frappe.db.sql('''select activity_type, sum(hours) as total_hours
-			from `tabTime Log` where project=%s group by activity_type order by total_hours desc''', self.name, as_dict=True))
+			from `tabTime Sheet Detail` where project=%s group by activity_type order by total_hours desc''', self.name, as_dict=True))
 
 	def __setup__(self):
 		self.onload()
@@ -95,13 +95,13 @@
 			self.percent_complete = flt(flt(completed) / total * 100, 2)
 
 	def update_costing(self):
-		from_time_log = frappe.db.sql("""select
+		from_time_sheet = frappe.db.sql("""select
 			sum(costing_amount) as costing_amount,
 			sum(billing_amount) as billing_amount,
 			min(from_time) as start_date,
 			max(to_time) as end_date,
 			sum(hours) as time
-			from `tabTime Log` where project = %s and docstatus = 1""", self.name, as_dict=1)[0]
+			from `tabTime Sheet Detail` where project = %s and docstatus = 1""", self.name, as_dict=1)[0]
 
 		from_expense_claim = frappe.db.sql("""select
 			sum(total_sanctioned_amount) as total_sanctioned_amount
@@ -109,12 +109,12 @@
 			and docstatus = 1""",
 			self.name, as_dict=1)[0]
 
-		self.actual_start_date = from_time_log.start_date
-		self.actual_end_date = from_time_log.end_date
+		self.actual_start_date = from_time_sheet.start_date
+		self.actual_end_date = from_time_sheet.end_date
 
-		self.total_costing_amount = from_time_log.costing_amount
-		self.total_billing_amount = from_time_log.billing_amount
-		self.actual_time = from_time_log.time
+		self.total_costing_amount = from_time_sheet.costing_amount
+		self.total_billing_amount = from_time_sheet.billing_amount
+		self.actual_time = from_time_sheet.time
 
 		self.total_expense_claim = from_expense_claim.total_sanctioned_amount
 
@@ -162,7 +162,7 @@
 def get_timeline_data(name):
 	'''Return timeline for attendance'''
 	return dict(frappe.db.sql('''select unix_timestamp(from_time), count(*)
-		from `tabTime Log` where project=%s
+		from `tabTime Sheet Detail` where project=%s
 			and from_time > date_sub(curdate(), interval 1 year)
 			and docstatus < 2
 			group by date(from_time)''', name))
diff --git a/erpnext/projects/doctype/project/project_dashboard.html b/erpnext/projects/doctype/project/project_dashboard.html
index 34a2d04..f5bfbb7 100644
--- a/erpnext/projects/doctype/project/project_dashboard.html
+++ b/erpnext/projects/doctype/project/project_dashboard.html
@@ -3,7 +3,7 @@
 {% for d in data %}
 <div class="row">
 	<div class="col-xs-4">
-		<a class="small time-log-link" data-activity_type="{{ d.activity_type || "" }}">
+		<a class="small time-sheet-link" data-activity_type="{{ d.activity_type || "" }}">
 			{{ d.activity_type || __("Unknown") }}</a>
 	</div>
 	<div class="col-xs-8">
diff --git a/erpnext/projects/doctype/project/project_links.py b/erpnext/projects/doctype/project/project_links.py
index 6c16378..17f7492 100644
--- a/erpnext/projects/doctype/project/project_links.py
+++ b/erpnext/projects/doctype/project/project_links.py
@@ -5,7 +5,7 @@
 	'transactions': [
 		{
 			'label': _('Project'),
-			'items': ['Task', 'Time Log', 'Expense Claim', 'Issue']
+			'items': ['Task', 'Time Sheet', 'Expense Claim', 'Issue']
 		},
 		{
 			'label': _('Material'),
diff --git a/erpnext/projects/doctype/task/task.js b/erpnext/projects/doctype/task/task.js
index 605ed8d..1d708c4 100644
--- a/erpnext/projects/doctype/task/task.js
+++ b/erpnext/projects/doctype/task/task.js
@@ -16,10 +16,10 @@
 
 
 		if(!doc.__islocal) {
-			if(frappe.model.can_read("Time Log")) {
-				frm.add_custom_button(__("Time Logs"), function() {
+			if(frappe.model.can_read("Time Sheet")) {
+				frm.add_custom_button(__("Time Sheet"), function() {
 					frappe.route_options = {"project": doc.project, "task": doc.name}
-					frappe.set_route("List", "Time Log");
+					frappe.set_route("List", "Time Sheet");
 				}, __("View"), true);
 			}
 			if(frappe.model.can_read("Expense Claim")) {
diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json
index 31d6538..94ec8a1 100644
--- a/erpnext/projects/doctype/task/task.json
+++ b/erpnext/projects/doctype/task/task.json
@@ -3,6 +3,7 @@
  "allow_import": 1, 
  "allow_rename": 0, 
  "autoname": "TASK.#####", 
+ "beta": 0, 
  "creation": "2013-01-29 19:25:50", 
  "custom": 0, 
  "docstatus": 0, 
@@ -413,7 +414,7 @@
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Actual Start Date (via Time Logs)", 
+   "label": "Actual Start Date (via Time Sheet)", 
    "length": 0, 
    "no_copy": 0, 
    "oldfieldname": "act_start_date", 
@@ -491,7 +492,7 @@
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Actual End Date (via Time Logs)", 
+   "label": "Actual End Date (via Time Sheet)", 
    "length": 0, 
    "no_copy": 0, 
    "oldfieldname": "act_end_date", 
@@ -541,7 +542,7 @@
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Total Costing Amount (via Time Logs)", 
+   "label": "Total Costing Amount (via Time Sheet)", 
    "length": 0, 
    "no_copy": 0, 
    "oldfieldname": "actual_budget", 
@@ -618,7 +619,7 @@
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Total Billing Amount (via Time Logs)", 
+   "label": "Total Billing Amount (via Time Sheet)", 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
@@ -763,6 +764,7 @@
  "hide_toolbar": 0, 
  "icon": "icon-check", 
  "idx": 1, 
+ "image_view": 0, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 0, 
@@ -770,7 +772,7 @@
  "istable": 0, 
  "max_attachments": 5, 
  "menu_index": 0, 
- "modified": "2016-03-29 01:01:50.074252", 
+ "modified": "2016-06-20 17:31:00.798534", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Task", 
@@ -797,6 +799,7 @@
    "write": 1
   }
  ], 
+ "quick_entry": 0, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "search_fields": "subject", 
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index 392f140..cc45a42 100644
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -58,7 +58,7 @@
 	def update_time_and_costing(self):
 		tl = frappe.db.sql("""select min(from_time) as start_date, max(to_time) as end_date,
 			sum(billing_amount) as total_billing_amount, sum(costing_amount) as total_costing_amount,
-			sum(hours) as time from `tabTime Log` where task = %s and docstatus=1"""
+			sum(hours) as time from `tabTime Sheet Detail` where task = %s and docstatus=1"""
 			,self.name, as_dict=1)[0]
 		if self.status == "Open":
 			self.status = "Working"
diff --git a/erpnext/projects/doctype/task/test_task.py b/erpnext/projects/doctype/task/test_task.py
index 7007269..45bcd82 100644
--- a/erpnext/projects/doctype/task/test_task.py
+++ b/erpnext/projects/doctype/task/test_task.py
@@ -124,29 +124,6 @@
 		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_start_date"), getdate('2015-1-26'))
 		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_end_date"), getdate('2015-1-28'))
 
-		time_log = frappe.new_doc('Time Log')
-		time_log.update({
-			"from_time": "2015-1-1",
-			"to_time": "2015-1-20",
-			"task": task1.name
-		})
-		time_log.submit()
-
-		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_start_date"), getdate('2015-1-21'))
-		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_end_date"), getdate('2015-1-25'))
-
-		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_start_date"), getdate('2015-1-26'))
-		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_end_date"), getdate('2015-1-28'))
-
-		time_log.cancel()
-
-		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_start_date"), getdate('2015-1-21'))
-		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_end_date"), getdate('2015-1-25'))
-
-		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_start_date"), getdate('2015-1-26'))
-		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_end_date"), getdate('2015-1-28'))
-
-
 	def test_close_assignment(self):
 		task = frappe.new_doc("Task")
 		task.subject = "Test Close Assignment"
diff --git a/erpnext/projects/doctype/time_log/README.md b/erpnext/projects/doctype/time_log/README.md
deleted file mode 100644
index bab52e7..0000000
--- a/erpnext/projects/doctype/time_log/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Log of activity done by a user in a particular period.
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log/test_records.json b/erpnext/projects/doctype/time_log/test_records.json
deleted file mode 100644
index 0637a08..0000000
--- a/erpnext/projects/doctype/time_log/test_records.json
+++ /dev/null
@@ -1 +0,0 @@
-[]
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log/test_time_log.py b/erpnext/projects/doctype/time_log/test_time_log.py
deleted file mode 100644
index 591316b..0000000
--- a/erpnext/projects/doctype/time_log/test_time_log.py
+++ /dev/null
@@ -1,182 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-import unittest
-
-import datetime
-from frappe.utils import now_datetime, now
-from erpnext.projects.doctype.time_log.time_log import OverlapError, NotSubmittedError, NegativeHoursError
-from erpnext.manufacturing.doctype.workstation.workstation import WorkstationHolidayError, NotInWorkingHoursError
-from erpnext.manufacturing.doctype.production_order.test_production_order import make_prod_order_test_record
-
-
-class TestTimeLog(unittest.TestCase):
-	def test_duplication(self):
-		tl1 = make_time_log_test_record(user= "test@example.com", employee= "_T-Employee-0002", simulate= True)
-
-		tl2 = make_time_log_test_record(user= "test@example.com", employee= "_T-Employee-0002",
-			from_time= tl1.from_time, to_time= tl1.to_time, do_not_save= 1)
-
-		self.assertRaises(OverlapError, tl2.insert)
-		
-		tl3 = make_time_log_test_record(user= "test@example.com", employee= "_T-Employee-0002",
-			from_time= tl1.from_time - datetime.timedelta(hours=1), 
-			to_time= tl1.to_time + datetime.timedelta(hours=1), do_not_save= 1)
-
-		self.assertRaises(OverlapError, tl3.insert)
-		
-		tl4 = make_time_log_test_record(user= "test@example.com", employee= "_T-Employee-0002",
-			from_time= tl1.from_time + datetime.timedelta(minutes=20), 
-			to_time= tl1.to_time + datetime.timedelta(minutes=30), do_not_save= 1)
-
-		self.assertRaises(OverlapError, tl4.insert)
-		
-		make_time_log_test_record(user= "test@example.com", employee= "_T-Employee-0002",
-			from_time= tl1.to_time, 
-			to_time= tl1.to_time + datetime.timedelta(hours=1))
-
-	def test_production_order_status(self):
-		prod_order = make_prod_order_test_record(item= "_Test FG Item 2", qty= 1, do_not_submit= True)
-		prod_order.set_production_order_operations()
-		prod_order.save()
-
-		time_log = make_time_log_test_record(for_manufacturing= 1, production_order= prod_order.name, qty= 1,
-			employee= "_T-Employee-0003", do_not_save= True, simulate=1)
-
-		self.assertRaises(NotSubmittedError, time_log.save)
-
-	def test_time_log_on_holiday(self):
-		prod_order = make_prod_order_test_record(item= "_Test FG Item 2", qty= 1,
-			planned_start_date= now(), do_not_save= True)
-		prod_order.set_production_order_operations()
-		prod_order.save()
-		prod_order.submit()
-
-		time_log = make_time_log_test_record(from_time= "2013-02-01 10:00:00", to_time= "2013-02-01 20:00:00",
-			for_manufacturing= 1, production_order= prod_order.name, qty= 1,
-			operation= prod_order.operations[0].operation, operation_id= prod_order.operations[0].name,
-			workstation= "_Test Workstation 1", do_not_save= True)
-
-		self.assertRaises(WorkstationHolidayError , time_log.save)
-
-		time_log.update({
-			"from_time": "2013-02-02 09:00:00",
-			"to_time": "2013-02-02 20:00:00"
-		})
-		self.assertRaises(NotInWorkingHoursError , time_log.save)
-
-		time_log.from_time= "2013-02-02 10:30:00"
-		time_log.save()
-		time_log.submit()
-		time_log.cancel()
-
-	def test_negative_hours(self):
-		time_log = make_time_log_test_record(to_time= now_datetime() + datetime.timedelta(minutes=-1),
-			employee="_T-Employee-0006",do_not_save= True)
-		self.assertRaises(NegativeHoursError, time_log.save)
-
-	def test_default_activity_cost(self):
-		activity_type = frappe.get_doc("Activity Type", "_Test Activity Type")
-		activity_type.billing_rate = 20
-		activity_type.costing_rate = 15
-		activity_type.save()
-
-		project = "_Test Project for Activity Type"
-
-		frappe.db.sql("delete from `tabTime Log` where project=%s or employee='_T-Employee-0002'", project)
-		frappe.delete_doc("Project", project)
-		project = frappe.get_doc({"doctype": "Project", "project_name": project}).insert()
-
-		make_time_log_test_record(employee="_T-Employee-0002", hours=2,
-			activity_type = "_Test Activity Type", project = project.name)
-
-		project = frappe.get_doc("Project", project.name)
-		self.assertTrue(project.total_costing_amount, 30)
-		self.assertTrue(project.total_billing_amount, 40)
-
-	def test_total_activity_cost_for_project(self):
-		frappe.db.sql("""delete from `tabTask` where project = "_Test Project 1" """)
-		frappe.db.sql("""delete from `tabProject` where name = "_Test Project 1" """)
-		frappe.db.sql("""delete from `tabTime Log` where name = "_Test Project 1" """)
-
-		if not frappe.db.exists('Activity Cost', {"activity_type": "_Test Activity Type"}):
-			activity_cost = frappe.get_doc({
-				"doctype": "Activity Cost",
-				"employee": "_T-Employee-0002",
-				"activity_type": "_Test Activity Type",
-				"billing_rate": 100,
-				"costing_rate": 50
-			})
-			activity_cost.insert()
-
-		frappe.get_doc({
-			"project_name": "_Test Project 1",
-			"doctype": "Project",
-			"tasks" :
-				[{ "title": "_Test Project Task 1", "status": "Open" }]
-		}).save()
-
-		task_name = frappe.db.get_value("Task",{"project": "_Test Project 1"})
-
-		time_log = make_time_log_test_record(employee="_T-Employee-0002", hours=2,
-			task=task_name, simulate=1)
-		self.assertEqual(time_log.costing_rate, 50)
-		self.assertEqual(time_log.costing_amount, 100)
-		self.assertEqual(time_log.billing_rate, 100)
-		self.assertEqual(time_log.billing_amount, 200)
-
-		self.assertEqual(frappe.db.get_value("Task", task_name, "total_billing_amount"), 200)
-		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_billing_amount"), 200)
-
-		time_log2 = make_time_log_test_record(employee="_T-Employee-0002",
-			hours=2, task= task_name, from_time = now_datetime() + datetime.timedelta(hours= 3), simulate=1)
-		self.assertEqual(frappe.db.get_value("Task", task_name, "total_billing_amount"), 400)
-		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_billing_amount"), 400)
-
-		time_log2.cancel()
-
-		self.assertEqual(frappe.db.get_value("Task", task_name, "total_billing_amount"), 200)
-		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_billing_amount"), 200)
-		time_log.cancel()
-
-test_ignore = ["Time Log Batch", "Sales Invoice"]
-
-def make_time_log_test_record(**args):
-	args = frappe._dict(args)
-
-	time_log = frappe.new_doc("Time Log")
-
-	time_log.from_time = args.from_time or now_datetime()
-	time_log.hours = args.hours or 1
-	time_log.to_time = args.to_time or time_log.from_time + datetime.timedelta(hours= time_log.hours)
-
-	time_log.project = args.project
-	time_log.task = args.task
-	time_log.for_manufacturing = args.for_manufacturing
-	time_log.production_order = args.production_order
-	time_log.operation = args.operation
-	time_log.operation_id = args.operation_id
-	time_log.workstation = args.workstation
-	time_log.completed_qty = args.completed_qty
-	time_log.activity_type = args.activity_type or "_Test Activity Type"
-	time_log.billable = args.billable or 1
-	time_log.employee = args.employee
-	time_log.user = args.user
-
-	if not args.do_not_save:
-		if args.simulate:
-			while True:
-				try:
-					time_log.save()
-					break
-				except OverlapError:
-					time_log.from_time = time_log.from_time + datetime.timedelta(minutes=10)
-					time_log.to_time = time_log.from_time + datetime.timedelta(hours= time_log.hours)
-		else:
-			time_log.save()
-		if not args.do_not_submit:
-			time_log.submit()
-
-	return time_log
diff --git a/erpnext/projects/doctype/time_log/time_log.js b/erpnext/projects/doctype/time_log/time_log.js
deleted file mode 100644
index 10e3bc7..0000000
--- a/erpnext/projects/doctype/time_log/time_log.js
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
-
-frappe.ui.form.on("Time Log", {
-	onload: function(frm) {
-		if (frm.doc.__islocal) {
-			if (frm.doc.for_manufacturing) {
-				frappe.ui.form.trigger("Time Log", "production_order");
-			}
-			if (frm.doc.from_time && frm.doc.to_time) {
-				frappe.ui.form.trigger("Time Log", "to_time");
-			}
-		}
-		frm.set_query('task', function() {
-			return {
-				filters:{
-					'project': frm.doc.project
-				}
-			}
-		});
-	},
-	refresh: function(frm) {
-		// set default user if created
-		if (frm.doc.__islocal && !frm.doc.user) {
-			frm.set_value("user", user);
-		}
-		if (frm.doc.status==='In Progress' && !frm.is_new()) {
-			frm.add_custom_button(__('Finish'), function() {
-				frappe.prompt({
-					fieldtype: 'Datetime',
-					fieldname: 'to_time',
-					label: __('End Time'),
-					'default': dateutil.now_datetime()
-					}, function(value) {
-						frm.set_value('to_time', value.to_time);
-						frm.save();
-					});
-			}).addClass('btn-primary');
-		}
-
-
-		frm.toggle_reqd("activity_type", !frm.doc.for_manufacturing);
-	},
-	hours: function(frm) {
-		if(!frm.doc.from_time) {
-			frm.set_value("from_time", frappe.datetime.now_datetime());
-		}
-		var d = moment(frm.doc.from_time);
-		d.add(frm.doc.hours, "hours");
-		frm._setting_hours = true;
-		frm.set_value("to_time", d.format(moment.defaultDatetimeFormat));
-		frm._setting_hours = false;
-
-		frm.trigger('calculate_cost');
-	},
-	before_save: function(frm) {
-		frm.doc.production_order && frappe.model.remove_from_locals("Production Order",
-			frm.doc.production_order);
-	},
-	to_time: function(frm) {
-		if(frm._setting_hours) return;
-		frm.set_value("hours", moment(cur_frm.doc.to_time).diff(moment(cur_frm.doc.from_time),
-			"seconds") / 3600);
-	},
-	calculate_cost: function(frm) {
-		frm.set_value("costing_amount", frm.doc.costing_rate * frm.doc.hours);
-		if (frm.doc.billable==1){
-			frm.set_value("billing_amount", (frm.doc.billing_rate * frm.doc.hours) + frm.doc.additional_cost);
-		}
-	},
-	additional_cost: function(frm) {
-		frm.trigger('calculate_cost');
-	},
-	activity_type: function(frm) {
-		if (frm.doc.activity_type){
-			return frappe.call({
-				method: "erpnext.projects.doctype.time_log.time_log.get_activity_cost",
-				args: {
-					"employee": frm.doc.employee,
-					"activity_type": frm.doc.activity_type
-				},
-				callback: function(r) {
-					if(!r.exc && r.message) {
-						frm.set_value("costing_rate", r.message.costing_rate);
-						frm.set_value("billing_rate", r.message.billing_rate);
-						frm.trigger('calculate_cost');
-					}
-				}
-			});
-		}
-	},
-	employee: function(frm) {
-		frm.trigger('activity_type');
-	},
-	billable: function(frm) {
-		if (frm.doc.billable==1) {
-			frm.trigger('calculate_cost');
-		}
-		else {
-			frm.set_value("billing_amount", 0);
-			frm.set_value("additional_cost", 0);
-		}
-	}
-
-});
diff --git a/erpnext/projects/doctype/time_log/time_log.json b/erpnext/projects/doctype/time_log/time_log.json
deleted file mode 100644
index 25d62c4..0000000
--- a/erpnext/projects/doctype/time_log/time_log.json
+++ /dev/null
@@ -1,995 +0,0 @@
-{
- "allow_copy": 0, 
- "allow_import": 1, 
- "allow_rename": 0, 
- "autoname": "naming_series:", 
- "creation": "2013-04-03 16:38:41", 
- "custom": 0, 
- "description": "Log of Activities performed by users against Tasks that can be used for tracking time, billing.", 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "Setup", 
- "fields": [
-  {
-   "allow_on_submit": 1, 
-   "bold": 1, 
-   "collapsible": 0, 
-   "depends_on": "__islocal", 
-   "fieldname": "title", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Title", 
-   "length": 0, 
-   "no_copy": 1, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 1, 
-   "collapsible": 0, 
-   "depends_on": "eval:!doc.for_manufacturing", 
-   "fieldname": "activity_type", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Activity Type", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Activity Type", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "naming_series", 
-   "fieldtype": "Select", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Series", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "TL-", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 1, 
-   "collapsible": 0, 
-   "depends_on": "", 
-   "fieldname": "project", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Project", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Project", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 1, 
-   "collapsible": 0, 
-   "depends_on": "", 
-   "fieldname": "task", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Task", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Task", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "status", 
-   "fieldtype": "Select", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Status", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "In Progress\nTo Submit\nSubmitted\nBatched for Billing\nBilled\nCancelled", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "column_break_2", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 1, 
-   "collapsible": 0, 
-   "default": "now", 
-   "fieldname": "from_time", 
-   "fieldtype": "Datetime", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "From Time", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "default": "0", 
-   "fieldname": "hours", 
-   "fieldtype": "Float", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Hours", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 1, 
-   "collapsible": 0, 
-   "fieldname": "to_time", 
-   "fieldtype": "Datetime", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "To Time", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "billable", 
-   "fieldtype": "Check", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Billable", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "section_break_7", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "note", 
-   "fieldtype": "Text Editor", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Note", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "section_break_12", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "user", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "User", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "User", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "employee", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Employee", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Employee", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "column_break_3", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "for_manufacturing", 
-   "fieldtype": "Check", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "For Manufacturing", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "for_manufacturing", 
-   "fieldname": "section_break_11", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "", 
-   "fieldname": "production_order", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Production Order", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Production Order", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "", 
-   "fieldname": "operation", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Operation", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Operation", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "", 
-   "fieldname": "operation_id", 
-   "fieldtype": "Data", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Operation ID", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 1, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "column_break_14", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "", 
-   "fieldname": "workstation", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Workstation", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Workstation", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "", 
-   "description": "Operation completed for how many finished goods?", 
-   "fieldname": "completed_qty", 
-   "fieldtype": "Float", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Completed Qty", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "collapsible_depends_on": "", 
-   "depends_on": "costing_rate", 
-   "fieldname": "section_break_24", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Cost", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "default": "0", 
-   "description": "", 
-   "fieldname": "costing_rate", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Costing Rate based on Activity Type (per hour)", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "default": "0", 
-   "fieldname": "costing_amount", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Costing Amount", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "column_break_25", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "default": "0", 
-   "depends_on": "billable", 
-   "description": "", 
-   "fieldname": "billing_rate", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Billing Rate based on Activity Type (per hour)", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "eval:doc.billable", 
-   "fieldname": "additional_cost", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Additional Cost", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "default": "0", 
-   "depends_on": "billable", 
-   "description": "Will be updated only if Time Log is 'Billable'", 
-   "fieldname": "billing_amount", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Billing Amount", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "section_break_29", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "description": "Will be updated when batched.", 
-   "fieldname": "time_log_batch", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Time Log Batch", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Time Log Batch", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "description": "Will be updated when billed.", 
-   "fieldname": "sales_invoice", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Sales Invoice", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Sales Invoice", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "amended_from", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 1, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Amended From", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Time Log", 
-   "permlevel": 1, 
-   "print_hide": 1, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }
- ], 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "icon": "icon-time", 
- "idx": 1, 
- "in_create": 0, 
- "in_dialog": 0, 
- "is_submittable": 1, 
- "issingle": 0, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2016-04-29 05:19:18.247260", 
- "modified_by": "Administrator", 
- "module": "Projects", 
- "name": "Time Log", 
- "owner": "Administrator", 
- "permissions": [
-  {
-   "amend": 1, 
-   "apply_user_permissions": 1, 
-   "cancel": 1, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 0, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Projects User", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 1, 
-   "write": 1
-  }, 
-  {
-   "amend": 1, 
-   "apply_user_permissions": 0, 
-   "cancel": 1, 
-   "create": 0, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 0, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Projects Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 1, 
-   "write": 1
-  }
- ], 
- "quick_entry": 1, 
- "read_only": 0, 
- "read_only_onload": 0, 
- "sort_order": "ASC", 
- "title_field": "title", 
- "track_seen": 1
-}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log/time_log.py b/erpnext/projects/doctype/time_log/time_log.py
deleted file mode 100644
index 9545bd7..0000000
--- a/erpnext/projects/doctype/time_log/time_log.py
+++ /dev/null
@@ -1,296 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe import _
-from frappe.utils import flt, get_datetime, get_time, getdate
-from dateutil.relativedelta import relativedelta
-from erpnext.manufacturing.doctype.manufacturing_settings.manufacturing_settings import get_mins_between_operations
-
-class OverlapError(frappe.ValidationError): pass
-class OverProductionLoggedError(frappe.ValidationError): pass
-class NotSubmittedError(frappe.ValidationError): pass
-class NegativeHoursError(frappe.ValidationError): pass
-
-from frappe.model.document import Document
-
-class TimeLog(Document):
-	def validate(self):
-		self.set_status()
-		self.set_title()
-		self.validate_overlap()
-		self.validate_timings()
-		self.calculate_total_hours()
-		self.validate_time_log_for()
-		self.check_workstation_timings()
-		self.validate_production_order()
-		self.validate_manufacturing()
-		self.set_project_if_missing()
-		self.update_cost()
-
-	def on_submit(self):
-		self.update_production_order()
-		self.update_task_and_project()
-
-	def on_cancel(self):
-		self.update_production_order()
-		self.update_task_and_project()
-
-	def before_update_after_submit(self):
-		self.set_status()
-
-	def before_cancel(self):
-		self.set_status()
-
-	def set_status(self):
-		self.status = {
-			0: "To Submit",
-			1: "Submitted",
-			2: "Cancelled"
-		}[self.docstatus or 0]
-
-		if not self.to_time:
-			self.status = 'In Progress'
-
-		if self.time_log_batch:
-			self.status= "Batched for Billing"
-
-		if self.sales_invoice:
-			self.status= "Billed"
-
-	def set_title(self):
-		"""Set default title for the Time Log"""
-		if self.title:
-			return
-
-		from frappe.utils import get_fullname
-		if self.production_order:
-			self.title = _("{0} for {1}").format(self.operation, self.production_order)
-		elif self.activity_type and (self.task or self.project):
-			self.title = _("{0} for {1}").format(self.activity_type, self.task or self.project)
-		else:
-			self.title = self.task or self.project or get_fullname(frappe.session.user)
-
-	def validate_overlap(self):
-		"""Checks if 'Time Log' entries overlap for a user, workstation. """
-		self.validate_overlap_for("user")
-		self.validate_overlap_for("employee")
-		self.validate_overlap_for("workstation")
-
-	def validate_overlap_for(self, fieldname):
-		existing = self.get_overlap_for(fieldname)
-		if existing:
-			frappe.throw(_("This Time Log conflicts with {0} for {1} {2}").format(existing.name,
-				self.meta.get_label(fieldname), self.get(fieldname)), OverlapError)
-
-	def get_overlap_for(self, fieldname):
-		if not self.get(fieldname):
-			return
-
-		existing = frappe.db.sql("""select name, from_time, to_time from `tabTime Log`
-			where `{0}`=%(val)s and
-			(
-				(%(from_time)s > from_time and %(from_time)s < to_time) or
-				(%(to_time)s > from_time and %(to_time)s < to_time) or
-				(%(from_time)s <= from_time and %(to_time)s >= to_time))
-			and name!=%(name)s
-			and docstatus < 2""".format(fieldname),
-			{
-				"val": self.get(fieldname),
-				"from_time": self.from_time,
-				"to_time": self.to_time,
-				"name": self.name or "No Name"
-			}, as_dict=True)
-
-		return existing[0] if existing else None
-
-	def validate_timings(self):
-		if self.to_time and self.from_time and get_datetime(self.to_time) <= get_datetime(self.from_time):
-			frappe.throw(_("To Time must be greater than From Time"), NegativeHoursError)
-
-	def calculate_total_hours(self):
-		if self.to_time and self.from_time:
-			from frappe.utils import time_diff_in_seconds
-			self.hours = flt(time_diff_in_seconds(self.to_time, self.from_time)) / 3600
-
-	def set_project_if_missing(self):
-		"""Set project if task is set"""
-		if self.task and not self.project:
-			self.project = frappe.db.get_value("Task", self.task, "project")
-
-	def validate_time_log_for(self):
-		if not self.for_manufacturing:
-			for fld in ["production_order", "operation", "workstation", "completed_qty"]:
-				self.set(fld, None)
-		else:
-			self.activity_type=None
-
-	def check_workstation_timings(self):
-		"""Checks if **Time Log** is between operating hours of the **Workstation**."""
-		if self.workstation and self.from_time and self.to_time:
-			from erpnext.manufacturing.doctype.workstation.workstation import check_if_within_operating_hours
-			check_if_within_operating_hours(self.workstation, self.operation, self.from_time, self.to_time)
-
-	def validate_production_order(self):
-		"""Throws 'NotSubmittedError' if **production order** is not submitted. """
-		if self.production_order:
-			if frappe.db.get_value("Production Order", self.production_order, "docstatus") != 1 :
-				frappe.throw(_("You can make a time log only against a submitted production order"), NotSubmittedError)
-
-	def update_production_order(self):
-		"""Updates `start_date`, `end_date`, `status` for operation in Production Order."""
-
-		if self.production_order and self.for_manufacturing:
-			if not self.operation_id:
-				frappe.throw(_("Operation ID not set"))
-
-			dates = self.get_operation_start_end_time()
-			summary = self.get_time_log_summary()
-
-			pro = frappe.get_doc("Production Order", self.production_order)
-			for o in pro.operations:
-				if o.name == self.operation_id:
-					o.actual_start_time = dates.start_date
-					o.actual_end_time = dates.end_date
-					o.completed_qty = summary.completed_qty
-					o.actual_operation_time = summary.mins
-					break
-
-
-			pro.flags.ignore_validate_update_after_submit = True
-			pro.update_operation_status()
-			pro.calculate_operating_cost()
-			pro.set_actual_dates()
-			pro.save()
-
-	def get_operation_start_end_time(self):
-		"""Returns Min From and Max To Dates of Time Logs against a specific Operation. """
-		return frappe.db.sql("""select min(from_time) as start_date, max(to_time) as end_date from `tabTime Log`
-				where production_order = %s and operation = %s and docstatus=1""",
-				(self.production_order, self.operation), as_dict=1)[0]
-
-	def move_to_next_day(self):
-		"""Move start and end time one day forward"""
-		self.from_time = get_datetime(self.from_time) + relativedelta(day=1)
-
-	def move_to_next_working_slot(self):
-		"""Move to next working slot from workstation"""
-		workstation = frappe.get_doc("Workstation", self.workstation)
-		slot_found = False
-		for working_hour in workstation.working_hours:
-			if get_datetime(self.from_time).time() < get_time(working_hour.start_time):
-				self.from_time = getdate(self.from_time).strftime("%Y-%m-%d") + " " + working_hour.start_time
-				slot_found = True
-				break
-
-		if not slot_found:
-			# later than last time
-			self.from_time = getdate(self.from_time).strftime("%Y-%m-%d") + " " + workstation.working_hours[0].start_time
-			self.move_to_next_day()
-
-	def move_to_next_non_overlapping_slot(self):
-		"""If in overlap, set start as the end point of the overlapping time log"""
-		overlapping = self.get_overlap_for("workstation") \
-			or self.get_overlap_for("employee") \
-			or self.get_overlap_for("user")
-
-		if not overlapping:
-			frappe.throw(_("Logical error: Must find overlapping"))
-
-		self.from_time = get_datetime(overlapping.to_time) + get_mins_between_operations()
-
-	def get_time_log_summary(self):
-		"""Returns 'Actual Operating Time'. """
-		return frappe.db.sql("""select
-			sum(hours*60) as mins, sum(completed_qty) as completed_qty
-			from `tabTime Log`
-			where production_order = %s and operation_id = %s and docstatus=1""",
-			(self.production_order, self.operation_id), as_dict=1)[0]
-
-	def validate_manufacturing(self):
-		if self.for_manufacturing:
-			if not self.production_order:
-				frappe.throw(_("Production Order is Mandatory"))
-			if not self.completed_qty:
-				self.completed_qty = 0
-
-			production_order = frappe.get_doc("Production Order", self.production_order)
-			pending_qty = flt(production_order.qty) - flt(production_order.produced_qty)
-			if flt(self.completed_qty) > pending_qty:
-				frappe.throw(_("Completed Qty cannot be more than {0} for operation {1}").format(pending_qty, self.operation),
-					OverProductionLoggedError)
-
-		else:
-			self.production_order = None
-			self.operation = None
-			self.quantity = None
-
-	def update_cost(self):
-		rate = get_activity_cost(self.employee, self.activity_type)
-		if rate:
-			self.costing_rate = flt(rate.get('costing_rate'))
-			self.billing_rate = flt(rate.get('billing_rate'))
-			self.costing_amount = self.costing_rate * self.hours
-			if self.billable:
-				self.billing_amount = self.billing_rate * self.hours
-			else:
-				self.billing_amount = 0
-
-		if self.additional_cost and self.billable:
-			self.billing_amount += self.additional_cost
-
-	def update_task_and_project(self):
-		"""Update costing rate in Task or Project if either is set"""
-
-		if self.task:
-			task = frappe.get_doc("Task", self.task)
-			task.update_time_and_costing()
-			task.save()
-
-		elif self.project:
-			frappe.get_doc("Project", self.project).update_project()
-
-	def has_webform_permission(doc):
-		project_user = frappe.db.get_value("Project User", {"parent": doc.project, "user":frappe.session.user} , "user")
-		if project_user:
-			return True
-
-
-@frappe.whitelist()
-def get_events(start, end, filters=None):
-	"""Returns events for Gantt / Calendar view rendering.
-
-	:param start: Start date-time.
-	:param end: End date-time.
-	:param filters: Filters like workstation, project etc.
-	"""
-	from frappe.desk.calendar import get_event_conditions
-	conditions = get_event_conditions("Time Log", filters)
-
-	data = frappe.db.sql("""select name, from_time, to_time,
-		activity_type, task, project, production_order, workstation from `tabTime Log`
-		where docstatus < 2 and ( from_time between %(start)s and %(end)s or to_time between %(start)s and %(end)s )
-		{conditions}""".format(conditions=conditions), {
-			"start": start,
-			"end": end
-			}, as_dict=True, update={"allDay": 0})
-
-	for d in data:
-		d.title = d.name + ": " + (d.activity_type or d.production_order or "")
-		if d.task:
-			d.title += " for Task: " + d.task
-		if d.project:
-			d.title += " for Project: " + d.project
-
-	return data
-
-@frappe.whitelist()
-def get_activity_cost(employee=None, activity_type=None):
-	rate = frappe.db.get_values("Activity Cost", {"employee": employee,
-		"activity_type": activity_type}, ["costing_rate", "billing_rate"], as_dict=True)
-	if not rate:
-		rate = frappe.db.get_values("Activity Type", {"activity_type": activity_type},
-			["costing_rate", "billing_rate"], as_dict=True)
-
-	return rate[0] if rate else {}
diff --git a/erpnext/projects/doctype/time_log/time_log_calendar.js b/erpnext/projects/doctype/time_log/time_log_calendar.js
deleted file mode 100644
index 132355f..0000000
--- a/erpnext/projects/doctype/time_log/time_log_calendar.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
-
-frappe.views.calendar["Time Log"] = {
-	field_map: {
-		"start": "from_time",
-		"end": "to_time",
-		"id": "name",
-		"title": "title",
-		"allDay": "allDay"
-	},
-	gantt: true,
-	gantt_scale: "hours",
-	filters: [
-		{
-			"fieldtype": "Link",
-			"fieldname": "workstation",
-			"options": "Workstation",
-			"label": __("Workstation")
-		},
-		{
-			"fieldtype": "Link",
-			"fieldname": "employee",
-			"options": "Employee",
-			"label": __("Employee")
-		},
-	],
-	get_events_method: "erpnext.projects.doctype.time_log.time_log.get_events"
-}
diff --git a/erpnext/projects/doctype/time_log/time_log_list.js b/erpnext/projects/doctype/time_log/time_log_list.js
deleted file mode 100644
index 4428bf6..0000000
--- a/erpnext/projects/doctype/time_log/time_log_list.js
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
-
-// render
-frappe.listview_settings['Time Log'] = {
-	add_fields: ["status", "billable", "activity_type", "task", "project", "hours", "for_manufacturing", "billing_amount"],
-
-	has_indicator_for_draft: true,
-
-	get_indicator: function(doc) {
-		if (doc.status== "Draft") {
-			return [__("Draft"), "red", "status,=,Draft"]
-		} else if (doc.status== "In Progress") {
-			return [__("In Progress"), "orange", "status,=,In Progress"]
-		} else if (doc.status== "Batched for Billing") {
-			return [__("Batched for Billing"), "darkgrey", "status,=,Batched for Billing"]
-		} else if (doc.status== "Billed") {
-			return [__("Billed"), "green", "status,=,Billed"]
-		} else if (doc.status== "Submitted" && doc.billable) {
-			return [__("Billable"), "orange", "billable,=,1"]
-		}
-	},
-
-	selectable: true,
-	onload: function(me) {
-		me.page.add_menu_item(__("Make Time Log Batch"), function() {
-			var selected = me.get_checked_items() || [];
-
-			if(!selected.length) {
-				msgprint(__("Please select Time Logs."));
-				return;
-			}
-
-			// select only billable time logs
-			for(var i in selected) {
-				var d = selected[i];
-				if(d.status=="Batched for Billing") {
-					msgprint(__("Time Log has been Batched for Billing") + ": " + d.name + " - " + d.title);
-					return;
-				}
-				if(d.status=="Billed") {
-					msgprint(__("Time Log has been Billed") + ": " + d.name + " - " + d.title);
-					return;
-				}
-				if(d.status!="Submitted") {
-					msgprint(__("Time Log Status must be Submitted.") + ": " + d.name + " - " + d.title);
-					return;
-				}
-			}
-
-			// make batch
-			frappe.model.with_doctype("Time Log Batch", function() {
-				var tlb = frappe.model.get_new_doc("Time Log Batch");
-				$.each(selected, function(i, d) {
-					var detail = frappe.model.get_new_doc("Time Log Batch Detail", tlb,
-						"time_logs");
-
-					$.extend(detail, {
-						"time_log": d.name,
-						"activity_type": d.activity_type,
-						"billing_amount": d.billing_amount,
-						"hours": d.hours
-					});
-				})
-				frappe.set_route("Form", "Time Log Batch", tlb.name);
-			})
-
-		}, "icon-file-alt");
-	}
-};
diff --git a/erpnext/projects/doctype/time_log_batch/README.md b/erpnext/projects/doctype/time_log_batch/README.md
deleted file mode 100644
index c27521a..0000000
--- a/erpnext/projects/doctype/time_log_batch/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Group of Time Logs that can be batched for billing.
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log_batch/__init__.py b/erpnext/projects/doctype/time_log_batch/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/projects/doctype/time_log_batch/__init__.py
+++ /dev/null
diff --git a/erpnext/projects/doctype/time_log_batch/test_time_log_batch.py b/erpnext/projects/doctype/time_log_batch/test_time_log_batch.py
deleted file mode 100644
index 9f3591d..0000000
--- a/erpnext/projects/doctype/time_log_batch/test_time_log_batch.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-from __future__ import unicode_literals
-
-import frappe, unittest
-from erpnext.projects.doctype.time_log.test_time_log import make_time_log_test_record
-
-class TimeLogBatchTest(unittest.TestCase):
-	def test_time_log_status(self):
-		time_log = make_time_log_test_record(simulate=True)
-
-		self.assertEquals(frappe.db.get_value("Time Log", time_log.name, "status"), "Submitted")
-
-		tlb = create_time_log_batch(time_log.name)
-
-		self.assertEquals(frappe.db.get_value("Time Log", time_log.name, "status"), "Batched for Billing")
-		tlb.cancel()
-		self.assertEquals(frappe.db.get_value("Time Log", time_log.name, "status"), "Submitted")
-
-def create_time_log_batch(time_log):
-	tlb = frappe.get_doc({
-		"doctype": "Time Log Batch",
-		"time_logs": [
-			{
-			"doctype": "Time Log Batch Detail",
-			"parentfield": "time_logs",
-			"parenttype": "Time Log Batch",
-			"time_log": time_log
-			}
-		]
-	})
-
-	tlb.insert()
-	tlb.submit()
-	return tlb
-
-test_ignore = ["Sales Invoice"]
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch.js b/erpnext/projects/doctype/time_log_batch/time_log_batch.js
deleted file mode 100644
index b1c431c..0000000
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch.js
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
-
-cur_frm.add_fetch("time_log", "activity_type", "activity_type");
-cur_frm.add_fetch("time_log", "billing_amount", "billing_amount");
-cur_frm.add_fetch("time_log", "hours", "hours");
-
-cur_frm.set_query("time_log", "time_logs", function(doc) {
-	return {
-		query: "erpnext.projects.utils.get_time_log_list",
-		filters: {
-			"billable": 1,
-			"status": "Submitted"
-		}
-	}
-});
-
-$.extend(cur_frm.cscript, {
-	refresh: function(doc) {
-		cur_frm.set_intro({
-			"Draft": __("Select Time Logs and Submit to create a new Sales Invoice."),
-			"Submitted": __("Click on 'Make Sales Invoice' button to create a new Sales Invoice."),
-			"Billed": __("This Time Log Batch has been billed."),
-			"Cancelled": __("This Time Log Batch has been cancelled.")
-		}[doc.status]);
-
-		if(doc.status=="Submitted") {
-			cur_frm.add_custom_button(__("Make Sales Invoice"), function() { cur_frm.cscript.make_invoice() },
-				"icon-file-alt");
-		}
-	},
-	make_invoice: function() {
-		frappe.model.open_mapped_doc({
-			method: "erpnext.projects.doctype.time_log_batch.time_log_batch.make_sales_invoice",
-			frm: cur_frm
-		});
-	}
-});
-
-frappe.ui.form.on("Time Log Batch Detail", "time_log", function(frm) {
-	calculate_time_and_amount(frm);
-});
-
-frappe.ui.form.on("Time Log Batch Detail", "time_logs_remove", function(frm) {
-	calculate_time_and_amount(frm);
-});
-
-frappe.ui.form.on("Time Log Batch", "onload", function(frm) {
-	if (frm.doc.__islocal && frm.doc.time_logs) {
-		calculate_time_and_amount(frm);
-	}
-});
-
-var calculate_time_and_amount = function(frm) {
-	var tl = frm.doc.time_logs || [];
-	total_hr = 0;
-	total_amt = 0;
-	for(var i=0; i<tl.length; i++) {
-		if (tl[i].time_log) {
-			total_hr += tl[i].hours;
-			total_amt += tl[i].billing_amount;
-		}
-	}
-	cur_frm.set_value("total_hours", total_hr);
-	cur_frm.set_value("total_billing_amount", total_amt);
-	
-}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch.json b/erpnext/projects/doctype/time_log_batch/time_log_batch.json
deleted file mode 100644
index 3ee6dee..0000000
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch.json
+++ /dev/null
@@ -1,305 +0,0 @@
-{
- "allow_copy": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "autoname": "naming_series:", 
- "creation": "2013-02-28 17:57:33", 
- "custom": 0, 
- "description": "Batch Time Logs for Billing.", 
- "docstatus": 0, 
- "doctype": "DocType", 
- "document_type": "Document", 
- "fields": [
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "naming_series", 
-   "fieldtype": "Select", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Series", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "TLB-", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "default": "Draft", 
-   "fieldname": "status", 
-   "fieldtype": "Select", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Status", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Draft\nSubmitted\nBilled\nCancelled", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "column_break_3", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "description": "Will be updated after Sales Invoice is Submitted.", 
-   "fieldname": "sales_invoice", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Sales Invoice", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Sales Invoice", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "section_break_5", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "time_logs", 
-   "fieldtype": "Table", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Time Logs", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Time Log Batch Detail", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "section_break_8", 
-   "fieldtype": "Section Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "default": "0", 
-   "description": "updated via Time Logs", 
-   "fieldname": "total_hours", 
-   "fieldtype": "Float", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Total Hours", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "column_break_10", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "default": "0", 
-   "description": "updated via Time Logs", 
-   "fieldname": "total_billing_amount", 
-   "fieldtype": "Float", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Total Billing Amount", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "amended_from", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 1, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Amended From", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Time Log Batch", 
-   "permlevel": 0, 
-   "print_hide": 1, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }
- ], 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "icon": "icon-time", 
- "idx": 1, 
- "in_create": 0, 
- "in_dialog": 0, 
- "is_submittable": 1, 
- "issingle": 0, 
- "istable": 0, 
- "max_attachments": 0, 
- "modified": "2015-11-16 06:29:59.535984", 
- "modified_by": "Administrator", 
- "module": "Projects", 
- "name": "Time Log Batch", 
- "owner": "Administrator", 
- "permissions": [
-  {
-   "amend": 1, 
-   "apply_user_permissions": 0, 
-   "cancel": 1, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 0, 
-   "if_owner": 0, 
-   "import": 0, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Projects User", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 1, 
-   "write": 1
-  }
- ], 
- "read_only": 0, 
- "read_only_onload": 0
-}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch.py b/erpnext/projects/doctype/time_log_batch/time_log_batch.py
deleted file mode 100644
index a692949..0000000
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch.py
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright (c) 2015, Frappe 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 frappe
-from frappe import _
-
-from frappe.utils import flt
-from frappe.model.document import Document
-from frappe.model.mapper import get_mapped_doc
-
-class TimeLogBatch(Document):
-
-	def validate(self):
-		self.set_status()
-		self.total_hours = 0.0
-		self.total_billing_amount = 0.0
-		for d in self.get("time_logs"):
-			tl = frappe.get_doc("Time Log", d.time_log)
-			self.update_time_log_values(d, tl)
-			self.validate_time_log_is_submitted(tl)
-			self.total_hours += flt(tl.hours)
-			self.total_billing_amount += flt(tl.billing_amount)
-
-	def update_time_log_values(self, d, tl):
-		d.update({
-			"hours": tl.hours,
-			"activity_type": tl.activity_type,
-			"billing_amount": tl.billing_amount,
-			"note": tl.note
-		})
-
-	def validate_time_log_is_submitted(self, tl):
-		if tl.status == "Batched for Billing":
-			frappe.throw(_("Time Log {0} already billed").format(tl.name))
-		elif tl.docstatus != 1:
-			frappe.throw(_("Time Log {0} must be 'Submitted'").format(tl.name))
-
-	def set_status(self):
-		self.status = {
-			"0": "Draft",
-			"1": "Submitted",
-			"2": "Cancelled"
-		}[str(self.docstatus or 0)]
-
-		if self.sales_invoice:
-			self.status = "Billed"
-
-	def on_submit(self):
-		self.update_status(self.name)
-
-	def before_cancel(self):
-		self.update_status(None)
-
-	def before_update_after_submit(self):
-		self.update_status(self.name)
-
-	def update_status(self, time_log_batch):
-		self.set_status()
-		for d in self.get("time_logs"):
-			tl = frappe.get_doc("Time Log", d.time_log)
-			tl.time_log_batch = time_log_batch
-			tl.sales_invoice = self.sales_invoice
-			tl.flags.ignore_validate_update_after_submit = True
-			tl.save()
-
-@frappe.whitelist()
-def make_sales_invoice(source_name, target=None):
-	def update_item(source_doc, target_doc, source_parent):
-		target_doc.stock_uom = "Hour"
-		target_doc.description = "via Time Logs"
-		target_doc.qty = 1
-
-	target = frappe.new_doc("Sales Invoice")
-	target.append("items", get_mapped_doc("Time Log Batch", source_name, {
-		"Time Log Batch": {
-			"doctype": "Sales Invoice Item",
-			"field_map": {
-				"total_billing_amount": "rate",
-				"name": "time_log_batch"
-			},
-			"postprocess": update_item
-		}
-	}))
-
-	return target
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js b/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js
deleted file mode 100644
index fe82b07..0000000
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js
+++ /dev/null
@@ -1,8 +0,0 @@
-frappe.listview_settings['Time Log Batch'] = {
-	add_fields: ["status", "total_hours"],
-	get_indicator: function(doc) {
-		if (doc.status== "Billed") {
-			return [__("Billed"), "green", "status,=," + "Billed"]
-		}
-	}
-};
diff --git a/erpnext/projects/doctype/time_log_batch_detail/README.md b/erpnext/projects/doctype/time_log_batch_detail/README.md
deleted file mode 100644
index daa04aa..0000000
--- a/erpnext/projects/doctype/time_log_batch_detail/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Time Log detail for parent Time Log Batch.
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.json b/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.json
deleted file mode 100644
index ad89b74..0000000
--- a/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
- "allow_copy": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "creation": "2013-03-05 09:11:06", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "fields": [
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "time_log", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Time Log", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Time Log", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_width": "200px", 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0, 
-   "width": "200px"
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "hours", 
-   "fieldtype": "Float", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Hours", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "section_break_3", 
-   "fieldtype": "Column Break", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "activity_type", 
-   "fieldtype": "Data", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Activity Type", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "fieldname": "billing_amount", 
-   "fieldtype": "Float", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 1, 
-   "label": "Billing Amount", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "read_only": 1, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "unique": 0
-  }
- ], 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "idx": 1, 
- "in_create": 0, 
- "in_dialog": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 1, 
- "max_attachments": 0, 
- "modified": "2015-11-16 06:29:59.590738", 
- "modified_by": "Administrator", 
- "module": "Projects", 
- "name": "Time Log Batch Detail", 
- "owner": "Administrator", 
- "permissions": [], 
- "read_only": 0, 
- "read_only_onload": 0
-}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.py b/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.py
deleted file mode 100644
index c9af6fa..0000000
--- a/erpnext/projects/doctype/time_log_batch_detail/time_log_batch_detail.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright (c) 2015, Frappe 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 frappe
-
-from frappe.model.document import Document
-
-class TimeLogBatchDetail(Document):
-	pass
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log/__init__.py b/erpnext/projects/doctype/time_sheet/__init__.py
similarity index 100%
rename from erpnext/projects/doctype/time_log/__init__.py
rename to erpnext/projects/doctype/time_sheet/__init__.py
diff --git a/erpnext/projects/doctype/time_sheet/test_time_sheet.py b/erpnext/projects/doctype/time_sheet/test_time_sheet.py
new file mode 100644
index 0000000..23ead15
--- /dev/null
+++ b/erpnext/projects/doctype/time_sheet/test_time_sheet.py
@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+import datetime
+from frappe.utils import now_datetime, nowdate
+from erpnext.projects.doctype.time_sheet.time_sheet import OverlapError
+from erpnext.projects.doctype.time_sheet.time_sheet import make_salary_slip, make_sales_invoice
+
+class TestTimeSheet(unittest.TestCase):
+	def test_time_sheet_billing_amount(self):
+		salary_structure = make_salary_structure("_T-Employee-0001")
+		time_sheet = make_time_sheet("_T-Employee-0001", True)
+
+		self.assertEquals(time_sheet.total_hours, 2)
+		self.assertEquals(time_sheet.timesheets[0].billing_rate, 50)
+		self.assertEquals(time_sheet.timesheets[0].billing_amount, 100)
+
+	def test_salary_slip_from_timesheet(self):
+		salary_structure = make_salary_structure("_T-Employee-0001")
+		time_sheet = make_time_sheet("_T-Employee-0001", simulate = True)
+		salary_slip = make_salary_slip(time_sheet.name)
+		salary_slip.submit()
+
+		self.assertEquals(salary_slip.total_working_hours, 2)
+		self.assertEquals(salary_slip.hour_rate, 50)
+		self.assertEquals(salary_slip.net_pay, 150)
+		self.assertEquals(salary_slip.timesheets[0].time_sheet, time_sheet.name)
+		self.assertEquals(salary_slip.timesheets[0].working_hours, 2)
+		
+		time_sheet = frappe.get_doc('Time Sheet', time_sheet.name)
+		self.assertEquals(time_sheet.status, 'Payslip')
+		salary_slip.cancel()
+
+		time_sheet = frappe.get_doc('Time Sheet', time_sheet.name)
+		self.assertEquals(time_sheet.status, 'Submitted')
+
+	def test_sales_invoice_from_timesheet(self):
+		time_sheet = make_time_sheet("_T-Employee-0001", simulate = True, billable = 1)
+		sales_invoice = make_sales_invoice(time_sheet.name)
+		sales_invoice.customer = "_Test Customer"
+		sales_invoice.due_date = nowdate()
+
+		item = sales_invoice.append('items', {})
+		item.item_code = '_Test Item'
+		item.qty = 2
+		item.rate = 100
+
+		sales_invoice.submit()
+		
+		time_sheet = frappe.get_doc('Time Sheet', time_sheet.name)
+		self.assertEquals(sales_invoice.total_billing_amount, 100)
+		self.assertEquals(time_sheet.status, 'Billed')
+
+def make_salary_structure(employee):
+	name = frappe.db.get_value('Salary Structure', {'employee': employee, 'salary_slip_based_on_timesheet': 1}, 'name')
+	if name:
+		frappe.delete_doc('Salary Structure', name)
+
+	salary_structure = frappe.new_doc("Salary Structure")
+	salary_structure.salary_slip_based_on_timesheet = 1
+	salary_structure.employee = employee
+	salary_structure.from_date = nowdate()
+	salary_structure.earning_type = "Basic"
+	salary_structure.hour_rate = 50.0
+	salary_structure.company= "_Test Company"
+
+	salary_structure.set('earnings', [])
+	salary_structure.set('deductions', [])
+
+	es = salary_structure.append('earnings', {
+		"e_type": "_Test Allowance",
+		"modified_value": 100 
+	})
+
+	ds = salary_structure.append('deductions', {
+		"d_type": "_Test Professional Tax",
+		"d_modified_amt": 50
+	})
+
+	salary_structure.save(ignore_permissions=True)
+
+	return salary_structure
+
+def make_time_sheet(employee, simulate=False, billable = 0):
+	update_activity_type("_Test Activity Type")
+	time_sheet = frappe.new_doc("Time Sheet")
+	time_sheet.employee = employee
+	time_sheet_detail = time_sheet.append('timesheets', {})
+	time_sheet_detail.billable = billable
+	time_sheet_detail.activity_type = "_Test Activity Type"
+	time_sheet_detail.from_time = now_datetime()
+	time_sheet_detail.hours = 2
+	time_sheet_detail.to_time = time_sheet_detail.from_time + datetime.timedelta(hours= time_sheet_detail.hours)
+
+	for data in time_sheet.get('timesheets'):
+		if simulate:
+			while True:
+				try:
+					time_sheet.save()
+					break
+				except OverlapError:
+					data.from_time = data.from_time + datetime.timedelta(minutes=10)
+					data.to_time = data.from_time + datetime.timedelta(hours= data.hours)
+		else:
+			time_sheet.save()
+
+	time_sheet.submit()
+
+	return time_sheet
+
+def update_activity_type(activity_type):
+	activity_type = frappe.get_doc('Activity Type',activity_type)
+	activity_type.billing_rate = 50.0
+	activity_type.save(ignore_permissions=True)
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_sheet/time_sheet.js b/erpnext/projects/doctype/time_sheet/time_sheet.js
new file mode 100644
index 0000000..5375f93
--- /dev/null
+++ b/erpnext/projects/doctype/time_sheet/time_sheet.js
@@ -0,0 +1,156 @@
+// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+// License: GNU General Public License v3. See license.txt
+
+cur_frm.add_fetch("activity_type", "billing_rate", "billing_rate");
+
+frappe.ui.form.on("Time Sheet", {
+	setup: function(frm) {
+		frm.get_field('timesheets').grid.editable_fields = [
+			{fieldname: 'activity_type', columns: 2},
+			{fieldname: 'from_time', columns: 2},
+			{fieldname: 'hours', columns: 2},
+			{fieldname: 'to_time', columns: 2},
+		];
+
+		frm.fields_dict.employee.get_query = function() {
+			return {
+				query:"erpnext.projects.doctype.time_sheet.time_sheet.get_employee_list"
+			}
+		}
+
+		frm.fields_dict['timesheets'].grid.get_field('task').get_query = function(frm, cdt, cdn) {
+			child = locals[cdt][cdn];
+			return{
+				filters: {
+					'project': child.project
+				}
+			}
+		}
+	},
+
+	onload: function(frm){
+		if (frm.doc.__islocal && frm.doc.timesheets) {
+			frm.set_value("employee", "")
+			calculate_time_and_amount(frm);
+		}
+	},
+
+	refresh: function(frm) {
+		if(frm.doc.docstatus==1) {
+			if(!frm.doc.sales_invoice && frm.doc.total_billing_amount > 0 
+				&& frm.doc.employee){
+				frm.add_custom_button(__("Make Sales Invoice"), function() { frm.trigger("make_invoice") },
+					"icon-file-alt");
+			}
+
+			if(!frm.doc.salary_slip && frm.doc.employee){
+				frm.add_custom_button(__("Make Salary Slip"), function() { frm.trigger("make_salary_slip") },
+					"icon-file-alt");
+			}
+		}
+	},
+
+	make_invoice: function(frm) {
+		frappe.model.open_mapped_doc({
+			method: "erpnext.projects.doctype.time_sheet.time_sheet.make_sales_invoice",
+			frm: frm
+		});
+	},
+
+	make_salary_slip: function(frm) {
+		frappe.model.open_mapped_doc({
+			method: "erpnext.projects.doctype.time_sheet.time_sheet.make_salary_slip",
+			frm: frm
+		});
+	},
+})
+
+frappe.ui.form.on("Time Sheet Detail", {
+	timesheets_remove: function(frm) {
+		calculate_time_and_amount(frm);
+	},
+
+	from_time: function(frm, cdt, cdn) {
+		calculate_end_time(frm, cdt, cdn)
+	},
+
+	to_time: function(frm, cdt, cdn) {
+		var child = locals[cdt][cdn];
+
+		if(frm._setting_hours) return;
+
+		if(flt(child.hours) == 0.0){
+			frappe.model.set_value(cdt, cdn, "hours", moment(child.to_time).diff(moment(child.from_time),
+				"seconds") / 3600);
+		}else{
+			var d = moment(child.to_time);
+			d.add(child.hours, "hours");
+			frappe.model.set_value(cdt, cdn, "from_time", d.format(moment.defaultDatetimeFormat));
+		}
+	},
+
+	hours: function(frm, cdt, cdn) {
+		calculate_end_time(frm, cdt, cdn)
+	},
+
+	billing_rate: function(frm, cdt, cdn) {
+		var child = locals[cdt][cdn]
+		if(child.hours && child.billing_rate){
+			frappe.mode.set_value(cdt, cdn, 'total_billing_amount', flt(child.billing_rate * child.hours))
+		}
+		calculate_billing_amount(frm, cdt, cdn)
+	},
+
+	costing_rate: function(frm, cdt, cdn) {
+		var child = locals[cdt][cdn]
+		frappe.mode.set_value(cdt, cdn, 'total_costing_amount', flt(child.costing_rate * child.hours))
+		calculate_billing_amount(frm, cdt, cdn)
+	},
+
+	billable: function(frm, cdt, cdn) {
+		calculate_billing_amount(frm, cdt, cdn)
+	}
+});
+
+calculate_end_time = function(frm, cdt, cdn){
+	var child = locals[cdt][cdn];
+
+	if(!child.from_time) {
+		frappe.model.set_value(cdt, cdn, "from_time", frappe.datetime.now_datetime());
+	}
+
+	var d = moment(child.from_time);
+	d.add(child.hours, "hours");
+	frm._setting_hours = true;
+	frappe.model.set_value(cdt, cdn, "to_time", d.format(moment.defaultDatetimeFormat));
+	frm._setting_hours = false;
+
+	calculate_billing_amount(frm, cdt, cdn)
+}
+
+var calculate_billing_amount = function(frm, cdt, cdn){
+	child = locals[cdt][cdn]
+	billing_amount = 0.0
+
+	if(child.hours && child.billable){
+		billing_amount = (child.hours * child.billing_rate)	
+	}
+
+	frappe.model.set_value(cdt, cdn, 'billing_amount', billing_amount)
+	calculate_time_and_amount(frm)
+}
+
+var calculate_time_and_amount = function(frm) {
+	var tl = frm.doc.timesheets || [];
+	total_hr = 0;
+	total_billing_amount = 0;
+	for(var i=0; i<tl.length; i++) {
+		if (tl[i].hours) {
+			total_hr += tl[i].hours;
+			total_billing_amount += tl[i].billing_amount;
+		}
+	}
+
+	cur_frm.set_value("total_hours", total_hr);
+	cur_frm.set_value("total_billing_amount", total_billing_amount);
+}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_sheet/time_sheet.json b/erpnext/projects/doctype/time_sheet/time_sheet.json
new file mode 100644
index 0000000..687e24d
--- /dev/null
+++ b/erpnext/projects/doctype/time_sheet/time_sheet.json
@@ -0,0 +1,661 @@
+{
+ "allow_copy": 0, 
+ "allow_import": 0, 
+ "allow_rename": 0, 
+ "autoname": "naming_series:", 
+ "beta": 0, 
+ "creation": "2013-02-28 17:57:33", 
+ "custom": 0, 
+ "description": "Batch Time Logs for Billing.", 
+ "docstatus": 0, 
+ "doctype": "DocType", 
+ "document_type": "Document", 
+ "fields": [
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "naming_series", 
+   "fieldtype": "Select", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Series", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "TS-\nTLB-", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "company", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Company", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Company", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "description": "", 
+   "fieldname": "sales_invoice", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Sales Invoice", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Sales Invoice", 
+   "permlevel": 0, 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "column_break_3", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "salary_slip", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Salary Slip", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Salary Slip", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "default": "Draft", 
+   "fieldname": "status", 
+   "fieldtype": "Select", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Status", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Draft\nSubmitted\nBilled\nPayslip\nCompleted\nCancelled", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "collapsible_depends_on": "", 
+   "depends_on": "eval:!doc.production_order", 
+   "fieldname": "employee_detail", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Employee Detail", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "description": "List of employee which has \"Salary Slip Based on Timesheet\" is enabled in salary structure.", 
+   "fieldname": "employee", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Employee", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Employee", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "employee_name", 
+   "fieldtype": "Read Only", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Employee Name", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "employee.employee_name", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "user", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "User", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "User", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "column_break_9", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "start_date", 
+   "fieldtype": "Date", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Start Date", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "end_date", 
+   "fieldtype": "Date", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "End Date", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "collapsible_depends_on": "", 
+   "depends_on": "production_order", 
+   "fieldname": "production_detail", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Production Detail", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "production_order", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Production Order", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Production Order", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "section_break_5", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "timesheets", 
+   "fieldtype": "Table", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Time Sheets", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Time Sheet Detail", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "section_break_8", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "default": "0", 
+   "description": "updated via Time Logs", 
+   "fieldname": "total_hours", 
+   "fieldtype": "Float", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Total Hours", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "column_break_10", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "default": "0", 
+   "depends_on": "", 
+   "description": "updated via Time Logs", 
+   "fieldname": "total_billing_amount", 
+   "fieldtype": "Float", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Total Billing Amount", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "amended_from", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 1, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Amended From", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Time Sheet", 
+   "permlevel": 0, 
+   "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }
+ ], 
+ "hide_heading": 0, 
+ "hide_toolbar": 0, 
+ "icon": "icon-time", 
+ "idx": 1, 
+ "image_view": 0, 
+ "in_create": 0, 
+ "in_dialog": 0, 
+ "is_submittable": 1, 
+ "issingle": 0, 
+ "istable": 0, 
+ "max_attachments": 0, 
+ "modified": "2016-06-27 01:45:26.226915", 
+ "modified_by": "Administrator", 
+ "module": "Projects", 
+ "name": "Time Sheet", 
+ "owner": "Administrator", 
+ "permissions": [
+  {
+   "amend": 1, 
+   "apply_user_permissions": 0, 
+   "cancel": 1, 
+   "create": 1, 
+   "delete": 1, 
+   "email": 1, 
+   "export": 0, 
+   "if_owner": 0, 
+   "import": 0, 
+   "permlevel": 0, 
+   "print": 1, 
+   "read": 1, 
+   "report": 1, 
+   "role": "Projects User", 
+   "set_user_permissions": 0, 
+   "share": 1, 
+   "submit": 1, 
+   "write": 1
+  }, 
+  {
+   "amend": 1, 
+   "apply_user_permissions": 0, 
+   "cancel": 1, 
+   "create": 0, 
+   "delete": 1, 
+   "email": 1, 
+   "export": 1, 
+   "if_owner": 0, 
+   "import": 0, 
+   "permlevel": 0, 
+   "print": 1, 
+   "read": 1, 
+   "report": 1, 
+   "role": "Projects Manager", 
+   "set_user_permissions": 0, 
+   "share": 1, 
+   "submit": 1, 
+   "write": 1
+  }, 
+  {
+   "amend": 0, 
+   "apply_user_permissions": 0, 
+   "cancel": 0, 
+   "create": 1, 
+   "delete": 0, 
+   "email": 1, 
+   "export": 1, 
+   "if_owner": 0, 
+   "import": 0, 
+   "permlevel": 0, 
+   "print": 1, 
+   "read": 1, 
+   "report": 1, 
+   "role": "Manufacturing User", 
+   "set_user_permissions": 0, 
+   "share": 1, 
+   "submit": 0, 
+   "write": 0
+  }
+ ], 
+ "quick_entry": 0, 
+ "read_only": 0, 
+ "read_only_onload": 0, 
+ "sort_order": "ASC", 
+ "track_seen": 0
+}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_sheet/time_sheet.py b/erpnext/projects/doctype/time_sheet/time_sheet.py
new file mode 100644
index 0000000..da56112
--- /dev/null
+++ b/erpnext/projects/doctype/time_sheet/time_sheet.py
@@ -0,0 +1,272 @@
+# Copyright (c) 2015, Frappe 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 frappe
+from frappe import _
+
+from frappe.utils import flt, time_diff_in_hours, get_datetime, getdate, cint, get_datetime_str
+from frappe.model.document import Document
+from frappe.model.mapper import get_mapped_doc
+from erpnext.manufacturing.doctype.manufacturing_settings.manufacturing_settings import get_mins_between_operations
+
+class OverlapError(frappe.ValidationError): pass
+class OverProductionLoggedError(frappe.ValidationError): pass
+
+class TimeSheet(Document):
+
+	def validate(self):
+		self.set_status()
+		self.total_hours = 0.0
+		self.total_billing_amount = 0.0
+		self.validate_dates()
+		self.validate_timesheets()
+		self.update_cost()
+		for d in self.get("timesheets"):
+			self.total_hours += flt(d.hours)
+			if d.billable: self.total_billing_amount += flt(d.billing_amount)
+
+	def set_status(self):
+		self.status = {
+			"0": "Draft",
+			"1": "Submitted",
+			"2": "Cancelled"
+		}[str(self.docstatus or 0)]
+
+		if self.sales_invoice:
+			self.status = "Billed"
+
+		if self.salary_slip:
+			self.status = "Payslip"
+
+		if self.sales_invoice and self.salary_slip:
+			self.status = "Completed"
+
+	def set_dates(self):
+		if self.docstatus < 2:
+			start_date = min([d.from_time for d in self.timesheets])
+			end_date = max([d.to_time for d in self.timesheets])
+
+			if start_date and end_date:
+				self.start_date = getdate(start_date)
+				self.end_date = getdate(end_date)
+
+	def before_submit(self):
+		self.set_dates()
+
+	def before_cancel(self):
+		self.set_status()
+
+	def on_cancel(self):
+		self.update_production_order(None)
+		self.update_task_and_project()
+
+	def on_submit(self):
+		self.validate_mandatory_fields()
+		self.update_production_order(self.name)
+		self.update_task_and_project()
+
+	def validate_mandatory_fields(self):
+		if self.production_order:
+			production_order = frappe.get_doc("Production Order", self.production_order)
+			pending_qty = flt(production_order.qty) - flt(production_order.produced_qty)
+
+		for data in self.timesheets:
+			if not data.from_time and not data.to_time:
+				frappe.throw(_("Row {0}: From Time and To Time is mandatory.").format(data.idx))
+
+			if not data.activity_type and self.employee:
+				frappe.throw(_("Row {0}: Activity Type is mandatory.").format(data.idx))
+
+			if flt(data.hours) == 0.0:
+				frappe.throw(_("Row {0}: Hours value must be greater than zero.").format(data.idx))
+
+			if self.production_order and flt(data.completed_qty) == 0:
+				frappe.throw(_("Row {0}: Completed Qty must be greater than zero.").format(data.idx))
+
+			if self.production_order and flt(pending_qty) < flt(data.completed_qty):
+				frappe.throw(_("Row {0}: Completed Qty cannot be more than {0} for operation {1}").format(data.idx, pending_qty, self.operation),
+					OverProductionLoggedError)
+
+	def update_production_order(self, time_sheet):
+		if self.production_order:
+			pro = frappe.get_doc('Production Order', self.production_order)
+
+			for timesheet in self.timesheets:
+				for data in pro.operations:
+					if data.name == timesheet.operation_id:
+						summary = self.get_actual_timesheet_summary(timesheet.operation_id)
+						data.time_sheet = time_sheet
+						data.completed_qty = summary.completed_qty 
+						data.actual_operation_time = summary.mins
+						data.actual_start_time = summary.from_time
+						data.actual_end_time = summary.to_time
+
+			pro.flags.ignore_validate_update_after_submit = True
+			pro.update_operation_status()
+			pro.calculate_operating_cost()
+			pro.set_actual_dates()
+			pro.save()
+
+	def get_actual_timesheet_summary(self, operation_id):
+		"""Returns 'Actual Operating Time'. """
+		return frappe.db.sql("""select
+			sum(tsd.hours*60) as mins, sum(tsd.completed_qty) as completed_qty, min(tsd.from_time) as from_time,
+			max(tsd.to_time) as to_time from `tabTime Sheet Detail` as tsd, `tabTime Sheet` as ts where 
+			ts.production_order = %s and tsd.operation_id = %s and ts.docstatus=1 and ts.name = tsd.parent""",
+			(self.production_order, operation_id), as_dict=1)[0]
+
+	def update_task_and_project(self):
+		for data in self.timesheets:
+			if data.task:
+				task = frappe.get_doc("Task", data.task)
+				task.update_time_and_costing()
+				task.save()
+
+			elif data.project:
+				frappe.get_doc("Project", data.project).update_project()
+
+	def validate_dates(self):
+		for data in self.timesheets:
+			if time_diff_in_hours(data.to_time, data.from_time) < 0:
+				frappe.throw(_("To date cannot be before from date"))
+
+	def validate_timesheets(self):
+		for data in self.get('timesheets'):
+			self.validate_overlap(data)
+			self.check_workstation_timings(data)
+
+	def validate_overlap(self, data):
+		if self.production_order:
+			self.validate_overlap_for("workstation", data)
+		else:
+			self.validate_overlap_for("user", data)
+			self.validate_overlap_for("employee", data)
+
+	def validate_overlap_for(self, fieldname, args):
+		existing = self.get_overlap_for(fieldname, args)
+		if existing:
+			frappe.throw(_("Row {0}: From Time and To Time overlap with existing from and to time").format(args.idx),
+				OverlapError)
+
+	def get_overlap_for(self, fieldname, args):
+		if not args.get(fieldname):
+			return
+
+		existing = frappe.db.sql("""select ts.name as name, tsd.from_time as from_time, tsd.to_time as to_time from 
+			`tabTime Sheet Detail` tsd, `tabTime Sheet` ts where tsd.`{0}`=%(val)s and tsd.parent = ts.name and
+			(
+				(%(from_time)s > tsd.from_time and %(from_time)s < tsd.to_time) or
+				(%(to_time)s > tsd.from_time and %(to_time)s < tsd.to_time) or
+				(%(from_time)s <= tsd.from_time and %(to_time)s >= tsd.to_time))
+			and tsd.name!=%(name)s
+			and ts.docstatus < 2""".format(fieldname),
+			{
+				"val": args.get(fieldname),
+				"from_time": args.from_time,
+				"to_time": args.to_time,
+				"name": args.name or "No Name"
+			}, as_dict=True)
+
+		return existing[0] if existing else None
+
+	def check_workstation_timings(self, args):
+		"""Checks if **Time Log** is between operating hours of the **Workstation**."""
+		if args.workstation and args.from_time and args.to_time:
+			from erpnext.manufacturing.doctype.workstation.workstation import check_if_within_operating_hours
+			check_if_within_operating_hours(args.workstation, args.operation, args.from_time, args.to_time)
+
+	def move_to_next_non_overlapping_slot(self, index):
+		from datetime import timedelta
+		if self.timesheets:
+			for data in self.timesheets:
+				if data.idx == index:
+					overlapping = self.get_overlap_for("workstation", data)
+					if not overlapping:
+						frappe.throw(_("Logical error: Must find overlapping"))
+					
+					if overlapping:
+						time_sheet = self.get_last_working_slot(overlapping.name, data.workstation)
+						data.from_time = get_datetime(time_sheet.to_time) + get_mins_between_operations()
+						data.to_time = get_datetime(data.from_time) + timedelta(hours=data.hours)
+					break
+
+	def get_last_working_slot(self, time_sheet, workstation):
+		return frappe.db.sql(""" select max(from_time) as from_time, max(to_time) as to_time 
+			from `tabTime Sheet Detail` where workstation = %(workstation)s""",
+			{'workstation': workstation}, as_dict=True)[0]
+
+	def update_cost(self):
+		for data in self.timesheets:
+			if data.activity_type and not data.billing_amount:
+				rate = get_activity_cost(self.employee, data.activity_type)
+				hours =  data.hours or 0
+				if rate:
+					data.billing_rate = flt(rate.get('billing_rate'))
+					data.costing_rate = flt(rate.get('costing_rate'))
+					data.billing_amount = data.billing_rate * hours
+					data.costing_amount = data.costing_rate * hours
+
+@frappe.whitelist()
+def make_sales_invoice(source_name, target=None):
+	target = frappe.new_doc("Sales Invoice")
+
+	target.append("timesheets", get_mapped_doc("Time Sheet", source_name, {
+		"Time Sheet": {
+			"doctype": "Sales Invoice Timesheet",
+			"field_map": {
+				"total_billing_amount": "billing_amount",
+				"name": "time_sheet"
+			},
+		}
+	}))
+	
+	target.run_method("calculate_billing_amount_from_timesheet")
+
+	return target
+
+@frappe.whitelist()
+def make_salary_slip(source_name, target_doc=None):
+	target = frappe.new_doc("Salary Slip")
+	set_missing_values(source_name, target)
+	
+	target.append("timesheets", get_mapped_doc("Time Sheet", source_name, {
+		"Time Sheet": {
+			"doctype": "Salary Slip Timesheet",
+			"field_map": {
+				"total_hours": "working_hours",
+				"name": "time_sheet"
+			},
+		}
+	}))
+	
+	target.run_method("get_emp_and_leave_details")
+
+	return target
+
+def set_missing_values(time_sheet, target):
+	doc = frappe.get_doc('Time Sheet', time_sheet)
+	target.employee = doc.employee
+	target.employee_name = doc.employee_name
+	target.salary_slip_based_on_timesheet = 1
+	target.start_date = doc.start_date
+	target.end_date = doc.end_date
+	
+@frappe.whitelist()
+def get_activity_cost(employee=None, activity_type=None):
+	rate = frappe.db.get_values("Activity Cost", {"employee": employee,
+		"activity_type": activity_type}, ["costing_rate", "billing_rate"], as_dict=True)
+	if not rate:
+		rate = frappe.db.get_values("Activity Type", {"activity_type": activity_type},
+			["costing_rate", "billing_rate"], as_dict=True)
+
+	return rate[0] if rate else {}
+	
+@frappe.whitelist()
+def get_employee_list(doctype, txt, searchfield, start, page_len, filters):
+	return frappe.db.sql("""select distinct(employee) as employee
+		from `tabSalary Structure` where salary_slip_based_on_timesheet=1
+		and employee like %(txt)s limit %(start)s, %(page_len)s""", 
+		{'txt': "%%%s%%"%(txt), 'start': start, 'page_len': page_len})
diff --git a/erpnext/projects/doctype/time_sheet/time_sheet_list.js b/erpnext/projects/doctype/time_sheet/time_sheet_list.js
new file mode 100644
index 0000000..ad8b3b5
--- /dev/null
+++ b/erpnext/projects/doctype/time_sheet/time_sheet_list.js
@@ -0,0 +1,16 @@
+frappe.listview_settings['Time Sheet'] = {
+	add_fields: ["status", "total_hours"],
+	get_indicator: function(doc) {
+		if (doc.status== "Billed") {
+			return [__("Billed"), "green", "status,=," + "Billed"]
+		}
+		
+		if (doc.status== "Payslip") {
+			return [__("Payslip"), "green", "status,=," + "Payslip"]
+		}
+		
+		if (doc.status== "Completed") {
+			return [__("Completed"), "green", "status,=," + "Completed"]
+		}
+	}
+};
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log_batch_detail/__init__.py b/erpnext/projects/doctype/time_sheet_detail/__init__.py
similarity index 100%
rename from erpnext/projects/doctype/time_log_batch_detail/__init__.py
rename to erpnext/projects/doctype/time_sheet_detail/__init__.py
diff --git a/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.json b/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.json
new file mode 100644
index 0000000..4a0787d
--- /dev/null
+++ b/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.json
@@ -0,0 +1,493 @@
+{
+ "allow_copy": 0, 
+ "allow_import": 0, 
+ "allow_rename": 0, 
+ "beta": 0, 
+ "creation": "2013-03-05 09:11:06", 
+ "custom": 0, 
+ "docstatus": 0, 
+ "doctype": "DocType", 
+ "document_type": "Document", 
+ "fields": [
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "billable", 
+   "fieldtype": "Check", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Billable", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "activity_type", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Activity Type", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Activity Type", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "from_time", 
+   "fieldtype": "Datetime", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "From Time", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "hours", 
+   "fieldtype": "Float", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Hours", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "to_time", 
+   "fieldtype": "Datetime", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "To Time", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "section_break_3", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "project", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Project", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Project", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "project", 
+   "fieldname": "task", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Task", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Task", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "eval:parent.production_order", 
+   "fieldname": "workstation", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Workstation", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Workstation", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "eval:parent.production_order", 
+   "fieldname": "operation", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Operation", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Operation", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "eval:parent.production_order", 
+   "fieldname": "operation_id", 
+   "fieldtype": "Data", 
+   "hidden": 1, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Operation Id", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "completed_qty", 
+   "fieldtype": "Float", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Completed Qty", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "2", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "section_break_11", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "depends_on": "", 
+   "fieldname": "billing_rate", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Billing Rate", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "2", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "costing_rate", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Costing Rate", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "column_break_14", 
+   "fieldtype": "Column Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "default": "0", 
+   "depends_on": "", 
+   "fieldname": "billing_amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Billing Amount", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "2", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "default": "0", 
+   "fieldname": "costing_amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Costing Amount", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }
+ ], 
+ "hide_heading": 0, 
+ "hide_toolbar": 0, 
+ "idx": 1, 
+ "image_view": 0, 
+ "in_create": 0, 
+ "in_dialog": 0, 
+ "is_submittable": 0, 
+ "issingle": 0, 
+ "istable": 1, 
+ "max_attachments": 0, 
+ "modified": "2016-06-24 15:55:30.746870", 
+ "modified_by": "Administrator", 
+ "module": "Projects", 
+ "name": "Time Sheet Detail", 
+ "owner": "Administrator", 
+ "permissions": [], 
+ "quick_entry": 1, 
+ "read_only": 0, 
+ "read_only_onload": 0, 
+ "sort_order": "ASC", 
+ "track_seen": 0
+}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.py b/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.py
new file mode 100644
index 0000000..bbb68e8
--- /dev/null
+++ b/erpnext/projects/doctype/time_sheet_detail/time_sheet_detail.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class TimeSheetDetail(Document):
+	pass
diff --git a/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.json b/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.json
deleted file mode 100644
index 2cdaf6b..0000000
--- a/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "apply_user_permissions": 1, 
- "creation": "2013-04-03 11:27:52", 
- "docstatus": 0, 
- "doctype": "Report", 
- "idx": 1, 
- "is_standard": "Yes", 
- "modified": "2014-06-03 07:18:17.019543", 
- "modified_by": "Administrator", 
- "module": "Projects", 
- "name": "Daily Time Log Summary", 
- "owner": "Administrator", 
- "ref_doctype": "Time Log", 
- "report_name": "Daily Time Log Summary", 
- "report_type": "Script Report"
-}
\ No newline at end of file
diff --git a/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.py b/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.py
deleted file mode 100644
index 028fd77..0000000
--- a/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe import _
-from frappe.utils import flt
-
-def execute(filters=None):
-	if not filters:
-		filters = {}
-	elif filters.get("from_date") or filters.get("to_date"):
-		filters["from_time"] = "00:00:00"
-		filters["to_time"] = "24:00:00"
-
-	columns = [_("Time Log") + ":Link/Time Log:120", _("Employee") + "::150", _("From Datetime") + "::140",
-		_("To Datetime") + "::140", _("Hours") + "::70", _("Activity Type") + "::120", _("Task") + ":Link/Task:150",
-		_("Task Subject") + "::180", _("Project") + ":Link/Project:120", _("Status") + "::70"]
-
-	user_map = get_user_map()
-	employee_map = get_employee_map()
-	task_map = get_task_map()
-
-	conditions = build_conditions(filters)
-	time_logs = frappe.db.sql("""select * from `tabTime Log`
-		where docstatus < 2 %s order by owner asc""" % (conditions, ), filters, as_dict=1)
-
-	if time_logs:
-		users = [time_logs[0].owner]
-
-	data = []
-	total_hours = total_employee_hours = count = 0
-	for tl in time_logs:
-		if tl.employee:
-			employee=employee_map[tl.employee]
-		else:
-			employee=user_map[tl.owner]	
-		if tl.owner not in users:
-			users.append(tl.owner)
-			data.append(["", "", "", "Total", total_employee_hours, "", "", "", "", ""])
-			total_employee_hours = 0
-
-		data.append([tl.name, employee, tl.from_time, tl.to_time, tl.hours,
-				tl.activity_type, tl.task, task_map.get(tl.task), tl.project, tl.status])
-
-		count += 1
-		total_hours += flt(tl.hours)
-		total_employee_hours += flt(tl.hours)
-
-		if count == len(time_logs):
-			data.append(["", "", "", "Total Hours", total_employee_hours, "", "", "", "", ""])
-
-	if total_hours:
-		data.append(["", "", "", "Grand Total", total_hours, "", "", "", "", ""])
-
-	return columns, data
-
-def get_user_map():
-	users = frappe.db.sql("""select name,
-		concat(first_name, if(last_name, (' ' + last_name), '')) as fullname
-		from tabUser""", as_dict=1)
-	user_map = {}
-	for p in users:
-		user_map.setdefault(p.name, []).append(p.fullname)
-
-	return user_map
-	
-def get_employee_map():
-	employees = frappe.db.sql("""select name,
-		employee_name as fullname
-		from tabEmployee""", as_dict=1)
-	employee_map = {}
-	for p in employees:
-		employee_map.setdefault(p.name, []).append(p.fullname)
-
-	return employee_map	
-
-def get_task_map():
-	tasks = frappe.db.sql("""select name, subject from tabTask""", as_dict=1)
-	task_map = {}
-	for t in tasks:
-		task_map.setdefault(t.name, []).append(t.subject)
-
-	return task_map
-
-def build_conditions(filters):
-	conditions = ""
-	if filters.get("from_date"):
-		conditions += " and from_time >= timestamp(%(from_date)s, %(from_time)s)"
-	if filters.get("to_date"):
-		conditions += " and to_time <= timestamp(%(to_date)s, %(to_time)s)"
-
-	from frappe.desk.reportview import build_match_conditions
-	match_conditions = build_match_conditions("Time Log")
-	if match_conditions:
-		conditions += " and %s" % match_conditions
-
-	return conditions
diff --git a/erpnext/projects/report/daily_time_log_summary/__init__.py b/erpnext/projects/report/daily_time_sheet_summary/__init__.py
similarity index 100%
rename from erpnext/projects/report/daily_time_log_summary/__init__.py
rename to erpnext/projects/report/daily_time_sheet_summary/__init__.py
diff --git a/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.js b/erpnext/projects/report/daily_time_sheet_summary/daily_time_sheet_summary.js
similarity index 61%
rename from erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.js
rename to erpnext/projects/report/daily_time_sheet_summary/daily_time_sheet_summary.js
index a1baed7..4798697 100644
--- a/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.js
+++ b/erpnext/projects/report/daily_time_sheet_summary/daily_time_sheet_summary.js
@@ -1,7 +1,7 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
 
-frappe.query_reports["Daily Time Log Summary"] = {
+frappe.query_reports["Daily Time Sheet Summary"] = {
 	"filters": [
 		{
 			"fieldname":"from_date",
diff --git a/erpnext/projects/report/daily_time_sheet_summary/daily_time_sheet_summary.json b/erpnext/projects/report/daily_time_sheet_summary/daily_time_sheet_summary.json
new file mode 100644
index 0000000..cf5a8cb
--- /dev/null
+++ b/erpnext/projects/report/daily_time_sheet_summary/daily_time_sheet_summary.json
@@ -0,0 +1,18 @@
+{
+ "add_total_row": 0, 
+ "apply_user_permissions": 1, 
+ "creation": "2016-06-25 01:52:25.911238", 
+ "disabled": 0, 
+ "docstatus": 0, 
+ "doctype": "Report", 
+ "idx": 0, 
+ "is_standard": "Yes", 
+ "modified": "2016-06-25 01:52:31.214122", 
+ "modified_by": "Administrator", 
+ "module": "Projects", 
+ "name": "Daily Time Sheet Summary", 
+ "owner": "Administrator", 
+ "ref_doctype": "Time Sheet", 
+ "report_name": "Daily Time Sheet Summary", 
+ "report_type": "Script Report"
+}
\ No newline at end of file
diff --git a/erpnext/projects/report/daily_time_sheet_summary/daily_time_sheet_summary.py b/erpnext/projects/report/daily_time_sheet_summary/daily_time_sheet_summary.py
new file mode 100644
index 0000000..ed835aa
--- /dev/null
+++ b/erpnext/projects/report/daily_time_sheet_summary/daily_time_sheet_summary.py
@@ -0,0 +1,34 @@
+# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+
+def execute(filters=None):
+	if not filters:
+		filters = {}
+	elif filters.get("from_date") or filters.get("to_date"):
+		filters["from_time"] = "00:00:00"
+		filters["to_time"] = "24:00:00"
+
+	columns = [_("Time Sheet") + ":Link/Time Sheet:120", _("Employee") + "::150", _("From Datetime") + "::140",
+		_("To Datetime") + "::140", _("Hours") + "::70", _("Activity Type") + "::120", _("Task") + ":Link/Task:150",
+		_("Project") + ":Link/Project:120", _("Status") + "::70"]
+		
+	conditions = "ts.docstatus = 1"
+	if filters.get("from_date"):
+		conditions += " and tsd.from_time >= timestamp(%(from_date)s, %(from_time)s)"
+	if filters.get("to_date"):
+		conditions += " and tsd.to_time <= timestamp(%(to_date)s, %(to_time)s)"
+	
+	data = get_data(conditions, filters)
+
+	return columns, data
+
+def get_data(conditions, filters):
+	time_sheet = frappe.db.sql(""" select ts.name, ts.employee, tsd.from_time, tsd.to_time, tsd.hours,
+		tsd.activity_type, tsd.task, tsd.project, ts.status from `tabTime Sheet Detail` tsd, 
+		`tabTime Sheet` ts where ts.name = tsd.parent and %s order by ts.name"""%(conditions), filters, as_list=1)
+
+	return time_sheet
diff --git a/erpnext/projects/utils.py b/erpnext/projects/utils.py
index 1f6e2b3..d663ad0 100644
--- a/erpnext/projects/utils.py
+++ b/erpnext/projects/utils.py
@@ -7,10 +7,6 @@
 import frappe
 
 @frappe.whitelist()
-def get_time_log_list(doctype, txt, searchfield, start, page_len, filters):
-	return frappe.db.get_values("Time Log", filters, ["name", "activity_type", "owner"])
-
-@frappe.whitelist()
 def query_task(doctype, txt, searchfield, start, page_len, filters):
 	from frappe.desk.reportview import build_match_conditions
 
diff --git a/erpnext/setup/doctype/company/delete_company_transactions.py b/erpnext/setup/doctype/company/delete_company_transactions.py
index a78898f..7b3326b 100644
--- a/erpnext/setup/doctype/company/delete_company_transactions.py
+++ b/erpnext/setup/doctype/company/delete_company_transactions.py
@@ -18,7 +18,7 @@
 			frappe.PermissionError)
 
 	delete_bins(company_name)
-	delete_time_logs(company_name)
+	delete_time_sheets(company_name)
 	delete_lead_addresses(company_name)
 
 	for doctype in frappe.db.sql_list("""select parent from
@@ -70,21 +70,12 @@
 	frappe.db.sql("""delete from tabBin where warehouse in
 			(select name from tabWarehouse where company=%s)""", company_name)
 
-def delete_time_logs(company_name):
+def delete_time_sheets(company_name):
 	# Delete Time Logs as it is linked to Production Order / Project / Task, which are linked to company
 	frappe.db.sql("""
-		delete from `tabTime Log`
+		delete from `tabTime Sheet`
 		where
-			(ifnull(project, '') != ''
-				and exists(select name from `tabProject` where name=`tabTime Log`.project and company=%(company)s))
-			or (ifnull(task, '') != ''
-				and exists(select name from `tabTask` where name=`tabTime Log`.task and company=%(company)s))
-			or (ifnull(production_order, '') != ''
-				and exists(select name from `tabProduction Order`
-					where name=`tabTime Log`.production_order and company=%(company)s))
-			or (ifnull(sales_invoice, '') != ''
-				and exists(select name from `tabSales Invoice`
-					where name=`tabTime Log`.sales_invoice and company=%(company)s))
+			company=%(company)s
 	""", {"company": company_name})
 
 def delete_lead_addresses(company_name):
diff --git a/erpnext/setup/setup_wizard/domainify.py b/erpnext/setup/setup_wizard/domainify.py
index f77b05d..f4cc35a 100644
--- a/erpnext/setup/setup_wizard/domainify.py
+++ b/erpnext/setup/setup_wizard/domainify.py
@@ -43,7 +43,7 @@
 	},
 
 	'Services': {
-		'desktop_icons': ['Project', 'Time Log', 'Customer', 'Sales Order', 'Sales Invoice', 'Lead', 'Opportunity',
+		'desktop_icons': ['Project', 'Time Sheet', 'Customer', 'Sales Order', 'Sales Invoice', 'Lead', 'Opportunity',
 			'Expense Claim', 'Employee', 'HR', 'ToDo'],
 		'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
 		'properties': [
diff --git a/erpnext/startup/notifications.py b/erpnext/startup/notifications.py
index 335efbb..ac503c2 100644
--- a/erpnext/startup/notifications.py
+++ b/erpnext/startup/notifications.py
@@ -43,8 +43,6 @@
 			"Purchase Receipt": {"docstatus": 0},
 			"Production Order": { "status": ("in", ("Draft", "Not Started", "In Process")) },
 			"BOM": {"docstatus": 0},
-			"Timesheet": {"docstatus": 0},
-			"Time Log": {"status": "Draft"},
-			"Time Log Batch": {"status": "Draft"}
+			"Time Sheet": {"status": "Draft"}
 		}
 	}
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 2fe3bb7..05435f4 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -178,7 +178,7 @@
 			self.production_order = None
 
 	def check_if_operations_completed(self):
-		"""Check if Time Logs are completed against before manufacturing to capture operating costs."""
+		"""Check if Time Sheets are completed against before manufacturing to capture operating costs."""
 		prod_order = frappe.get_doc("Production Order", self.production_order)
 
 		for d in prod_order.get("operations"):
diff --git a/erpnext/templates/pages/projects.py b/erpnext/templates/pages/projects.py
index 0f021a6..25b3a67 100644
--- a/erpnext/templates/pages/projects.py
+++ b/erpnext/templates/pages/projects.py
@@ -20,8 +20,9 @@
 	project.tasks = get_tasks(project.name, start=0, item_status='open',
 		search=frappe.form_dict.get("search"))
 
-	project.timelogs = get_timelogs(project.name, start=0,
-		search=frappe.form_dict.get("search"))
+	project.timelogs = []
+	# project.timelogs = get_timelogs(project.name, start=0,
+		# search=frappe.form_dict.get("search"))
 
 
 	context.doc = project