diff --git modules/taxonomy/taxonomy.admin.inc modules/taxonomy/taxonomy.admin.inc
index 007a2f7..9d8fb9b 100644
--- modules/taxonomy/taxonomy.admin.inc
+++ modules/taxonomy/taxonomy.admin.inc
@@ -461,7 +461,7 @@ function taxonomy_overview_terms_submit($form, &$form_state) {
 
   // Build a list of all terms that need to be updated on previous pages.
   $weight = 0;
-  $term = (array)$tree[0];
+  $term = (array)array_shift($tree);
   while ($term['tid'] != $form['#first_tid']) {
     if ($term['parents'][0] == 0 && $term['weight'] != $weight) {
       $term['parent'] = $term['parents'][0];
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index 4404b33..e6434e8 100644
--- modules/taxonomy/taxonomy.module
+++ modules/taxonomy/taxonomy.module
@@ -857,9 +857,9 @@ function taxonomy_get_children($tid, $vid = 0, $key = 'tid') {
  *   Internal use only.
  *
  * @return
- *   An array of all term objects in the tree. Each term object is extended
- *   to have "depth" and "parents" attributes in addition to its normal ones.
- *   Results are statically cached.
+ *   An array of all term objects in the tree, indexed by taxonomy ID (tid).
+ *   each term object is extended to have "depth" and "parents" attributes in
+ *   addition to its normal ones. Results are statically cached.
  */
 function taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $depth = -1) {
   static $children, $parents, $terms;
@@ -889,10 +889,10 @@ function taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $depth = -1) {
         // The "parent" attribute is not useful, as it would show one parent only.
         unset($term->parent);
         $term->parents = $parents[$vid][$child];
-        $tree[] = $term;
+        $tree[$term->tid] = $term;
 
         if (!empty($children[$vid][$child])) {
-          $tree = array_merge($tree, taxonomy_get_tree($vid, $child, $max_depth, $depth));
+          $tree += taxonomy_get_tree($vid, $child, $max_depth, $depth);
         }
       }
     }
