diff --git a/erpnext/accounts/doctype/account/account.js b/erpnext/accounts/doctype/account/account.js
index 8a9a439..ed7e39a 100644
--- a/erpnext/accounts/doctype/account/account.js
+++ b/erpnext/accounts/doctype/account/account.js
@@ -1,94 +1,94 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-
-cur_frm.cscript.refresh = function (doc, cdt, cdn) {
-	if (doc.__islocal) {
-		frappe.msgprint(__("Please create new account from Chart of Accounts."));
-		throw "cannot create";
-	}
-
-	cur_frm.toggle_display('account_name', doc.__islocal);
-
-	// hide fields if group
-	cur_frm.toggle_display(['account_type', 'tax_rate'], cint(doc.is_group) == 0)
-
-	// disable fields
-	cur_frm.toggle_enable(['account_name', 'is_group', 'company'], false);
-
-	if (cint(doc.is_group) == 0) {
-		cur_frm.toggle_display('freeze_account', doc.__onload && doc.__onload.can_freeze_account);
-	}
-
-	// read-only for root accounts
-	if (!doc.parent_account) {
-		cur_frm.set_read_only();
-		cur_frm.set_intro(__("This is a root account and cannot be edited."));
-	} else {
-		// credit days and type if customer or supplier
-		cur_frm.set_intro(null);
-
-		cur_frm.cscript.account_type(doc, cdt, cdn);
-
-		// show / hide convert buttons
-		cur_frm.cscript.add_toolbar_buttons(doc);
-	}
-}
-
-cur_frm.add_fetch('parent_account', 'report_type', 'report_type');
-cur_frm.add_fetch('parent_account', 'root_type', 'root_type');
-
-cur_frm.cscript.account_type = function (doc, cdt, cdn) {
-	if (doc.is_group == 0) {
-		cur_frm.toggle_display(['tax_rate'], doc.account_type == 'Tax');
-		cur_frm.toggle_display('warehouse', doc.account_type == 'Stock');
-	}
-}
-
-cur_frm.cscript.add_toolbar_buttons = function (doc) {
-	cur_frm.add_custom_button(__('Chart of Accounts'),
-		function () { frappe.set_route("Tree", "Account"); });
-
-	if (doc.is_group == 1) {
-		cur_frm.add_custom_button(__('Group to Non-Group'),
-			function () { cur_frm.cscript.convert_to_ledger(); }, 'fa fa-retweet', 'btn-default');
-	} else if (cint(doc.is_group) == 0) {
-		cur_frm.add_custom_button(__('Ledger'), function () {
-			frappe.route_options = {
-				"account": doc.name,
-				"from_date": frappe.sys_defaults.year_start_date,
-				"to_date": frappe.sys_defaults.year_end_date,
-				"company": doc.company
+frappe.ui.form.on('Account', {
+	setup: function(frm) {
+		frm.add_fetch('parent_account', 'report_type', 'report_type');
+		frm.add_fetch('parent_account', 'root_type', 'root_type');
+	},
+	onload: function(frm) {
+		frm.set_query('parent_account', function(doc) {
+			return {
+				filters: {
+					"is_group": 1,
+					"company": doc.company
+				}
 			};
-			frappe.set_route("query-report", "General Ledger");
 		});
+	},
+	refresh: function(frm) {
+		if (frm.doc.__islocal) {
+			frappe.msgprint(__("Please create new account from Chart of Accounts."));
+			throw "cannot create";
+		}
 
-		cur_frm.add_custom_button(__('Non-Group to Group'),
-			function () { cur_frm.cscript.convert_to_group(); }, 'fa fa-retweet', 'btn-default')
+		frm.toggle_display('account_name', frm.doc.__islocal);
+
+		// hide fields if group
+		frm.toggle_display(['account_type', 'tax_rate'], cint(frm.doc.is_group) == 0);
+
+		// disable fields
+		frm.toggle_enable(['account_name', 'is_group', 'company'], false);
+
+		if (cint(frm.doc.is_group) == 0) {
+			frm.toggle_display('freeze_account', frm.doc.__onload
+				&& frm.doc.__onload.can_freeze_account);
+		}
+
+		// read-only for root accounts
+		if (!frm.doc.parent_account) {
+			frm.set_read_only();
+			frm.set_intro(__("This is a root account and cannot be edited."));
+		} else {
+			// credit days and type if customer or supplier
+			frm.set_intro(null);
+			frm.trigger('account_type');
+
+			// show / hide convert buttons
+			frm.trigger('add_toolbar_buttons');
+		}
+	},
+	account_type: function (frm) {
+		if (frm.doc.is_group == 0) {
+			frm.toggle_display(['tax_rate'], frm.doc.account_type == 'Tax');
+			frm.toggle_display('warehouse', frm.doc.account_type == 'Stock');
+		}
+	},
+	add_toolbar_buttons: function(frm) {
+		frm.add_custom_button(__('Chart of Accounts'),
+			function () { frappe.set_route("Tree", "Account"); });
+
+		if (frm.doc.is_group == 1) {
+			frm.add_custom_button(__('Group to Non-Group'), function () {
+				return frappe.call({
+					doc: frm.doc,
+					method: 'convert_group_to_ledger',
+					callback: function() {
+						frm.refresh();
+					}
+				});
+			});
+		} else if (cint(frm.doc.is_group) == 0) {
+			cur_frm.add_custom_button(__('Ledger'), function () {
+				frappe.route_options = {
+					"account": frm.doc.name,
+					"from_date": frappe.sys_defaults.year_start_date,
+					"to_date": frappe.sys_defaults.year_end_date,
+					"company": frm.doc.company
+				};
+				frappe.set_route("query-report", "General Ledger");
+			});
+
+			frm.add_custom_button(__('Non-Group to Group'), function () {
+				return frappe.call({
+					doc: frm.doc,
+					method: 'convert_ledger_to_group',
+					callback: function() {
+						frm.refresh();
+					}
+				});
+			});
+		}
+
 	}
-}
-
-cur_frm.cscript.convert_to_ledger = function (doc, cdt, cdn) {
-	return $c_obj(cur_frm.doc, 'convert_group_to_ledger', '', function (r, rt) {
-		if (r.message == 1) {
-			cur_frm.refresh();
-		}
-	});
-}
-
-cur_frm.cscript.convert_to_group = function (doc, cdt, cdn) {
-	return $c_obj(cur_frm.doc, 'convert_ledger_to_group', '', function (r, rt) {
-		if (r.message == 1) {
-			cur_frm.refresh();
-		}
-	});
-}
-
-cur_frm.fields_dict['parent_account'].get_query = function (doc) {
-	return {
-		filters: {
-			"is_group": 1,
-			"company": doc.company
-		}
-	}
-}
+});
\ No newline at end of file
diff --git a/erpnext/tests/ui/accounts/test_account.js b/erpnext/tests/ui/accounts/test_account.js
new file mode 100644
index 0000000..6d7709b
--- /dev/null
+++ b/erpnext/tests/ui/accounts/test_account.js
@@ -0,0 +1,27 @@
+QUnit.module('accounts');
+
+QUnit.test("test account", function(assert) {
+	assert.expect(4);
+	let done = assert.async();
+	frappe.run_serially([
+		() => frappe.set_route('Tree', 'Account'),
+		() => frappe.tests.click_button('Expand All'),
+		() => frappe.tests.click_link('Debtors'),
+		() => frappe.tests.click_button('Edit'),
+		() => frappe.timeout(1),
+		() => {
+			assert.ok(cur_frm.doc.root_type=='Asset');
+			assert.ok(cur_frm.doc.report_type=='Balance Sheet');
+			assert.ok(cur_frm.doc.account_type=='Receivable');
+		},
+		() => frappe.tests.click_button('Ledger'),
+		() => frappe.timeout(1),
+		() => {
+			// check if general ledger report shown
+			assert.deepEqual(frappe.get_route(), ['query-report', 'General Ledger']);
+			window.history.back();
+			return frappe.timeout(1);
+		},
+		() => done()
+	]);
+});
