diff --git a/core/modules/contact/contact.admin.inc b/core/modules/contact/contact.admin.inc
index 32ddf71..d686009 100644
--- a/core/modules/contact/contact.admin.inc
+++ b/core/modules/contact/contact.admin.inc
@@ -8,21 +8,6 @@
 use Drupal\contact\Plugin\Core\Entity\Category;
 
 /**
- * Page callback: Lists contact categories.
- *
- * @return array
- *   A build array in the format expected by drupal_render().
- *
- * @see contact_menu()
- */
-function contact_category_list() {
-  drupal_set_title(t('Contact form categories'));
-  return Drupal::entityManager()
-    ->getListController('contact_category')
-    ->render();
-}
-
-/**
  * Page callback: Presents the category creation form.
  *
  * @return array
diff --git a/core/modules/contact/contact.module b/core/modules/contact/contact.module
index 3ef1ce6..35302f8 100644
--- a/core/modules/contact/contact.module
+++ b/core/modules/contact/contact.module
@@ -58,11 +58,9 @@ function contact_permission() {
  */
 function contact_menu() {
   $items['admin/structure/contact'] = array(
-    'title' => 'Contact form',
+    'title' => 'Contact form categories',
     'description' => 'Create a system contact form and set up categories for the form to use.',
-    'page callback' => 'contact_category_list',
-    'access arguments' => array('administer contact forms'),
-    'file' => 'contact.admin.inc',
+    'route_name' => 'contact_category_list',
   );
   $items['admin/structure/contact/add'] = array(
     'title' => 'Add category',
diff --git a/core/modules/contact/contact.routing.yml b/core/modules/contact/contact.routing.yml
index 1f34937..df992db 100644
--- a/core/modules/contact/contact.routing.yml
+++ b/core/modules/contact/contact.routing.yml
@@ -4,3 +4,11 @@ contact_category_delete:
     _form: '\Drupal\contact\Form\DeleteForm'
   requirements:
     _permission: 'administer contact forms'
+
+contact_category_list:
+  pattern: 'admin/structure/contact'
+  defaults:
+    _content: '\Drupal\Core\Entity\Controller\EntityListController::listing'
+    entity_type: 'contact_category'
+  requirements:
+    _permission: 'administer contact forms'
diff --git a/core/modules/contact/lib/Drupal/contact/CategoryListController.php b/core/modules/contact/lib/Drupal/contact/CategoryListController.php
index a3ec886..058979a 100644
--- a/core/modules/contact/lib/Drupal/contact/CategoryListController.php
+++ b/core/modules/contact/lib/Drupal/contact/CategoryListController.php
@@ -1,21 +1,29 @@
 <?php
 
 /**
- * Definition of Drupal\contact\CategoryListController.
+ * Contains \Drupal\contact\CategoryListController.
  */
 
 namespace Drupal\contact;
 
 use Drupal\Core\Config\Entity\ConfigEntityListController;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Form\FormInterface;
 
 /**
  * Provides a listing of contact categories.
  */
-class CategoryListController extends ConfigEntityListController {
+class CategoryListController extends ConfigEntityListController implements FormInterface {
 
   /**
-   * Overrides Drupal\Core\Entity\EntityListController::getOperations().
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormID() {
+    return 'contact_category_list_form';
+  }
+
+  /**
+   * Overrides \Drupal\Core\Entity\EntityListController::getOperations().
    */
   public function getOperations(EntityInterface $entity) {
     $operations = parent::getOperations($entity);
@@ -38,26 +46,132 @@ public function getOperations(EntityInterface $entity) {
   }
 
   /**
-   * Overrides Drupal\Core\Entity\EntityListController::buildHeader().
+   * Overrides \Drupal\Core\Entity\EntityListController::buildHeader().
    */
   public function buildHeader() {
     $row['category'] = t('Category');
     $row['recipients'] = t('Recipients');
-    $row['selected'] = t('Selected');
+    $row['default'] = t('Default');
     $row['operations'] = t('Operations');
     return $row;
   }
 
   /**
-   * Overrides Drupal\Core\Entity\EntityListController::buildRow().
+   * Overrides \Drupal\Core\Entity\EntityListController::buildRow().
    */
   public function buildRow(EntityInterface $entity) {
     $row['category'] = check_plain($entity->label());
-    $row['recipients'] = check_plain(implode(', ', $entity->recipients));
+    $row['recipients'] = check_plain(implode(', ', $entity->get('recipients')));
     $default_category = config('contact.settings')->get('default_category');
-    $row['selected'] = ($default_category == $entity->id() ? t('Yes') : t('No'));
+    $row['default'] = ($default_category == $entity->id() ? t('Yes') : t('No'));
     $row['operations']['data'] = $this->buildOperations($entity);
     return $row;
   }
 
+  /**
+   * Overrides \Drupal\Core\Entity\EntityListController::render().
+   */
+  public function render() {
+    $entities = $this->load();
+    if (count($entities) > 1) {
+      // Creates a form for manipulating contact category form weights.
+      return drupal_get_form($this);
+    }
+
+    return parent::render();
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::buildForm().
+   */
+  public function buildForm(array $form, array &$form_state) {
+    $form['entities'] = array(
+      '#type' => 'table',
+      '#header' => $this->buildHeader() + array('weight' => t('Weight')),
+      '#empty' => t('There is no @label yet.', array('@label' => $this->entityInfo['label'])),
+      '#tabledrag' => array(
+        array('order', 'sibling', 'weight'),
+      ),
+    );
+    $default_category = config('contact.settings')->get('default_category');
+    foreach ($this->load() as $entity) {
+      $row = $this->buildRow($entity);
+      // Override default values to markup elements.
+      $uri = $entity->uri();
+      $row['category'] = array('data' => array(
+        '#type' => 'link',
+        '#title' => $entity->label(),
+        '#href' => $uri['path'],
+        '#options' => $uri['options'],
+      ));
+      $row['recipients'] = array(
+        '#markup' => $row['recipients'],
+      );
+      // Allow to change default contact category.
+      $row['default'] = array(
+        '#type' => 'radio',
+        '#title' => t('Set @title as default', array('@title' => $entity->label())),
+        '#title_display' => 'invisible',
+        '#return_value' => $entity->id(),
+        '#default_value' => ($default_category == $entity->id() ? $entity->id() : NULL),
+        '#parents' => array('default_category'),
+        '#id' => 'edit-entities-default',
+      );
+      // Add weight column and ordering.
+      $row['#weight'] = $entity->get('weight');
+      $row['#attributes']['class'][] = 'draggable';
+      $row['weight'] = array(
+        '#type' => 'weight',
+        '#title' => t('Weight for @title', array('@title' => $entity->label())),
+        '#title_display' => 'invisible',
+        '#default_value' => $entity->get('weight'),
+        '#attributes' => array('class' => array('weight')),
+      );
+
+      $form['entities'][$entity->id()] = $row;
+    }
+
+    $form['actions']['#type'] = 'actions';
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save changes'),
+      '#button_type' => 'primary',
+    );
+
+    return $form;
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::validateForm().
+   */
+  public function validateForm(array &$form, array &$form_state) {
+    // No validation.
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::submitForm().
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    $values = $form_state['values']['entities'];
+
+    $entities = entity_load_multiple($this->entityType, array_keys($values));
+    foreach ($values as $id => $value) {
+      if (isset($entities[$id]) && $value['weight'] != $entities[$id]->get('weight')) {
+        // Update changed weight.
+        $entities[$id]->set('weight', $value['weight']);
+        $entities[$id]->save();
+      }
+    }
+    // Update the site's default contact category.
+    $contact_config = config('contact.settings');
+    $default_category = $form_state['values']['default_category'];
+    if (isset($entities[$default_category]) && $default_category != $contact_config->get('default_category')) {
+      $contact_config
+        ->set('default_category', $default_category)
+        ->save();
+    }
+
+    drupal_set_message(t('Changes have been saved.'));
+  }
+
 }
