diff --git a/core/modules/system/lib/Drupal/system/Controller/AdminPageController.php b/core/modules/system/lib/Drupal/system/Controller/AdminPageController.php
new file mode 100644
index 0000000..8016de7
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Controller/AdminPageController.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Controller\AdminPageController.
+ */
+
+namespace Drupal\system\Controller;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+
+/**
+ * Controller routines for machine name transliteration routes.
+ */
+class AdminPageController {
+
+  /**
+   * Sets whether the admin menu is in compact mode or not.
+   *
+   * @param string $mode
+   *   Valid values are 'on' and 'off'.
+   *
+   * @return RedirectResponse
+   */
+  function compactPage($mode) {
+    user_cookie_save(array('admin_compact_mode' => ($mode == 'on')));
+    return new RedirectResponse(url('', array('absolute' => TRUE)));
+  }
+}
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 2c70d82..4b79121 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -657,11 +657,8 @@ function system_menu() {
     'file' => 'system.admin.inc',
   );
   $items['admin/compact'] = array(
-    'title' => 'Compact mode',
-    'page callback' => 'system_admin_compact_page',
-    'access arguments' => array('access administration pages'),
+    'route_name' => 'system_admin_compact_page',
     'type' => MENU_CALLBACK,
-    'file' => 'system.admin.inc',
   );
   $items['admin/tasks'] = array(
     'title' => 'Tasks',
@@ -3386,14 +3383,14 @@ function confirm_form($form, $question, $path, $description = NULL, $yes = NULL,
  * such as the configuration page and the permissions page.
  *
  * Whether the user is in compact mode is determined by a cookie, which is set
- * for the user by system_admin_compact_page().
+ * for the user by AdminPageController->compactPage().
  *
  * If the user does not have the cookie, the default value is given by the
  * system variable 'admin_compact_mode', which itself defaults to FALSE. This
  * does not have a user interface to set it: it is a hidden variable which can
  * be set in the settings.php file.
  *
- * @return
+ * @return bool
  *   TRUE when in compact mode, FALSE when in expanded mode.
  */
 function system_admin_compact_mode() {
@@ -3403,17 +3400,6 @@ function system_admin_compact_mode() {
 }
 
 /**
- * Menu callback; Sets whether the admin menu is in compact mode or not.
- *
- * @param $mode
- *   Valid values are 'on' and 'off'.
- */
-function system_admin_compact_page($mode = 'off') {
-  user_cookie_save(array('admin_compact_mode' => ($mode == 'on')));
-  drupal_goto();
-}
-
-/**
  * Generate a list of tasks offered by a specified module.
  *
  * @param $module
diff --git a/core/modules/system/system.routing.yml b/core/modules/system/system.routing.yml
index f39cf3b..c282a42 100644
--- a/core/modules/system/system.routing.yml
+++ b/core/modules/system/system.routing.yml
@@ -4,6 +4,7 @@ system.cron:
     _controller: '\Drupal\system\CronController::run'
   requirements:
     _access_system_cron: 'TRUE'
+
 system.machine_name_transliterate:
   pattern: '/machine_name/transliterate'
   defaults:
@@ -115,3 +116,11 @@ system_theme_enable:
     _controller: 'Drupal\system\Controller\ThemeController::enable'
   requirements:
     _permission: 'administer themes'
+
+system_admin_compact_page:
+  pattern: 'admin/compact/{mode}'
+  defaults:
+    _controller: 'Drupal\system\Controller\AdminPageController::compactPage'
+    mode: 'off'
+  requirements:
+    _permission: 'access administration pages'
