Only in ../features_extra_6.x-1.x-dev: 755986_fe_taxonomy2_0.patch
diff -upr ../features_extra_6.x-1.x-dev/fe_taxonomy.module ./fe_taxonomy.module
--- ../features_extra_6.x-1.x-dev/fe_taxonomy.module	2011-06-10 14:13:23.000000000 +0200
+++ ./fe_taxonomy.module	2011-06-10 14:33:45.000000000 +0200
@@ -77,6 +77,7 @@ function fe_taxonomy_vocabulary_features
 
 /**
  * Implementation of hook_features_export_render().
+ * @param data the vocabularies machine names
  */
 function fe_taxonomy_vocabulary_features_export_render($module_name = '', $data) {
   ctools_include('export');
@@ -95,13 +96,20 @@ function fe_taxonomy_vocabulary_features
       // Load vocabulary.
       if (!empty($object->vid)) {
         $vocabulary = taxonomy_vocabulary_load($object->vid);
-        $additions = (array) $vocabulary;
-        unset($additions['vid']);
+        if ($vocabulary) {
+          $additions = (array) $vocabulary;
+        }
       }
 
       // Code.
       $identifier = $schema['export']['identifier'];
+      // Export Vocabularies.
       $code[] = ctools_export_object($component, $object, '  ', $identifier, $additions);
+      // Export Terms.
+      $terms = _fe_taxonomy_get_terms($object->vid);
+      if (count($terms) > 0) {
+        $code[] = '  $'. $identifier .'->terms = '. var_export($terms, TRUE) .';';
+      }
       $code[] = '  $export[\''. $machine_name .'\'] = $'. $identifier .';';
       $code[] = '';
     }
@@ -134,6 +142,10 @@ function fe_taxonomy_vocabulary_features
       if (!empty($result['vid'])) {
         db_query("DELETE FROM {{$table}} WHERE vid = %d OR machine_name = '%s'", $result['vid'], $object->machine_name);
         db_query("INSERT INTO {{$table}} (vid, machine_name) VALUES (%d, '%s')", $result['vid'], $object->machine_name);
+        // We save terms.
+        if (!empty($object->terms)) {
+          _fe_taxonomy_save_term_tree($object->terms, $vid);
+        }
       }
     }
   }
@@ -158,16 +170,37 @@ function fe_taxonomy_vocabulary_features
     }
 
     $vid = db_result(db_query("SELECT vid FROM {{$table}} WHERE machine_name = '%s'", $object->machine_name));
+
+    // If vocabulary exists, remove.
+    if ($vid) {
+      db_query("DELETE FROM {vocabulary} WHERE vid = %d", $vid);
+    }
+
+    // Insert vocabulary.
+    db_query("INSERT INTO {vocabulary} 
+              (vid, name, description, help, relations, hierarchy, multiple, required, tags, module, weight) 
+              VALUES (%d, '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s', %d)", 
+              $object->vid, $object->name, $object->description, $object->help, $object->relations, $object->hierarchy, $object->multiple, $object->required, $object->tags, $object->module, $object->weight);
+
     if (empty($vid) || !($vocab = taxonomy_vocabulary_load($vid))) {
       $result = _fe_taxonomy_save_vocabulary((array) $object);
       if (!empty($result['vid'])) {
-        db_query("DELETE FROM {{$table}} WHERE vid = %d OR machine_name = '%s'", $result['vid'], $object->machine_name);
-        db_query("INSERT INTO {{$table}} (vid, machine_name) VALUES (%d, '%s')", $result['vid'], $object->machine_name);
+        db_query("DELETE FROM {{$table}} WHERE vid = %d OR machine_name = '%s'", $object->vid, $object->machine_name);
+        db_query("INSERT INTO {{$table}} (vid, machine_name) VALUES (%d, '%s')", $object->vid, $object->machine_name);
+        // We save terms.
+        $vid = $result['vid'];
+        if (!empty($object->terms)) {
+          _fe_taxonomy_save_term_tree($object->terms, $vid);
+        }
       }
     }
     else {
       $object->vid = $vid;
       $result = _fe_taxonomy_save_vocabulary((array) $object);
+      //we save terms
+      if (!empty($object->terms)) {
+        _fe_taxonomy_save_term_tree($object->terms, $vid);
+      }
     }
   }
 
@@ -228,8 +261,8 @@ function fe_taxonomy_taxonomy($op, $type
     case 'insert':
     case 'update':
       if (isset($array['machine_name'])) {
-        db_query("DELETE FROM {{$table}} WHERE vid = %d", $array['vid']);
         if (!empty($array['machine_name'])) {
+          db_query("DELETE FROM {{$table}} WHERE vid = %d", $array['vid']);
           drupal_write_record($table, $array);
         }
       }
@@ -362,14 +395,6 @@ function _fe_taxonomy_save_vocabulary($s
 }
 
 /**
- * Term functions.
- *
- * TODO
- *
- * Not currently in use.
- */
-
-/**
  * Get all terms for a vocabulary.
  *
  * Use vid as cache key.
@@ -381,7 +406,6 @@ function _fe_taxonomy_get_terms($vid) {
 
   if (!isset($cache[$vid])) {
     $terms = array();
-
     $query = "SELECT data.*, hierarchy.parent"
             ." FROM {term_data} data"
             ." INNER JOIN {term_hierarchy} hierarchy ON hierarchy.tid = data.tid"
@@ -389,17 +413,30 @@ function _fe_taxonomy_get_terms($vid) {
             ." ORDER BY data.name ASC";
     $result = db_query($query, $vid);
     while ($obj = db_fetch_object($result)) {
-      if (!array_key_exists($obj->tid, $terms)) {
+      if (!array_key_exists($obj->tid, $terms)) {        
         $term = array();
         $term['name']        = $obj->name;
         $term['description'] = $obj->description;
         $term['weight']      = $obj->weight;
-        $term['parent']      = array($obj->parent => 1);
-
+        $term['tid']      = $obj->tid; 
+        $term['parent']      = array($obj->parent => 1); 
+        // Get relations
+        $rel_result = db_query("SELECT tid2 FROM {term_relation} WHERE tid1 = %d", $obj->tid);
+        while ($rel_obj = db_fetch_object($rel_result)) {
+          if ($rel_obj->tid2) {
+            $term['relations'][] = $obj2->tid2;
+          }
+        }
+        // Get synonyms
+        $syn_result = db_query("SELECT name FROM {term_synonym} WHERE tid = %d", $obj->tid);
+        while ($syn_obj = db_fetch_object($syn_result)) {
+          if ($syn_obj->name) {
+            $term['synonyms'][] = $syn_obj->name;
+          }
+        }
         $terms[$obj->tid] = $term;
-      }
-    }
-
+      }   
+    } 
     $cache[$vid] = _fe_taxonomy_build_term_tree($terms);
   }
 
@@ -411,6 +448,7 @@ function _fe_taxonomy_get_terms($vid) {
  */
 function _fe_taxonomy_build_term_tree($terms, $parent = 0) {
   static $tid_array = array();
+
   $tree = array();
 
   foreach ($terms as $tid => $term) {
@@ -420,6 +458,9 @@ function _fe_taxonomy_build_term_tree($t
         'name'        => $term['name'],
         'description' => $term['description'],
         'weight'      => $term['weight'],
+        'relations'   => $term['relations'],
+        'synonyms'    => $term['synonyms'],
+        'tid'         => $term['tid'],
         'children'    => _fe_taxonomy_build_term_tree($terms, $tid),
       );
       $tree[] = $item;
@@ -430,13 +471,19 @@ function _fe_taxonomy_build_term_tree($t
 }
 
 /**
- * Save a term tree.
+ * Save a term tree for the vocabulary vid
+ * @param vid the vocabulary id
+ * @param $tree the term tree
  */
-function _fe_taxonomy_save_term_tree($tree, $parent = 0) {
+function _fe_taxonomy_save_term_tree($tree, $vid, $parent = array()) {
   foreach ($tree as $term) {
-    $result = _fe_taxonomy_save_term($term);
-    if (!empty($result['tid']) && !empty($term['children'])) {
-      _fe_taxonomy_save_term_tree($term['children'], $result['tid']);
+    if ($parent) {
+      $term['parent'] = $parent;
+    }
+    $term['vid'] = $vid;
+    _fe_taxonomy_save_term($term);
+    if (!empty($term['children'])) {
+      _fe_taxonomy_save_term_tree($term['children'], $vid, array($term['tid']));
     }
   }
 }
@@ -449,36 +496,71 @@ function _fe_taxonomy_save_term($setting
     return FALSE;
   }
 
-  // Don't count those I have saved/updated.
-  static $tid_array = array();
-
-  if (empty($settings['tid'])) {
-    $placeholders = db_placeholders($tid_array);
-    $args = array($settings['name'], $settings['vid']) + $tid_array;
-    // TODO
-    // Try to find a same term, and avoid using it twice.
-    $tid = db_result(db_query("SELECT tid FROM {term_data} WHERE UPPER(TRIM(name)) = UPPER('%s') AND vid = %d AND tid NOT IN ()", $args));
-    if (!empty($tid)) {
-      $settings['tid'] = $tid;
-    }
-  }
-
   // Default
   $default_settings = array(
     'description' => '',
     'weight'      => 0,
+    'tid'         => '',
     'relations'   => array(),
-    'parent'      => array(0),
     'synonyms'    => '',
   );
   $settings = array_merge($default_settings, $settings);
-  taxonomy_save_term($settings);
+  // Cannot use taxonomy_save_term because it updates based on the tid if it exists. 
+  // Since we want to maintain the current tid we want it to overwrite.
+  $settings = fe_taxonomy_term_save($settings);
+  
+  return $settings;
+}
 
-  if (empty($settings['tid'])) {
-    return FALSE;
+/**
+ *  Substitute for taxonomy_save_term().
+ */
+function fe_taxonomy_term_save($form_values) {
+  $form_values += array(
+    'description' => '', 
+    'weight' => 0,
+  );
+  if ($tid = $form_values['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);
+
+    if ($form_values['name']) {
+      db_query("INSERT INTO {term_data} (tid, vid, name, description, weight) 
+                VALUES (%d, %d, '%s', '%s', %d)", $form_values['tid'], $form_values['vid'], $form_values['name'], $form_values['description'], $form_values['weight']); 
+    }
+    // If parent is empty insert zero.
+    $form_values['parent'] = $form_values['parent'] ? $form_values['parent'] : array('parent' => 0);
+    foreach ($form_values['parent'] as $parent) {
+      db_query("INSERT INTO {term_hierarchy} (tid, parent) VALUES (%d, %d)", $form_values['tid'], $parent);
+    }
+    // trid is still autoincrementing.
+    if ($form_values['relations']) {
+      foreach ($form_values['relations'] as $related_id) {
+        if ($related_id != 0) {
+          db_query('INSERT INTO {term_relation} (tid1, tid2) VALUES (%d, %d)', $form_values['tid'], $related_id);
+        }
+      }
+    }
+    if ($form_values['synonyms']) {
+      foreach (explode("\n", str_replace("\r", '', $form_values['synonyms'])) as $synonym) {
+        if ($synonym) {
+          db_query("INSERT INTO {term_synonym} (tid, name) VALUES (%d, '%s')", $form_values['tid'], chop($synonym));
+        }
+      }
+    }
+    $hook = 'insert';
+    $status = OVERWRITTEN;
+  }
+  else {
+    drupal_write_record('term_data', $form_values);
+    $hook = 'insert';
+    $status = SAVED_NEW;
   }
-  $tid_array[] = $settings['tid'];
 
-  return $settings;
+  cache_clear_all();
+
+  return $status;
 }
 
Only in .: features_extra-755986-19.patch
diff -upr ../features_extra_6.x-1.x-dev/views/fe_taxonomy.views.inc ./views/fe_taxonomy.views.inc
--- ../features_extra_6.x-1.x-dev/views/fe_taxonomy.views.inc	2011-06-10 14:13:23.000000000 +0200
+++ ./views/fe_taxonomy.views.inc	2011-06-10 14:14:50.000000000 +0200
@@ -6,7 +6,7 @@
  */
 
 /**
- * Implementation of hook_views_data()
+ * Implementation of hook_views_data().
  */
 function fe_taxonomy_views_data() {
   // Table
