diff --git a/apps/settings/appinfo/routes.php b/apps/settings/appinfo/routes.php
index b55bea0de6834cb42cf89f125b0057edec01a115..3c80cc05386c2438947cde8e2ccefdbc1733e691 100644
--- a/apps/settings/appinfo/routes.php
+++ b/apps/settings/appinfo/routes.php
@@ -89,12 +89,7 @@ $application->registerRoutes($this, [
 		['name' => 'ChangePassword#changeUserPassword', 'url' => '/settings/users/changepassword', 'verb' => 'POST'],
 		['name' => 'TwoFactorSettings#index', 'url' => '/settings/api/admin/twofactorauth', 'verb' => 'GET'],
 		['name' => 'TwoFactorSettings#update', 'url' => '/settings/api/admin/twofactorauth', 'verb' => 'PUT'],
+
+		['name' => 'Help#help', 'url' => '/settings/help/{mode}', 'verb' => 'GET', 'defaults' => ['mode' => '']],
 	]
 ]);
-
-/** @var $this \OCP\Route\IRouter */
-
-// Settings pages
-$this->create('settings_help', '/settings/help')
-	->actionInclude('settings/help.php');
-
diff --git a/apps/settings/composer/composer/autoload_classmap.php b/apps/settings/composer/composer/autoload_classmap.php
index e2a08896cccd33b8de282536411bccf1d3081293..a59c31701e8523d460e994c4b31593e70fc08715 100644
--- a/apps/settings/composer/composer/autoload_classmap.php
+++ b/apps/settings/composer/composer/autoload_classmap.php
@@ -27,6 +27,7 @@ return array(
     'OCA\\Settings\\Controller\\ChangePasswordController' => $baseDir . '/../lib/Controller/ChangePasswordController.php',
     'OCA\\Settings\\Controller\\CheckSetupController' => $baseDir . '/../lib/Controller/CheckSetupController.php',
     'OCA\\Settings\\Controller\\CommonSettingsTrait' => $baseDir . '/../lib/Controller/CommonSettingsTrait.php',
+    'OCA\\Settings\\Controller\\HelpController' => $baseDir . '/../lib/Controller/HelpController.php',
     'OCA\\Settings\\Controller\\LogSettingsController' => $baseDir . '/../lib/Controller/LogSettingsController.php',
     'OCA\\Settings\\Controller\\MailSettingsController' => $baseDir . '/../lib/Controller/MailSettingsController.php',
     'OCA\\Settings\\Controller\\PersonalSettingsController' => $baseDir . '/../lib/Controller/PersonalSettingsController.php',
diff --git a/apps/settings/composer/composer/autoload_static.php b/apps/settings/composer/composer/autoload_static.php
index 3dd12edc57c0f187a40e3dcfc2b3ec05d2b517c7..2545c97d220ae6f52b2f750e63d5f3300342b22f 100644
--- a/apps/settings/composer/composer/autoload_static.php
+++ b/apps/settings/composer/composer/autoload_static.php
@@ -42,6 +42,7 @@ class ComposerStaticInitSettings
         'OCA\\Settings\\Controller\\ChangePasswordController' => __DIR__ . '/..' . '/../lib/Controller/ChangePasswordController.php',
         'OCA\\Settings\\Controller\\CheckSetupController' => __DIR__ . '/..' . '/../lib/Controller/CheckSetupController.php',
         'OCA\\Settings\\Controller\\CommonSettingsTrait' => __DIR__ . '/..' . '/../lib/Controller/CommonSettingsTrait.php',
+        'OCA\\Settings\\Controller\\HelpController' => __DIR__ . '/..' . '/../lib/Controller/HelpController.php',
         'OCA\\Settings\\Controller\\LogSettingsController' => __DIR__ . '/..' . '/../lib/Controller/LogSettingsController.php',
         'OCA\\Settings\\Controller\\MailSettingsController' => __DIR__ . '/..' . '/../lib/Controller/MailSettingsController.php',
         'OCA\\Settings\\Controller\\PersonalSettingsController' => __DIR__ . '/..' . '/../lib/Controller/PersonalSettingsController.php',
diff --git a/apps/settings/help.php b/apps/settings/help.php
deleted file mode 100644
index 62f10ade521e49c6a3bf3452d3d8aeea256420dd..0000000000000000000000000000000000000000
--- a/apps/settings/help.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Frank Karlitschek <frank@karlitschek.de>
- * @author Jakob Sack <mail@jakobsack.de>
- * @author Jan-Christoph Borchardt <hey@jancborchardt.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program.  If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-OC_Util::checkLoggedIn();
-
-// Load the files we need
-OC_Util::addStyle( "settings", "settings" );
-\OC::$server->getNavigationManager()->setActiveEntry('help');
-
-
-if(isset($_GET['mode']) and $_GET['mode'] === 'admin') {
-	$url=\OCP\Util::linkToAbsolute( 'core', 'doc/admin/index.html' );
-	$style1='';
-	$style2=' active';
-}else{
-	$url=\OCP\Util::linkToAbsolute( 'core', 'doc/user/index.html' );
-	$style1=' active';
-	$style2='';
-}
-
-$url1=\OC::$server->getURLGenerator()->linkToRoute('settings_help').'?mode=user';
-$url2=\OC::$server->getURLGenerator()->linkToRoute('settings_help').'?mode=admin';
-
-$tmpl = new OC_Template( "settings", "help", "user" );
-$tmpl->assign( "admin", OC_User::isAdminUser(OC_User::getUser()));
-$tmpl->assign( "url", $url );
-$tmpl->assign( "url1", $url1 );
-$tmpl->assign( "url2", $url2 );
-$tmpl->assign( "style1", $style1 );
-$tmpl->assign( "style2", $style2 );
-$tmpl->printPage();
diff --git a/apps/settings/lib/Controller/HelpController.php b/apps/settings/lib/Controller/HelpController.php
new file mode 100644
index 0000000000000000000000000000000000000000..eaad0be6709ffff613da408a4746ae659e29d32f
--- /dev/null
+++ b/apps/settings/lib/Controller/HelpController.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+declare(strict_types=1);
+
+namespace OCA\Settings\Controller;
+
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http\ContentSecurityPolicy;
+use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IGroupManager;
+use OCP\INavigationManager;
+use OCP\IRequest;
+use OCP\IURLGenerator;
+use OCP\IUserSession;
+
+class HelpController extends Controller {
+
+	/** @var INavigationManager */
+	private $navigationManager;
+	/** @var IUserSession */
+	private $urlGenerator;
+	/** @var IGroupManager */
+	private $groupManager;
+
+	/** @var string */
+	private $userId;
+
+	public function __construct(
+		string $appName,
+		IRequest $request,
+		INavigationManager $navigationManager,
+		IURLGenerator $urlGenerator,
+		string $userId,
+		IGroupManager $groupManager
+	) {
+		parent::__construct($appName, $request);
+		$this->navigationManager = $navigationManager;
+		$this->urlGenerator = $urlGenerator;
+		$this->userId = $userId;
+		$this->groupManager = $groupManager;
+	}
+
+	/**
+	 * @return TemplateResponse
+	 *
+	 * @NoCSRFRequired
+	 * @NoAdminRequired
+	 */
+	public function help(string $mode = 'user'): TemplateResponse {
+		$this->navigationManager->setActiveEntry('help');
+
+		if(!isset($mode) || $mode !== 'admin') {
+			$mode = 'user';
+		}
+
+		$documentationUrl = $this->urlGenerator->getAbsoluteURL(
+			$this->urlGenerator->linkTo('core', 'doc/' . $mode . '/index.html')
+		);
+
+		$urlUserDocs = $this->urlGenerator->linkToRoute('settings.Help.help', ['mode' => 'user']);
+		$urlAdminDocs = $this->urlGenerator->linkToRoute('settings.Help.help', ['mode' => 'admin']);
+
+		$response = new TemplateResponse('settings', 'help', [
+			'admin' => $this->groupManager->isAdmin($this->userId),
+			'url' => $documentationUrl,
+			'urlUserDocs' => $urlUserDocs,
+			'urlAdminDocs' => $urlAdminDocs,
+			'mode' => $mode,
+		]);
+		$policy = new ContentSecurityPolicy();
+		$policy->addAllowedFrameDomain('\'self\'');
+		$response->setContentSecurityPolicy($policy);
+		return $response;
+
+	}
+
+}
diff --git a/apps/settings/templates/help.php b/apps/settings/templates/help.php
index f58fc66f1b22e468b67581a39f985c21e0ba90f0..02e84052ff49b346cc7a88cdce97e26577c4cab1 100644
--- a/apps/settings/templates/help.php
+++ b/apps/settings/templates/help.php
@@ -1,15 +1,18 @@
+<?php
+\OC_Util::addStyle( 'settings', "settings" );
+?>
 <div id="app-navigation">
 	<ul>
-	<?php if($_['admin']) { ?>
 		<li>
-			<a class="icon-user <?php p($_['style1']); ?>"
-				href="<?php print_unescaped($_['url1']); ?> class= "">
+			<a class="icon-user <?php if ($_['mode'] === 'user') { p('active'); } ?>"
+				href="<?php print_unescaped($_['urlUserDocs']); ?>">
 				<?php p($l->t('User documentation')); ?>
 			</a>
 		</li>
+	<?php if($_['admin']) { ?>
 		<li>
-			<a class="icon-user-admin <?php p($_['style2']); ?>"
-				href="<?php print_unescaped($_['url2']); ?>">
+			<a class="icon-user-admin <?php if ($_['mode'] === 'admin') { p('active'); } ?>"
+				href="<?php print_unescaped($_['urlAdminDocs']); ?>">
 				<?php p($l->t('Administrator documentation')); ?>
 			</a>
 		</li>