diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php
index f0d1c5c..ddbeb6c 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php
@@ -9,14 +9,36 @@
 
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityListController;
+use Drupal\Core\Entity\EntityStorageControllerInterface;
+use Drupal\Core\Form\FormInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
 
 /**
  * Defines the default list controller for ConfigEntity objects.
  */
-class ConfigEntityListController extends EntityListController {
+class ConfigEntityListController extends EntityListController implements FormInterface {
 
   /**
-   * Overrides Drupal\Core\Entity\EntityListController::load().
+   * Name of the entity's weight field or FALSE if no field is provided.
+   *
+   * @var string|bool
+   */
+  protected $weightKey = FALSE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct($entity_type, array $entity_info, EntityStorageControllerInterface $storage, ModuleHandlerInterface $module_handler) {
+    parent::__construct($entity_type, $entity_info, $storage, $module_handler);
+
+    // Check if the entity type supports weighting.
+    if (!empty($this->entityInfo['entity_keys']['weight'])) {
+      $this->weightKey = $this->entityInfo['entity_keys']['weight'];
+    }
+  }
+
+  /**
+   * {@inheritdoc}
    */
   public function load() {
     $entities = parent::load();
@@ -25,7 +47,7 @@ public function load() {
   }
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::getOperations();
+   * {@inheritdoc}
    */
   public function getOperations(EntityInterface $entity) {
     $operations = parent::getOperations($entity);
@@ -57,4 +79,124 @@ public function getOperations(EntityInterface $entity) {
     return $operations;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function buildHeader() {
+    $row = parent::buildHeader();
+    // Override defaults.
+    $row['label'] = $this->entityInfo['label'];
+    unset($row['id']);
+    if (empty($this->weightKey)) {
+      return $row;
+    }
+    // @todo Simplify this http://drupal.org/node/1876718
+    return $row = array_slice($row, 0, 2, TRUE) + array(
+      'weight' => t('Weight'),
+    ) + array_slice($row, 0, NULL, TRUE);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRow(EntityInterface $entity) {
+    $row = parent::buildRow($entity);
+    // Use markup here to allow child implementations to add classes.
+    $row['label'] = array('data' => array(
+      '#markup' => check_plain($row['label']),
+    ));
+
+    unset($row['id']);
+    if (empty($this->weightKey)) {
+      return $row;
+    }
+    // Override default values to markup elements.
+    $row['#attributes']['class'][] = 'draggable';
+    $row['#weight'] = $entity->get($this->weightKey);
+    // Add weight column.
+    $row['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight for @title', array('@title' => $entity->label())),
+      '#title_display' => 'invisible',
+      '#default_value' => $entity->get($this->weightKey),
+      '#attributes' => array('class' => array('weight')),
+    );
+    return $row;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render() {
+    if (empty($this->weightKey)) {
+      return parent::render();
+    }
+
+    return drupal_get_form($this);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return $this->entityType . '_admin_list_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state) {
+    $form['entities'] = array(
+      '#type' => 'table',
+      '#header' => $this->buildHeader(),
+      '#empty' => t('There is no @label yet.', array('@label' => $this->entityInfo['label'])),
+      '#tabledrag' => array(
+        array('order', 'sibling', 'weight'),
+      ),
+    );
+
+    // Save header's order of columns for sorting data-rows.
+    $header_sort = array_flip(array_keys($form['entities']['#header']));
+    foreach ($this->load() as $entity) {
+      $row = $this->buildRow($entity);
+      // Sort row columns by header's order.
+      $form['entities'][$entity->id()] = array_merge($header_sort, $row);
+    }
+
+    $form['actions']['#type'] = 'actions';
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save order'),
+      '#submit' => array(array($this, 'submit')),
+      '#button_type' => 'primary',
+    );
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, array &$form_state) {
+    // No validation.
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    $values = $form_state['values']['entities'];
+
+    $entities = $this->load();
+    foreach ($values as $id => $value) {
+      if (isset($entities[$id]) && $entities[$id]->get($this->weightKey) != $value['weight']) {
+        // Save entity only when its weight was changed.
+        $entities[$id]->set($this->weightKey, $value['weight']);
+        $entities[$id]->save();
+      }
+    }
+
+    drupal_set_message(t('The configuration options have been saved.'));
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityListController.php b/core/lib/Drupal/Core/Entity/EntityListController.php
index b5a5f9c..1008170 100644
--- a/core/lib/Drupal/Core/Entity/EntityListController.php
+++ b/core/lib/Drupal/Core/Entity/EntityListController.php
@@ -139,8 +139,7 @@ public function buildHeader() {
   public function buildRow(EntityInterface $entity) {
     $row['label'] = $entity->label();
     $row['id'] = $entity->id();
-    $operations = $this->buildOperations($entity);
-    $row['operations']['data'] = $operations;
+    $row['operations']['data'] = $this->buildOperations($entity);
     return $row;
   }
 
@@ -181,8 +180,12 @@ public function render() {
       '#rows' => array(),
       '#empty' => t('There is no @label yet.', array('@label' => $this->entityInfo['label'])),
     );
+    // Save header's order of columns for sorting data-rows.
+    $header_sort = array_flip(array_keys($build['#header']));
     foreach ($this->load() as $entity) {
-      $build['#rows'][$entity->id()] = $this->buildRow($entity);
+      $row = $this->buildRow($entity);
+      // Sort row columns by the header's order.
+      $build['#rows'][$entity->id()] = array_merge($header_sort, $row);
     }
     return $build;
   }
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListTest.php
index 7917731..71218e9 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListTest.php
@@ -79,21 +79,21 @@ function testList() {
     $this->assertIdentical($expected_operations, $actual_operations);
 
     // Test buildHeader() method.
+    $entity_info = $this->container->get('plugin.manager.entity')->getDefinition('config_test');
     $expected_items = array(
-      'label' => 'Label',
-      'id' => 'Machine name',
+      'label' => $entity_info['label'],
       'operations' => 'Operations',
     );
     $actual_items = $controller->buildHeader();
     $this->assertIdentical($expected_items, $actual_items, 'Return value from buildHeader matches expected.');
 
     // Test buildRow() method.
-    $build_operations = $controller->buildOperations($entity);
     $expected_items = array(
-      'label' => 'Default',
-      'id' => 'dotted.default',
+      'label' => array('data' => array(
+        '#markup' => 'Default',
+      )),
       'operations' => array(
-        'data' => $build_operations,
+        'data' => $controller->buildOperations($entity),
       ),
     );
     $actual_items = $controller->buildRow($entity);
@@ -171,24 +171,24 @@ function testListUI() {
 
     // Test the table header.
     $elements = $this->xpath('//div[@id="content"]//table/thead/tr/th');
-    $this->assertEqual(count($elements), 3, 'Correct number of table header cells found.');
+    $this->assertEqual(count($elements), 2, 'Correct number of table header cells found.');
 
     // Test the contents of each th cell.
-    $expected_items = array('Label', 'Machine name', 'Operations');
+    $entity_info = $this->container->get('plugin.manager.entity')->getDefinition('config_test');
+    $expected_items = array($entity_info['label'], 'Operations');
     foreach ($elements as $key => $element) {
       $this->assertIdentical((string) $element[0], $expected_items[$key]);
     }
 
     // Check the number of table row cells.
     $elements = $this->xpath('//div[@id="content"]//table/tbody/tr[@class="odd"]/td');
-    $this->assertEqual(count($elements), 3, 'Correct number of table row cells found.');
+    $this->assertEqual(count($elements), 2, 'Correct number of table row cells found.');
 
     // Check the contents of each row cell. The first cell contains the label,
     // the second contains the machine name, and the third contains the
     // operations list.
     $this->assertIdentical((string) $elements[0], 'Default');
-    $this->assertIdentical((string) $elements[1], 'dotted.default');
-    $this->assertTrue($elements[2]->children()->xpath('//ul'), 'Operations list found.');
+    $this->assertTrue($elements[1]->children()->xpath('//ul'), 'Operations list found.');
 
     // Add a new entity using the operations link.
     $this->assertLink('Add test configuration');
@@ -208,7 +208,6 @@ function testListUI() {
     // text of the label and machine name appears in the list (versus elsewhere
     // on the page).
     $this->assertFieldByXpath('//td', 'Antelope', "Label found for added 'Antelope' entity.");
-    $this->assertFieldByXpath('//td', 'antelope', "Machine name found for added 'Antelope' entity.");
 
     // Edit the entity using the operations link.
     $this->assertLinkByHref('admin/structure/config_test/manage/antelope');
@@ -222,7 +221,6 @@ function testListUI() {
     // text of the label and machine name appears in the list (versus elsewhere
     // on the page).
     $this->assertFieldByXpath('//td', 'Albatross', "Label found for updated 'Albatross' entity.");
-    $this->assertFieldByXpath('//td', 'albatross', "Machine name found for updated 'Albatross' entity.");
 
     // Delete the added entity using the operations link.
     $this->assertLinkByHref('admin/structure/config_test/manage/albatross/delete');
@@ -234,7 +232,6 @@ function testListUI() {
     // Verify that the text of the label and machine name does not appear in
     // the list (though it may appear elsewhere on the page).
     $this->assertNoFieldByXpath('//td', 'Albatross', "No label found for deleted 'Albatross' entity.");
-    $this->assertNoFieldByXpath('//td', 'albatross', "No machine name found for deleted 'Albatross' entity.");
 
     // Delete the original entity using the operations link.
     $this->clickLink('Delete');
@@ -245,7 +242,6 @@ function testListUI() {
     // Verify that the text of the label and machine name does not appear in
     // the list (though it may appear elsewhere on the page).
     $this->assertNoFieldByXpath('//td', 'Default', "No label found for deleted 'Default' entity.");
-    $this->assertNoFieldByXpath('//td', 'dotted.default', "No machine name found for deleted 'Default' entity.");
 
     // Confirm that the empty text is displayed.
     $this->assertText('There is no Test configuration yet.');
diff --git a/core/modules/contact/lib/Drupal/contact/CategoryListController.php b/core/modules/contact/lib/Drupal/contact/CategoryListController.php
index 25f18f2..5b4d175 100644
--- a/core/modules/contact/lib/Drupal/contact/CategoryListController.php
+++ b/core/modules/contact/lib/Drupal/contact/CategoryListController.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Definition of Drupal\contact\CategoryListController.
+ * Contains \Drupal\contact\CategoryListController.
  */
 
 namespace Drupal\contact;
@@ -15,7 +15,7 @@
 class CategoryListController extends ConfigEntityListController {
 
   /**
-   * Overrides Drupal\Core\Entity\EntityListController::getOperations().
+   * {@inheritdoc}
    */
   public function getOperations(EntityInterface $entity) {
     $operations = parent::getOperations($entity);
@@ -45,33 +45,33 @@ public function getOperations(EntityInterface $entity) {
   }
 
   /**
-   * Overrides Drupal\Core\Entity\EntityListController::buildHeader().
+   * {@inheritdoc}
    */
   public function buildHeader() {
-    $row['category'] = t('Category');
-    $row['recipients'] = t('Recipients');
-    $row['selected'] = t('Selected');
-    $row['operations'] = t('Operations');
-    return $row;
+    $row = parent::buildHeader();
+    // The two array_slice work together to put additional columns after the
+    // first ones.
+    // @todo Simplify this http://drupal.org/node/1876718
+    return array_slice($row, 0, 1, TRUE) + array(
+      'selected' => t('Selected'),
+      'recipients' => t('Recipients'),
+    ) + array_slice($row, 0, NULL, TRUE);
   }
 
   /**
-   * Overrides Drupal\Core\Entity\EntityListController::buildRow().
+   * {@inheritdoc}
    */
   public function buildRow(EntityInterface $entity) {
-    $row['category'] = check_plain($entity->label());
-    // Special case the personal category.
-    if ($entity->id() == 'personal') {
-      $row['recipients'] = t('Selected user');
-      $row['selected'] = t('No');
-    }
-    else {
-      $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['operations']['data'] = $this->buildOperations($entity);
-    return $row;
+    $default_category = config('contact.settings')->get('default_category');
+    // Add own columns.
+    return parent::buildRow($entity) + array(
+      'selected' => array(
+        '#markup' => ($default_category == $entity->id() && $entity->id() != 'personal' ? t('Yes') : t('No')),
+      ),
+      'recipients' => array(
+        '#markup' => check_plain(implode(', ', $entity->recipients)),
+      ),
+    );
   }
 
 }
diff --git a/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Category.php b/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Category.php
index 0b3323f..f383350 100644
--- a/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Category.php
+++ b/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Category.php
@@ -35,7 +35,8 @@
  *   entity_keys = {
  *     "id" = "id",
  *     "label" = "label",
- *     "uuid" = "uuid"
+ *     "uuid" = "uuid",
+ *     "weight" = "weight"
  *   }
  * )
  */
diff --git a/core/modules/menu/lib/Drupal/menu/MenuListController.php b/core/modules/menu/lib/Drupal/menu/MenuListController.php
index dfa6019..ee79425 100644
--- a/core/modules/menu/lib/Drupal/menu/MenuListController.php
+++ b/core/modules/menu/lib/Drupal/menu/MenuListController.php
@@ -15,33 +15,32 @@
 class MenuListController extends ConfigEntityListController {
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::buildHeader().
+   * {@inheritdoc}
    */
   public function buildHeader() {
-    $row['title'] = t('Title');
-    $row['description'] = array(
-      'data' => t('Description'),
-      'class' => array(RESPONSIVE_PRIORITY_MEDIUM),
-    );
-    $row['operations'] = t('Operations');
-    return $row;
+    $row = parent::buildHeader();
+    // Add description column after first too.
+    // @todo Simplify this http://drupal.org/node/1876718
+    return array_slice($row, 0, 1, TRUE) + array(
+      'description' => array(
+        'data' => t('Description'),
+        'class' => array(RESPONSIVE_PRIORITY_MEDIUM),
+      ),
+    ) + array_slice($row, 0, NULL, TRUE);
   }
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::buildRow().
+   * {@inheritdoc}
    */
   public function buildRow(EntityInterface $entity) {
-    $row['title'] = array(
-      'data' => check_plain($entity->label()),
-      'class' => array('menu-label'),
-    );
+    $row = parent::buildRow($entity);
+    $row['label']['class'] = array('menu-label');
     $row['description'] = filter_xss_admin($entity->description);
-    $row['operations']['data'] = $this->buildOperations($entity);
     return $row;
   }
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::getOperations();
+   * {@inheritdoc}
    */
   public function getOperations(EntityInterface $entity) {
     $operations = parent::getOperations($entity);
@@ -66,7 +65,7 @@ public function getOperations(EntityInterface $entity) {
   }
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::render();
+   * {@inheritdoc}
    */
   public function render() {
     $build = parent::render();
diff --git a/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php b/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php
index 114e30c..cca5880 100644
--- a/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php
+++ b/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php
@@ -99,7 +99,6 @@ public function testPictureAdmin() {
     $this->drupalGet('admin/config/media/picturemapping');
     $this->assertNoText('There is no Picture mapping yet.');
     $this->assertText('Mapping One');
-    $this->assertText('mapping_one');
 
     // Edit the group.
     $this->drupalGet('admin/config/media/picturemapping/mapping_one/edit');
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutListController.php b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutListController.php
index a40005c..c32239e 100644
--- a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutListController.php
+++ b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutListController.php
@@ -15,16 +15,7 @@
 class ShortcutListController extends ConfigEntityListController {
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::buildHeader().
-   */
-  public function buildHeader() {
-    $row['label'] = t('Name');
-    $row['operations'] = t('Operations');
-    return $row;
-  }
-
-  /**
-   * Overrides \Drupal\Core\Entity\EntityListController::getOperations().
+   * {@inheritdoc}
    */
   public function getOperations(EntityInterface $entity) {
     $operations = parent::getOperations($entity);
@@ -43,13 +34,4 @@ public function getOperations(EntityInterface $entity) {
     return $operations;
   }
 
-  /**
-   * Overrides \Drupal\Core\Entity\EntityListController::buildRow().
-   */
-  public function buildRow(EntityInterface $entity) {
-    $row['name'] = check_plain($entity->label());
-    $row['operations']['data'] = $this->buildOperations($entity);
-    return $row;
-  }
-
 }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Vocabulary.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Vocabulary.php
index 9d55435..806ac98 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Vocabulary.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Vocabulary.php
@@ -32,7 +32,8 @@
  *   entity_keys = {
  *     "id" = "vid",
  *     "label" = "name",
- *     "uuid" = "uuid"
+ *     "uuid" = "uuid",
+ *     "weight" = "weight"
  *   }
  * )
  */
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php
index 11ed4a1..689f7b8 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php
@@ -56,33 +56,6 @@ public function getOperations(EntityInterface $entity) {
   public function buildHeader() {
     $row = parent::buildHeader();
     $row['label'] = t('Vocabulary name');
-    unset($row['id']);
-    $row['weight'] = t('Weight');
-    return $row;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildRow(EntityInterface $entity) {
-    $row = parent::buildRow($entity);
-
-    // Override default values to markup elements.
-    $row['#attributes']['class'][] = 'draggable';
-    unset($row['id']);
-
-    $row['label'] = array(
-      '#markup' => check_plain($row['label']),
-    );
-    $row['#weight'] = $entity->get('weight');
-    // Add weight column.
-    $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')),
-    );
     return $row;
   }
 
@@ -96,18 +69,10 @@ public function render() {
       // vocabulary exists.
       return drupal_get_form($this);
     }
-    $build = array(
-      '#theme' => 'table',
-      '#header' => $this->buildHeader(),
-      '#rows' => array(),
-      '#empty' => t('No vocabularies available. <a href="@link">Add vocabulary</a>.', array('@link' => url('admin/structure/taxonomy/add'))),
-    );
-    unset($build['#header']['weight']);
-    foreach ($entities as $entity) {
-      $row = parent::buildRow($entity);
-      unset($row['id']);
-      $build['#rows'][$entity->id()] = $row;
-    }
+    // Unset weight key to use render.
+    unset($this->weightKey);
+    $build = parent::render();
+    $build['#empty'] = t('No vocabularies available. <a href="@link">Add vocabulary</a>.', array('@link' => url('admin/structure/taxonomy/add')));
     return $build;
   }
 
@@ -115,27 +80,11 @@ public function render() {
    * {@inheritdoc}
    */
   public function buildForm(array $form, array &$form_state) {
-    $form['vocabularies'] = array(
-      '#type' => 'table',
-      '#header' => $this->buildHeader(),
-      '#tabledrag' => array(
-        array('order', 'sibling', 'weight'),
-      ),
-      '#attributes' => array(
-        'id' => 'taxonomy',
-      ),
-    );
-
-    foreach ($this->load() as $entity) {
-      $form['vocabularies'][$entity->id()] = $this->buildRow($entity);
-    }
-
-    $form['actions']['#type'] = 'actions';
-    $form['actions']['submit'] = array(
-      '#type' => 'submit',
-      '#value' => t('Save'),
-      '#button_type' => 'primary',
+    $form = parent::buildForm($form, $form_state);
+    $form['vocabularies']['#attributes'] = array(
+      'id' => 'taxonomy',
     );
+    $form['actions']['submit']['#value'] = t('Save');
 
     return $form;
   }
@@ -143,24 +92,8 @@ public function buildForm(array $form, array &$form_state) {
   /**
    * {@inheritdoc}
    */
-  public function validateForm(array &$form, array &$form_state) {
-    // No validation.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function submitForm(array &$form, array &$form_state) {
-    $vocabularies = $form_state['values']['vocabularies'];
-
-    $entities = entity_load_multiple($this->entityType, array_keys($vocabularies));
-    foreach ($vocabularies 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();
-      }
-    }
+    parent::submitForm($form, $form_state);
 
     drupal_set_message(t('The configuration options have been saved.'));
   }
diff --git a/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php
index d35d7f1..947fde2 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php
@@ -33,7 +33,8 @@
  *   entity_keys = {
  *     "id" = "id",
  *     "uuid" = "uuid",
- *     "label" = "label"
+ *     "label" = "label",
+ *     "weight" = "weight"
  *   }
  * )
  */
diff --git a/core/modules/user/lib/Drupal/user/RoleListController.php b/core/modules/user/lib/Drupal/user/RoleListController.php
index a2250f5..30670c5 100644
--- a/core/modules/user/lib/Drupal/user/RoleListController.php
+++ b/core/modules/user/lib/Drupal/user/RoleListController.php
@@ -29,8 +29,6 @@ public function getFormID() {
   public function buildHeader() {
     $row = parent::buildHeader();
     $row['label'] = t('Name');
-    unset($row['id']);
-    $row['weight'] = t('Weight');
     return $row;
   }
 
@@ -55,83 +53,8 @@ public function getOperations(EntityInterface $entity) {
   /**
    * {@inheritdoc}
    */
-  public function buildRow(EntityInterface $entity) {
-    $row = parent::buildRow($entity);
-
-    // Override default values to markup elements.
-    $row['#attributes']['class'][] = 'draggable';
-    unset($row['id']);
-
-    $row['label'] = array(
-      '#markup' => check_plain($row['label']),
-    );
-    $row['#weight'] = $entity->get('weight');
-    // Add weight column.
-    $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')),
-    );
-    return $row;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function render() {
-    return drupal_get_form($this);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildForm(array $form, array &$form_state) {
-    $form['entities'] = array(
-      '#type' => 'table',
-      '#header' => $this->buildHeader(),
-      '#empty' => t('There is no @label yet.', array('@label' => $this->entityInfo['label'])),
-      '#tabledrag' => array(
-        array('order', 'sibling', 'weight'),
-      ),
-    );
-
-    foreach ($this->load() as $entity) {
-      $form['entities'][$entity->id()] = $this->buildRow($entity);
-    }
-
-    $form['actions']['#type'] = 'actions';
-    $form['actions']['submit'] = array(
-      '#type' => 'submit',
-      '#value' => t('Save order'),
-      '#button_type' => 'primary',
-    );
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function validateForm(array &$form, array &$form_state) {
-    // No validation.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   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();
-      }
-    }
+    parent::submitForm($form, $form_state);
 
     drupal_set_message(t('The role settings have been updated.'));
   }
