diff --git a/core/routes.php b/core/routes.php
index 04b42d20598d5bf99454c6637359878c32b94b42..9a84eb64a3b368d4bb520145cbda8b61c7e1ddba 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -6,6 +6,21 @@
  * See the COPYING-README file.
  */
 
+// Core settings pages
+$this->create('settings_help', '/settings/help')
+	->actionInclude('settings/help.php');
+$this->create('settings_personal', '/settings/personal')
+	->actionInclude('settings/personal.php');
+$this->create('settings_settings', '/settings')
+	->actionInclude('settings/settings.php');
+$this->create('settings_users', '/settings/users')
+	->actionInclude('settings/users.php');
+$this->create('settings_apps', '/settings/apps')
+	->actionInclude('settings/apps.php');
+$this->create('settings_admin', '/settings/admin')
+	->actionInclude('settings/admin.php');
+
+// Not specifically routed
 $this->create('app_css', '/apps/{app}/{file}')
 	->requirements(array('file' => '.*.css'))
 	->action('OC', 'loadCSSFile');
diff --git a/lib/app.php b/lib/app.php
index 7889339e4203651c0cd03a59f845b74ee6577492..71add8838024d856d0e334d7b3eb1be56f70454d 100755
--- a/lib/app.php
+++ b/lib/app.php
@@ -282,33 +282,33 @@ class OC_App{
 		// by default, settings only contain the help menu
 		if(OC_Config::getValue('knowledgebaseenabled', true)==true) {
 			$settings = array(
-				array( "id" => "help", "order" => 1000, "href" => OC_Helper::linkTo( "settings", "help.php" ), "name" => $l->t("Help"), "icon" => OC_Helper::imagePath( "settings", "help.svg" ))
+				array( "id" => "help", "order" => 1000, "href" => OC_Helper::linkToRoute( "settings_help" ), "name" => $l->t("Help"), "icon" => OC_Helper::imagePath( "settings", "help.svg" ))
 			);
 		}
 
 		// if the user is logged-in
 		if (OC_User::isLoggedIn()) {
 			// personal menu
-			$settings[] = array( "id" => "personal", "order" => 1, "href" => OC_Helper::linkTo( "settings", "personal.php" ), "name" => $l->t("Personal"), "icon" => OC_Helper::imagePath( "settings", "personal.svg" ));
+			$settings[] = array( "id" => "personal", "order" => 1, "href" => OC_Helper::linkToRoute( "settings_personal" ), "name" => $l->t("Personal"), "icon" => OC_Helper::imagePath( "settings", "personal.svg" ));
 
 			// if there are some settings forms
 			if(!empty(self::$settingsForms))
 				// settings menu
-				$settings[]=array( "id" => "settings", "order" => 1000, "href" => OC_Helper::linkTo( "settings", "settings.php" ), "name" => $l->t("Settings"), "icon" => OC_Helper::imagePath( "settings", "settings.svg" ));
+				$settings[]=array( "id" => "settings", "order" => 1000, "href" => OC_Helper::linkToRoute( "settings_settings" ), "name" => $l->t("Settings"), "icon" => OC_Helper::imagePath( "settings", "settings.svg" ));
 
 			//SubAdmins are also allowed to access user management
 			if(OC_SubAdmin::isSubAdmin($_SESSION["user_id"]) || OC_Group::inGroup( $_SESSION["user_id"], "admin" )) {
 				// admin users menu
-				$settings[] = array( "id" => "core_users", "order" => 2, "href" => OC_Helper::linkTo( "settings", "users.php" ), "name" => $l->t("Users"), "icon" => OC_Helper::imagePath( "settings", "users.svg" ));
+				$settings[] = array( "id" => "core_users", "order" => 2, "href" => OC_Helper::linkToRoute( "settings_users" ), "name" => $l->t("Users"), "icon" => OC_Helper::imagePath( "settings", "users.svg" ));
 			}
 
 
 			// if the user is an admin
 			if(OC_Group::inGroup( $_SESSION["user_id"], "admin" )) {
 				// admin apps menu
-				$settings[] = array( "id" => "core_apps", "order" => 3, "href" => OC_Helper::linkTo( "settings", "apps.php" ).'?installed', "name" => $l->t("Apps"), "icon" => OC_Helper::imagePath( "settings", "apps.svg" ));
+				$settings[] = array( "id" => "core_apps", "order" => 3, "href" => OC_Helper::linkToRoute( "settings_apps" ).'?installed', "name" => $l->t("Apps"), "icon" => OC_Helper::imagePath( "settings", "apps.svg" ));
 
-				$settings[]=array( "id" => "admin", "order" => 1000, "href" => OC_Helper::linkTo( "settings", "admin.php" ), "name" => $l->t("Admin"), "icon" => OC_Helper::imagePath( "settings", "admin.svg" ));
+				$settings[]=array( "id" => "admin", "order" => 1000, "href" => OC_Helper::linkToRoute( "settings_admin" ), "name" => $l->t("Admin"), "icon" => OC_Helper::imagePath( "settings", "admin.svg" ));
 			}
 		}
 
@@ -485,6 +485,12 @@ class OC_App{
 	public static function getCurrentApp() {
 		$script=substr($_SERVER["SCRIPT_NAME"], strlen(OC::$WEBROOT)+1);
 		$topFolder=substr($script, 0, strpos($script, '/'));
+		if (empty($topFolder)) {
+			$path_info = OC_Request::getPathInfo();
+			if ($path_info) {
+				$topFolder=substr($path_info, 1, strpos($path_info, '/', 1)-1);
+			}
+		}
 		if($topFolder=='apps') {
 			$length=strlen($topFolder);
 			return substr($script, $length+1, strpos($script, '/', $length+1)-$length-1);
diff --git a/settings/admin.php b/settings/admin.php
index a36f219038666b7fcca5438c70a54f01a919061a..9cb70353f9c8edafafa55468316cca9002be642d 100755
--- a/settings/admin.php
+++ b/settings/admin.php
@@ -5,8 +5,8 @@
  * See the COPYING-README file.
  */
 
-require_once '../lib/base.php';
 OC_Util::checkAdminUser();
+OC_App::loadApps();
 
 OC_Util::addStyle( "settings", "settings" );
 OC_Util::addScript( "settings", "admin" );
diff --git a/settings/apps.php b/settings/apps.php
index a1c1bf6aa5303710fb3d308a8111e5414ed23cb4..8134b44143a1c1cafbf662f6a320bc7e82d95b14 100644
--- a/settings/apps.php
+++ b/settings/apps.php
@@ -21,8 +21,8 @@
 *
 */
 
-require_once '../lib/base.php';
 OC_Util::checkAdminUser();
+OC_App::loadApps();
 
 // Load the files we need
 OC_Util::addStyle( "settings", "settings" );
diff --git a/settings/help.php b/settings/help.php
index 9157308dd57cf81e3023bb6a3ecf5a45b56d580f..69a5ec9c14691fd58861a2f5a223a70a500bf682 100644
--- a/settings/help.php
+++ b/settings/help.php
@@ -5,9 +5,8 @@
  * See the COPYING-README file.
  */
 
-require_once '../lib/base.php';
 OC_Util::checkLoggedIn();
-
+OC_App::loadApps();
 
 // Load the files we need
 OC_Util::addStyle( "settings", "settings" );
diff --git a/settings/personal.php b/settings/personal.php
index 4f92985c7977956476c55e4629f4601966e70fe2..ce9065247dfbbc5f611fed36e567365a1c5fbbe1 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -5,8 +5,8 @@
  * See the COPYING-README file.
  */
 
-require_once '../lib/base.php';
 OC_Util::checkLoggedIn();
+OC_App::loadApps();
 
 // Highlight navigation entry
 OC_Util::addScript( 'settings', 'personal' );
diff --git a/settings/settings.php b/settings/settings.php
index 24099ef574227c2cc4605914b8b348abe8a682e9..1e05452ec4d1b612e43720f9006f17275c97477c 100644
--- a/settings/settings.php
+++ b/settings/settings.php
@@ -5,8 +5,8 @@
  * See the COPYING-README file.
  */
 
-require_once '../lib/base.php';
 OC_Util::checkLoggedIn();
+OC_App::loadApps();
 
 OC_Util::addStyle( 'settings', 'settings' );
 OC_App::setActiveNavigationEntry( 'settings' );
diff --git a/settings/users.php b/settings/users.php
index e76505cc78d6e9d44206f9b7a6cfc0000a985610..6eaae474538a26385eff0a6cc74ba94e6936ba28 100644
--- a/settings/users.php
+++ b/settings/users.php
@@ -5,8 +5,8 @@
  * See the COPYING-README file.
  */
 
-require_once '../lib/base.php';
 OC_Util::checkSubAdminUser();
+OC_App::loadApps();
 
 // We have some javascript foo!
 OC_Util::addScript( 'settings', 'users' );
@@ -57,4 +57,4 @@ $tmpl->assign( 'subadmins', $subadmins);
 $tmpl->assign( 'numofgroups', count($accessiblegroups));
 $tmpl->assign( 'quota_preset', $quotaPreset);
 $tmpl->assign( 'default_quota', $defaultQuota);
-$tmpl->printPage();
\ No newline at end of file
+$tmpl->printPage();