diff --git a/term_reference_tree.widget.inc b/term_reference_tree.widget.inc
index f49a71a..c0b8288 100644
--- a/term_reference_tree.widget.inc
+++ b/term_reference_tree.widget.inc
@@ -206,23 +206,34 @@ function _term_reference_tree_output_list_level(&$element, &$tree) {
     $tokens_unselected = ($settings['token_display_unselected'] != '') ? $settings['token_display_unselected'] : $tokens_selected;
 
     $taxonomy_term_info = entity_get_info('taxonomy_term');
-    foreach ($tree['children'] as &$item) {
+    foreach ($tree['children'] as $itemno => &$item) {
       $term = $taxonomy_term_info['load hook']($item['tid']);
-      $uri = $taxonomy_term_info['uri callback']($term);
-      $uri['options']['html'] = TRUE;
-      $class = $item['selected'] ? 'selected' : 'unselected';
-      $output .= "<li class='$class'>";
-      if ($tokens_selected != '' && module_exists('token')) {
-        $replace = $item['selected'] ? $tokens_selected : $tokens_unselected;
-        $output .= token_replace($replace, array('term' => $term), array('clear' => TRUE));
-      }
-      else {
-        $output .= l(entity_label('taxonomy_term', $term), $uri['path'], $uri['options']);
+      //do not output terms that do not exist
+      if ($term) {
+        $uri = $taxonomy_term_info['uri callback']($term);
+        $uri['options']['html'] = TRUE;
+        $class = $item['selected'] ? 'selected' : 'unselected';
+        $output_fragment[$term->weight][$itemno] = "<li class='$class'>";
+        if ($tokens_selected != '' && module_exists('token')) {
+          $replace = $item['selected'] ? $tokens_selected : $tokens_unselected;
+          $output_fragment[$term->weight][$itemno] .= token_replace($replace, array('term' => $term), array('clear' => TRUE));
+        }
+        else {
+          $output_fragment[$term->weight][$itemno] .= l(entity_label('taxonomy_term', $term), $uri['path'], $uri['options']);
+        }
+        if (isset($item['children'])) {
+          $output_fragment[$term->weight][$itemno] .= _term_reference_tree_output_list_level($element, $item);
+        }
+        $output_fragment[$term->weight][$itemno] .= "</li>";
       }
-      if (isset($item['children'])) {
-        $output .= _term_reference_tree_output_list_level($element, $item);
+    }
+
+    //using output fragments with weights as the array key should force this into current sort order once we sort the array
+    if (isset($output_fragment)) {
+      ksort($output_fragment);
+      foreach($output_fragment as $this_fragment) {
+        $output .= implode('',$this_fragment);
       }
-      $output .= "</li>";
     }
 
     $output .= '</ul>';
