diff --git a/core/modules/node/content_types.inc b/core/modules/node/content_types.inc
index e838460..95cb7c3 100644
--- a/core/modules/node/content_types.inc
+++ b/core/modules/node/content_types.inc
@@ -442,52 +442,3 @@ function node_type_reset($type) {
     }
   }
 }
-
-/**
- * Page callback: Form constructor for the content type delete form.
- *
- * @param $type
- *   Content type object.
- *
- * @return
- *   Form array for delete confirmation form.
- *
- * @see node_type_delete_confirm_submit()
- * @ingroup forms
- */
-function node_type_delete_confirm($form, &$form_state, $type) {
-  $form['type'] = array('#type' => 'value', '#value' => $type->type);
-  $form['name'] = array('#type' => 'value', '#value' => $type->name);
-
-  $message = t('Are you sure you want to delete the content type %type?', array('%type' => $type->name));
-
-  $num_nodes = db_query("SELECT COUNT(*) FROM {node} WHERE type = :type", array(':type' => $type->type))->fetchField();
-  if ($num_nodes) {
-    drupal_set_title($message, PASS_THROUGH);
-    $caption = '<p>' . format_plural($num_nodes, '%type is used by 1 piece of content on your site. You can not remove this content type until you have removed all of the %type content.', '%type is used by @count pieces of content on your site. You may not remove %type until you have removed all of the %type content.', array('%type' => $type->name)) . '</p>';
-    $form['description'] = array('#markup' => $caption);
-    return $form;
-  }
-
-  $caption = '<p>' . t('This action cannot be undone.') . '</p>';
-
-  return confirm_form($form, $message, 'admin/structure/types', $caption, t('Delete'));
-}
-
-/**
- * Form submission handler for node_type_delete_confirm().
- */
-function node_type_delete_confirm_submit($form, &$form_state) {
-  node_type_delete($form_state['values']['type']);
-
-  variable_del('node_preview_' . $form_state['values']['type']);
-  $t_args = array('%name' => $form_state['values']['name']);
-  drupal_set_message(t('The content type %name has been deleted.', $t_args));
-  watchdog('node', 'Deleted content type %name.', $t_args, WATCHDOG_NOTICE);
-
-  node_types_rebuild();
-  menu_router_rebuild();
-
-  $form_state['redirect'] = 'admin/structure/types';
-  return;
-}
diff --git a/core/modules/node/lib/Drupal/node/Form/ContentTypeDeleteForm.php b/core/modules/node/lib/Drupal/node/Form/ContentTypeDeleteForm.php
new file mode 100644
index 0000000..6bb827c
--- /dev/null
+++ b/core/modules/node/lib/Drupal/node/Form/ContentTypeDeleteForm.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\Form\ContentTypeDeleteForm.
+ */
+
+namespace Drupal\node\Form;
+
+use Drupal\Core\Form\ConfirmFormBase;
+
+/**
+ * @todo.
+ */
+class ContentTypeDeleteForm extends ConfirmFormBase {
+
+  /**
+   * The content type being deleted.
+   *
+   * @var \stdClass
+   */
+  protected $type;
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormID() {
+    return 'node_type_delete_confirm';
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\ConfirmFormBase::getQuestion().
+   */
+  protected function getQuestion() {
+    return t('Are you sure you want to delete the content type %type?', array('%type' => $this->type->name));
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\ConfirmFormBase::getCancelPath().
+   */
+  protected function getCancelPath() {
+    return 'admin/structure/types';
+  }
+
+  /**
+   * Overrides \Drupal\Core\Form\ConfirmFormBase::getConfirmText().
+   */
+  protected function getConfirmText() {
+    return t('Delete');
+  }
+
+  /**
+   * Overrides \Drupal\Core\Form\FormInterface::buildForm().
+   */
+  public function buildForm(array $form, array &$form_state, $type = NULL) {
+    $types = _node_types_build()->types;
+    $this->type = isset($types[$type]) ? $types[$type] : FALSE;
+
+    $num_nodes = db_query("SELECT COUNT(*) FROM {node} WHERE type = :type", array(':type' => $this->type->type))->fetchField();
+    if ($num_nodes) {
+      drupal_set_title($this->getQuestion(), PASS_THROUGH);
+      $caption = '<p>' . format_plural($num_nodes, '%type is used by 1 piece of content on your site. You can not remove this content type until you have removed all of the %type content.', '%type is used by @count pieces of content on your site. You may not remove %type until you have removed all of the %type content.', array('%type' => $this->type->name)) . '</p>';
+      $form['description'] = array('#markup' => $caption);
+      return $form;
+    }
+
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submitForm().
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    // Delete the content type.
+    node_type_delete($this->type->type);
+
+    variable_del('node_preview_' . $this->type->type);
+    drupal_set_message(t('The content type %name has been deleted.', array('%name' => $this->type->name)));
+    watchdog('node', 'Deleted content type %name.', array('%name' => $this->type->name), WATCHDOG_NOTICE);
+
+    node_types_rebuild();
+    menu_router_rebuild();
+
+    $form_state['redirect'] = 'admin/structure/types';
+  }
+
+}
diff --git a/core/modules/node/lib/Drupal/node/Form/RebuildPermissionsForm.php b/core/modules/node/lib/Drupal/node/Form/RebuildPermissionsForm.php
new file mode 100644
index 0000000..7efc47f
--- /dev/null
+++ b/core/modules/node/lib/Drupal/node/Form/RebuildPermissionsForm.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\Form\RebuildPermissionsForm.
+ */
+
+namespace Drupal\node\Form;
+
+use Drupal\Core\Form\ConfirmFormBase;
+
+/**
+ * Provides the permission rebuild confirmation form.
+ */
+class RebuildPermissionsForm extends ConfirmFormBase {
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormID() {
+    return 'node_configure_rebuild_confirm';
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\ConfirmFormBase::getQuestion().
+   */
+  protected function getQuestion() {
+    return t('Are you sure you want to rebuild the permissions on site content?');
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\ConfirmFormBase::getCancelPath().
+   */
+  protected function getCancelPath() {
+    return 'admin/reports/status';
+  }
+
+  /**
+   * Overrides \Drupal\Core\Form\ConfirmFormBase::getDescription().
+   */
+  protected function getDescription() {
+    return t('This action rebuilds all permissions on site content, and may be a lengthy process. This action cannot be undone.');
+  }
+
+  /**
+   * Overrides \Drupal\Core\Form\ConfirmFormBase::getConfirmText().
+   */
+  protected function getConfirmText() {
+    return t('Rebuild permissions');
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submitForm().
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    node_access_rebuild(TRUE);
+    $form_state['redirect'] = 'admin/reports/status';
+  }
+
+}
diff --git a/core/modules/node/node.admin.inc b/core/modules/node/node.admin.inc
index 139b2d2..ce5c287 100644
--- a/core/modules/node/node.admin.inc
+++ b/core/modules/node/node.admin.inc
@@ -8,29 +8,6 @@
 use Drupal\Core\Database\Query\SelectInterface;
 
 /**
- * Page callback: Form constructor for the permission rebuild confirmation form.
- *
- * @return array
- *   An array as expected by drupal_render().
- *
- * @see node_configure_rebuild_confirm_submit()
- * @see node_menu()
- * @ingroup forms
- */
-function node_configure_rebuild_confirm() {
-  return confirm_form(array(), t('Are you sure you want to rebuild the permissions on site content?'),
-                  'admin/reports/status', t('This action rebuilds all permissions on site content, and may be a lengthy process. This action cannot be undone.'), t('Rebuild permissions'), t('Cancel'));
-}
-
-/**
- * Form submission handler for node_configure_rebuild_confirm().
- */
-function node_configure_rebuild_confirm_submit($form, &$form_state) {
-  node_access_rebuild(TRUE);
-  $form_state['redirect'] = 'admin/reports/status';
-}
-
-/**
  * Implements hook_node_operations().
  */
 function node_node_operations() {
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 4c7392b..54805fd 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1665,17 +1665,6 @@ function node_menu() {
     'type' => MENU_DEFAULT_LOCAL_TASK,
   );
 
-  $items['admin/reports/status/rebuild'] = array(
-    'title' => 'Rebuild permissions',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('node_configure_rebuild_confirm'),
-    // Any user than can potentially trigger a node_access_needs_rebuild(TRUE)
-    // has to be allowed access to the 'node access rebuild' confirm form.
-    'access arguments' => array('access administration pages'),
-    'type' => MENU_CALLBACK,
-    'file' => 'node.admin.inc',
-  );
-
   $items['admin/structure/types'] = array(
     'title' => 'Content types',
     'description' => 'Manage content types, including default status, front page promotion, comment settings, etc.',
@@ -1710,9 +1699,7 @@ function node_menu() {
   );
   $items['admin/structure/types/manage/%node_type/delete'] = array(
     'title' => 'Delete',
-    'page arguments' => array('node_type_delete_confirm', 4),
-    'access arguments' => array('administer content types'),
-    'file' => 'content_types.inc',
+    'route_name' => 'node_type_delete_confirm',
   );
   $items['node/add'] = array(
     'title' => 'Add content',
diff --git a/core/modules/node/node.routing.yml b/core/modules/node/node.routing.yml
new file mode 100644
index 0000000..22d102e
--- /dev/null
+++ b/core/modules/node/node.routing.yml
@@ -0,0 +1,13 @@
+node_type_delete_confirm:
+  pattern: '/admin/structure/types/manage/{type}/delete'
+  defaults:
+    _form: 'Drupal\node\Form\ContentTypeDeleteForm'
+  requirements:
+    _permission: 'administer content types'
+
+node_configure_rebuild_confirm:
+  pattern: '/admin/reports/status/rebuild'
+  defaults:
+    _form: 'Drupal\node\Form\RebuildPermissionsForm'
+  requirements:
+    _permission: 'access administration pages'
