diff --git a/core/modules/contact/contact.admin.inc b/core/modules/contact/contact.admin.inc
index bc706c3..6bc8ed3 100644
--- a/core/modules/contact/contact.admin.inc
+++ b/core/modules/contact/contact.admin.inc
@@ -17,7 +17,7 @@
  */
 function contact_category_list() {
   drupal_set_title(t('Contact form categories'));
-  return drupal_container()->get('plugin.manager.entity')
+  return Drupal::service('plugin.manager.entity')
     ->getListController('contact_category')
     ->render();
 }
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.'));
+  }
+
 }
