diff --git a/core/modules/contact/contact.admin.inc b/core/modules/contact/contact.admin.inc
index a3e63f6..3fbe5d4 100644
--- a/core/modules/contact/contact.admin.inc
+++ b/core/modules/contact/contact.admin.inc
@@ -17,7 +17,119 @@
  */
 function contact_category_list() {
   drupal_set_title(t('Contact form categories'));
-  return entity_list_controller('contact_category')->render();
+  $build = entity_list_controller('contact_category')->render();
+  if (count($build['#entities']) > 1) {
+    // Enables ordering of contact categories if there's more then one in list.
+    $build = drupal_get_form('contact_category_list_form', $build);
+  }
+  return $build;
+}
+
+/**
+ * Form constructor for categories overview form.
+ */
+function contact_category_list_form($form, $form_state, $build) {
+  $form['categories'] = array(
+    '#categories' => $build['#entities'],
+    '#header' => $build['#header'] + array('weight' => t('Weight')),
+    '#empty' => $build['#empty'],
+    '#tree' => TRUE,
+    '#theme' => 'contact_category_list_form_table',
+  );
+  $default_category = config('contact.settings')->get('default_category');
+  foreach ($build['#entities'] as $category) {
+    $form['categories'][$category->id()]['category']['#markup'] = $build['#rows'][$category->id()]['category'];
+    $form['categories'][$category->id()]['recipients']['#markup'] = $build['#rows'][$category->id()]['recipients'];
+    // Allows to change the default contact category.
+    $form['categories'][$category->id()]['default'] = array(
+      '#type' => 'radio',
+      '#parents' => array('category_default'),
+      '#title' => t('Set @title as default', array('@title' => $category->label())),
+      '#title_display' => 'invisible',
+      '#return_value' => $category->id(),
+      '#default_value' => ($default_category == $category->id() ? $category->id() : NULL),
+      '#id' => 'edit-category-default-' . $category->id(),
+    );
+    // Inherit available operations.
+    $form['categories'][$category->id()]['operations'] = $build['#rows'][$category->id()]['operations']['data'];
+    // Allows changing a contact category weight.
+    $form['categories'][$category->id()]['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight for @title', array('@title' => $category->label())),
+      '#title_display' => 'invisible',
+      '#default_value' => $category->weight,
+    );
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save changes'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submission handler for contact_category_list_form().
+ */
+function contact_category_list_form_submit($form, &$form_state) {
+  $categories = $form['categories']['#categories'];
+  foreach ($categories as $category) {
+    if ($form_state['values']['categories'][$category->id()]['weight'] != $category->weight) {
+      $category->set('weight', $form_state['values']['categories'][$category->id()]['weight']);
+      $category->save();
+    }
+  }
+
+  // Update the site's default contact category.
+  $contact_config = config('contact.settings');
+  if ($form_state['values']['category_default'] != $contact_config->get('default_category')) {
+    $contact_config
+      ->set('default_category', $form_state['values']['category_default'])
+      ->save();
+  }
+
+  drupal_set_message(t('Changes saved.'));
+}
+
+/**
+ * Returns HTML for the list of contact categories form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_contact_category_list_form_table($variables) {
+  $form = $variables['form'];
+
+  $rows = array();
+  foreach (element_children($form) as $cid) {
+    $form[$cid]['weight']['#attributes']['class'] = array('entity-weight');
+    $rows[] = array(
+      'data' => array(
+        drupal_render($form[$cid]['category']),
+        drupal_render($form[$cid]['recipients']),
+        drupal_render($form[$cid]['default']),
+        drupal_render($form[$cid]['operations']),
+        drupal_render($form[$cid]['weight']),
+      ),
+      'class' => array('draggable'),
+    );
+  }
+  $output = theme('table', array(
+    'header' => $form['#header'],
+    'rows' => $rows,
+    'attributes' => array('id' => 'contact-category-list'),
+    'empty' => $form['#empty'],
+  ));
+  $output .= drupal_render_children($form);
+
+  drupal_add_tabledrag('contact-category-list', 'order', 'sibling', 'entity-weight');
+
+  return $output;
 }
 
 /**
diff --git a/core/modules/contact/contact.module b/core/modules/contact/contact.module
index 585f011..b18ef05 100644
--- a/core/modules/contact/contact.module
+++ b/core/modules/contact/contact.module
@@ -338,3 +338,15 @@ function contact_form_user_admin_settings_submit($form, &$form_state) {
     ->set('user_default_enabled', $form_state['values']['contact_default_status'])
     ->save();
 }
+
+/**
+ * Implements hook_theme().
+ */
+function contact_theme() {
+  return array(
+    'contact_category_list_form_table' => array(
+      'render element' => 'form',
+      'file' => 'contact.admin.inc',
+    ),
+  );
+}
diff --git a/core/modules/contact/lib/Drupal/contact/CategoryListController.php b/core/modules/contact/lib/Drupal/contact/CategoryListController.php
index 617fa93..81d55e2 100644
--- a/core/modules/contact/lib/Drupal/contact/CategoryListController.php
+++ b/core/modules/contact/lib/Drupal/contact/CategoryListController.php
@@ -20,7 +20,7 @@ class CategoryListController extends ConfigEntityListController {
   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;
   }
@@ -32,9 +32,28 @@ public function buildRow(EntityInterface $entity) {
     $row['category'] = check_plain($entity->label());
     $row['recipients'] = check_plain(implode(', ', $entity->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();
+    $build = array(
+      '#theme' => 'table',
+      '#header' => $this->buildHeader(),
+      '#rows' => array(),
+      '#empty' => t('There is no @label yet.', array('@label' => $this->entityInfo['label'])),
+    );
+    foreach ($entities as $entity) {
+      $build['#rows'][$entity->id()] = $this->buildRow($entity);
+    }
+    // Store entities for later usage in building form.
+    $build['#entities'] = $entities;
+    return $build;
+  }
+
 }
