[shopping-cart] i'm back
diff --git a/erpnext/templates/pages/address.py b/erpnext/templates/pages/address.py
new file mode 100644
index 0000000..46dde92
--- /dev/null
+++ b/erpnext/templates/pages/address.py
@@ -0,0 +1,62 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import json
+
+import frappe
+from erpnext.shopping_cart.cart import get_lead_or_customer, update_cart_address
+from frappe.desk.form.meta import get_meta
+
+no_cache = 1
+no_sitemap = 1
+
+def get_context(context):
+	def _get_fields(fieldnames):
+		return [frappe._dict(zip(["label", "fieldname", "fieldtype", "options"],
+				[df.label, df.fieldname, df.fieldtype, df.options]))
+			for df in get_meta("Address").get("fields", {"fieldname": ["in", fieldnames]})]
+
+	docname = doc = None
+	title = "New Address"
+	if frappe.form_dict.name:
+		doc = frappe.get_doc("Address", frappe.form_dict.name)
+		docname = doc.name
+		title = doc.name
+
+	return {
+		"doc": doc,
+		"meta": frappe._dict({
+			"left_fields": _get_fields(["address_title", "address_type", "address_line1", "address_line2",
+				"city", "state", "pincode", "country"]),
+			"right_fields": _get_fields(["email_id", "phone", "fax", "is_primary_address",
+				"is_shipping_address"])
+		}),
+		"docname": docname,
+		"title": title
+	}
+
+@frappe.whitelist()
+def save_address(fields, address_fieldname=None):
+	party = get_lead_or_customer()
+	fields = json.loads(fields)
+
+	if fields.get("name"):
+		doc = frappe.get_doc("Address", fields.get("name"))
+	else:
+		doc = frappe.get_doc({"doctype": "Address", "__islocal": 1})
+
+	doc.update(fields)
+
+	party_fieldname = party.doctype.lower()
+	doc.update({
+		party_fieldname: party.name,
+		(party_fieldname + "_name"): party.get(party_fieldname + "_name")
+	})
+	doc.ignore_permissions = True
+	doc.save()
+
+	if address_fieldname:
+		update_cart_address(address_fieldname, doc.name)
+
+	return doc.name