diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index 7ad28e9..9afb15c 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -1721,7 +1721,15 @@ function taxonomy_term_title($term) {
 function taxonomy_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
   $tags = array();
   foreach ($items as $item) {
-    $tags[$item['tid']] = isset($item['taxonomy_term']) ? $item['taxonomy_term'] : taxonomy_term_load($item['tid']);
+    if ($item['tid'] == 'autocreate') {
+      $tags[$item['tid']] = (object) $item;
+    }
+    elseif (isset($item['taxonomy_term'])) {
+      $tags[$item['tid']] = $item['taxonomy_term'];
+    }
+    else {
+      $tags[$item['tid']] = taxonomy_term_load($item['tid']);
+    }
   }
 
   $element += array(
@@ -1880,11 +1888,11 @@ function taxonomy_rdf_mapping() {
  */
 
 /**
- * Implements hook_field_presave().
+ * Implements hook_field_insert().
  *
  * Create any new terms defined in a freetagging vocabulary.
  */
-function taxonomy_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+function taxonomy_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
   foreach ($items as $delta => $item) {
     if ($item['tid'] == 'autocreate') {
       $term = (object) $item;
