diff --git a/core/modules/system/lib/Drupal/system/Controller/SystemInfoController.php b/core/modules/system/lib/Drupal/system/Controller/SystemInfoController.php
new file mode 100644
index 0000000..6121bf0
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Controller/SystemInfoController.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Controller\SystemInfoController.
+ */
+
+namespace Drupal\system\Controller;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Response;
+use Drupal\Core\ControllerInterface;
+use Drupal\Core\Database\Connection;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\system\SystemManager;
+
+/**
+ * Returns responses for System Info routes.
+ */
+class SystemInfoController implements ControllerInterface {
+
+  /**
+   * System Manager Service.
+   *
+   * @var \Drupal\system\SystemManager
+   */
+  protected $systemManager;
+
+  /**
+   * Module handler service.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('system.manager'),
+      $container->get('module_handler')
+    );
+  }
+
+  /**
+   * Constructs a SystemInfoController object.
+   *
+   * @param \Drupal\system\SystemManager $systemManager
+   *   Module handler service.
+   * @param \Drupal\Core\Database\ModuleHandlerInterface $moduleHandler
+   *   Database connection.
+   */
+  public function __construct(SystemManager $systemManager, ModuleHandlerInterface $moduleHandler) {
+    $this->systemManager = $systemManager;
+    $this->moduleHandler = $moduleHandler;
+  }
+
+  /**
+   * Displays the site status report.
+   *
+   * @return string
+   *   The current status of the Drupal installation.
+   */
+  public function status() {
+    return $this->systemManager->status();
+  }
+
+  /**
+   * Returns the contents of phpinfo().
+   *
+   * @return \Symfony\Component\HttpFoundation\Response
+   *   A response object to be sent to the client.
+   */
+  public function php() {
+    ob_start();
+    phpinfo();
+    $output = ob_get_clean();
+    return new Response($output);
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/SystemManager.php b/core/modules/system/lib/Drupal/system/SystemManager.php
new file mode 100644
index 0000000..7b46fd0
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/SystemManager.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\system\SystemManager.
+ */
+
+namespace Drupal\system;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Database\Connection;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+
+/**
+ * System Manager Service.
+ */
+class SystemManager {
+
+  /**
+   * Module handler service.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * Database Service Object.
+   *
+   * @var \Drupal\Core\Database\Connection
+   */
+  protected $database;
+
+  /**
+   * Constructs a SystemManager object.
+   */
+  public function __construct(ModuleHandlerInterface $module_handler, Connection $database) {
+    $this->moduleHandler = $module_handler;
+    $this->database = $database;
+  }
+
+  /**
+   * Displays the site status report. Can also be used as a pure check.
+   *
+   * @return bool|string
+   */
+  public function status($check = FALSE) {
+    // Load .install files
+    include_once DRUPAL_ROOT . '/core/includes/install.inc';
+    drupal_load_updates();
+
+    // Check run-time requirements and status information.
+    $requirements = $this->moduleHandler->invokeAll('requirements', array('runtime'));
+    usort($requirements, function($a, $b) {
+      if (!isset($a['weight'])) {
+        if (!isset($b['weight'])) {
+          return strcmp($a['title'], $b['title']);
+        }
+        return -$b['weight'];
+      }
+      return isset($b['weight']) ? $a['weight'] - $b['weight'] : $a['weight'];
+    });
+
+    if ($check) {
+      return drupal_requirements_severity($requirements) == REQUIREMENT_ERROR;
+    }
+
+    // MySQL import might have set the uid of the anonymous user to autoincrement
+    // value. Let's try fixing it. See http://drupal.org/node/204411
+    $this->database->update('users')
+      ->expression('uid', 'uid - uid')
+      ->condition('name', '')
+      ->condition('pass', '')
+      ->condition('status', 0)
+      ->execute();
+    return theme('status_report', array('requirements' => $requirements));
+  }
+
+}
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 1566c80..3b619f1 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -19,7 +19,8 @@
  */
 function system_admin_config_page() {
   // Check for status report errors.
-  if (system_status(TRUE) && user_access('administer site configuration')) {
+  // @todo Use depedancy injection in http://drupal.org/node/1987810.
+  if (Drupal::service('system.manager')->status(TRUE) && user_access('administer site configuration')) {
     drupal_set_message(t('One or more problems were detected with your Drupal installation. Check the <a href="@status">status report</a> for more information.', array('@status' => url('admin/reports/status'))), 'error');
   }
   $blocks = array();
@@ -1329,35 +1330,6 @@ function system_modules_uninstall_submit($form, &$form_state) {
 }
 
 /**
- * Menu callback: displays the site status report. Can also be used as a pure check.
- *
- * @param $check
- *   If true, only returns a boolean whether there are system status errors.
- */
-function system_status($check = FALSE) {
-  // Load .install files
-  include_once DRUPAL_ROOT . '/core/includes/install.inc';
-  drupal_load_updates();
-
-  // Check run-time requirements and status information.
-  $requirements = module_invoke_all('requirements', 'runtime');
-  usort($requirements, '_system_sort_requirements');
-
-  if ($check) {
-    return drupal_requirements_severity($requirements) == REQUIREMENT_ERROR;
-  }
-  // MySQL import might have set the uid of the anonymous user to autoincrement
-  // value. Let's try fixing it. See http://drupal.org/node/204411
-  db_update('users')
-    ->expression('uid', 'uid - uid')
-    ->condition('name', '')
-    ->condition('pass', '')
-    ->condition('status', 0)
-    ->execute();
-  return theme('status_report', array('requirements' => $requirements));
-}
-
-/**
  * Menu callback: run cron manually.
  */
 function system_run_cron() {
@@ -1373,14 +1345,6 @@ function system_run_cron() {
 }
 
 /**
- * Menu callback: return information about PHP.
- */
-function system_php() {
-  phpinfo();
-  drupal_exit();
-}
-
-/**
  * Default page callback for batches.
  */
 function system_batch_page() {
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 0d472e5..4a007e0 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -991,10 +991,7 @@ function system_menu() {
   $items['admin/reports/status'] = array(
     'title' => 'Status report',
     'description' => "Get a status report about your site's operation and any detected problems.",
-    'page callback' => 'system_status',
-    'weight' => -60,
-    'access arguments' => array('administer site configuration'),
-    'file' => 'system.admin.inc',
+    'route_name' => 'system_status',
   );
   $items['admin/reports/status/run-cron'] = array(
     'title' => 'Run cron',
@@ -1003,13 +1000,6 @@ function system_menu() {
     'type' => MENU_CALLBACK,
     'file' => 'system.admin.inc',
   );
-  $items['admin/reports/status/php'] = array(
-    'title' => 'PHP',
-    'page callback' => 'system_php',
-    'access arguments' => array('administer site configuration'),
-    'type' => MENU_CALLBACK,
-    'file' => 'system.admin.inc',
-  );
 
   // Default page for batch operations.
   $items['batch'] = array(
@@ -3296,19 +3286,6 @@ function system_config_form_submit($form, &$form_state) {
 }
 
 /**
- * Helper function to sort requirements.
- */
-function _system_sort_requirements($a, $b) {
-  if (!isset($a['weight'])) {
-    if (!isset($b['weight'])) {
-      return strcmp($a['title'], $b['title']);
-    }
-    return -$b['weight'];
-  }
-  return isset($b['weight']) ? $a['weight'] - $b['weight'] : $a['weight'];
-}
-
-/**
  * Generates a form array for a confirmation form.
  *
  * This function returns a complete form array for confirming an action. The
diff --git a/core/modules/system/system.routing.yml b/core/modules/system/system.routing.yml
index 9859d6a..82d8841 100644
--- a/core/modules/system/system.routing.yml
+++ b/core/modules/system/system.routing.yml
@@ -87,3 +87,17 @@ date_format_localize_reset:
     _form: '\Drupal\system\Form\DateFormatLocalizeResetForm'
   requirements:
     _permission: 'administer site configuration'
+
+system_status:
+  pattern: '/admin/reports/status'
+  defaults:
+    _controller: 'Drupal\system\Controller\SystemInfoController::status'
+  requirements:
+    _permission: 'administer site configuration'
+
+system_php:
+  pattern: '/admin/reports/status/php'
+  defaults:
+    _controller: 'Drupal\system\Controller\SystemInfoController::php'
+  requirements:
+    _permission: 'administer site configuration'
diff --git a/core/modules/system/system.services.yml b/core/modules/system/system.services.yml
index c049b0a..8f0d232 100644
--- a/core/modules/system/system.services.yml
+++ b/core/modules/system/system.services.yml
@@ -6,3 +6,6 @@ services:
   plugin.manager.system.plugin_ui:
     class: Drupal\system\Plugin\Type\PluginUIManager
     arguments: ['@container.namespaces']
+  system.manager:
+    class: Drupal\system\SystemManager
+    arguments: ['@module_handler', '@database']
