diff --git a/select_or_other.field_widget.inc b/select_or_other.field_widget.inc
index d8346e2..28adb7a 100644
--- a/select_or_other.field_widget.inc
+++ b/select_or_other.field_widget.inc
@@ -100,7 +100,7 @@ function _select_or_other_field_widget_get_available_options($select_or_other_fi
     $select_or_other_field_widget_list = array();
     foreach ($options_list as $key => $val) {
       // $select_or_other_field_widget_list[] = "{$key}|{$val}";
-      $select_or_other_field_widget_list[] = $val;
+      $select_or_other_field_widget_list[$key] = $val;
     }
   }
   else {
@@ -126,19 +126,6 @@ function select_or_other_field_widget_form_prepare_options($field, $instance, $h
   $settings = &$instance['widget']['settings'];
   $list = _select_or_other_field_widget_get_available_options($settings, $field);
 
-  foreach ($list as $key => $opt) {
-    if (is_array($opt)) {
-      $optgroup_options = array();
-      foreach ($opt as $optgroup_key => $optgroup_opt) {
-        select_or_other_field_widget_form_prepare_option($optgroup_options, $optgroup_key, $optgroup_opt, $settings);
-        $options[$key] = $optgroup_options;
-      }
-    }
-    else {
-      select_or_other_field_widget_form_prepare_option($options, $key, $opt, $settings);
-    }
-  }
-
   $required = (isset($instance['required']) && $instance['required']);
   $multiple = (($instance['widget']['type'] == 'select_or_other' && $field['cardinality'] == -1)
     || ($instance['widget']['type'] == 'select_or_other_sort'));
@@ -149,7 +136,7 @@ function select_or_other_field_widget_form_prepare_options($field, $instance, $h
   if ($multiple) {
     // Add a 'none' option for non-required fields.
     if (!$required) {
-      $options = $empty_option + $options;
+      $options = $empty_option + $list;
     }
   }
   // Single select.
@@ -157,7 +144,7 @@ function select_or_other_field_widget_form_prepare_options($field, $instance, $h
     // Add a 'none' option for non-required fields, and a 'select a value'
     // option for required fields that do not come with a value selected.
     if (!$required) {
-      $options = $empty_option + $options;
+      $options = $empty_option + $list;
     }
   }
 
@@ -170,12 +157,15 @@ function select_or_other_field_widget_form_prepare_options($field, $instance, $h
 }
 
 function select_or_other_taxonomy_default_value($items, $delta) {
+  $default_value = NULL;
   if (!empty($items[$delta]['tid'])) {
+    $default_value = array();
     $term = taxonomy_term_load_multiple(array($items[$delta]['tid']));
-    $default_value = !empty($items[$delta]['tid']) ? $term[$items[$delta]['tid']]->name : NULL;
-  }
-  else {
-    $default_value = NULL;
+    if (module_exists('i18n_taxonomy')) {
+      $default_value[$items[$delta]['tid']] = i18n_taxonomy_term_name($term[$items[$delta]['tid']]);
+    } else {
+      $default_value = $term[$items[$delta]['tid']]->name;
+    }
   }
   return $default_value;
 }
@@ -197,7 +187,7 @@ function select_or_other_field_widget_form(&$form, &$form_state, $field, $instan
     '#other' => isset($instance['widget']['settings']['other']) ? $instance['widget']['settings']['other'] : t('Other'),
     '#other_title' => !empty($instance['widget']['settings']['other_title']) ? $instance['widget']['settings']['other_title'] : NULL,
     '#other_size' => $instance['widget']['settings']['other_size'],
-    '#default_value' => $default_value,
+    '#default_value' => array_keys($default_value),
     '#options' => select_or_other_field_widget_form_prepare_options($field, $instance, !empty($items[$delta])),
     '#description' => isset($instance['description']) ? $instance['description'] : '',
     '#multiple' => $field['cardinality'] == 1 ? FALSE : $field['cardinality'],
@@ -395,7 +385,7 @@ function select_or_other_taxonomy_validate($element, &$form_state) {
     foreach ($typed_terms as $typed_term) {
       // See if the term exists in the chosen vocabulary and return the tid;
       // otherwise, create a new 'autocreate' term for insert/update.
-      if ($possibilities = taxonomy_term_load_multiple(array(), array('name' => trim($typed_term), 'vid' => array_keys($vocabularies)))) {
+      if ($possibilities = taxonomy_term_load_multiple(array(), array('tid' => trim($typed_term), 'vid' => array_keys($vocabularies)))) {
         $term = array_pop($possibilities);
       }
       else {
