diff --git a/classes/dlg.php b/classes/dlg.php
index 32c41ee34acde295862b51b60f5e4905be293065..6617dfe07f6c50457ef8d37dc416ad8740c5c67f 100644
--- a/classes/dlg.php
+++ b/classes/dlg.php
@@ -49,7 +49,7 @@ class Dlg extends Handler_Protected {
 
 		print "<div align='center'>";
 
-		print "<button dojoType=\"dijit.form.Button\" onclick=\"return opmlRegenKey()\">".
+		print "<button dojoType=\"dijit.form.Button\" onclick=\"return Prefs.OPML.changeKey()\">".
 			__('Generate new URL')."</button> ";
 
 		print "<button dojoType=\"dijit.form.Button\" onclick=\"return CommonDialogs.closeInfoBox()\">".
diff --git a/classes/opml.php b/classes/opml.php
index 5b7690375ed762c4a52c6fa4880888e695f92f39..1b1897e7d4aea425a64a48079116df5c64c71ea0 100644
--- a/classes/opml.php
+++ b/classes/opml.php
@@ -8,11 +8,8 @@ class Opml extends Handler_Protected {
 	}
 
 	function export() {
-		$output_name = $_REQUEST["filename"];
-		if (!$output_name) $output_name = "TinyTinyRSS.opml";
-
-		$show_settings = $_REQUEST["settings"];
-
+		$output_name = "tt-rss_".date("Y-m-d").".opml";
+		$show_settings = $_REQUEST["include_settings"];
 		$owner_uid = $_SESSION["uid"];
 
 		$rc = $this->opml_export($output_name, $owner_uid, false, ($show_settings == 1));
diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php
index 961a09c28afca34d662853642df247dfbaacfe23..ff91120ec166f593c3c27e611d2a57001536a231 100755
--- a/classes/pref/feeds.php
+++ b/classes/pref/feeds.php
@@ -1270,11 +1270,11 @@ class Pref_Feeds extends Handler_Protected {
 
 		print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('OPML')."\">";
 
-		print "<p>" . __("Using OPML you can export and import your feeds, filters, labels and Tiny Tiny RSS settings.") .
-			__("Only main settings profile can be migrated using OPML.") . "</p>";
+		print_notice(__("Using OPML you can export and import your feeds, filters, labels and Tiny Tiny RSS settings.") .
+			__("Only main settings profile can be migrated using OPML."));
 
 		print "<iframe id=\"upload_iframe\"
-			name=\"upload_iframe\" onload=\"opmlImportComplete(this)\"
+			name=\"upload_iframe\" onload=\"Prefs.OPML.onImportComplete(this)\"
 			style=\"width: 400px; height: 100px; display: none;\"></iframe>";
 
 		print "<form  name=\"opml_form\" style='display : block' target=\"upload_iframe\"
@@ -1285,24 +1285,29 @@ class Pref_Feeds extends Handler_Protected {
 			</label>
 			<input type=\"hidden\" name=\"op\" value=\"dlg\">
 			<input type=\"hidden\" name=\"method\" value=\"importOpml\">
-			<button dojoType=\"dijit.form.Button\" onclick=\"return opmlImport();\" type=\"submit\">" .
-			__('Import my OPML') . "</button>";
+			<button dojoType=\"dijit.form.Button\" onclick=\"return Prefs.OPML.import();\" type=\"submit\">" .
+			__('Import OPML') . "</button>";
 
-		print "<hr>";
+		print "</form>";
+
+		print "<p/>";
 
-		$opml_export_filename = "TinyTinyRSS_".date("Y-m-d").".opml";
+		print "<form dojoType=\"dijit.form.Form\" id=\"opmlExportForm\">";
 
-		print "<p>" . __('Filename:') .
-            " <input class=\"input input-text\" type=\"text\" id=\"filename\" value=\"$opml_export_filename\" />&nbsp;" .
-				__('Include settings') . "<input type=\"checkbox\" id=\"settings\" checked=\"1\"/>";
+		print "<button dojoType=\"dijit.form.Button\"
+			onclick=\"Prefs.OPML.export()\" >" .
+			__('Export OPML') . "</button>";
 
-		print "</p><button dojoType=\"dijit.form.Button\"
-			onclick=\"gotoExportOpml(document.opml_form.filename.value, document.opml_form.settings.checked)\" >" .
-              __('Export OPML') . "</button></p></form>";
+		print "<label>";
+		print_checkbox("include_settings", true, "1", "");
+		print "&nbsp;" . __("Include settings");
+		print "</label>";
+
+		print "</form>";
 
 		print "<hr>";
 
-		print "<p>" . __('Your OPML can be published publicly and can be subscribed by anyone who knows the URL below.') . "</p>";
+		print_notice(__('Your OPML can be published publicly and can be subscribed by anyone who knows the URL below.'));
 
 		print_warning("Published OPML does not include your Tiny Tiny RSS settings, feeds that require authentication or feeds hidden from Popular feeds.");
 
diff --git a/js/PrefHelpers.js b/js/PrefHelpers.js
index 749e954cc1f1f53e8e9d4b4429e9ee99751b0798..df42547b21ace3f86396792bc1127c9d1bca51b4 100644
--- a/js/PrefHelpers.js
+++ b/js/PrefHelpers.js
@@ -148,7 +148,85 @@ define(["dojo/_base/declare"], function (declare) {
 				Notify.close();
 			});
 		}
-	}
+	};
+
+	Prefs.OPML = {
+		import: function() {
+			const opml_file = $("opml_file");
+
+			if (opml_file.value.length == 0) {
+				alert(__("Please choose an OPML file first."));
+				return false;
+			} else {
+				Notify.progress("Importing, please wait...", true);
+
+				Element.show("upload_iframe");
+
+				return true;
+			}
+		},
+		onImportComplete: function(iframe) {
+			if (!iframe.contentDocument.body.innerHTML) return false;
+
+			Element.show(iframe);
+
+			Notify.close();
+
+			if (dijit.byId('opmlImportDlg'))
+				dijit.byId('opmlImportDlg').destroyRecursive();
+
+			const content = iframe.contentDocument.body.innerHTML;
+
+			const dialog = new dijit.Dialog({
+				id: "opmlImportDlg",
+				title: __("OPML Import"),
+				style: "width: 600px",
+				onCancel: function () {
+					window.location.reload();
+				},
+				execute: function () {
+					window.location.reload();
+				},
+				content: content
+			});
+
+			dojo.connect(dialog, "onShow", function () {
+				Element.hide(iframe);
+			});
+
+			dialog.show();
+		},
+		export: function() {
+			console.log("export");
+			window.open("backend.php?op=opml&method=export&" + dojo.formToQuery("opmlExportForm"));
+		},
+		changeKey: function() {
+			if (confirm(__("Replace current OPML publishing address with a new one?"))) {
+				Notify.progress("Trying to change address...", true);
+
+				xhrJson("backend.php", {op: "pref-feeds", method: "regenOPMLKey"}, (reply) => {
+					if (reply) {
+						const new_link = reply.link;
+						const e = $('pub_opml_url');
+
+						if (new_link) {
+							e.href = new_link;
+							e.innerHTML = new_link;
+
+							new Effect.Highlight(e);
+
+							Notify.close();
+
+						} else {
+							Notify.error("Could not change feed URL.");
+						}
+					}
+				});
+			}
+			return false;
+		},
+
+};
 
 	return Prefs;
 });
diff --git a/js/prefs.js b/js/prefs.js
index edb11bc7dc499db17e1d17288267cca92942b8b3..4bdfb45efa61251bc2057d08d30fcef21cf91a17 100755
--- a/js/prefs.js
+++ b/js/prefs.js
@@ -152,79 +152,4 @@ require(["dojo/_base/kernel",
 			exception_error(e);
 		}
 	});
-});
-
-function opmlImportComplete(iframe) {
-	if (!iframe.contentDocument.body.innerHTML) return false;
-
-	Element.show(iframe);
-
-	Notify.close();
-
-	if (dijit.byId('opmlImportDlg'))
-		dijit.byId('opmlImportDlg').destroyRecursive();
-
-	const content = iframe.contentDocument.body.innerHTML;
-
-	const dialog = new dijit.Dialog({
-		id: "opmlImportDlg",
-		title: __("OPML Import"),
-		style: "width: 600px",
-		onCancel: function () {
-			window.location.reload();
-		},
-		execute: function () {
-			window.location.reload();
-		},
-		content: content
-	});
-
-	dialog.show();
-}
-
-function opmlImport() {
-
-	const opml_file = $("opml_file");
-
-	if (opml_file.value.length == 0) {
-		alert(__("Please choose an OPML file first."));
-		return false;
-	} else {
-		Notify.progress("Importing, please wait...", true);
-
-		Element.show("upload_iframe");
-
-		return true;
-	}
-}
-
-function opmlRegenKey() {
-	if (confirm(__("Replace current OPML publishing address with a new one?"))) {
-		Notify.progress("Trying to change address...", true);
-
-		xhrJson("backend.php", { op: "pref-feeds", method: "regenOPMLKey" }, (reply) => {
-			if (reply) {
-				const new_link = reply.link;
-				const e = $('pub_opml_url');
-
-				if (new_link) {
-					e.href = new_link;
-					e.innerHTML = new_link;
-
-					new Effect.Highlight(e);
-
-					Notify.close();
-
-				} else {
-					Notify.error("Could not change feed URL.");
-				}
-			}
-		});
-	}
-	return false;
-}
-
-function gotoExportOpml(filename, settings) {
-	const tmp = settings ? 1 : 0;
-	document.location.href = "backend.php?op=opml&method=export&filename=" + filename + "&settings=" + tmp;
-}
+});
\ No newline at end of file