diff --git a/core/modules/automated_cron/automated_cron.module b/core/modules/automated_cron/automated_cron.module
index 6b8c4d2..f441fc5 100644
--- a/core/modules/automated_cron/automated_cron.module
+++ b/core/modules/automated_cron/automated_cron.module
@@ -5,13 +5,10 @@
  * Provides an automated cron by executing it at the end of a response.
  */
 
-use Drupal\Core\Routing\RouteMatchInterface;
-use Drupal\Core\Form\FormStateInterface;
-
 /**
  * Implements hook_help().
  */
-function automated_cron_help($route_name, RouteMatchInterface $route_match) {
+function automated_cron_help($route_name) {
   switch ($route_name) {
     case 'help.page.automated_cron':
       $output = '';
@@ -27,34 +24,3 @@ function automated_cron_help($route_name, RouteMatchInterface $route_match) {
       return $output;
   }
 }
-
-/**
- * Implements hook_form_FORM_ID_alter() for the system_cron_settings() form.
- */
-function automated_cron_form_system_cron_settings_alter(&$form, &$form_state) {
-  $automated_cron_settings = \Drupal::config('automated_cron.settings');
-
-  $options = [3600, 10800, 21600, 43200, 86400, 604800];
-  $form['cron']['interval'] = [
-    '#type' => 'select',
-    '#title' => t('Run cron every'),
-    '#description' => t('More information about setting up scheduled tasks can be found by <a href="@url">reading the cron tutorial on drupal.org</a>.', ['@url' => 'https://www.drupal.org/cron']),
-    '#default_value' => $automated_cron_settings->get('interval'),
-    '#options' => [0 => t('Never')] + array_map([\Drupal::service('date.formatter'), 'formatInterval'], array_combine($options, $options)),
-  ];
-
-  // Add submit callback.
-  $form['#submit'][] = 'automated_cron_settings_submit';
-
-  // Theme this form as a config form.
-  $form['#theme'] = 'system_config_form';
-}
-
-/**
- * Form submission handler for system_cron_settings().
- */
-function automated_cron_settings_submit(array $form, FormStateInterface $form_state) {
-  \Drupal::configFactory()->getEditable('automated_cron.settings')
-    ->set('interval', $form_state->getValue('interval'))
-    ->save();
-}
diff --git a/core/modules/automated_cron/src/EventSubscriber/AutomatedCron.php b/core/modules/automated_cron/src/EventSubscriber/AutomatedCron.php
index b6aefcd..5d5f966 100644
--- a/core/modules/automated_cron/src/EventSubscriber/AutomatedCron.php
+++ b/core/modules/automated_cron/src/EventSubscriber/AutomatedCron.php
@@ -5,14 +5,16 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\CronInterface;
 use Drupal\Core\State\StateInterface;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Drupal\Core\Routing\RouteSubscriberBase;
+use Drupal\automated_cron\Form\AutomatedCronForm;
+use Symfony\Component\Routing\RouteCollection;
 use Symfony\Component\HttpKernel\Event\PostResponseEvent;
 use Symfony\Component\HttpKernel\KernelEvents;
 
 /**
  * A subscriber running cron after a response is sent.
  */
-class AutomatedCron implements EventSubscriberInterface {
+class AutomatedCron extends RouteSubscriberBase {
 
   /**
    * The cron service.
@@ -31,7 +33,7 @@ class AutomatedCron implements EventSubscriberInterface {
   /**
    * The state key value store.
    *
-   * @var \Drupal\Core\State\StateInterface;
+   * @var \Drupal\Core\State\StateInterface
    */
   protected $state;
 
@@ -68,13 +70,20 @@ public function onTerminate(PostResponseEvent $event) {
   }
 
   /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
+   * {@inheritdoc}
+   */
+  public function alterRoutes(RouteCollection $collection) {
+    $collection->get('system.cron_settings')->setDefault('_form', AutomatedCronForm::class);
+  }
+
+  /**
+   * {@inheritdoc}
    */
   public static function getSubscribedEvents() {
-    return [KernelEvents::TERMINATE => [['onTerminate', 100]]];
+    $events = parent::getSubscribedEvents();
+    $events[KernelEvents::TERMINATE] = [['onTerminate', 100]];
+
+    return $events;
   }
 
 }
diff --git a/core/modules/automated_cron/src/Form/AutomatedCronForm.php b/core/modules/automated_cron/src/Form/AutomatedCronForm.php
new file mode 100644
index 0000000..ca55b39
--- /dev/null
+++ b/core/modules/automated_cron/src/Form/AutomatedCronForm.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\automated_cron\Form;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\system\Form\CronForm;
+
+/**
+ * Configure automated cron settings for this site.
+ */
+class AutomatedCronForm extends CronForm {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEditableConfigNames() {
+    $configs = parent::getEditableConfigNames();
+    $configs[] = 'automated_cron.settings';
+
+    return $configs;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form = parent::buildForm($form, $form_state);
+
+    $options = [3600, 10800, 21600, 43200, 86400, 604800];
+
+    $form['settings']['interval'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Run cron every'),
+      '#weight' => -1,
+      '#options' => [$this->t('Never')] + array_map([$this->dateFormatter, 'formatInterval'], array_combine($options, $options)),
+      '#default_value' => $this->config('automated_cron.settings')->get('interval'),
+      '#description' => $this->t('More information about setting up scheduled tasks can be found by <a href="@url">reading the cron tutorial on drupal.org</a>.', [
+        '@url' => 'https://www.drupal.org/cron',
+      ]),
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $this->config('automated_cron.settings')
+      ->set('interval', $form_state->getValue('interval'))
+      ->save();
+
+    parent::submitForm($form, $form_state);
+  }
+
+}
diff --git a/core/modules/system/src/Form/CronForm.php b/core/modules/system/src/Form/CronForm.php
index d19915d..c1ed8d7 100644
--- a/core/modules/system/src/Form/CronForm.php
+++ b/core/modules/system/src/Form/CronForm.php
@@ -2,20 +2,21 @@
 
 namespace Drupal\system\Form;
 
-use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\CronInterface;
 use Drupal\Core\Datetime\DateFormatterInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\State\StateInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Drupal\Core\Form\ConfigFormBaseTrait;
 
 /**
- * Configure cron settings for this site.
+ * Configure cron settings for this site and run the cron.
  */
 class CronForm extends FormBase {
+
   use ConfigFormBaseTrait;
 
   /**
@@ -42,15 +43,13 @@ class CronForm extends FormBase {
   /**
    * The module handler service.
    *
-   * @var \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
    */
   protected $moduleHandler;
 
   /**
    * Constructs a CronForm object.
    *
-   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
-   *   The factory for configuration objects.
    * @param \Drupal\Core\State\StateInterface $state
    *   The state key value store.
    * @param \Drupal\Core\CronInterface $cron
@@ -60,7 +59,7 @@ class CronForm extends FormBase {
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
    *   The module handler service.
    */
-  public function __construct(ConfigFactoryInterface $config_factory, StateInterface $state, CronInterface $cron, DateFormatterInterface $date_formatter, ModuleHandlerInterface $module_handler) {
+  public function __construct(StateInterface $state, CronInterface $cron, DateFormatterInterface $date_formatter, ModuleHandlerInterface $module_handler) {
     $this->state = $state;
     $this->cron = $cron;
     $this->dateFormatter = $date_formatter;
@@ -79,7 +78,6 @@ protected function getEditableConfigNames() {
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('config.factory'),
       $container->get('state'),
       $container->get('cron'),
       $container->get('date.formatter'),
@@ -98,46 +96,65 @@ public function getFormId() {
    * {@inheritdoc}
    */
   public function buildForm(array $form, FormStateInterface $form_state) {
-    $form['description'] = array(
-      '#markup' => '<p>' . t('Cron takes care of running periodic tasks like checking for updates and indexing content for search.') . '</p>',
-    );
-    $form['run'] = array(
+    $paragraph = function (TranslatableMarkup $message) {
+      return "<p>$message</p>";
+    };
+
+    $form['description'] = [
+      '#markup' => $paragraph($this->t('Cron takes care of running periodic tasks like checking for updates and indexing content for search.')),
+    ];
+
+    $form['run'] = [
       '#type' => 'submit',
-      '#value' => t('Run cron'),
-    );
-    $status = '<p>' . $this->t('Last run: %time ago.', array('%time' => $this->dateFormatter->formatTimeDiffSince($this->state->get('system.cron_last')))) . '</p>';
-    $form['status'] = array(
-      '#markup' => $status,
-    );
+      '#value' => $this->t('Run cron'),
+      '#submit' => ['::runCron'],
+    ];
 
-    $cron_url = $this->url('system.cron', array('key' => $this->state->get('system.cron_key')), array('absolute' => TRUE));
-    $form['cron_url'] = array(
-      '#markup' => '<p>' . t('To run cron from outside the site, go to <a href=":cron">@cron</a>', array(':cron' => $cron_url, '@cron' => $cron_url)) . '</p>',
-    );
+    $form['status'] = [
+      '#markup' => $paragraph($this->t('Last run: %time ago.', [
+        '%time' => $this->dateFormatter->formatTimeDiffSince($this->state->get('system.cron_last')),
+      ])),
+    ];
+
+    $cron_url = $this->url('system.cron', [
+      'key' => $this->state->get('system.cron_key'),
+    ], [
+      'absolute' => TRUE,
+    ]);
+
+    $form['cron_url'] = [
+      '#markup' => $paragraph($this->t('To run cron from outside the site, go to <a href=":cron">@cron</a>', [
+        ':cron' => $cron_url,
+        '@cron' => $cron_url,
+      ])),
+    ];
 
     if (!$this->moduleHandler->moduleExists('automated_cron')) {
-      $form['automated_cron'] = array(
-        '#markup' => $this->t('Enable the <em>Automated Cron</em> module to allow cron execution at the end of a server response.'),
-      );
+      $form['automated_cron'] = [
+        '#markup' => $paragraph($this->t('Enable the <em>Automated Cron</em> module to allow cron execution at the end of a server response.')),
+      ];
     }
 
-    $form['cron'] = [
-      '#title' => t('Cron settings'),
+    $form['settings'] = [
+      '#title' => $this->t('Cron settings'),
       '#type' => 'details',
       '#open' => TRUE,
     ];
 
-    $form['cron']['logging'] = array(
+    $form['settings']['logging'] = [
       '#type' => 'checkbox',
-      '#title' => t('Detailed cron logging'),
+      '#title' => $this->t('Detailed cron logging'),
       '#default_value' => $this->config('system.cron')->get('logging'),
-      '#description' => 'Run times of individual cron jobs will be written to watchdog',
-    );
+      '#description' => $this->t('Run times of individual cron jobs will be written to watchdog.'),
+    ];
+
+    $form['actions'] = [
+      '#type' => 'actions',
+    ];
 
-    $form['actions']['#type'] = 'actions';
     $form['actions']['submit'] = [
       '#type' => 'submit',
-      '#value' => t('Save configuration'),
+      '#value' => $this->t('Save configuration'),
       '#button_type' => 'primary',
     ];
 
@@ -145,22 +162,29 @@ public function buildForm(array $form, FormStateInterface $form_state) {
   }
 
   /**
-   * Runs cron and reloads the page.
+   * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
     $this->config('system.cron')
       ->set('logging', $form_state->getValue('logging'))
       ->save();
-    drupal_set_message(t('The configuration options have been saved.'));
 
+    drupal_set_message($this->t('The configuration options have been saved.'));
+  }
+
+  /**
+   * Runs cron and reloads the page.
+   *
+   * {@inheritdoc}
+   */
+  public function runCron(array &$form, FormStateInterface $form_state) {
     // Run cron manually from Cron form.
     if ($this->cron->run()) {
-      drupal_set_message(t('Cron ran successfully.'));
+      drupal_set_message($this->t('Cron ran successfully.'));
     }
     else {
-      drupal_set_message(t('Cron run failed.'), 'error');
+      drupal_set_message($this->t('Cron run failed.'), 'error');
     }
-
   }
 
 }
diff --git a/core/modules/system/src/Tests/System/CronRunTest.php b/core/modules/system/src/Tests/System/CronRunTest.php
index ec35b72..f033aa2 100644
--- a/core/modules/system/src/Tests/System/CronRunTest.php
+++ b/core/modules/system/src/Tests/System/CronRunTest.php
@@ -96,8 +96,8 @@ function testCronExceptions() {
   /**
    * Make sure the cron UI reads from the state storage.
    */
-  function testCronUI() {
-    $admin_user = $this->drupalCreateUser(array('administer site configuration'));
+  public function testCronUi() {
+    $admin_user = $this->drupalCreateUser(['administer site configuration']);
     $this->drupalLogin($admin_user);
     $this->drupalGet('admin/config/system/cron');
     // Don't use REQUEST to calculate the exact time, because that will
@@ -106,8 +106,16 @@ function testCronUI() {
     $this->assertNoText('years');
 
     $this->drupalPostForm(NULL, [], t('Save configuration'));
+    // Make sure that cron have not ran after saving the configuration.
+    $this->assertNoText(t('Cron ran successfully.'));
     $this->assertText(t('The configuration options have been saved.'));
     $this->assertUrl('admin/config/system/cron');
+
+    $this->drupalPostForm(NULL, [], t('Run cron'));
+    $this->assertText(t('Cron ran successfully.'));
+    // Make sure that cron execution have not triggered configuration saving.
+    $this->assertNoText(t('The configuration options have been saved.'));
+    $this->assertUrl('admin/config/system/cron');
   }
 
   /**
