diff --git a/erpnext/regional/india/bank_remittance_txt.py b/erpnext/regional/india/bank_remittance_txt.py
new file mode 100644
index 0000000..7c4995e
--- /dev/null
+++ b/erpnext/regional/india/bank_remittance_txt.py
@@ -0,0 +1,133 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+from frappe.utils import cint,cstr, today
+from functools import reduce
+import re
+import datetime
+from collections import OrderedDict
+
+def create_bank_remittance_txt(name):
+    payment_order = frappe.get_doc("Payment Order", name)
+
+    no_of_records = len(payment_order.get("references"))
+    total_amount = reduce(lambda x, y: x.get("amount") + y.get("amount"), payment_order.get("references"))
+
+    header = get_header_row(payment_order)
+    batch = get_batch_row(payment_order, no_of_records, total_amount)
+
+    detail = []
+    for ref_doc in payment_order.get("references"):
+        detail.append(get_detail_row(ref_doc, format_date(doc.posting_date))
+
+    trailer = get_trailer_row(no_of_records, total_amount)
+
+    detail_records = "\n".join(detail)
+
+    return "~".join([header, batch , detail_records, trailer])
+
+@frappe.whitelist()
+def generate_report_and_get_url(name):
+    data = create_bank_remittance_txt(name)
+    file_name = generate_file_name(name)
+    f = frappe.get_doc({
+        'doctype': 'File',
+        'file_name': file_name+'.txt',
+        'content': data,
+        'is_private': True
+    })
+    f.save()
+
+def generate_file_name(name):
+    ''' generate file name with format (account_code)_mmdd_(payment_order_no) '''
+    return name
+
+def get_header_row(doc):
+    client_code = "ELECTROLAB"
+    file_name = generate_file_name(doc.name)
+    header = ["H"]
+    header.append(cstr(client_code)[:20])
+    header += [''] * 3
+    header.append(cstr(file_name)[:20])
+    return "~".join(header)
+
+def get_batch_row(doc, no_of_records, total_amount):
+    product_code = "VENPAY"
+    batch = ["B"]
+    batch.append(cstr(no_of_records)[:5]) # 5
+    batch.append(cstr(total_amount)[:17]) #amt 17.2
+    batch.append(sanitize_to_alphanumeric(doc.name)[:20])
+    batch.append(format_date(doc.posting_date))
+    batch.append(product_code[:20])
+    return "~".join(batch)
+
+def get_detail_row(ref_doc, payment_date):
+    payment_entry = frappe.get_cached_doc('Payment Entry', ref_doc.payment_entry)
+    supplier_bank_details = frappe.get_cached_doc('Bank Account', ref_doc.bank_account)
+    addr_link = frappe.db.get_value('Dynamic Link',
+        {
+        'link_doctype': 'Supplier',
+        'link_name': 'Sample Supplier',
+        'parenttype':'Address',
+        'parent': ('like', '%-Billing')
+        },'parent')
+    supplier_billing_address = frappe.get_doc('Address', addr_link)
+    detail = OrderedDict(
+        record_identifier='D',
+        payment_ref_no=sanitize_to_alphanumeric(ref_doc.payment_entry),
+        payment_type=ref_doc.mode_of_payment[:10],
+        amount=str(ref_doc.amount)[:13],
+        payment_date=payment_date,
+        instrument_date=payment_date,
+        instrument_number='',
+        dr_account_no_client=str(payment_entry.bank_account_no)[:20],
+        dr_description='',
+        dr_ref_no='',
+        cr_ref_no='',
+        bank_code_indicator='M',
+        beneficiary_code='',
+        beneficiary_name=sanitize_to_alphanumeric(payment_entry.party)[:160],
+        beneficiary_bank=sanitize_to_alphanumeric(supplier_bank_details.bank)[:10],
+        beneficiary_branch_ifsc_code=supplier_bank_details.branch_code,
+        beneficiary_acc_no=supplier_bank_details.bank_account_no,
+        location=supplier_billing_address.city,
+        print_location=supplier_billing_address.city,
+        beneficiary_address_1=supplier_billing_address.address_line1,
+        beneficiary_address_2=supplier_billing_address.address_line2,
+        beneficiary_address_3='',
+        beneficiary_address_4='',
+        beneficiary_address_5='',
+        beneficiary_city=supplier_billing_address.address_line1,
+        beneficiary_zipcode=supplier_billing_address.pincode,
+        beneficiary_state=supplier_billing_address.state,
+        beneficiary_email=supplier_billing_address.email_address,
+        beneficiary_mobile=supplier_billing_address.phone,
+        payment_details_1='',
+        payment_details_2='',
+        payment_details_3='',
+        payment_details_4='',
+        delivery_mode=''
+    )
+    return "~".join(list(detail.values()))
+
+def get_advice_row(doc):
+    advice = ['A']
+
+def get_trailer_row(no_of_records, total_amount):
+    trailer = ["T"]
+    trailer.append(cstr(no_of_records)[:5]) # 5
+    trailer.append(cstr(total_amount)[:17]) # 17.2
+    return "~".join(trailer)
+
+def sanitize_to_alphanumeric(val):
+    ''' Remove all the non-alphanumeric characters from string '''
+    pattern = pattern = re.compile('[\W_]+')
+    return pattern.sub(' ', val)
+
+def format_date(val):
+    ''' Convert a datetime object to DD/MM/YYYY format '''
+    return val.strftime("%d/%m/%Y")
\ No newline at end of file
