[Enhancement] POS
diff --git a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json
index 6befedc..26519ac 100644
--- a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json
+++ b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json
@@ -17,6 +17,7 @@
    "fieldtype": "Data", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Mode of Payment", 
@@ -26,6 +27,7 @@
    "oldfieldtype": "Data", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -37,10 +39,37 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "type", 
+   "fieldtype": "Select", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Type", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Cash\nBank\nGeneral", 
+   "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": "accounts", 
    "fieldtype": "Table", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Accounts", 
@@ -50,6 +79,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -68,7 +98,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:50.335559", 
+ "modified": "2016-04-26 11:48:17.411796", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Mode of Payment", 
@@ -115,6 +145,9 @@
    "write": 0
   }
  ], 
+ "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/payments/__init__.py b/erpnext/accounts/doctype/payments/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/payments/__init__.py
diff --git a/erpnext/accounts/doctype/payments/payments.json b/erpnext/accounts/doctype/payments/payments.json
new file mode 100644
index 0000000..d52fb15
--- /dev/null
+++ b/erpnext/accounts/doctype/payments/payments.json
@@ -0,0 +1,191 @@
+{
+ "allow_copy": 0, 
+ "allow_import": 0, 
+ "allow_rename": 0, 
+ "beta": 0, 
+ "creation": "2016-05-08 23:49:38.842621", 
+ "custom": 0, 
+ "docstatus": 0, 
+ "doctype": "DocType", 
+ "document_type": "", 
+ "fields": [
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "mode_of_payment", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Mode of Payment", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Mode of Payment", 
+   "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, 
+   "default": "0.0", 
+   "depends_on": "eval:parent.doctype == 'Sales Invoice'", 
+   "fieldname": "amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 1, 
+   "label": "Amount", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "currency", 
+   "permlevel": 0, 
+   "precision": "2", 
+   "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": "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, 
+   "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": "account", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Account", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Account", 
+   "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": "type", 
+   "fieldtype": "Read Only", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Type", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "mode_of_payment.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": "base_amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Base Amount (Company Currency)", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Company:company:default_currency", 
+   "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
+  }
+ ], 
+ "hide_heading": 0, 
+ "hide_toolbar": 0, 
+ "idx": 0, 
+ "in_create": 0, 
+ "in_dialog": 0, 
+ "is_submittable": 0, 
+ "issingle": 0, 
+ "istable": 1, 
+ "max_attachments": 0, 
+ "modified": "2016-05-09 00:14:18.975568", 
+ "modified_by": "Administrator", 
+ "module": "Accounts", 
+ "name": "Payments", 
+ "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/payments/payments.py b/erpnext/accounts/doctype/payments/payments.py
new file mode 100644
index 0000000..15cf0b2
--- /dev/null
+++ b/erpnext/accounts/doctype/payments/payments.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 Payments(Document):
+	pass
diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.json b/erpnext/accounts/doctype/pos_profile/pos_profile.json
index 6d395af..8f25ba9 100644
--- a/erpnext/accounts/doctype/pos_profile/pos_profile.json
+++ b/erpnext/accounts/doctype/pos_profile/pos_profile.json
@@ -3,6 +3,7 @@
  "allow_import": 0, 
  "allow_rename": 0, 
  "autoname": "hash", 
+ "beta": 0, 
  "creation": "2013-05-24 12:15:51", 
  "custom": 0, 
  "docstatus": 0, 
@@ -16,6 +17,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Applicable for User", 
@@ -26,6 +28,7 @@
    "options": "User", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -41,6 +44,7 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Series", 
@@ -51,6 +55,7 @@
    "options": "[Select]", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -62,37 +67,13 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "warehouse", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Warehouse", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "warehouse", 
-   "oldfieldtype": "Link", 
-   "options": "Warehouse", 
-   "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, 
    "default": "1", 
    "description": "", 
    "fieldname": "update_stock", 
    "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Update Stock", 
@@ -100,6 +81,60 @@
    "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": "update_stock", 
+   "fieldname": "warehouse", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Warehouse", 
+   "length": 0, 
+   "no_copy": 0, 
+   "oldfieldname": "warehouse", 
+   "oldfieldtype": "Link", 
+   "options": "Warehouse", 
+   "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": "ignore_pricing_rule", 
+   "fieldtype": "Check", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Ignore Pricing Rule", 
+   "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, 
@@ -115,6 +150,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -122,6 +158,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -137,6 +174,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Customer", 
@@ -147,6 +185,7 @@
    "options": "Customer", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -162,6 +201,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Company", 
@@ -172,6 +212,7 @@
    "options": "Company", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -187,6 +228,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Currency", 
@@ -197,6 +239,7 @@
    "options": "Currency", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -208,19 +251,70 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "mode_of_payment", 
-   "fieldtype": "Link", 
+   "fieldname": "allow_partial_payment", 
+   "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
-   "label": "Mode of Payment", 
+   "label": "Allow Partial Payment", 
    "length": 0, 
    "no_copy": 0, 
-   "options": "Mode of Payment", 
    "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_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, 
+   "fieldname": "payments", 
+   "fieldtype": "Table", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Payments", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Payments", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -236,6 +330,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -243,6 +338,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -258,6 +354,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Print Format", 
@@ -267,6 +364,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -282,6 +380,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Letter Head", 
@@ -292,6 +391,7 @@
    "options": "Letter Head", 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -307,6 +407,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Print Heading", 
@@ -317,6 +418,7 @@
    "options": "Print Heading", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -332,6 +434,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Terms and Conditions", 
@@ -342,6 +445,7 @@
    "options": "Terms and Conditions", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -357,6 +461,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -364,6 +469,33 @@
    "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
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "customer_group", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Customer Group", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Customer Group", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -380,6 +512,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 1, 
    "label": "Territory", 
@@ -390,6 +523,7 @@
    "options": "Territory", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -405,6 +539,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Price List", 
@@ -415,6 +550,60 @@
    "options": "Price List", 
    "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": "apply_discount", 
+   "fieldtype": "Check", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Apply Discount", 
+   "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": "Grand Total", 
+   "depends_on": "apply_discount", 
+   "fieldname": "apply_discount_on", 
+   "fieldtype": "Select", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Apply Discount On", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Grand Total\nNet Total", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -430,6 +619,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -437,6 +627,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -448,10 +639,12 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "depends_on": "", 
    "fieldname": "write_off_account", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Write Off Account", 
@@ -461,6 +654,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -476,6 +670,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Write Off Cost Center", 
@@ -485,6 +680,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -500,6 +696,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Taxes and Charges", 
@@ -510,6 +707,7 @@
    "options": "Sales Taxes and Charges Template", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -525,6 +723,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -532,6 +731,7 @@
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -547,6 +747,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Cash/Bank Account", 
@@ -557,6 +758,7 @@
    "options": "Account", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -572,6 +774,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Income Account", 
@@ -582,6 +785,7 @@
    "options": "Account", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -598,6 +802,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Expense Account", 
@@ -606,6 +811,7 @@
    "options": "Account", 
    "permlevel": 0, 
    "print_hide": 1, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -621,6 +827,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Cost Center", 
@@ -631,6 +838,7 @@
    "options": "Cost Center", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -649,7 +857,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:51.741253", 
+ "modified": "2016-05-09 00:00:30.610878", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "POS Profile", 
@@ -696,9 +904,11 @@
    "write": 0
   }
  ], 
+ "quick_entry": 1, 
  "read_only": 0, 
  "read_only_onload": 0, 
  "sort_field": "modified", 
  "sort_order": "DESC", 
- "title_field": "user"
+ "title_field": "user", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.py b/erpnext/accounts/doctype/pos_profile/pos_profile.py
index 98a8509..634d63c 100644
--- a/erpnext/accounts/doctype/pos_profile/pos_profile.py
+++ b/erpnext/accounts/doctype/pos_profile/pos_profile.py
@@ -5,6 +5,7 @@
 import frappe
 from frappe import msgprint, _
 from frappe.utils import cint
+from erpnext.accounts.doctype.sales_invoice.sales_invoice import set_account_for_mode_of_payment
 
 from frappe.model.document import Document
 
@@ -36,6 +37,9 @@
 						"company": self.company, "name": link_dn}):
 					frappe.throw(_("{0} does not belong to Company {1}").format(link_dn, self.company))
 
+	def before_save(self):
+		set_account_for_mode_of_payment(self)
+
 	def on_update(self):
 		self.set_defaults()
 
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index c534415..923514d 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -129,7 +129,7 @@
 
 	paid_amount: function() {
 		this.set_in_company_currency(this.frm.doc, ["paid_amount"]);
-		this.write_off_outstanding_amount();
+		this.write_off_amount();
 		this.frm.refresh_fields();
 	},
 
diff --git a/erpnext/accounts/doctype/sales_invoice/pos.py b/erpnext/accounts/doctype/sales_invoice/pos.py
index 62a9f52..0cf17da 100644
--- a/erpnext/accounts/doctype/sales_invoice/pos.py
+++ b/erpnext/accounts/doctype/sales_invoice/pos.py
@@ -2,50 +2,186 @@
 # License: GNU General Public License v3. See license.txt
 
 from __future__ import unicode_literals
-import frappe
+import frappe, json
+from frappe import _
+from frappe.utils import nowdate
+from erpnext.setup.utils import get_exchange_rate
+from erpnext.stock.get_item_details import get_pos_profile
+from erpnext.controllers.accounts_controller import get_taxes_and_charges
 
 @frappe.whitelist()
-def get_items(price_list, sales_or_purchase, item=None):
-	condition = ""
-	order_by = ""
-	args = {"price_list": price_list}
+def get_pos_data():
+	doc = frappe.new_doc('Sales Invoice')
+	doc.update_stock = 1;
+	doc.is_pos = 1;
+	pos_profile = get_pos_profile(doc.company)
 
-	if item:
-		# search serial no
-		item_code = frappe.db.sql("""select name as serial_no, item_code
-			from `tabSerial No` where name=%s""", (item), as_dict=1)
-		if item_code:
-			item_code[0]["name"] = item_code[0]["item_code"]
-			return item_code
+	if not pos_profile:
+		frappe.throw(_("Create pos profile first"))
 
-		# search barcode
-		item_code = frappe.db.sql("""select name, item_code from `tabItem`
-			where barcode=%s""",
-			(item), as_dict=1)
-		if item_code:
-			item_code[0]["barcode"] = item
-			return item_code
+	pos_profile = frappe.get_doc('POS Profile', pos_profile.name)	
+	update_pos_profile_data(doc, pos_profile)
+	update_multi_mode_option(doc, pos_profile)
 
-		condition += " and ((CONCAT(i.name, i.item_name) like %(name)s) or (i.variant_of like %(name)s) or (i.item_group like %(name)s))"
-		order_by = """if(locate(%(_name)s, i.name), locate(%(_name)s, i.name), 99999),
-			if(locate(%(_name)s, i.item_name), locate(%(_name)s, i.item_name), 99999),
-			if(locate(%(_name)s, i.variant_of), locate(%(_name)s, i.variant_of), 99999),
-			if(locate(%(_name)s, i.item_group), locate(%(_name)s, i.item_group), 99999),"""
-		args["name"] = "%%%s%%" % frappe.db.escape(item)
-		args["_name"] = item.replace("%", "")
+	return {
+		'doc': doc,
+		'items': get_items(doc, pos_profile),
+		'customers': get_customers(pos_profile),
+		'pricing_rules': get_pricing_rules(doc),
+		'mode_of_payment': get_mode_of_payment(doc),
+		'print_template': frappe.db.get_value('Print Format', pos_profile.print_format, 'html') or '',
+		'meta': {
+			'invoice': frappe.get_meta('Sales Invoice'),
+			'items': frappe.get_meta('Sales Invoice Item'),
+			'taxes': frappe.get_meta('Sales Taxes and Charges')
+		}
+	}
 
-	# locate function is used to sort by closest match from the beginning of the value
-	return frappe.db.sql("""select i.name, i.item_name, i.image,
-		item_det.price_list_rate, item_det.currency
-		from `tabItem` i LEFT JOIN
-			(select item_code, price_list_rate, currency from
-				`tabItem Price`	where price_list=%(price_list)s) item_det
-		ON
-			(item_det.item_code=i.name or item_det.item_code=i.variant_of)
-		where
-			i.has_variants = 0 and
-			{condition}
-		order by
-			{order_by}
-			i.name
-		limit 24""".format(condition=condition, order_by=order_by), args, as_dict=1)
+def update_pos_profile_data(doc, pos_profile):
+	company_data = frappe.db.get_value('Company', doc.company, '*', as_dict=1)
+
+	doc.taxes_and_charges = pos_profile.taxes_and_charges
+	if doc.taxes_and_charges:
+		update_tax_table(doc)
+
+	doc.currency = pos_profile.currency or company_data.default_currency
+	doc.conversion_rate = 1.0 
+	if doc.currency != company_data.default_currency:
+		doc.conversion_rate = get_exchange_rate(doc.currency, company_data.default_currency)
+	doc.selling_price_list = pos_profile.selling_price_list or frappe.db.get_value('Selling Settings', None, 'selling_price_list')
+	doc.naming_series = pos_profile.naming_series or 'SINV-'
+	doc.letter_head = pos_profile.letter_head or company_data.default_letter_head
+	doc.ignore_pricing_rule = pos_profile.ignore_pricing_rule
+	doc.apply_discount_on = pos_profile.apply_discount_on
+	doc.customer_group = pos_profile.customer_group or get_root('Customer Group')
+	doc.territory = pos_profile.territory or get_root('Territory')
+	
+def get_root(table):
+	root = frappe.db.sql(""" select name from `tab%(table)s` having 
+		min(lft)"""%{'table': table}, as_dict=1)
+	
+	return root[0].name 
+
+def update_multi_mode_option(doc, pos_profile):
+	from frappe.model import default_fields
+
+	for payment_mode in pos_profile.payments:
+		payment_mode = payment_mode.as_dict()
+
+		for fieldname in default_fields:
+			if fieldname in payment_mode:
+				del payment_mode[fieldname]
+
+		doc.append('payments', payment_mode)
+
+def update_tax_table(doc):
+	taxes = get_taxes_and_charges('Sales Taxes and Charges Template', doc.taxes_and_charges)
+	for tax in taxes:
+		doc.append('taxes', tax)
+
+def get_items(doc, pos_profile):
+	item_list = []
+	for item in frappe.get_all("Item", fields=["*"], filters={'disabled': 0, 'has_variants': 0}):
+		item_doc = frappe.get_doc('Item', item.name)
+		if item_doc.taxes:
+			item.taxes = json.dumps(dict(([d.tax_type, d.tax_rate] for d in
+						item_doc.get("taxes"))))
+
+		item.price_list_rate = frappe.db.get_value('Item Price', {'item_code': item.name,
+									'price_list': doc.selling_price_list}, 'price_list_rate') or 0
+		item.default_warehouse = pos_profile.warehouse or item.default_warehouse or None
+		item.expense_account = pos_profile.expense_account or item.expense_account
+		item.income_account = pos_profile.income_account or item_doc.income_account
+		item.cost_center = pos_profile.cost_center or item_doc.selling_cost_center
+		item.actual_qty = frappe.db.get_value('Bin', {'item_code': item.name,
+								'warehouse': item.default_warehouse}, 'actual_qty') or 0
+		item.serial_nos = frappe.db.sql_list("""select name from `tabSerial No` where warehouse= %(warehouse)s 
+			and item_code = %(item_code)s""", {'warehouse': item.default_warehouse, 'item_code': item.item_code})
+		item_list.append(item)
+
+	return item_list
+
+def get_customers(pos_profile):
+	filters = {'disabled': 0}
+	if pos_profile.customer:
+		filters.update({'name': pos_profile.customer})
+
+	return frappe.get_all("Customer", fields=["*"], filters = filters)
+
+def get_pricing_rules(doc):
+	if doc.ignore_pricing_rule == 0:
+		return frappe.db.sql(""" Select * from `tabPricing Rule` where docstatus < 2 and disable = 0
+					and selling = 1 and ifnull(company, '') in (%(company)s, '') and
+					ifnull(for_price_list, '') in (%(price_list)s, '')  and %(date)s between
+					ifnull(valid_from, '2000-01-01') and ifnull(valid_upto, '2500-12-31') order by priority desc, name desc""", 
+				{'company': doc.company, 'price_list': doc.selling_price_list, 'date': nowdate()}, as_dict=1)
+
+def get_mode_of_payment(doc):
+	return frappe.get_all('Mode of Payment Account', fields = ['distinct parent'], filters={'company': doc.company})
+
+@frappe.whitelist()
+def make_invoice(doc_list):
+	if isinstance(doc_list, basestring):
+		doc_list = json.loads(doc_list)
+
+	name_list = []
+
+	for docs in doc_list:
+		for name, doc in docs.items():
+			validate_customer(doc)
+			validate_item(doc)
+			si_doc = frappe.new_doc('Sales Invoice')
+			si_doc.offline_pos_name = name
+			si_doc.update(doc)
+			submit_invoice(si_doc)
+			name_list.append(name)
+
+	return name_list
+
+def validate_customer(doc):
+	if not frappe.db.get_value('Customer', doc.get('customer')):
+		customer_doc = frappe.new_doc('Customer')
+		customer_doc.customer_name = doc.get('customer')
+		customer_doc.customer_type = 'Company'
+		customer_doc.customer_group = doc.get('customer_group')
+		customer_doc.territory = doc.get('territory')
+		customer_doc.save(ignore_permissions = True)
+		frappe.db.commit()
+		doc['customer'] = customer_doc.name
+
+	return doc
+
+def validate_item(doc):
+	for item in doc.get('items'):
+		if not frappe.db.exists('Item', item.get('item_code')):
+			item_doc = frappe.new_doc('Item')
+			item_doc.name = item.get('item_code')
+			item_doc.item_code = item.get('item_code')
+			item_doc.item_name = item.get('item_name')
+			item_doc.description = item.get('description')
+			item_doc.default_warehouse = item.get('warehouse')
+			item_doc.stock_uom = item.get('stock_uom')
+			item_doc.item_group = item.get('item_group')
+			item_doc.save(ignore_permissions=True)
+			frappe.db.commit()
+
+def submit_invoice(si_doc):
+	try:
+		si_doc.insert()
+		si_doc.submit()
+	except Exception, e:
+		if frappe.message_log: frappe.message_log.pop()
+		frappe.db.rollback()
+		save_invoice(e, si_doc)
+
+def save_invoice(e, si_doc):
+	si_doc.docstatus = 0
+	si_doc.name = ''
+	si_doc.save(ignore_permissions=True)
+	make_scheduler_log(e, si_doc.name)
+
+def make_scheduler_log(e, sales_invoice):
+	scheduler_log = frappe.new_doc('Scheduler Log')
+	scheduler_log.error = e
+	scheduler_log.sales_invoice = sales_invoice
+	scheduler_log.save(ignore_permissions=True)
\ 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 c3c91a0..45c918c 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -17,17 +17,6 @@
 			this.frm.set_df_property("debit_to", "print_hide", 0);
 		}
 
-		// toggle to pos view if is_pos is 1 in user_defaults
-		if ((is_null(this.frm.doc.is_pos) && cint(frappe.defaults.get_user_default("is_pos"))===1) || this.frm.doc.is_pos) {
-			if(this.frm.doc.__islocal && !this.frm.doc.amended_from && !this.frm.doc.customer) {
-				this.frm.set_value("is_pos", 1);
-				this.is_pos(function() {
-					if (cint(frappe.defaults.get_user_defaults("fs_pos_view"))===1)
-						erpnext.pos.toggle(me.frm, true);
-				});
-			}
-		}
-
 		erpnext.queries.setup_queries(this.frm, "Warehouse", function() {
 			return erpnext.queries.warehouse(me.frm.doc);
 		});
@@ -149,39 +138,6 @@
 		this.get_terms();
 	},
 
-	is_pos: function(doc, dt, dn, callback_fn) {
-		cur_frm.cscript.hide_fields(this.frm.doc);
-		if(cur_frm.doc.__missing_values_set) return;
-		if(cint(this.frm.doc.is_pos)) {
-			if(!this.frm.doc.company) {
-				this.frm.set_value("is_pos", 0);
-				msgprint(__("Please specify Company to proceed"));
-			} else {
-				var me = this;
-				return this.frm.call({
-					doc: me.frm.doc,
-					method: "set_missing_values",
-					callback: function(r) {
-						if(!r.exc) {
-							if(r.message && r.message.print_format) {
-								cur_frm.pos_print_format = r.message.print_format;
-							}
-							cur_frm.doc.__missing_values_set = true;
-							me.frm.script_manager.trigger("update_stock");
-							frappe.model.set_default_values(me.frm.doc);
-							me.set_dynamic_labels();
-							me.calculate_taxes_and_totals();
-							if(callback_fn) callback_fn();
-							frappe.after_ajax(function() {
-								cur_frm.doc.__missing_values_set = false;
-							})
-						}
-					}
-				});
-			}
-		}
-	},
-
 	customer: function() {
 		var me = this;
 		if(this.frm.updating_party_details) return;
@@ -245,11 +201,6 @@
 		this.write_off_outstanding_amount_automatically();
 	},
 
-	paid_amount: function() {
-		this.set_in_company_currency(this.frm.doc, ["paid_amount"]);
-		this.write_off_outstanding_amount_automatically();
-	},
-
 	items_add: function(doc, cdt, cdn) {
 		var row = frappe.get_doc(cdt, cdn);
 		this.frm.script_manager.copy_from_first_row("items", row, ["income_account", "cost_center"]);
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index 6678583..9da4aae 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -3,6 +3,7 @@
  "allow_import": 1, 
  "allow_rename": 0, 
  "autoname": "naming_series:", 
+ "beta": 0, 
  "creation": "2013-05-24 19:29:05", 
  "custom": 0, 
  "default_print_format": "Standard", 
@@ -198,6 +199,31 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
+   "fieldname": "offline_pos_name", 
+   "fieldtype": "Data", 
+   "hidden": 1, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Offline POS Name", 
+   "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_break1", 
    "fieldtype": "Column Break", 
    "hidden": 0, 
@@ -656,6 +682,32 @@
   {
    "allow_on_submit": 0, 
    "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "territory", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Territory", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Territory", 
+   "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": 1, 
    "depends_on": "customer", 
    "fieldname": "currency_and_price_list", 
@@ -1941,7 +1993,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 1, 
-   "collapsible_depends_on": "paid_amount", 
+   "collapsible_depends_on": "", 
    "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", 
    "fieldname": "payments_section", 
    "fieldtype": "Section Break", 
@@ -1971,7 +2023,7 @@
    "depends_on": "is_pos", 
    "fieldname": "cash_bank_account", 
    "fieldtype": "Link", 
-   "hidden": 0, 
+   "hidden": 1, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
@@ -1996,9 +2048,34 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "depends_on": "is_pos", 
-   "fieldname": "column_break3", 
-   "fieldtype": "Column Break", 
+   "fieldname": "payments", 
+   "fieldtype": "Table", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Payments", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Payments", 
+   "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": "section_break_84", 
+   "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
@@ -2007,6 +2084,7 @@
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
+   "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
    "read_only": 0, 
@@ -2014,35 +2092,6 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
-   "unique": 0, 
-   "width": "50%"
-  }, 
-  {
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "depends_on": "is_pos", 
-   "fieldname": "paid_amount", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_list_view": 0, 
-   "label": "Paid Amount", 
-   "length": 0, 
-   "no_copy": 1, 
-   "oldfieldname": "paid_amount", 
-   "oldfieldtype": "Currency", 
-   "options": "currency", 
-   "permlevel": 0, 
-   "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
   }, 
   {
@@ -2074,6 +2123,110 @@
   {
    "allow_on_submit": 0, 
    "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "base_change_amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Base Change Amount (Company Currency)", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Company:company:default_currency", 
+   "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_86", 
+   "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": "is_pos", 
+   "fieldname": "paid_amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Paid Amount", 
+   "length": 0, 
+   "no_copy": 1, 
+   "oldfieldname": "paid_amount", 
+   "oldfieldtype": "Currency", 
+   "options": "currency", 
+   "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": "change_amount", 
+   "fieldtype": "Currency", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Change Amount", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "currency", 
+   "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": 1, 
    "collapsible_depends_on": "write_off_amount", 
    "depends_on": "grand_total", 
@@ -3443,7 +3596,7 @@
  "istable": 0, 
  "max_attachments": 0, 
  "menu_index": 0, 
- "modified": "2016-04-14 13:01:01.748816", 
+ "modified": "2016-05-09 15:03:33.236351", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Sales Invoice", 
@@ -3530,6 +3683,7 @@
    "write": 0
   }
  ], 
+ "quick_entry": 1, 
  "read_only": 0, 
  "read_only_onload": 1, 
  "search_fields": "posting_date, due_date, customer, base_grand_total, outstanding_amount", 
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 3120e73..952cce6 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -64,8 +64,8 @@
 		self.validate_fixed_asset()
 		self.set_income_account_for_fixed_assets()
 		
-		if cint(self.is_pos):
-			self.validate_pos()
+		# if cint(self.is_pos):
+			# self.validate_pos()
 
 		if cint(self.update_stock):
 			self.validate_dropship_item()
@@ -83,6 +83,18 @@
 		self.validate_multiple_billing("Delivery Note", "dn_detail", "amount", "items")
 		self.update_packing_list()
 
+	def before_save(self):
+		set_account_for_mode_of_payment(self)
+		
+	def update_change_amount(self):
+		self.base_paid_amount = 0.0
+		if self.paid_amount:
+			self.base_paid_amount = flt(self.paid_amount * self.conversion_rate, self.precision("base_paid_amount"))
+			self.change_amount = self.base_change_amount = 0.0
+			if self.paid_amount > self.grand_total:
+				self.change_amount = flt(self.paid_amount - self.grand_total, self.precision("change_amount"))
+				self.base_change_amount = flt(self.change_amount * self.conversion_rate, self.precision("base_change_amount"))
+
 	def on_submit(self):			
 		if not self.recurring_id:
 			frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype,
@@ -588,8 +600,7 @@
 			gl_entries += super(SalesInvoice, self).get_gl_entries()
 
 	def make_pos_gl_entries(self, gl_entries):
-		if cint(self.is_pos) and self.cash_bank_account and self.paid_amount:
-			bank_account_currency = get_account_currency(self.cash_bank_account)
+		if cint(self.is_pos) and self.paid_amount:
 			# POS, make payment entries
 			gl_entries.append(
 				self.get_gl_dict({
@@ -597,22 +608,43 @@
 					"party_type": "Customer",
 					"party": self.customer,
 					"against": self.cash_bank_account,
-					"credit": self.base_paid_amount,
-					"credit_in_account_currency": self.base_paid_amount \
-						if self.party_account_currency==self.company_currency else self.paid_amount,
+					"credit": flt(self.base_paid_amount - self.base_change_amount),
+					"credit_in_account_currency": flt(self.base_paid_amount - self.base_change_amount) \
+						if self.party_account_currency==self.company_currency else flt(self.paid_amount - self.change_amount),
 					"against_voucher": self.return_against if cint(self.is_return) else self.name,
 					"against_voucher_type": self.doctype,
 				}, self.party_account_currency)
 			)
-			gl_entries.append(
-				self.get_gl_dict({
-					"account": self.cash_bank_account,
-					"against": self.customer,
-					"debit": self.base_paid_amount,
-					"debit_in_account_currency": self.base_paid_amount \
-						if bank_account_currency==self.company_currency else self.paid_amount
-				}, bank_account_currency)
-			)
+
+			cash_account = ''
+			for payment_mode in self.payments:
+				if payment_mode.type == 'Cash':
+					cash_account = payment_mode.account
+
+				if payment_mode.base_amount > 0:
+					payment_mode_account_currency = get_account_currency(payment_mode.account)
+					gl_entries.append(
+						self.get_gl_dict({
+							"account": payment_mode.account,
+							"against": self.customer,
+							"debit": payment_mode.base_amount,
+							"debit_in_account_currency": payment_mode.base_amount \
+								if payment_mode_account_currency==self.company_currency else payment_mode.amount
+						}, payment_mode_account_currency)
+					)
+
+			if self.change_amount:
+				cash_account = cash_account or self.payments[0].account
+				cash_account_currency = get_account_currency(cash_account)
+				gl_entries.append(
+					self.get_gl_dict({
+						"account": cash_account,
+						"against": self.customer,
+						"credit": self.base_change_amount,
+						"credit_in_account_currency": self.base_change_amount \
+							if payment_mode_account_currency==self.company_currency else self.change_amount
+					}, payment_mode_account_currency)
+				)
 
 	def make_write_off_gl_entry(self, gl_entries):
 		# write off entries, applicable if only pos
@@ -680,7 +712,7 @@
 	account = frappe.db.get_value("Mode of Payment Account",
 		{"parent": mode_of_payment, "company": company}, "default_account")
 	if not account:
-		frappe.msgprint(_("Please set default Cash or Bank account in Mode of Payment {0}").format(mode_of_payment))
+		frappe.throw(_("Please set default Cash or Bank account in Mode of Payment {0}").format(mode_of_payment))
 	return {
 		"account": account
 	}
@@ -737,4 +769,9 @@
 @frappe.whitelist()
 def make_sales_return(source_name, target_doc=None):
 	from erpnext.controllers.sales_and_purchase_return import make_return_doc
-	return make_return_doc("Sales Invoice", source_name, target_doc)
\ No newline at end of file
+	return make_return_doc("Sales Invoice", source_name, target_doc)
+
+def set_account_for_mode_of_payment(self):
+	for data in self.payments:
+		if not data.account:
+			data.account = get_bank_cash_account(data.mode_of_payment, self.company).get("account")
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index bac24d8..7208c2a 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -441,17 +441,45 @@
 		self.make_pos_profile()
 
 		self._insert_purchase_receipt()
-
 		pos = copy.deepcopy(test_records[1])
 		pos["is_pos"] = 1
 		pos["update_stock"] = 1
-		pos["cash_bank_account"] = "_Test Bank - _TC"
-		pos["paid_amount"] = 600.0
+		pos["payments"] = [{'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 300},
+							{'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300}]
 
 		si = frappe.copy_doc(pos)
 		si.insert()
 		si.submit()
+		
+		self.assertEquals(si.paid_amount, 600.0)
 
+		self.pos_gl_entry(si, pos, 300)
+		
+	def test_make_pos_invoice(self):
+		from erpnext.accounts.doctype.sales_invoice.pos import make_invoice
+		
+		set_perpetual_inventory()
+
+		self.make_pos_profile()
+		self._insert_purchase_receipt()
+
+		pos = copy.deepcopy(test_records[1])
+		pos["is_pos"] = 1
+		pos["update_stock"] = 1
+		pos["payments"] = [{'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 300},
+							{'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 330}]
+		
+		invoice_data = [{'09052016142': pos}]					
+		si = make_invoice(invoice_data)
+		self.assertEquals(si[0], '09052016142')
+		
+		sales_invoice = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': '09052016142', 'docstatus': 1})
+		si = frappe.get_doc('Sales Invoice', sales_invoice[0].name)
+		self.assertEquals(si.grand_total, 630.0)
+		
+		self.pos_gl_entry(si, pos, 330)
+		
+	def pos_gl_entry(self, si, pos, cash_amount):
 		# check stock ledger entries
 		sle = frappe.db.sql("""select * from `tabStock Ledger Entry`
 			where voucher_type = 'Sales Invoice' and voucher_no = %s""",
@@ -467,7 +495,7 @@
 		self.assertTrue(gl_entries)
 
 		stock_in_hand = frappe.db.get_value("Account", {"warehouse": "_Test Warehouse - _TC"})
-
+		
 		expected_gl_entries = sorted([
 			[si.debit_to, 630.0, 0.0],
 			[pos["items"][0]["income_account"], 0.0, 500.0],
@@ -475,8 +503,9 @@
 			[pos["taxes"][1]["account_head"], 0.0, 50.0],
 			[stock_in_hand, 0.0, abs(sle.stock_value_difference)],
 			[pos["items"][0]["expense_account"], abs(sle.stock_value_difference), 0.0],
-			[si.debit_to, 0.0, 600.0],
-			["_Test Bank - _TC", 600.0, 0.0]
+			[si.debit_to, 0.0, si.paid_amount],
+			["_Test Bank - _TC", 300.0, 0.0],
+			["Cash - _TC", cash_amount, 0.0]
 		])
 
 		for i, gle in enumerate(sorted(gl_entries, key=lambda gle: gle.account)):
diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js
index df7757b..04dd580 100644
--- a/erpnext/accounts/page/pos/pos.js
+++ b/erpnext/accounts/page/pos/pos.js
@@ -1,46 +1,843 @@
+frappe.provide("erpnext.pos");
+{% include "erpnext/public/js/controllers/taxes_and_totals.js" %}
+
 frappe.pages['pos'].on_page_load = function(wrapper) {
 	var page = frappe.ui.make_app_page({
 		parent: wrapper,
-		title: __('Start Point-of-Sale (POS)'),
+		title: 'Point of Sale',
 		single_column: true
 	});
-
-	page.main.html(frappe.render_template("pos_page", {}));
-
-	var pos_type = frappe.ui.form.make_control({
-		parent: page.main.find(".select-type"),
-		df: {
-			fieldtype: "Select",
-			options: [
-				{label: __("Billing (Sales Invoice)"), value:"Sales Invoice"},
-				{value:"Sales Order"},
-				{value:"Delivery Note"},
-				{value:"Quotation"},
-				{value:"Purchase Order"},
-				{value:"Purchase Receipt"},
-				{value:"Purchase Invoice"},
-			],
-			fieldname: "pos_type"
-		},
-		only_input: true
-	});
-
-	pos_type.refresh();
-
-	pos_type.set_input("Sales Invoice");
-
-	page.main.find(".btn-primary").on("click", function() {
-		erpnext.open_as_pos = true;
-		new_doc(pos_type.get_value());
-	});
-
-	$.ajax({
-		url: "/api/resource/POS Profile",
-		success: function(data) {
-			if(!data.data.length) {
-				page.main.find(".pos-setting-message").removeClass('hide');
-			}
-		}
-	})
-
+	
+	wrapper = $(wrapper).find('.page-content')
+	new erpnext.pos.PointOfSale(page, wrapper)
 }
+
+erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
+	init: function(page, wrapper){
+		this.page = page;
+		this.wrapper = wrapper;
+		this.set_indicator();
+		this.onload();
+		this.make_menu_list();
+		this.set_interval_for_si_sync();
+		this.si_docs = this.get_doc_from_localstorage();
+	},
+
+	check_internet_connection: function(){
+		var me = this;
+		//Check Internet connection after every 30 seconds
+		setInterval(function(){
+			me.set_indicator();
+		}, 30000)
+	},
+
+	set_indicator: function(){
+		var me = this;
+		// navigator.onLine
+		this.page.set_indicator("Offline", "grey")
+		frappe.call({
+			method:"frappe.handler.ping",
+			callback: function(r){
+				if(r.message){
+					me.connection_status = true;
+					me.page.set_indicator("Online", "green")
+				}
+			}
+		})
+	},
+
+	onload: function(){
+		var me = this;
+
+		this.get_data_from_server(function(){
+			me.create_new(); 
+		});
+	
+		this.check_internet_connection();
+	},
+
+	make_menu_list: function(){
+		var me = this;
+
+		this.page.add_menu_item(__("Unsync Records"), function(){
+			me.show_unsync_invoice_list()
+		});
+	
+		this.page.add_menu_item(__("Sync Master Data"), function(){
+			me.get_data_from_server()
+		});
+	
+		this.page.add_menu_item(__("New Sales Invoice"), function() {
+			me.create_new()
+		})
+	},
+
+	show_unsync_invoice_list: function(){
+		var me = this;
+		this.si_docs = this.get_doc_from_localstorage();
+
+		this.list_dialog = new frappe.ui.Dialog({
+			title: 'Invoice List'
+		});
+	
+		this.list_dialog.show();
+		this.list_body = this.list_dialog.body;
+		$(this.list_body).append('<div class="row list-row list-row-head pos-invoice-list">\
+				<div class="col-xs-6">Customer</div>\
+				<div class="col-xs-3 text-right">Grand Total</div>\
+				<div class="col-xs-3 text-right">Status</div>\
+		</div>')
+
+		$.each(this.si_docs, function(index, data){
+			for(key in data) {
+				$(frappe.render_template("pos_invoice_list", {
+					name: key,
+					customer: data[key].customer,
+					grand_total: data[key].grand_total,
+					status: (data[key].docstatus == 1) ? 'Submitted' : 'Draft'
+				})).appendTo($(me.list_body));
+			}
+		})
+	
+		$(this.list_body).find('.list-row').click(function() {
+			me.name = $(this).attr('invoice-name')
+			doc_data = me.get_invoice_doc(me.si_docs)
+			if(doc_data){
+				me.frm.doc = doc_data[0][me.name];
+				me.refresh();
+				me.disable_input_field();
+				me.list_dialog.hide();
+			}
+		})
+	},
+
+	get_invoice_doc: function(si_docs){
+		var me = this;
+		this.si_docs = this.get_doc_from_localstorage();
+
+		return $.grep(this.si_docs, function(data){
+			for(key in data){
+				return key == me.name
+			}
+		}) 
+	},
+
+	get_data_from_server: function(callback){
+		var me = this;
+		frappe.call({
+			method: "erpnext.accounts.doctype.sales_invoice.pos.get_pos_data",
+			freeze: true,
+			callback: function(r){
+				window.items = r.message.items;
+				window.customers = r.message.customers;
+				window.pricing_rules = r.message.pricing_rules;
+				window.meta = r.message.meta;
+				window.print_template = r.message.print_template;
+				localStorage.setItem('doc', JSON.stringify(r.message.doc));
+				if(callback){
+					callback();
+				}
+			}
+		})
+	},
+	
+	create_new: function(){
+		this.frm = {}
+		var me = this;
+		this.name = '';
+		this.frm.doc =  JSON.parse(localStorage.getItem('doc'))
+		this.load_data();
+		this.setup();
+	},
+
+	load_data: function(){
+		this.items = window.items;
+		this.customers = window.customers;
+		this.pricing_rules = window.pricing_rules;
+
+		$.each(window.meta, function(i, data){
+			frappe.meta.sync(data)
+		})
+
+		this.print_template = frappe.render_template("print_template", 
+			{content: window.print_template, title:"POS"})
+	},
+
+	setup: function(){
+		this.wrapper.html(frappe.render_template("pos", this.frm.doc));
+		this.set_transaction_defaults("Customer");
+		this.make();
+		this.set_primary_action();
+	},
+
+	set_transaction_defaults: function(party) {
+		var me = this;
+		this.party = party;
+		this.price_list = (party == "Customer" ?
+			this.frm.doc.selling_price_list : this.frm.doc.buying_price_list);
+		this.price_list_field = (party == "Customer" ? "selling_price_list" : "buying_price_list");
+		this.sales_or_purchase = (party == "Customer" ? "Sales" : "Purchase");
+	},
+
+	make: function() {
+		this.make_search();
+		this.make_customer();
+		this.make_item_list();
+		this.make_discount_field()
+	},
+
+	make_search: function() {
+		var me = this;
+		this.search = frappe.ui.form.make_control({
+			df: {
+				"fieldtype": "Data",
+				"label": "Item",
+				"fieldname": "pos_item",
+				"placeholder": "Search Item"
+			},
+			parent: this.wrapper.find(".search-area"),
+			only_input: true,
+		});
+	
+		this.search.make_input();
+		this.search.$input.on("keyup", function() {
+			setTimeout(function() {
+				me.items = me.get_items();
+				me.make_item_list(); 
+			}, 1000);
+		});
+	
+		this.party_field = frappe.ui.form.make_control({
+			df: {
+				"fieldtype": "Data",
+				"options": this.party,
+				"label": this.party,
+				"fieldname": this.party.toLowerCase(),
+				"placeholder": this.party
+			},
+			parent: this.wrapper.find(".party-area"),
+			only_input: true,
+		});
+	
+		this.party_field.make_input();
+	},
+
+	make_customer: function() {
+		var me = this;
+	
+		if(this.customers.length == 1){
+			this.party_field.$input.val(this.customers[0].name);
+			this.frm.doc.customer = this.customers[0].name;
+		}
+	
+		this.party_field.$input.autocomplete({
+			source: function (request, response) {
+				me.customer_data = me.get_customers(request.term)
+				response($.map(me.customer_data, function(data){
+					return {label: data.name, value: data.name, 
+						customer_group: data.customer_group, territory: data.territory}
+				}))
+			},
+			change: function(event, ui){
+				if(ui.item){
+					me.frm.doc.customer = ui.item.label;
+					me.frm.doc.customer_name = ui.item.customer_name;
+					me.frm.doc.customer_group = ui.item.customer_group;
+					me.frm.doc.territory = ui.item.territory;
+				}else{
+					me.frm.doc.customer = me.party_field.$input.val();
+				}
+				me.refresh();
+			}
+		})
+	},
+
+	get_customers: function(key){
+		var me = this;
+		key = key.toLowerCase()
+		return $.grep(this.customers, function(data) {
+			if(data.name.toLowerCase().match(key) || data.customer_name.toLowerCase().match(key)
+					|| data.customer_group.toLowerCase().match(key)){
+				return data
+			}
+		})
+	},
+
+	make_item_list: function() {
+		var me = this;
+		if(!this.price_list) {
+			msgprint(__("Price List not found or disabled"));
+			return;
+		}
+
+		me.item_timeout = null;
+	
+		var $wrap = me.wrapper.find(".item-list");
+		me.wrapper.find(".item-list").empty();
+
+		if (this.items) {
+			$.each(this.items, function(index, obj) {
+				if(index < 16){
+					$(frappe.render_template("pos_item", {
+						item_code: obj.name,
+						item_price: format_currency(obj.price_list_rate, obj.currency),
+						item_name: obj.name===obj.item_name ? "" : obj.item_name,
+						item_image: obj.image ? "url('" + obj.image + "')" : null,
+						color: frappe.get_palette(obj.item_name),
+						abbr: frappe.get_abbr(obj.item_name)
+					})).tooltip().appendTo($wrap);
+				}
+			});
+		}
+	
+		if(this.items.length == 1){
+			this.search.$input.val("");
+			this.add_to_cart();
+		}
+
+		// if form is local then allow this function
+		$(me.wrapper).find("div.pos-item").on("click", function() {
+			me.customer_validate();
+			if(me.frm.doc.docstatus==0) {
+				me.items = me.get_items($(this).attr("data-item-code"))
+				me.add_to_cart();
+			}
+		});
+	},
+
+	get_items: function(item_code){
+		// To search item as per the key enter
+
+		var me = this;
+		this.item_serial_no = {}
+	
+		if(item_code){
+			return $.grep(window.items, function(item){
+				if(item.item_code == item_code ){
+					return true
+				}
+			})
+		}
+
+		key = this.search.$input.val().toLowerCase();
+
+		if(key){
+			return $.grep(window.items, function(item){
+				if( (item.item_code.toLowerCase().match(key)) ||
+				(item.item_name.toLowerCase().match(key)) || (item.item_group.toLowerCase().match(key)) ){
+					return true
+				}else if(item.barcode){
+					return item.barcode == me.search.$input.val()
+				} else if (in_list(item.serial_nos, me.search.$input.val())){
+					me.item_serial_no[item.item_code] = me.search.$input.val()
+					return true
+				}
+			})
+		}else{
+			return window.items;
+		}
+	},
+
+	update_qty: function() {
+		var me = this;
+
+		$(this.wrapper).find(".pos-item-qty").on("change", function(){
+			var item_code = $(this).parents(".pos-bill-item").attr("data-item-code");
+			me.update_qty_against_item_code(item_code, $(this).val());
+		})
+	
+		$(this.wrapper).find("[data-action='increase-qty']").on("click", function(){
+			var item_code = $(this).parents(".pos-bill-item").attr("data-item-code");
+			var qty = flt($(this).parents(".pos-bill-item").find('.pos-item-qty').val()) + 1;
+			me.update_qty_against_item_code(item_code, qty);
+		})
+	
+		$(this.wrapper).find("[data-action='decrease-qty']").on("click", function(){
+			var item_code = $(this).parents(".pos-bill-item").attr("data-item-code");
+			var qty = flt($(this).parents(".pos-bill-item").find('.pos-item-qty').val()) - 1;
+			me.update_qty_against_item_code(item_code, qty);
+		})
+	},
+
+	update_qty_against_item_code: function(item_code, qty){
+		var me = this;
+		if(qty < 0){
+			frappe.throw(__("Quantity must be positive"));
+		}
+	
+		this.remove_item = []
+		$.each(this.frm.doc["items"] || [], function(i, d) {
+			if (d.item_code == item_code) {
+				d.qty = flt(qty);
+				d.amount = flt(d.rate) * flt(d.qty);
+				if(d.qty==0){
+					me.remove_item.push(d.idx)
+				}
+			}
+		});
+		this.remove_zero_qty_item();
+		this.refresh();
+	},
+
+	remove_zero_qty_item: function(){
+		var me = this;
+		idx = 0
+		this.items = []
+		idx = 0
+		$.each(this.frm.doc["items"] || [], function(i, d) {
+			if(!in_list(me.remove_item, d.idx)){
+				d.idx = idx;
+				me.items.push(d);
+				idx++; 
+			}
+		});
+	
+		this.frm.doc["items"] = this.items;
+	},
+
+	make_discount_field: function(){
+		var me = this;
+
+		this.wrapper.find('input.discount-percentage').on("change", function() {
+			me.frm.doc.additional_discount_percentage = flt($(this).val(), precision("additional_discount_percentage"));
+			total = me.frm.doc.grand_total
+		
+			if(me.frm.doc.apply_discount_on == 'Net Total'){
+				total = me.frm.doc.net_total
+			}
+		
+			me.frm.doc.discount_amount = flt(total*flt(me.frm.doc.additional_discount_percentage) / 100, precision("discount_amount"));
+			me.wrapper.find('input.discount-amount').val(me.frm.doc.discount_amount)
+			me.refresh();
+		});
+
+		this.wrapper.find('input.discount-amount').on("change", function() {
+			me.frm.doc.discount_amount = flt($(this).val(), precision("discount_amount"));
+			me.frm.doc.additional_discount_percentage = 0.0;
+			me.wrapper.find('input.discount-percentage').val(0);
+			me.refresh();
+		});
+	},
+
+	customer_validate: function(){
+		var me = this;
+	
+		if(!this.frm.doc.customer){
+			frappe.throw(__("Please select customer"))
+		}
+	},
+
+	add_to_cart: function() {
+		var me = this;
+		var caught = false;
+		var no_of_items = me.wrapper.find(".pos-bill-item").length;
+
+		this.validate_serial_no()
+		this.validate_warehouse();
+
+		if (no_of_items != 0) {
+			$.each(this.frm.doc["items"] || [], function(i, d) {
+				if (d.item_code == me.items[0].item_code) {
+					caught = true;
+					d.qty += 1;
+					d.amount = flt(d.rate) * flt(d.qty)
+					if(me.item_serial_no.length){
+						d.serial_no += '\n' + me.item_serial_no[d.item_code]
+					}
+				}
+			});
+		}
+
+		// if item not found then add new item
+		if (!caught)
+			this.add_new_item_to_grid();
+
+		this.refresh();
+	},
+
+	add_new_item_to_grid: function() {
+		var me = this;
+		this.child = frappe.model.add_child(this.frm.doc, this.frm.doc.doctype + " Item", "items");
+		this.child.item_code = this.items[0].item_code;
+		this.child.item_name = this.items[0].item_name;
+		this.child.stock_uom = this.items[0].stock_uom;
+		this.child.description = this.items[0].description;
+		this.child.qty = 1;
+		this.child.item_group = this.items[0].item_group;
+		this.child.cost_center = this.items[0].cost_center;
+		this.child.income_account = this.items[0].income_account;
+		this.child.warehouse = this.items[0].default_warehouse;
+		this.child.price_list_rate = flt(this.items[0].price_list_rate, 9) / flt(this.frm.doc.conversion_rate, 9);
+		this.child.rate = flt(this.items[0].price_list_rate, 9) / flt(this.frm.doc.conversion_rate, 9);
+		this.child.actual_qty = this.items[0].actual_qty;
+		this.child.amount = flt(this.child.qty) * flt(this.child.rate);
+		this.child.serial_no = this.item_serial_no[this.child.item_code]; 
+	},
+
+	refresh: function() {
+		var me = this;
+		this.refresh_fields();
+		this.update_qty();
+		this.set_primary_action();
+	},
+	refresh_fields: function() {
+		this.apply_pricing_rule();
+		this.discount_amount_applied = false;
+		this._calculate_taxes_and_totals();
+		this.calculate_discount_amount();
+		this.show_items_in_item_cart();
+		this.set_taxes();
+		this.calculate_outstanding_amount();
+		this.set_totals();
+	},
+	
+	get_company_currency: function() {
+		return erpnext.get_currency(this.frm.doc.company);
+	},
+	
+	show_item_wise_taxes: function(){
+		return null;
+	},
+	
+	show_items_in_item_cart: function() {
+		var me = this;
+		var $items = this.wrapper.find(".items").empty();
+		me.frm.doc.net_total = 0.0
+		$.each(this.frm.doc.items|| [], function(i, d) {
+			$(frappe.render_template("pos_bill_item", {
+				item_code: d.item_code,
+				item_name: (d.item_name===d.item_code || !d.item_name) ? "" : ("<br>" + d.item_name),
+				qty: d.qty,
+				actual_qty: d.actual_qty,
+				projected_qty: d.projected_qty,
+				rate: format_currency(d.rate, me.frm.doc.currency),
+				amount: format_currency(d.amount, me.frm.doc.currency)
+			})).appendTo($items);
+		});
+
+		this.wrapper.find("input.pos-item-qty").on("focus", function() {
+			$(this).select();
+		});
+	},
+
+	set_taxes: function(){
+		var me = this;
+		me.frm.doc.total_taxes_and_charges = 0.0
+
+		var taxes = this.frm.doc.taxes || [];
+		$(this.wrapper)
+			.find(".tax-area").toggleClass("hide", (taxes && taxes.length) ? false : true)
+			.find(".tax-table").empty();
+	
+		$.each(taxes, function(i, d) {
+			if (d.tax_amount && cint(d.included_in_print_rate) == 0) {
+				$(frappe.render_template("pos_tax_row", {
+					description: d.description,
+					tax_amount: format_currency(flt(d.tax_amount_after_discount_amount),
+						me.frm.doc.currency)
+				})).appendTo(me.wrapper.find(".tax-table"));
+			}
+		});
+	},
+
+	set_totals: function() {
+		var me = this;
+		this.wrapper.find(".net-total").text(format_currency(me.frm.doc.total, me.frm.doc.currency));
+		this.wrapper.find(".grand-total").text(format_currency(me.frm.doc.grand_total, me.frm.doc.currency));
+	},
+
+	set_primary_action: function() {
+		var me = this;
+
+		if (this.frm.doc.docstatus==0 && this.frm.doc.outstanding_amount > 0) {
+			this.page.set_primary_action(__("Pay"), function() {
+				me.validate()
+				me.create_invoice();
+				me.make_payment();
+			});
+		}else if(this.frm.doc.docstatus == 0){
+			this.page.set_primary_action(__("Submit"), function() {
+				frappe.confirm(__("Do you really want to submit the invoice?"), function () {
+					me.write_off_amount()
+				})
+			})
+		}else if(this.frm.doc.docstatus == 1){
+			this.page.set_primary_action(__("Print"), function() {
+				html = frappe.render(me.print_template, me.frm.doc)
+				frappe.require("/assets/js/print_format_v3.min.js", function() {
+					w = _p.preview(html);
+					setTimeout(function(){
+						w.print();
+					}, 1000)
+				});
+			})
+		}
+	},
+	
+	write_off_amount: function(){
+		var me = this; 
+		var value = 0.0;
+
+		if(this.frm.doc.outstanding_amount > 0){
+			dialog = new frappe.ui.Dialog({
+				title: 'Write Off Amount',
+				fields: [
+					{fieldtype: "Currency", fieldname: "write_off_amount", label: __("Amount"), reqd: 1},
+				]
+			  });
+  
+			  dialog.show();
+			  
+			  dialog.fields_dict.write_off_amount.$input.change(function(){
+				  value = dialog.get_values()
+			  })
+			  
+			  dialog.set_primary_action(__("Submit"), function(){
+				  me.frm.doc.write_off_amount = value.write_off_amount;
+				  me.calculate_outstanding_amount();
+				  dialog.hide();
+				  me.change_status();
+			  })
+		}else{
+			me.change_status();
+		}
+	},
+	
+	change_status: function(){
+		if(this.frm.doc.docstatus == 0){
+			this.frm.doc.docstatus = 1;
+			this.update_invoice();
+			this.disable_input_field();
+		}
+	},
+
+	disable_input_field: function(){
+		var pointer_events = 'inherit'
+		$(this.wrapper).find('input').attr("disabled", false);
+	
+		if(this.frm.doc.docstatus == 1){
+			pointer_events = 'none'
+			$(this.wrapper).find('input').attr("disabled", true);	
+		}
+	
+		$(this.wrapper).find('.pos-bill-wrapper').css('pointer-events', pointer_events);
+		$(this.wrapper).find('.pos-items-section').css('pointer-events', pointer_events);
+		this.set_primary_action();
+	},
+
+	create_invoice: function(){
+		var me = this;
+		var invoice_data = {}
+		this.si_docs = this.get_doc_from_localstorage();
+		if(this.name){
+			this.update_invoice()
+		}else{
+			this.name = $.now();
+			invoice_data[this.name] = this.frm.doc
+			this.si_docs.push(invoice_data)
+			this.update_localstorage();
+			this.set_primary_action();
+		}
+	},
+
+	update_invoice: function(){
+		var me = this;
+		this.si_docs = this.get_doc_from_localstorage();
+		$.each(this.si_docs, function(index, data){
+			for(key in data){
+				if(key == me.name){
+					me.si_docs[index][key] = me.frm.doc
+					me.update_localstorage();
+				}
+			}
+		})
+	},
+
+	update_localstorage: function(){
+		try{
+			localStorage.setItem('sales_invoice_doc', JSON.stringify(this.si_docs));
+		}catch(e){
+			frappe.throw(__("LocalStorage is full , did not save"))
+		}
+	},
+
+	get_doc_from_localstorage: function(){
+		return JSON.parse(localStorage.getItem('sales_invoice_doc')) || [];
+	},
+
+	set_interval_for_si_sync: function(){
+		var me = this;
+		setInterval(function(){
+			me.sync_sales_invoice()
+		}, 6000)
+	},
+
+	sync_sales_invoice: function(){
+		var me = this;
+		this.si_docs = this.get_submitted_invoice()
+
+		if(this.connection_status && this.si_docs.length){
+			frappe.call({
+				method: "erpnext.accounts.doctype.sales_invoice.pos.make_invoice",
+				args: {
+					doc_list: me.si_docs
+				},
+				callback: function(r){
+					if(r.message){
+						me.removed_items = r.message;
+						me.remove_doc_from_localstorage();
+					}
+				}
+			})
+		}
+	},
+
+	get_submitted_invoice: function(){
+		invoices = []
+		docs = this.get_doc_from_localstorage()
+		if(docs){
+			invoices = $.map(docs, function(data){
+				for(key in data){
+					if(data[key].docstatus == 1){
+						return data
+					}
+				}
+			});
+		}
+
+		return invoices
+	},
+
+	remove_doc_from_localstorage: function(){
+		var me = this;
+		this.si_docs = this.get_doc_from_localstorage();
+		if(this.removed_items){
+			$.each(this.si_docs, function(index, data){
+				for(key in data){
+					if(in_list(me.removed_items, key)){			
+						me.si_docs.splice(index)
+					}
+				}
+			})
+			this.update_localstorage();
+		}
+	},
+
+	validate: function(){
+		var me = this;
+		this.customer_validate();
+		this.item_validate();
+	},
+
+	item_validate: function(){
+		if(this.frm.doc.items.length == 0){
+			frappe.throw(__("Select items to save the invoice"))
+		}
+	},
+
+	validate_serial_no: function(){
+		var me = this;
+		var item_code = serial_no = '';
+		for (key in this.item_serial_no){
+			item_code = key;
+			serial_no = me.item_serial_no[key]
+		}
+	
+		if(item_code && serial_no){
+			$.each(this.frm.doc.items, function(index, data){
+				if(data.item_code == item_code){
+					if(in_list(data.serial_no.split('\n'), serial_no)){
+						frappe.throw(__(repl("Serial no %(serial_no)s is already taken", {
+							'serial_no': serial_no
+						})))
+					}
+				}
+			})
+		}
+	},
+
+	apply_pricing_rule: function(){
+		var me = this;
+		$.each(this.frm.doc["items"], function(n, item) {
+			pricing_rule = me.get_pricing_rule(item)
+			me.validate_pricing_rule(pricing_rule)
+			if(pricing_rule.length){
+				item.margin_type = pricing_rule[0].margin_type;
+				item.price_list_rate = pricing_rule[0].price || item.price_list_rate;
+				item.margin_rate_or_amount = pricing_rule[0].margin_rate_or_amount;
+				item.discount_percentage = pricing_rule[0].discount_percentage || 0.0;
+				me.apply_pricing_rule_on_item(item)
+			}
+		})
+	},
+
+	get_pricing_rule: function(item){
+		var me = this;
+		return $.grep(this.pricing_rules, function(data){
+			if(data.item_code == item.item_code || in_list(['All Item Groups', item.item_group], data.item_group)) {
+				if(in_list(['Customer', 'Customer Group', 'Territory'], data.applicable_for)){
+					return me.validate_condition(data)
+				}else{
+					return true
+				}
+			}
+		})
+	},
+
+	validate_condition: function(data){
+		//This method check condition based on applicable for
+		condition = this.get_mapper_for_pricing_rule(data)[data.applicable_for]
+		if(in_list(condition[1], condition[0])){
+			return true
+		}
+	},
+
+	get_mapper_for_pricing_rule: function(data){
+		return {
+			'Customer': [data.customer, [this.doc.customer]],
+			'Customer Group': [data.customer_group, [this.doc.customer_group, 'All Customer Groups']],
+			'Territory': [data.territory, [this.doc.territory, 'All Territories']],
+		}
+	},
+
+	validate_pricing_rule: function(pricing_rule){
+		//This method validate duplicate pricing rule
+		var pricing_rule_name = '';
+		var priority = 0;
+		var pricing_rule_list = [];
+		var priority_list = []
+
+		if(pricing_rule.length > 1){
+		
+			$.each(pricing_rule, function(index, data){
+				pricing_rule_name += data.name + ','				
+				priority_list.push(data.priority)
+				if(priority <= data.priority){
+					priority = data.priority
+					pricing_rule_list.push(data)
+				}
+			})
+		
+			count = 0
+			$.each(priority_list, function(index, value){
+				if(value == priority){
+					count++
+				}
+			})
+
+			if(priority == 0 || count > 1){
+				frappe.throw(__(repl("Multiple Price Rules exists with same criteria, please resolve conflict by assigning priority. Price Rules: %(pricing_rule)s", {
+					'pricing_rule': pricing_rule_name
+				})))
+			}
+		
+			return pricing_rule_list
+		}
+	},
+	
+	validate_warehouse: function(){
+		if(!this.items[0].default_warehouse){
+			frappe.throw(__("Deafault warehouse is required for selected item"))
+		}
+	}
+})
\ No newline at end of file
diff --git a/erpnext/accounts/party_status.py b/erpnext/accounts/party_status.py
index ff095b1..5a638e5 100644
--- a/erpnext/accounts/party_status.py
+++ b/erpnext/accounts/party_status.py
@@ -37,6 +37,7 @@
 
 	party = frappe.get_doc(party_type, name)
 	filters = get_filters_for(doc.doctype)
+	party.flags.ignore_mandatory = True
 
 	status = None
 	if filters:
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 204c236..2ede901 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -33,6 +33,7 @@
 
 		if self.meta.get_field("currency"):
 			self.calculate_taxes_and_totals()
+
 			if not self.meta.get_field("is_return") or not self.is_return:
 				self.validate_value("base_grand_total", ">=", 0)
 
@@ -54,17 +55,19 @@
 			if not self.get("__islocal"):
 				validate_recurring_document(self)
 				convert_to_recurring(self, self.get("posting_date") or self.get("transaction_date"))
-		
-		self.validate_paid_amount()
-	
+
+		if self.doctype == 'Purchase Invoice':
+			self.validate_paid_amount()
+
 	def validate_paid_amount(self):
 		if hasattr(self, "is_pos") or hasattr(self, "is_paid"):
 			is_paid = self.get("is_pos") or self.get("is_paid")
 			if cint(is_paid) == 1:
-				if flt(self.paid_amount) == 0:
+				if flt(self.paid_amount) == 0 and flt(self.outstanding_amount) > 0:
 					if self.cash_bank_account:
 						self.paid_amount = flt(flt(self.grand_total) - flt(self.write_off_amount), 
 							self.precision("paid_amount"))
+						self.base_paid_amount = flt(self.paid_amount * self.conversion_rate, self.precision("base_paid_amount"))
 					else:
 						# show message that the amount is not paid
 						self.paid_amount = 0
@@ -72,9 +75,6 @@
 			else:
 				frappe.db.set(self,'paid_amount',0)
 
-			frappe.db.set(self, 'base_paid_amount',
-				flt(self.paid_amount*self.conversion_rate, self.precision("base_paid_amount")))
-
 	def on_update_after_submit(self):
 		if self.meta.get_field("is_recurring"):
 			validate_recurring_document(self)
@@ -510,7 +510,7 @@
 							elif asset.status in ("Scrapped", "Cancelled", "Sold"):
 								frappe.throw(_("Row #{0}: Asset {1} cannot be submitted, it is already {2}")
 									.format(d.idx, d.asset, asset.status))
-						
+
 @frappe.whitelist()
 def get_tax_rate(account_head):
 	return frappe.db.get_value("Account", account_head, "tax_rate")
diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py
index 7210d76..eb75dee 100644
--- a/erpnext/controllers/taxes_and_totals.py
+++ b/erpnext/controllers/taxes_and_totals.py
@@ -435,13 +435,39 @@
 					- flt(self.doc.base_write_off_amount), self.doc.precision("grand_total"))
 
 		if self.doc.doctype == "Sales Invoice":
+			self.calculate_paid_amount()
 			self.doc.round_floats_in(self.doc, ["paid_amount"])
 			paid_amount = self.doc.paid_amount \
 				if self.doc.party_account_currency == self.doc.currency else self.doc.base_paid_amount
-			self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount),
-				self.doc.precision("outstanding_amount"))
+
+			self.doc.outstanding_amount = 0
+			if total_amount_to_pay > paid_amount:
+				self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount),
+					self.doc.precision("outstanding_amount"))
+			self.change_amount()
+
 		elif self.doc.doctype == "Purchase Invoice":
 			self.doc.outstanding_amount = flt(total_amount_to_pay, self.doc.precision("outstanding_amount"))
+		
+	def calculate_paid_amount(self):
+		paid_amount = base_paid_amount = 0.0
+		for payment in self.doc.get('payments'):
+			payment.base_amount = flt(payment.amount * self.doc.conversion_rate)
+			paid_amount += payment.amount
+			base_paid_amount += payment.base_amount
+
+		self.doc.paid_amount = flt(paid_amount, self.doc.precision("paid_amount"))
+		self.doc.base_paid_amount = flt(base_paid_amount, self.doc.precision("base_paid_amount"))
+
+	def change_amount(self):
+		change_amount = 0.0
+		if self.doc.paid_amount > self.doc.grand_total:
+			change_amount = flt(self.doc.paid_amount - self.doc.grand_total, 
+				self.doc.precision("change_amount"))
+
+		self.doc.change_amount = change_amount;
+		self.doc.base_change_amount = flt(change_amount * self.doc.conversion_rate, 
+			self.doc.precision("base_change_amount"))
 
 	def calculate_margin(self, item):
 		total_margin = 0.0
diff --git a/erpnext/public/build.json b/erpnext/public/build.json
index 1831907..9a949f2 100644
--- a/erpnext/public/build.json
+++ b/erpnext/public/build.json
@@ -16,13 +16,18 @@
 		"public/js/templates/address_list.html",
 		"public/js/templates/contact_list.html",
 		"public/js/controllers/stock_controller.js",
+		"public/js/controllers/payments.js",
 		"public/js/controllers/taxes_and_totals.js",
 		"public/js/controllers/transaction.js",
 		"public/js/pos/pos.html",
 		"public/js/pos/pos_bill_item.html",
 		"public/js/pos/pos_item.html",
 		"public/js/pos/pos_tax_row.html",
+		"public/js/pos/pos_print.html",
 		"public/js/pos/pos.js",
+		"public/js/pos/pos_invoice_list.html",
+		"public/js/payment/pos_payment.html",
+		"public/js/payment/payment_details.html",
 		"public/js/templates/item_selector.html",
 		"public/js/utils/item_selector.js"
 	],
diff --git a/erpnext/public/css/erpnext.css b/erpnext/public/css/erpnext.css
index 6777e1e..284260d 100644
--- a/erpnext/public/css/erpnext.css
+++ b/erpnext/public/css/erpnext.css
@@ -124,3 +124,49 @@
 .dashboard-list-item:last-child {
   border-bottom: none;
 }
+
+.payment-toolbar {
+	margin-left: 35px;
+}
+
+.payment-mode {
+	cursor: pointer;
+	font-family: sans-serif;
+	font-size: 15px;
+}
+
+.pos-payment-row .col-xs-6 {
+	padding :10px;
+}
+
+.pos-payment-row {
+	border-bottom:1px solid #d1d8dd;
+    margin: 2px 0px 5px 0px;
+}
+
+.pos-payment-row:hover {
+	background-color: #FCFFDD;
+	cursor: pointer;
+}
+
+.pos-keyboard-key, .delete-btn {
+	border: 1px solid #d1d8dd;
+	height:85px;
+	width:85px;
+	margin:10px 10px;
+	font-size:24px;
+	font-weight:200;
+}
+
+.amount-label {
+	font-size: 16px;
+}
+
+.selected-payment-mode {
+	background-color: #FCFFDD;
+	cursor: pointer;
+}
+
+.pos-invoice-list {
+	padding: 15px 10px;
+}
diff --git a/erpnext/public/js/controllers/payments.js b/erpnext/public/js/controllers/payments.js
new file mode 100644
index 0000000..7ac2b7b
--- /dev/null
+++ b/erpnext/public/js/controllers/payments.js
@@ -0,0 +1,158 @@
+// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+// License: GNU General Public License v3. See license.txt
+
+erpnext.payments = erpnext.stock.StockController.extend({
+	make_payment: function() {
+		var me = this;
+
+		this.dialog = new frappe.ui.Dialog({
+			title: 'Payment'
+		});
+	
+		this.dialog.show();
+		this.$body = this.dialog.body;
+		this.dialog.$wrapper.find('.modal-dialog').css("width", "750px");
+		this.set_payment_primary_action();
+		this.make_keyboard();
+	},
+
+	set_payment_primary_action: function(){
+		var me = this;
+	
+		this.dialog.set_primary_action(__("Submit"), function() {
+			frappe.confirm(__("Do you really want to submit the invoice?"), function () {
+				me.write_off_amount();
+				me.dialog.hide();
+			})
+		})
+	},
+
+	make_keyboard: function(){
+		var me = this;
+		$(this.$body).empty();
+		$(this.$body).html(frappe.render_template('pos_payment', this.frm.doc))
+		this.show_payment_details();
+		this.bind_keyboard_event()
+	},
+
+	pay_amount: function(){
+		var me = this;
+		this.make_multimode_payment();
+		this.calculate_outstanding_amount()
+		this.show_payment_details();
+	},
+
+	make_multimode_payment: function(){
+		var me = this;
+
+		if(this.frm.doc.change_amount > 0){
+			me.payment_val = me.doc.outstanding_amount
+		}
+
+		this.payments = frappe.model.add_child(this.frm.doc, 'Multi Mode Payment', "payments");
+		this.payments.mode_of_payment = this.dialog.fields_dict.mode_of_payment.get_value();
+		this.payments.amount = flt(this.payment_val);
+	},
+
+	show_payment_details: function(){
+		var me = this;
+		multimode_payments = $(this.$body).find('.multimode-payments').empty();
+		if(this.frm.doc.payments.length){
+			$.each(this.frm.doc.payments, function(index, data){
+				$(frappe.render_template('payment_details', {
+					mode_of_payment: data.mode_of_payment,
+					amount: data.amount,
+					idx: data.idx,
+					currency: me.frm.doc.currency,
+					type: data.type
+				})).appendTo(multimode_payments)
+			})
+		}else{
+			$("<p>No payment mode selected in pos profile</p>").appendTo(multimode_payments)
+		}
+	},
+	
+	bind_keyboard_event: function(){
+		var me = this;
+		this.payment_val = '';
+		this.bind_payment_mode_keys_event();
+		this.bind_keyboard_keys_event();
+	},
+	
+	bind_payment_mode_keys_event: function(){
+		var me = this;
+		$(this.$body).find('.pos-payment-row').click(function(){
+			me.idx = $(this).attr("idx");
+			me.selected_mode = $(me.$body).find(repl("input[idx='%(idx)s']",{'idx': me.idx}));
+			me.highlight_selected_row()
+			me.payment_val = 0.0
+			if(me.frm.doc.outstanding_amount > 0 && flt(me.selected_mode.val()) == 0.0){
+				//When user first time click on row
+				me.payment_val = flt(me.frm.doc.outstanding_amount)
+				me.selected_mode.val(format_number(me.payment_val, 2));
+				me.update_paid_amount()
+				me.bind_amount_change_event();
+			}else if(flt(me.selected_mode.val()) > 0){
+				//If user click on existing row which has value
+				me.payment_val = flt(me.selected_mode.val());
+			}
+			me.selected_mode.select()
+		})
+	},
+	
+	highlight_selected_row: function(){
+		var me = this;
+		selected_row = $(this.$body).find(repl(".pos-payment-row[idx='%(idx)s']",{'idx': this.idx}));
+		$(this.$body).find('.pos-payment-row').removeClass('selected-payment-mode')
+		selected_row.addClass('selected-payment-mode')
+		$(this.$body).find('.amount').attr('disabled', true);
+		this.selected_mode.attr('disabled', false);
+	},
+	
+	bind_keyboard_keys_event: function(){
+		var me = this;
+		$(this.$body).find('.pos-keyboard-key').click(function(){
+			me.payment_val += $(this).text();
+			me.selected_mode.val(format_number(me.payment_val, 2))
+			me.idx = me.selected_mode.attr("idx")
+			me.update_paid_amount()
+		})
+		
+		$(this.$body).find('.delete-btn').click(function(){
+			me.payment_val =  cstr(flt(me.selected_mode.val())).slice(0, -1);
+			me.selected_mode.val(format_number(me.payment_val, 2));
+			me.idx = me.selected_mode.attr("idx")
+			me.update_paid_amount();
+		})
+
+	},
+	
+	bind_amount_change_event: function(){
+		var me = this;
+		me.selected_mode.change(function(){
+			me.payment_val =  $(this).val() || 0.0;
+			me.selected_mode.val(format_number(me.payment_val, 2))
+			me.idx = me.selected_mode.attr("idx")
+			me.update_paid_amount()
+		})
+	},
+	
+	update_paid_amount: function(){
+		var me = this;
+		$.each(this.frm.doc.payments, function(index, data){
+			if(cint(me.idx) == cint(data.idx)){
+				data.amount = flt(me.selected_mode.val(), 2)
+			}
+		})
+		this.calculate_outstanding_amount();
+		this.show_amounts();
+	},
+	
+	show_amounts: function(){
+		var me = this;
+		$(this.$body).find('.paid_amount').text(format_currency(this.frm.doc.paid_amount, this.frm.doc.currency));
+		$(this.$body).find('.change_amount').text(format_currency(this.frm.doc.change_amount, this.frm.doc.currency))
+		$(this.$body).find('.outstanding_amount').text(format_currency(this.frm.doc.outstanding_amount, this.frm.doc.currency))
+		this.update_invoice();
+	}
+})
\ No newline at end of file
diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js
index 1a234a3..f775f29 100644
--- a/erpnext/public/js/controllers/taxes_and_totals.js
+++ b/erpnext/public/js/controllers/taxes_and_totals.js
@@ -1,13 +1,30 @@
 // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-erpnext.taxes_and_totals = erpnext.stock.StockController.extend({
+erpnext.taxes_and_totals = erpnext.payments.extend({
+	apply_pricing_rule_on_item: function(item){
+		if(!item.margin_type){
+			item.margin_rate_or_amount = 0.0;
+		}
+
+		if(item.margin_type == "Percentage"){
+			item.total_margin = item.price_list_rate + item.price_list_rate * ( item.margin_rate_or_amount / 100);
+		}else{
+			item.total_margin = item.price_list_rate + item.margin_rate_or_amount;
+		}
+
+		item.rate = flt(item.total_margin , 2);
+
+		if(item.discount_percentage){
+			discount_value = flt(item.total_margin) * flt(item.discount_percentage) / 100;
+			item.rate = flt((item.total_margin) - (discount_value), precision('rate'));
+		}
+	},
+
 	calculate_taxes_and_totals: function(update_paid_amount) {
 		this.discount_amount_applied = false;
 		this._calculate_taxes_and_totals();
-
-		if (frappe.meta.get_docfield(this.frm.doc.doctype, "discount_amount"))
-			this.apply_discount_amount();
+		this.calculate_discount_amount();
 
 		// Advance calculation applicable to Sales /Purchase Invoice
 		if(in_list(["Sales Invoice", "Purchase Invoice"], this.frm.doc.doctype)
@@ -24,6 +41,11 @@
 		this.frm.refresh_fields();
 	},
 
+	calculate_discount_amount: function(){
+		if (frappe.meta.get_docfield(this.frm.doc.doctype, "discount_amount"))
+			this.apply_discount_amount();
+	},
+
 	_calculate_taxes_and_totals: function() {
 		this.validate_conversion_rate();
 		this.calculate_item_values();
@@ -98,7 +120,7 @@
 
 			$.each(tax_fields, function(i, fieldname) { tax[fieldname] = 0.0 });
 
-			if (!this.discount_amount_applied) {
+			if (!this.discount_amount_applied && cur_frm) {
 				cur_frm.cscript.validate_taxes_and_charges(tax.doctype, tax.name);
 				me.validate_inclusive_tax(tax);
 			}
@@ -433,13 +455,14 @@
 	apply_discount_amount: function() {
 		var me = this;
 		var distributed_amount = 0.0;
+		this.frm.doc.base_discount_amount = 0.0;
 
 		if (this.frm.doc.discount_amount) {
 			if(!this.frm.doc.apply_discount_on)
 				frappe.throw(__("Please select Apply Discount On"));
-
-			this.frm.set_value("base_discount_amount",
-				flt(this.frm.doc.discount_amount * this.frm.doc.conversion_rate, precision("base_discount_amount")))
+			
+			this.frm.doc.base_discount_amount = flt(this.frm.doc.discount_amount * this.frm.doc.conversion_rate, 
+				precision("base_discount_amount"));
 
 			var total_for_discount_amount = this.get_total_for_discount_amount();
 			// calculate item amount after Discount Amount
@@ -455,8 +478,6 @@
 				this.discount_amount_applied = true;
 				this._calculate_taxes_and_totals();
 			}
-		} else {
-			this.frm.set_value("base_discount_amount", 0);
 		}
 	},
 
@@ -524,18 +545,59 @@
 				this.frm.doc.paid_amount = 0
 			}
 			this.set_in_company_currency(this.frm.doc, ["paid_amount"]);
-			this.frm.refresh_field("paid_amount");
-			this.frm.refresh_field("base_paid_amount");
+
+			if(this.frm.refresh_field){
+				this.frm.refresh_field("paid_amount");
+				this.frm.refresh_field("base_paid_amount");
+			}
+			
+			if(this.frm.doc.doctype == "Sales Invoice"){
+				this.calculate_paid_amount()
+			}
+			
+			var outstanding_amount = 0.0
 
 			var paid_amount = (this.frm.doc.party_account_currency == this.frm.doc.currency) ?
 				this.frm.doc.paid_amount : this.frm.doc.base_paid_amount;
 
-			var outstanding_amount =  flt(total_amount_to_pay - flt(paid_amount),
-				precision("outstanding_amount"));
+			if (total_amount_to_pay > paid_amount){
+				outstanding_amount =  flt(total_amount_to_pay - flt(paid_amount),
+					precision("outstanding_amount"));
+			}
 
 		} else if(this.frm.doc.doctype == "Purchase Invoice") {
 			var outstanding_amount = flt(total_amount_to_pay, precision("outstanding_amount"));
 		}
-		this.frm.set_value("outstanding_amount", outstanding_amount);
-	}
+
+		this.frm.doc.outstanding_amount = outstanding_amount;
+		this.calculate_change_amount()
+	},
+	
+	calculate_paid_amount: function(){
+		var me = this;
+		var paid_amount = base_paid_amount = 0.0;
+		$.each(this.frm.doc['payments'] || [], function(index, data){
+			if(data.amount > 0){
+				data.base_amount = flt(data.amount * me.frm.doc.conversion_rate);
+				paid_amount += data.amount;
+				base_paid_amount += data.base_amount;	
+			}
+		})
+		
+		this.frm.doc.paid_amount = flt(paid_amount, precision("paid_amount"));
+		this.frm.doc.base_paid_amount = flt(base_paid_amount, precision("base_paid_amount"));
+	},
+	
+	calculate_change_amount: function(){
+		var change_amount = 0.0;
+		if(this.frm.doc.paid_amount > this.frm.doc.grand_total){
+			change_amount = flt(this.frm.doc.paid_amount - this.frm.doc.grand_total, 
+				precision("change_amount"))
+		}
+		
+		this.frm.doc.change_amount = flt(change_amount, 
+			precision("change_amount"))
+		this.frm.doc.base_change_amount = flt(change_amount * this.frm.doc.conversion_rate, 
+			precision("base_change_amount"))
+	},
 })
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index 3f6ea5a..c622466 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -165,7 +165,7 @@
 		erpnext.hide_company();
 		this.show_item_wise_taxes();
 		this.set_dynamic_labels();
-		erpnext.pos.make_pos_btn(this.frm);
+		// erpnext.pos.make_pos_btn(this.frm);
 		this.setup_sms();
 		this.make_show_payments_btn();
 	},
@@ -550,7 +550,7 @@
 		setup_field_label_map(["base_total", "base_net_total", "base_total_taxes_and_charges",
 			"base_discount_amount", "base_grand_total", "base_rounded_total", "base_in_words",
 			"base_taxes_and_charges_added", "base_taxes_and_charges_deducted", "total_amount_to_pay",
-			"base_paid_amount", "base_write_off_amount"
+			"base_paid_amount", "base_write_off_amount", "base_change_amount"
 		], company_currency);
 
 		setup_field_label_map(["total", "net_total", "total_taxes_and_charges", "discount_amount",
diff --git a/erpnext/public/js/payment/payment_details.html b/erpnext/public/js/payment/payment_details.html
new file mode 100644
index 0000000..b0f61d8
--- /dev/null
+++ b/erpnext/public/js/payment/payment_details.html
@@ -0,0 +1,4 @@
+<div class="row pos-payment-row" type="{{type}}" idx={{idx}}>
+    <div class="col-xs-6"><h5 class="payment-mode text-ellipsis" idx="{{idx}}"> {{mode_of_payment}} </h5></div>
+	<div class="col-xs-6 text-right"><input disabled data-fieldtype="Currency" class="input-with-feedback form-control text-right amount" idx="{{idx}}" type="text" value="{{format_number(amount, 2)}}"></div>
+</div>
\ No newline at end of file
diff --git a/erpnext/public/js/payment/pos_payment.html b/erpnext/public/js/payment/pos_payment.html
new file mode 100644
index 0000000..e93644d
--- /dev/null
+++ b/erpnext/public/js/payment/pos_payment.html
@@ -0,0 +1,40 @@
+<div class="pos_payment row">
+    	<div class="col-sm-6">
+			<div class="row">
+				<div class="col-xs-6 text-center"> 
+					<p class="amount-label"> Total <h3>{%= format_currency(grand_total, currency) %} </h3></p>
+				</div>
+				<div class="col-xs-6 text-center"> 
+					<p class="amount-label"> Paid <h3 class="paid_amount">{%= format_currency(paid_amount, currency) %}</h3></p>
+				</div>              
+			</div>
+				<hr>
+			<div class="multimode-payments">
+    		</div>
+    	</div>
+    	<div class="col-sm-6">
+            <div class="row">
+				<div class="col-xs-6 text-center"> 
+					<p class="amount-label"> Outstanding <h3 class="outstanding_amount">{%= format_currency(outstanding_amount, currency) %} </h3></p>
+				</div>
+				<div class="col-xs-6 text-center"> 
+					<p class="amount-label"> Change <h3 class="change_amount">{%= format_currency(change_amount, currency) %}</h3></p>
+				</div>              
+            </div>
+			<hr>
+            <div class="payment-toolbar">
+				{% for(var i=0; i<3; i++) { %}
+					<div class="row">
+						{% for(var j=i*3; j<(i+1)*3; j++) { %}
+							<button type="button"  class="btn btn-default pos-keyboard-key">{{j+1}}</button>
+						{% } %}
+					</div>
+				{% } %}   
+				<div class="row">
+					<button type="button"  class="btn btn-default delete-btn"><span class="mega-octicon octicon-triangle-left"></span></button>
+					<button type="button"  class="btn btn-default pos-keyboard-key">0</button>
+					<button type="button"  class="btn btn-default pos-keyboard-key">.</button>
+				</div>
+            </div>
+    	</div>
+</div>
diff --git a/erpnext/public/js/pos/pos.html b/erpnext/public/js/pos/pos.html
index 36ef7c9..9d0ab60 100644
--- a/erpnext/public/js/pos/pos.html
+++ b/erpnext/public/js/pos/pos.html
@@ -24,22 +24,24 @@
 							<div class="tax-table small"></div>
 						</div>
                     </div>
-                    <div class="row pos-bill-row discount-amount-area">
-                        <div class="col-xs-6"><h6 class="text-muted">{%= __("Discount") %}</h6></div>
-						<div class="col-xs-3 discount-field-col">
-							<div class="input-group input-group-sm">
-								<span class="input-group-addon">%</span>
-								<input type="text" class="form-control discount-percentage text-right">
+					{% if (apply_discount_on) { %}
+	                    <div class="row pos-bill-row discount-amount-area">
+	                        <div class="col-xs-6"><h6 class="text-muted">{%= __("Discount") %}</h6></div>
+							<div class="col-xs-3 discount-field-col">
+								<div class="input-group input-group-sm">
+									<span class="input-group-addon">%</span>
+									<input type="text" class="form-control discount-percentage text-right">
+								</div>
 							</div>
-						</div>
-                        <div class="col-xs-3 discount-field-col">
-							<div class="input-group input-group-sm">
-								<span class="input-group-addon">{%= get_currency_symbol(currency) %}</span>
-								<input type="text" class="form-control discount-amount text-right"
-							  		placeholder="{%= 0.00 %}">
+	                        <div class="col-xs-3 discount-field-col">
+								<div class="input-group input-group-sm">
+									<span class="input-group-addon">{%= get_currency_symbol(currency) %}</span>
+									<input type="text" class="form-control discount-amount text-right"
+								  		placeholder="{%= 0.00 %}">
+								</div>
 							</div>
-						</div>
-                    </div>
+	                    </div>
+					{% } %} 
                     <div class="row pos-bill-row grand-total-area">
                         <div class="col-xs-6"><h6>{%= __("Grand Total") %}</h6></div>
                         <div class="col-xs-6"><h6 class="grand-total text-right"></h6></div>
@@ -51,11 +53,12 @@
 			<div class="row pos-item-area">
 
 			</div>
+			<span id="customer-results" style="color:#68a;"></span>
             <div class="row pos-item-toolbar">
             	<div class="search-area col-xs-12"></div>
             </div>
     		<div class="item-list-area">
-				<div class="item-list"></div>
+				<div class="app-listing item-list"></ul>
     		</div>
     	</div>
     </div>
diff --git a/erpnext/public/js/pos/pos_bill_item.html b/erpnext/public/js/pos/pos_bill_item.html
index c93c76c..fe521f6 100644
--- a/erpnext/public/js/pos/pos_bill_item.html
+++ b/erpnext/public/js/pos/pos_bill_item.html
@@ -9,8 +9,7 @@
                 </div>
                 {% if(actual_qty != null) { %}
                 <div style="margin-top: 5px;" class="text-muted small text-right">
-                    <span title="{%= __("In Stock") %}">{%= actual_qty || 0 %}<span>
-                    <span title="{%= __("Projected") %}">({%= projected_qty || 0 %})<span>
+                    <span title="{%= __("In Stock") %}">{%= actual_qty || 0 %}<span>                
                 </div>
                 {% } %}
             </div>
diff --git a/erpnext/public/js/pos/pos_invoice_list.html b/erpnext/public/js/pos/pos_invoice_list.html
new file mode 100644
index 0000000..463b3e7
--- /dev/null
+++ b/erpnext/public/js/pos/pos_invoice_list.html
@@ -0,0 +1,5 @@
+<div class="row list-row pos-invoice-list" invoice-name = "{{name}}">
+	<div class="col-xs-6">{%= customer %}</div>
+	<div class="col-xs-3 text-right">{%= grand_total %}</div>
+	<div class="col-xs-3 text-right">{%= status %}</div>
+</div>
diff --git a/erpnext/public/js/pos/pos_print.html b/erpnext/public/js/pos/pos_print.html
new file mode 100644
index 0000000..d31a885
--- /dev/null
+++ b/erpnext/public/js/pos/pos_print.html
@@ -0,0 +1,25 @@
+<style>
+	.print-format table, .print-format tr, 
+	.print-format td, .print-format div, .print-format p {
+		font-family: Monospace;
+		line-height: 200%;
+		vertical-align: middle;
+	}
+	@media screen {
+		.print-format {
+			width: 4in;
+			padding: 0.25in;
+			min-height: 8in;
+		}
+	}
+</style>
+
+<p class="text-center">
+	{{ company }}<br>
+</p>
+<p>
+	{{currency}}
+</p>
+{% for item in items %}
+	<p> {{item.item_code}} </p>
+{% endfor %}
\ No newline at end of file
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index 5906a4f..e613daf 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -122,7 +122,7 @@
 
 		// check if child doctype is Sales Order Item/Qutation Item and calculate the rate
 		if(in_list(["Quotation Item", "Sales Order Item", "Delivery Note Item", "Sales Invoice Item"]), cdt)
-			this.calculate_revised_margin_and_rate(item, doc,cdt, cdn);
+			this.apply_pricing_rule_on_item(item);
 		else
 			item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0),
 				precision("rate", item));
@@ -320,7 +320,7 @@
 	margin_rate_or_amount: function(doc, cdt, cdn) {
 		// calculated the revised total margin and rate on margin rate changes
 		item = locals[cdt][cdn];
-		this.calculate_revised_margin_and_rate(item)
+		this.apply_pricing_rule_on_item(item)
 		this.calculate_taxes_and_totals();
 		cur_frm.refresh_fields();
 	},
@@ -328,26 +328,9 @@
 	margin_type: function(doc, cdt, cdn){
 		// calculate the revised total margin and rate on margin type changes
 		item = locals[cdt][cdn];
-		this.calculate_revised_margin_and_rate(item, doc,cdt, cdn)
+		this.apply_pricing_rule_on_item(item, doc,cdt, cdn)
 		this.calculate_taxes_and_totals();
 		cur_frm.refresh_fields();
-	},
-
-	calculate_revised_margin_and_rate: function(item){
-		if(in_list(["Percentage", "Amount"], item.margin_type)){
-			if(item.margin_type == "Percentage")
-				item.total_margin = item.price_list_rate + item.price_list_rate * ( item.margin_rate_or_amount / 100);
-			else
-				item.total_margin = item.price_list_rate + item.margin_rate_or_amount;
-			item.rate = flt(item.total_margin * (1 - item.discount_percentage / 100.0),
-				precision("rate", item));
-		}
-		else{
-			item.rate_or_amount = 0.0;
-			item.total_margin = 0.0;
-			item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0),
-				precision("rate", item));
-		}
 	}
 });