diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php
index 41c3ba6..7c56b7c 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();
@@ -60,4 +82,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, 'submitForm')),
+      '#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 09cc203..4700acf 100644
--- a/core/lib/Drupal/Core/Entity/EntityListController.php
+++ b/core/lib/Drupal/Core/Entity/EntityListController.php
@@ -147,8 +147,7 @@ public function buildHeader() {
   public function buildRow(EntityInterface $entity) {
     $row['label'] = String::checkPlain($entity->label());
     $row['id'] = $entity->id();
-    $operations = $this->buildOperations($entity);
-    $row['operations']['data'] = $operations;
+    $row['operations']['data'] = $this->buildOperations($entity);
     return $row;
   }
 
@@ -189,9 +188,11 @@ 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) {
       if ($row = $this->buildRow($entity)) {
-        $build['#rows'][$entity->id()] = $row;
+        $build['#rows'][$entity->id()] = array_merge($header_sort, $row);
       }
     }
     return $build;
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeListController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeListController.php
index aaf2676..1ee7d33 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeListController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeListController.php
@@ -20,7 +20,7 @@ class CustomBlockTypeListController extends ConfigEntityListController {
    */
   public function getOperations(EntityInterface $entity) {
     $operations = parent::getOperations($entity);
-    if (module_exists('field_ui')) {
+    if ($this->moduleHandler->moduleExists('field_ui')) {
       $uri = $entity->uri();
       $operations['manage-fields'] = array(
         'title' => t('Manage fields'),
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListTest.php
index f97d6cf..3b7031a 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[@class="l-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[@class="l-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 820010f..5cfc6fc 100644
--- a/core/modules/contact/lib/Drupal/contact/CategoryListController.php
+++ b/core/modules/contact/lib/Drupal/contact/CategoryListController.php
@@ -1,13 +1,14 @@
 <?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\Component\Utility\String;
 
 /**
  * Provides a listing of contact categories.
@@ -15,7 +16,7 @@
 class CategoryListController extends ConfigEntityListController {
 
   /**
-   * Overrides Drupal\Core\Entity\EntityListController::getOperations().
+   * {@inheritdoc}
    */
   public function getOperations(EntityInterface $entity) {
     $operations = parent::getOperations($entity);
@@ -44,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(
+      'recipients' => t('Recipients'),
+      'selected' => t('Selected'),
+    ) + 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(
+      'recipients' => array(
+        '#markup' => ($entity->id() == 'personal' ? t('Selected user') : String::checkPlain(implode(', ', $entity->recipients))),
+      ),
+      'selected' => array(
+        '#markup' => ($default_category == $entity->id() && $entity->id() != 'personal' ? t('Yes') : t('No')),
+      ),
+    );
   }
 
 }
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 139c40b..834e29a 100644
--- a/core/modules/menu/lib/Drupal/menu/MenuListController.php
+++ b/core/modules/menu/lib/Drupal/menu/MenuListController.php
@@ -15,28 +15,27 @@
 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;
   }
 
@@ -63,7 +62,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 e61cac6..674f6c2 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');
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetListController.php b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetListController.php
index 42ebfb3..c8d73b4 100644
--- a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetListController.php
+++ b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutSetListController.php
@@ -16,15 +16,6 @@
 class ShortcutSetListController extends ConfigEntityListController {
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::buildHeader().
-   */
-  public function buildHeader() {
-    $row['label'] = t('Name');
-    $row['operations'] = t('Operations');
-    return $row;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function getOperations(EntityInterface $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 abcb75b..f3aecbd 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
@@ -34,7 +34,8 @@
  *   entity_keys = {
  *     "id" = "vid",
  *     "label" = "name",
- *     "uuid" = "uuid"
+ *     "uuid" = "uuid",
+ *     "weight" = "weight"
  *   }
  * )
  */
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyTest.php
index 5381156..0b7520d 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyTest.php
@@ -90,7 +90,7 @@ function testTaxonomyAdminChangingWeights() {
     foreach ($vocabularies as $key => $vocabulary) {
       $weight = -$vocabulary->weight;
       $vocabularies[$key]->weight = $weight;
-      $edit['vocabularies[' . $key . '][weight]'] = $weight;
+      $edit['entities[' . $key . '][weight]'] = $weight;
     }
     // Saving the new weights via the interface.
     $this->drupalPost('admin/structure/taxonomy', $edit, t('Save'));
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php
index 87f247c..f7c3e5c 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php
@@ -58,33 +58,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' => $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;
   }
 
@@ -98,18 +71,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;
   }
 
@@ -117,27 +82,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;
   }
@@ -145,24 +94,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 4c6602a..d485947 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 3f92dfd..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' => $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.'));
   }
