diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php
index 47e5689ecfe20ac1d013d80ec9bdcd5c08613902..ff9e693361d58f100d80643b0f16395b248d38a5 100755
--- a/classes/pref/feeds.php
+++ b/classes/pref/feeds.php
@@ -1394,7 +1394,7 @@ class Pref_Feeds extends Handler_Protected {
 		print "<button dojoType='dijit.form.Button' class='alt-primary'
 			onclick='CommonDialogs.generatedFeed(-2, false, \"$rss_url\", \"".__("Published articles")."\")'>".
 			__('Display URL')."</button>
-		<button class='alt-danger' dojoType='dijit.form.Button' onclick='return Helpers.clearFeedAccessKeys()'>".
+		<button class='alt-danger' dojoType='dijit.form.Button' onclick='return Helpers.Feeds.clearFeedAccessKeys()'>".
 			__('Clear all generated URLs')."</button> ";
 
 		PluginHost::getInstance()->run_hooks(PluginHost::HOOK_PREFS_TAB_SECTION, "prefFeedsPublishedGenerated");
diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php
index d40dc87c0fcd7d406390e3731e5077d6654a5ab0..cfe63ce85077e047f6ea24230866a8f11a1b0429 100644
--- a/classes/pref/prefs.php
+++ b/classes/pref/prefs.php
@@ -715,7 +715,7 @@ class Pref_Prefs extends Handler_Protected {
 						print "</select>";
 
 						print " <button dojoType=\"dijit.form.Button\" class='alt-info'
-							onclick=\"Helpers.customizeCSS()\">" . __('Customize') . "</button>";
+							onclick=\"Helpers.Prefs.customizeCSS()\">" . __('Customize') . "</button>";
 
 						print " <button dojoType='dijit.form.Button' onclick='window.open(\"https://tt-rss.org/wiki/Themes\")'>
 							<i class='material-icons'>open_in_new</i> ".__("More themes...")."</button>";
@@ -830,10 +830,10 @@ class Pref_Prefs extends Handler_Protected {
 			</div>
 			</div>";
 
-		print "<button dojoType=\"dijit.form.Button\" onclick=\"return Helpers.editProfiles()\">".
+		print "<button dojoType=\"dijit.form.Button\" onclick=\"return Helpers.Profiles.edit()\">".
 			__('Manage profiles')."</button> ";
 
-		print "<button dojoType=\"dijit.form.Button\" class=\"alt-danger\" onclick=\"return Helpers.confirmReset()\">".
+		print "<button dojoType=\"dijit.form.Button\" class=\"alt-danger\" onclick=\"return Helpers.Prefs.confirmReset()\">".
 			__('Reset to defaults')."</button>";
 
 		print "&nbsp;";
@@ -968,7 +968,7 @@ class Pref_Prefs extends Handler_Protected {
 				if (count($tmppluginhost->get_all($plugin)) > 0) {
 					if (in_array($name, $system_enabled) || in_array($name, $user_enabled)) {
 						print " <button dojoType='dijit.form.Button'
-							onclick=\"Helpers.clearPluginData('$name')\">
+							onclick=\"Helpers.Prefs.clearPluginData('$name')\">
 								<i class='material-icons'>clear</i> ".__("Clear data")."</button>";
 					}
 				}
diff --git a/js/PrefHelpers.js b/js/PrefHelpers.js
index 3b9e985a675fc06ba3d1367c822593c18e686506..b09beb99553ca407d66e89f94ef63aa1ac099928 100644
--- a/js/PrefHelpers.js
+++ b/js/PrefHelpers.js
@@ -40,16 +40,18 @@ const	Helpers = {
 			}
 		},
 	},
-	clearFeedAccessKeys: function() {
-		if (confirm(__("This will invalidate all previously generated feed URLs. Continue?"))) {
-			Notify.progress("Clearing URLs...");
+	Feeds: {
+		clearFeedAccessKeys: function() {
+			if (confirm(__("This will invalidate all previously generated feed URLs. Continue?"))) {
+				Notify.progress("Clearing URLs...");
 
-			xhrPost("backend.php", {op: "pref-feeds", method: "clearKeys"}, () => {
-				Notify.info("Generated URLs cleared.");
-			});
-		}
+				xhrPost("backend.php", {op: "pref-feeds", method: "clearKeys"}, () => {
+					Notify.info("Generated URLs cleared.");
+				});
+			}
 
-		return false;
+			return false;
+		},
 	},
 	System: {
 		getPHPInfo: function(widget) {
@@ -90,151 +92,155 @@ const	Helpers = {
 			}
 		},
 	},
-	editProfiles: function() {
-		const dialog = new fox.SingleUseDialog({
-			id: "profileEditDlg",
-			title: __("Settings Profiles"),
-			getSelectedProfiles: function () {
-				return Tables.getSelected("pref-profiles-list");
-			},
-			removeSelected: function () {
-				const sel_rows = this.getSelectedProfiles();
-
-				if (sel_rows.length > 0) {
-					if (confirm(__("Remove selected profiles? Active and default profiles will not be removed."))) {
-						Notify.progress("Removing selected profiles...", true);
-
-						const query = {
-							op: "rpc", method: "remprofiles",
-							ids: sel_rows.toString()
-						};
+	Profiles: {
+		edit: function() {
+			const dialog = new fox.SingleUseDialog({
+				id: "profileEditDlg",
+				title: __("Settings Profiles"),
+				getSelectedProfiles: function () {
+					return Tables.getSelected("pref-profiles-list");
+				},
+				removeSelected: function () {
+					const sel_rows = this.getSelectedProfiles();
+
+					if (sel_rows.length > 0) {
+						if (confirm(__("Remove selected profiles? Active and default profiles will not be removed."))) {
+							Notify.progress("Removing selected profiles...", true);
+
+							const query = {
+								op: "rpc", method: "remprofiles",
+								ids: sel_rows.toString()
+							};
+
+							xhrPost("backend.php", query, () => {
+								Notify.close();
+								dialog.refresh();
+							});
+						}
+
+					} else {
+						alert(__("No profiles selected."));
+					}
+				},
+				addProfile: function () {
+					if (this.validate()) {
+						Notify.progress("Creating profile...", true);
+
+						const query = {op: "rpc", method: "addprofile", title: dialog.attr('value').newprofile};
 
 						xhrPost("backend.php", query, () => {
 							Notify.close();
 							dialog.refresh();
 						});
-					}
-
-				} else {
-					alert(__("No profiles selected."));
-				}
-			},
-			addProfile: function () {
-				if (this.validate()) {
-					Notify.progress("Creating profile...", true);
-
-					const query = {op: "rpc", method: "addprofile", title: dialog.attr('value').newprofile};
 
-					xhrPost("backend.php", query, () => {
-						Notify.close();
-						dialog.refresh();
+					}
+				},
+				refresh: function() {
+					xhrPost("backend.php", {op: 'pref-prefs', method: 'editPrefProfiles'}, (transport) => {
+						dialog.attr('content', transport.responseText);
 					});
+				},
+				execute: function () {
+					const sel_rows = this.getSelectedProfiles();
 
-				}
-			},
-			refresh: function() {
-				xhrPost("backend.php", {op: 'pref-prefs', method: 'editPrefProfiles'}, (transport) => {
-					dialog.attr('content', transport.responseText);
-				});
-			},
-			execute: function () {
-				const sel_rows = this.getSelectedProfiles();
+					if (sel_rows.length == 1) {
+						if (confirm(__("Activate selected profile?"))) {
+							Notify.progress("Loading, please wait...");
 
-				if (sel_rows.length == 1) {
-					if (confirm(__("Activate selected profile?"))) {
-						Notify.progress("Loading, please wait...");
+							xhrPost("backend.php", {op: "rpc", method: "setprofile", id: sel_rows.toString()}, () => {
+								window.location.reload();
+							});
+						}
 
-						xhrPost("backend.php", {op: "rpc", method: "setprofile", id: sel_rows.toString()}, () => {
-							window.location.reload();
-						});
+					} else {
+						alert(__("Please choose a profile to activate."));
 					}
+				},
+				content: ""
+			});
 
-				} else {
-					alert(__("Please choose a profile to activate."));
-				}
-			},
-			content: ""
-		});
-
-		dialog.refresh();
-		dialog.show();
+			dialog.refresh();
+			dialog.show();
+		},
 	},
-	customizeCSS: function() {
-		xhrJson("backend.php", {op: "pref-prefs", method: "customizeCSS"}, (reply) => {
+	Prefs: {
+		customizeCSS: function() {
+			xhrJson("backend.php", {op: "pref-prefs", method: "customizeCSS"}, (reply) => {
+
+				const dialog = new fox.SingleUseDialog({
+					title: __("Customize stylesheet"),
+					apply: function() {
+						xhrPost("backend.php", this.attr('value'), () => {
+							new Effect.Appear("css_edit_apply_msg");
+							$("user_css_style").innerText = this.attr('value');
+						});
+					},
+					execute: function () {
+						Notify.progress('Saving data...', true);
 
-			const dialog = new fox.SingleUseDialog({
-				title: __("Customize stylesheet"),
-				apply: function() {
-					xhrPost("backend.php", this.attr('value'), () => {
-						new Effect.Appear("css_edit_apply_msg");
-						$("user_css_style").innerText = this.attr('value');
-					});
-				},
-				execute: function () {
-					Notify.progress('Saving data...', true);
+						xhrPost("backend.php", this.attr('value'), () => {
+							window.location.reload();
+						});
+					},
+					content: `
+						<div class='alert alert-info'>
+							${__("You can override colors, fonts and layout of your currently selected theme with custom CSS declarations here.")}
+						</div>
 
-					xhrPost("backend.php", this.attr('value'), () => {
-						window.location.reload();
-					});
-				},
-				content: `
-					<div class='alert alert-info'>
-						${__("You can override colors, fonts and layout of your currently selected theme with custom CSS declarations here.")}
-					</div>
-
-					${App.FormFields.hidden('op', 'rpc')}
-					${App.FormFields.hidden('method', 'setpref')}
-					${App.FormFields.hidden('key', 'USER_STYLESHEET')}
-
-					<div id='css_edit_apply_msg' style='display : none'>
-						<div class='alert alert-warning'>
-							${__("User CSS has been applied, you might need to reload the page to see all changes.")}
+						${App.FormFields.hidden('op', 'rpc')}
+						${App.FormFields.hidden('method', 'setpref')}
+						${App.FormFields.hidden('key', 'USER_STYLESHEET')}
+
+						<div id='css_edit_apply_msg' style='display : none'>
+							<div class='alert alert-warning'>
+								${__("User CSS has been applied, you might need to reload the page to see all changes.")}
+							</div>
 						</div>
-					</div>
-
-					<textarea class='panel user-css-editor' dojoType='dijit.form.SimpleTextarea'
-						style='font-size : 12px;' name='value'>${reply.value}</textarea>
-
-					<footer>
-						<button dojoType='dijit.form.Button' class='alt-success' onclick="App.dialogOf(this).apply()">
-							${__('Apply')}
-						</button>
-						<button dojoType='dijit.form.Button' class='alt-primary' type='submit'>
-							${__('Save and reload')}
-						</button>
-						<button dojoType='dijit.form.Button' onclick="App.dialogOf(this).hide()">
-							${__('Cancel')}
-						</button>
-					</footer>
-				`
-			});
 
-			dialog.show();
+						<textarea class='panel user-css-editor' dojoType='dijit.form.SimpleTextarea'
+							style='font-size : 12px;' name='value'>${reply.value}</textarea>
+
+						<footer>
+							<button dojoType='dijit.form.Button' class='alt-success' onclick="App.dialogOf(this).apply()">
+								${__('Apply')}
+							</button>
+							<button dojoType='dijit.form.Button' class='alt-primary' type='submit'>
+								${__('Save and reload')}
+							</button>
+							<button dojoType='dijit.form.Button' onclick="App.dialogOf(this).hide()">
+								${__('Cancel')}
+							</button>
+						</footer>
+					`
+				});
+
+				dialog.show();
 
-		});
-	},
-	confirmReset: function() {
-		if (confirm(__("Reset to defaults?"))) {
-			xhrPost("backend.php", {op: "pref-prefs", method: "resetconfig"}, (transport) => {
-				Helpers.refresh();
-				Notify.info(transport.responseText);
 			});
-		}
-	},
-	clearPluginData: function(name) {
-		if (confirm(__("Clear stored data for this plugin?"))) {
-			Notify.progress("Loading, please wait...");
+		},
+		confirmReset: function() {
+			if (confirm(__("Reset to defaults?"))) {
+				xhrPost("backend.php", {op: "pref-prefs", method: "resetconfig"}, (transport) => {
+					Helpers.Prefs.refresh();
+					Notify.info(transport.responseText);
+				});
+			}
+		},
+		clearPluginData: function(name) {
+			if (confirm(__("Clear stored data for this plugin?"))) {
+				Notify.progress("Loading, please wait...");
 
-			xhrPost("backend.php", {op: "pref-prefs", method: "clearplugindata", name: name}, () => {
-				Helpers.refresh();
+				xhrPost("backend.php", {op: "pref-prefs", method: "clearplugindata", name: name}, () => {
+					Helpers.Prefs.refresh();
+				});
+			}
+		},
+		refresh: function() {
+			xhrPost("backend.php", { op: "pref-prefs" }, (transport) => {
+				dijit.byId('prefsTab').attr('content', transport.responseText);
+				Notify.close();
 			});
-		}
-	},
-	refresh: function() {
-		xhrPost("backend.php", { op: "pref-prefs" }, (transport) => {
-			dijit.byId('prefsTab').attr('content', transport.responseText);
-			Notify.close();
-		});
+		},
 	},
 	OPML: {
 		import: function() {