diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php
index 3977310..92b7a38 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityListController.php
@@ -8,6 +8,8 @@
 namespace Drupal\Core\Config\Entity;
 
 use Drupal\Core\Entity\EntityListController;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityStorageControllerInterface;
 
 /**
  * Defines the default list controller for ConfigEntity objects.
@@ -15,6 +17,28 @@
 class ConfigEntityListController extends EntityListController {
 
   /**
+   * Name of the entity's weight field or FALSE if no field is provided.
+   *
+   * @var string|bool
+   */
+  protected $weightKey;
+
+  /**
+   * Overrides EntityListController::__construct().
+   */
+  public function __construct($entity_type, EntityStorageControllerInterface $storage) {
+    parent::__construct($entity_type, $storage);
+
+    // Check if the entity type supports weighting.
+    if (!empty($this->entityInfo['entity_keys']['weight'])) {
+      $this->weightKey = $this->entityInfo['entity_keys']['weight'];
+    }
+    else {
+      $this->weightKey = FALSE;
+    }
+  }
+
+  /**
    * Overrides Drupal\Core\Entity\EntityListController::load().
    */
   public function load() {
@@ -23,4 +47,132 @@ public function load() {
     return $entities;
   }
 
+  /**
+   * Overrides EntityListController::buildHeader().
+   */
+  public function buildHeader() {
+    // Override defaults to sort data rows.
+    $row['title'] = $this->entityInfo['label'];
+    $row['operations'] = t('Operations');
+    if (!empty($this->weightKey)) {
+      // Add weight column as last column as fallback for none-JS.
+      // @todo Make it easy: http://drupal.org/node/1876718
+      $row['weight'] = t('Weight');
+    }
+    return $row;
+  }
+
+  /**
+   * Overrides EntityListController::buildRow().
+   */
+  public function buildRow(EntityInterface $entity) {
+    $row = parent::buildRow($entity);
+    // Configurable entities could have default link to their edit pages.
+    if ($uri = $entity->uri()) {
+      $row['title'] = array('data' => array(
+        '#markup' => l($row['label'], $uri['path'], $uri['options']),
+      ));
+    }
+    else {
+      $row['title'] = array('data' => array(
+        '#markup' => $row['label'],
+      ));
+    }
+    // Save to be reused by contrib.
+    unset($row['id']);
+    unset($row['label']);
+    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;
+  }
+
+  /**
+   * Overrides EntityListController::render().
+   */
+  public function render() {
+    if (empty($this->weightKey)) {
+      return parent::render();
+    }
+
+    $form_state = array();
+    $form_state['build_info']['args'] = array();
+    $form_state['build_info']['callback'] = array($this, 'form');
+
+    return drupal_build_form($this->entityType . '_list_form', $form_state);
+  }
+
+  /**
+   * Creates a tabledrag form for manipulating config entity weights.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   *
+   * @return array
+   *   The array containing the complete form.
+   */
+  public function form($form, &$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 = 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(array_flip($header), $row);
+    }
+
+    $form['actions']['#type'] = 'actions';
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save'),
+      '#submit' => array(array($this, 'submit')),
+      '#button_type' => 'primary',
+    );
+
+    return $form;
+  }
+
+  /**
+   * Submit handler for the overview form.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   */
+  public function submit($form, &$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])) {
+        $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 1fdb4ba..bd299dd 100644
--- a/core/lib/Drupal/Core/Entity/EntityListController.php
+++ b/core/lib/Drupal/Core/Entity/EntityListController.php
@@ -112,8 +112,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;
   }
 
@@ -153,8 +152,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 = 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(array_flip($header), $row);
     }
     return $build;
   }
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 659043e..40ea43c 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -102,6 +102,8 @@
  *   - uuid (optional): The name of the property that contains the universally
  *     unique identifier of the entity, which is used to distinctly identify
  *     an entity across different systems.
+ *   - weight (optional): The name of the property that contains the weight of
+ *     the configuration entity which is used to for ordering.
  * - bundle_keys: An array describing how the Field API can extract the
  *   information it needs from the bundle objects for this type (e.g
  *   Vocabulary objects for terms; not applicable for nodes). This entry can
diff --git a/core/modules/contact/lib/Drupal/contact/CategoryListController.php b/core/modules/contact/lib/Drupal/contact/CategoryListController.php
index a3ec886..01f345c 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().
+   * Overrides \Drupal\Core\Entity\EntityListController::getOperations().
    */
   public function getOperations(EntityInterface $entity) {
     $operations = parent::getOperations($entity);
@@ -38,26 +38,35 @@ public function getOperations(EntityInterface $entity) {
   }
 
   /**
-   * Overrides Drupal\Core\Entity\EntityListController::buildHeader().
+   * Overrides ConfigEntityListController::buildHeader().
    */
   public function buildHeader() {
-    $row['category'] = t('Category');
-    $row['recipients'] = t('Recipients');
-    $row['selected'] = t('Selected');
-    $row['operations'] = t('Operations');
-    return $row;
+    $row = parent::buildHeader();
+    // Add own columns after title.
+    $title = $row['title'];
+    unset($row['title']);
+    // @todo Clean up this http://drupal.org/node/1876718
+    return array(
+      'title' => $title,
+      'default' => t('Default'),
+      'recipients' => t('Recipients'),
+    ) + $row;
   }
 
   /**
    * Overrides Drupal\Core\Entity\EntityListController::buildRow().
    */
   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['operations']['data'] = $this->buildOperations($entity);
-    return $row;
+    // Add own columns.
+    return parent::buildRow($entity) + array(
+      'default' => array(
+        '#markup' => ($default_category == $entity->id() ? 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 0004b00..89cd767 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
@@ -28,7 +28,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 a833dbc..77e79fd 100644
--- a/core/modules/menu/lib/Drupal/menu/MenuListController.php
+++ b/core/modules/menu/lib/Drupal/menu/MenuListController.php
@@ -15,28 +15,30 @@
 class MenuListController extends ConfigEntityListController {
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::buildHeader().
+   * Overrides ConfigEntityListController::buildHeader().
    */
   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 title.
+    $title = $row['title'];
+    unset($row['title']);
+    // @todo Clean up this http://drupal.org/node/1876718
+    return array(
+      'title' => $title,
+      'description' => array(
+        'data' => t('Description'),
+        'class' => array(RESPONSIVE_PRIORITY_MEDIUM),
+      )
+    ) + $row;
   }
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::buildRow().
+   * Overrides ConfigEntityListController::buildRow().
    */
   public function buildRow(EntityInterface $entity) {
-    $row['title'] = array(
-      'data' => check_plain($entity->label()),
-      'class' => array('menu-label'),
-    );
+    $row = parent::buildRow($entity);
+    $row['title']['class'] = array('menu-label');
     $row['description'] = filter_xss_admin($entity->description);
-    $row['operations']['data'] = $this->buildOperations($entity);
     return $row;
   }
 
@@ -72,7 +74,7 @@ public function getOperations(EntityInterface $entity) {
   }
 
   /**
-   * Overrides \Drupal\Core\Entity\EntityListController::render();
+   * Overrides ConfigEntityListController::render();
    */
   public function render() {
     $build = parent::render();
diff --git a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutListController.php b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutListController.php
index 401d280..5fa4145 100644
--- a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutListController.php
+++ b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutListController.php
@@ -15,47 +15,25 @@
 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().
+   * Overrides ConfigEntityListController::getOperations().
    */
   public function getOperations(EntityInterface $entity) {
+    $operations = parent::getOperations($entity);
     $uri = $entity->uri();
     $operations['list'] = array(
       'title' => t('list links'),
       'href' => $uri['path'],
-    );
-    $operations['edit'] = array(
-      'title' => t('edit set'),
-      'href' => $uri['path'] . '/edit',
       'options' => $uri['options'],
-      'weight' => 10,
+      'weight' => 0,
     );
+    $operations['edit']['title'] = t('edit set');
     if (shortcut_set_delete_access($entity)) {
-      $operations['delete'] = array(
-        'title' => t('delete set'),
-        'href' => $uri['path'] . '/delete',
-        'options' => $uri['options'],
-        'weight' => 100,
-      );
+      $operations['delete']['title'] = t('delete set');
+    }
+    else {
+      unset($operations['delete']);
     }
     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 9c65552..6ee7cc7 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
@@ -19,13 +19,17 @@
  *   label = @Translation("Taxonomy vocabulary"),
  *   module = "taxonomy",
  *   controller_class = "Drupal\taxonomy\VocabularyStorageController",
+ *   list_controller_class = "Drupal\taxonomy\VocabularyListController",
  *   form_controller_class = {
  *     "default" = "Drupal\taxonomy\VocabularyFormController"
  *   },
+ *   uri_callback = "taxonomy_vocabulary_uri",
  *   config_prefix = "taxonomy.vocabulary",
  *   entity_keys = {
  *     "id" = "vid",
- *     "label" = "name"
+ *     "label" = "name",
+ *     "uuid" = "uuid",
+ *     "weight" = "weight"
  *   },
  *   view_modes = {
  *     "full" = {
@@ -83,4 +87,5 @@ class Vocabulary extends ConfigEntityBase {
   public function id() {
     return $this->vid;
   }
+
 }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/VocabularyTest.php
index 8d05f64..64ed2d6 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[$key . '[weight]'] = $weight;
+      $edit["entities[$key][weight]"] = $weight;
     }
     // Saving the new weights via the interface.
     $this->drupalPost('admin/structure/taxonomy', $edit, t('Save'));
@@ -119,7 +119,8 @@ function testTaxonomyAdminNoVocabularies() {
     $this->assertFalse(taxonomy_vocabulary_load_multiple(), 'No vocabularies found.');
     $this->drupalGet('admin/structure/taxonomy');
     // Check the default message for no vocabularies.
-    $this->assertText(t('No vocabularies available.'));
+    $entity_info = entity_get_info('taxonomy_vocabulary');
+    $this->assertText(t('There is no @label yet.', array('@label' => $entity_info['label'])));
   }
 
   /**
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php
new file mode 100644
index 0000000..af7108e
--- /dev/null
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyListController.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Contains \Drupal\taxonomy\VocabularyListController.
+ */
+
+namespace Drupal\taxonomy;
+
+use Drupal\Core\Config\Entity\ConfigEntityListController;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Provides a listing of vocabularies.
+ */
+class VocabularyListController extends ConfigEntityListController {
+
+  /**
+   * Overrides EntityListController::getOperations().
+   */
+  public function getOperations(EntityInterface $entity) {
+    $operations = parent::getOperations($entity);
+    $uri = $entity->uri();
+
+    $operations['edit']['title'] = t('edit vocabulary');
+    $operations['list'] = array(
+      'title' => t('list terms'),
+      'href' => $uri['path'],
+      'options' => $uri['options'],
+      'weight' => 0,
+    );
+    $operations['add'] = array(
+      'title' => t('add terms'),
+      'href' => $uri['path'] . '/add',
+      'options' => $uri['options'],
+      'weight' => 30,
+    );
+    unset($operations['delete']);
+
+    return $operations;
+  }
+
+}
diff --git a/core/modules/taxonomy/taxonomy.admin.inc b/core/modules/taxonomy/taxonomy.admin.inc
index 6305e48..4672374 100644
--- a/core/modules/taxonomy/taxonomy.admin.inc
+++ b/core/modules/taxonomy/taxonomy.admin.inc
@@ -9,109 +9,16 @@
 use Drupal\taxonomy\Plugin\Core\Entity\Vocabulary;
 
 /**
- * Form builder to list and manage vocabularies.
+ * Page callback: Lists taxonomy vocabularies.
  *
- * @ingroup forms
- * @see taxonomy_overview_vocabularies_submit()
- * @see theme_taxonomy_overview_vocabularies()
- */
-function taxonomy_overview_vocabularies($form) {
-  $vocabularies = taxonomy_vocabulary_load_multiple();
-  taxonomy_vocabulary_sort($vocabularies);
-  $form['#tree'] = TRUE;
-  foreach ($vocabularies as $vocabulary) {
-    $form[$vocabulary->id()]['#vocabulary'] = $vocabulary;
-    $form[$vocabulary->id()]['name'] = array('#markup' => check_plain($vocabulary->name));
-    $form[$vocabulary->id()]['weight'] = array(
-      '#type' => 'weight',
-      '#title' => t('Weight for @title', array('@title' => $vocabulary->name)),
-      '#title_display' => 'invisible',
-      '#delta' => 10,
-      '#default_value' => $vocabulary->weight,
-    );
-    $links = array();
-    $links['edit'] = array(
-      'title' => t('edit vocabulary'),
-      'href' => "admin/structure/taxonomy/{$vocabulary->id()}/edit",
-    );
-    $links['list'] = array(
-      'title' => t('list terms'),
-      'href' => "admin/structure/taxonomy/{$vocabulary->id()}",
-    );
-    $links['add'] = array(
-      'title' => t('add terms'),
-      'href' => "admin/structure/taxonomy/{$vocabulary->id()}/add",
-    );
-    $form[$vocabulary->id()]['operations'] = array(
-      '#type' => 'operations',
-      '#links' => $links,
-    );
-  }
-
-  // Only make this form include a submit button and weight if more than one
-  // vocabulary exists.
-  if (count($vocabularies) > 1) {
-    $form['actions'] = array('#type' => 'actions');
-    $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save'), '#button_type' => 'primary');
-  }
-  elseif (isset($vocabulary)) {
-    unset($form[$vocabulary->id()]['weight']);
-  }
-  return $form;
-}
-
-/**
- * Submit handler for vocabularies overview. Updates changed vocabulary weights.
- *
- * @see taxonomy_overview_vocabularies()
- */
-function taxonomy_overview_vocabularies_submit($form, &$form_state) {
-  foreach ($form_state['values'] as $vid => $vocabulary) {
-    if (isset($form[$vid]['#vocabulary']) && $form[$vid]['#vocabulary']->weight != $form_state['values'][$vid]['weight']) {
-      $form[$vid]['#vocabulary']->weight = $form_state['values'][$vid]['weight'];
-      taxonomy_vocabulary_save($form[$vid]['#vocabulary']);
-    }
-  }
-  drupal_set_message(t('The configuration options have been saved.'));
-}
-
-/**
- * Returns HTML for the vocabulary overview form as a sortable list of vocabularies.
+ * @return array
+ *   A build array in the format expected by drupal_render().
  *
- * @param $variables
- *   An associative array containing:
- *   - form: A render element representing the form.
- *
- * @see taxonomy_overview_vocabularies()
- * @ingroup themeable
+ * @see taxonomy_menu()
  */
-function theme_taxonomy_overview_vocabularies($variables) {
-  $form = $variables['form'];
-
-  $rows = array();
-
-  foreach (element_children($form) as $key) {
-    if (isset($form[$key]['name'])) {
-      $vocabulary = &$form[$key];
-
-      $row = array();
-      $row[] = drupal_render($vocabulary['name']);
-      if (isset($vocabulary['weight'])) {
-        $vocabulary['weight']['#attributes']['class'] = array('vocabulary-weight');
-        $row[] = drupal_render($vocabulary['weight']);
-      }
-      $row[] = drupal_render($vocabulary['operations']);
-      $rows[] = array('data' => $row, 'class' => array('draggable'));
-    }
-  }
-
-  $header = array(t('Vocabulary name'));
-  if (isset($form['actions'])) {
-    $header[] = t('Weight');
-    drupal_add_tabledrag('taxonomy', 'order', 'sibling', 'vocabulary-weight');
-  }
-  $header[] = t('Operations');
-  return theme('table', array('header' => $header, 'rows' => $rows, 'empty' => t('No vocabularies available. <a href="@link">Add vocabulary</a>.', array('@link' => url('admin/structure/taxonomy/add'))), 'attributes' => array('id' => 'taxonomy'))) . drupal_render_children($form);
+function taxonomy_vocabulary_list() {
+  return drupal_container()->get('plugin.manager.entity')
+    ->getListController('taxonomy_vocabulary')->render();
 }
 
 /**
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index 8a13810..a644ae8 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -123,7 +123,7 @@ function taxonomy_entity_info(&$info) {
 }
 
 /**
- * Entity URI callback.
+ * Entity URI callback for the taxonomy term.
  */
 function taxonomy_term_uri($term) {
   return array(
@@ -132,6 +132,19 @@ function taxonomy_term_uri($term) {
 }
 
 /**
+ * Entity URI callback for the taxonomy vocabulary.
+ *
+ *  *
+ * @param \Drupal\taxonomy\Plugin\Core\Entity\Vocabulary $entity
+ *   A Taxonomy vocabulary entity.
+ */
+function taxonomy_vocabulary_uri($entity) {
+  return array(
+    'path' => 'admin/structure/taxonomy/' . $entity->id(),
+  );
+}
+
+/**
  * Implements hook_field_extra_fields().
  */
 function taxonomy_field_extra_fields() {
@@ -224,9 +237,6 @@ function taxonomy_select_nodes($tid, $pager = TRUE, $limit = FALSE, $order = arr
  */
 function taxonomy_theme() {
   return array(
-    'taxonomy_overview_vocabularies' => array(
-      'render element' => 'form',
-    ),
     'taxonomy_overview_terms' => array(
       'render element' => 'form',
     ),
@@ -244,8 +254,7 @@ function taxonomy_menu() {
   $items['admin/structure/taxonomy'] = array(
     'title' => 'Taxonomy',
     'description' => 'Manage tagging, categorization, and classification of your content.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('taxonomy_overview_vocabularies'),
+    'page callback' => 'taxonomy_vocabulary_list',
     'access arguments' => array('administer taxonomy'),
     'file' => 'taxonomy.admin.inc',
   );
