diff --git a/modules/taxonomy.module b/modules/taxonomy.module
index e8f26f7c5310ef09e35b12ac52b955e13568cb60..dc593879f6c53e8f58896c8e340c57d39070e242 100644
--- a/modules/taxonomy.module
+++ b/modules/taxonomy.module
@@ -294,19 +294,37 @@ function taxonomy_save_term($edit) {
 }
 
 function taxonomy_del_term($tid) {
-  $term = taxonomy_get_term($tid);
-
-  db_query('DELETE FROM {term_data} WHERE tid = %d', $tid);
-  db_query('DELETE FROM {term_hierarchy} WHERE tid = %d', $tid);
-  db_query('DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d', $tid, $tid);
-  db_query('DELETE FROM {term_synonym} WHERE tid = %d', $tid);
-  db_query('DELETE FROM {term_node} WHERE tid = %d', $tid);
+  $tids = array($tid);
+  while ($tids) {
+    $children_tids = $orphans = array();
+    foreach ($tids as $tid) {
+      // See if any of the term's children are about to be become orphans:
+      if ($children = taxonomy_get_children($tid)) {
+        foreach ($children as $child) {
+          // If the term has multiple parents, we don't delete it.
+          $parents = taxonomy_get_parents($child->tid);
+          if (count($parents) == 1) {
+            $orphans[] = $child->tid;
+          }
+        }
+      }
 
-  module_invoke_all('taxonomy', 'delete', 'term', $term);
+      $term = taxonomy_get_term($tid);
+  
+      db_query('DELETE FROM {term_data} WHERE tid = %d', $tid);
+      db_query('DELETE FROM {term_hierarchy} WHERE tid = %d', $tid);
+      db_query('DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d', $tid, $tid);
+      db_query('DELETE FROM {term_synonym} WHERE tid = %d', $tid);
+      db_query('DELETE FROM {term_node} WHERE tid = %d', $tid);
+    
+      module_invoke_all('taxonomy', 'delete', 'term', $term);
+      drupal_set_message(t('deleted term "%name".', array('%name' => $term->name)));
+    }
+    
+    $tids = $orphans;
+  }
 
   cache_clear_all();
-
-  return t('deleted term "%name".', array('%name' => $term->name));
 }
 
 function _taxonomy_confirm_del_term($tid) {
@@ -318,7 +336,9 @@ function _taxonomy_confirm_del_term($tid) {
   $form .= form_submit(t('Delete'));
   $form .= form_submit(t('Cancel'));
 
-  return form(form_item(t('Delete term "%name"', array('%name' => $term->name)), $form, t('Are you sure you want to delete the term?')));
+  $output = form(form_item(t('Delete term "%name" and all its children', array('%name' => $term->name)), $form, t('Are you sure you want to delete the term and all its children (if any)?')));
+
+  return $output;
 }
 
 /**
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index e8f26f7c5310ef09e35b12ac52b955e13568cb60..dc593879f6c53e8f58896c8e340c57d39070e242 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -294,19 +294,37 @@ function taxonomy_save_term($edit) {
 }
 
 function taxonomy_del_term($tid) {
-  $term = taxonomy_get_term($tid);
-
-  db_query('DELETE FROM {term_data} WHERE tid = %d', $tid);
-  db_query('DELETE FROM {term_hierarchy} WHERE tid = %d', $tid);
-  db_query('DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d', $tid, $tid);
-  db_query('DELETE FROM {term_synonym} WHERE tid = %d', $tid);
-  db_query('DELETE FROM {term_node} WHERE tid = %d', $tid);
+  $tids = array($tid);
+  while ($tids) {
+    $children_tids = $orphans = array();
+    foreach ($tids as $tid) {
+      // See if any of the term's children are about to be become orphans:
+      if ($children = taxonomy_get_children($tid)) {
+        foreach ($children as $child) {
+          // If the term has multiple parents, we don't delete it.
+          $parents = taxonomy_get_parents($child->tid);
+          if (count($parents) == 1) {
+            $orphans[] = $child->tid;
+          }
+        }
+      }
 
-  module_invoke_all('taxonomy', 'delete', 'term', $term);
+      $term = taxonomy_get_term($tid);
+  
+      db_query('DELETE FROM {term_data} WHERE tid = %d', $tid);
+      db_query('DELETE FROM {term_hierarchy} WHERE tid = %d', $tid);
+      db_query('DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d', $tid, $tid);
+      db_query('DELETE FROM {term_synonym} WHERE tid = %d', $tid);
+      db_query('DELETE FROM {term_node} WHERE tid = %d', $tid);
+    
+      module_invoke_all('taxonomy', 'delete', 'term', $term);
+      drupal_set_message(t('deleted term "%name".', array('%name' => $term->name)));
+    }
+    
+    $tids = $orphans;
+  }
 
   cache_clear_all();
-
-  return t('deleted term "%name".', array('%name' => $term->name));
 }
 
 function _taxonomy_confirm_del_term($tid) {
@@ -318,7 +336,9 @@ function _taxonomy_confirm_del_term($tid) {
   $form .= form_submit(t('Delete'));
   $form .= form_submit(t('Cancel'));
 
-  return form(form_item(t('Delete term "%name"', array('%name' => $term->name)), $form, t('Are you sure you want to delete the term?')));
+  $output = form(form_item(t('Delete term "%name" and all its children', array('%name' => $term->name)), $form, t('Are you sure you want to delete the term and all its children (if any)?')));
+
+  return $output;
 }
 
 /**