diff --git a/title.install b/title.install
index 0cce7bd..70ff943 100644
--- a/title.install
+++ b/title.install
@@ -22,6 +22,12 @@ function title_install() {
   // Make (reasonably) sure that title_module_implements_alter() is invoked as
   // last so we can determine the priority of our hook implementations reliably.
   _title_install_set_weight(100);
+
+  // Set the options list callback of taxonomy term reference fields.
+  $taxonomy_fields = field_read_fields(array('module' => 'taxonomy'));
+  foreach ($taxonomy_fields as $field_name => $taxonomy_field) {
+    field_update_field($taxonomy_field);
+  }
 }
 
 /**
@@ -53,3 +59,15 @@ function title_update_7002() {
 
   variable_del('title_auto_attach');
 }
+
+/**
+ * Implements hook_update_N.
+ *
+ * Set the options list callback of taxonomy term reference fields.
+ */
+function title_update_7003() {
+  $taxonomy_fields = field_read_fields(array('module' => 'taxonomy'));
+  foreach ($taxonomy_fields as $field_name => $taxonomy_field) {
+    field_update_field($taxonomy_field);
+  }
+}
diff --git a/title.module b/title.module
index ee53c42..177265d 100644
--- a/title.module
+++ b/title.module
@@ -34,6 +34,9 @@ function title_module_implements_alter(&$implementations, $hook) {
       case 'entity_info_alter':
       case 'entity_presave':
       case 'field_attach_presave':
+      case 'field_create_field':
+      case 'field_update_field':
+      case 'field_storage_details_alter':
         $implementations['title'] = $group;
         break;
 
@@ -83,6 +86,50 @@ function title_entity_info_alter(&$info) {
 }
 
 /**
+ * Implements hook_field_create_field().
+ *
+ * Set the options list callback of taxonomy term reference.
+ */
+function title_field_create_field($field) {
+  title_taxonomy_term_reference_field_options_list_callback($field);
+}
+
+/**
+ * Implements hook_field_update_field().
+ *
+ * Set the options list callback of taxonomy term reference.
+ */
+function title_field_update_field($field, $prior_field, $has_data) {
+  title_taxonomy_term_reference_field_options_list_callback($field);
+}
+
+/**
+ * Helper function.
+ *
+ * Override the options list callback of taxonomy term reference fields
+ * with one that provides translated term names.
+ */
+function title_taxonomy_term_reference_field_options_list_callback($field) {
+  $enabled_types = array_filter(variable_get('entity_translation_entity_types', array()));
+  $enabled_taxonomy_entity_translation = isset($enabled_types['taxonomy_term']) && $enabled_types['taxonomy_term'] != '';
+
+  if ($field['type'] == 'taxonomy_term_reference' && isset($field['settings']) && (empty($field['settings']['options_list_callback']) || $enabled_taxonomy_entity_translation)) {
+    $field['settings']['options_list_callback'] = 'title_taxonomy_allowed_values';
+
+    if (isset($field['id'])) {
+      if (isset($field['data'])) {
+        $field['data']['settings']['options_list_callback'] = 'title_taxonomy_allowed_values';
+      }
+      drupal_write_record('field_config', $field, array('id'));
+    }
+    else {
+        drupal_write_record('field_config', $field);
+    }
+  }
+  field_cache_clear(TRUE);
+}
+
+/**
  * Return field replacement specific information.
  *
  * @param $entity_type
@@ -218,9 +265,6 @@ function title_field_attach_load($entity_type, $entities, $age, $options) {
  * replaced fields.
  */
 function title_entity_load($entities, $type) {
-  // Load entity translations otherwise field language will not be computed
-  // correctly.
-  module_invoke('entity_translation', 'entity_load', $entities, $type);
   foreach ($entities as &$entity) {
     // Synchronize values from the regular field unless we are intializing it.
     title_entity_sync($type, $entity, NULL, !empty($GLOBALS['title_field_replacement_init']));
@@ -490,14 +534,8 @@ function title_field_sync_get($entity_type, $entity, $legacy_field, $info, $lang
     $langcode = field_language($entity_type, $entity, $info['field']['field_name'], $langcode);
     $values = $info['callbacks']['sync_get']($entity_type, $entity, $legacy_field, $info, $langcode);
     foreach ($values as $name => $value) {
-      if ($value !== NULL) {
-        $entity->{$name} = $value;
-      }
+      $entity->{$name} = $value;
     }
-    // Ensure we do not pollute field language static cache.
-    $cache = &drupal_static('field_language');
-    list($id, ,) = entity_extract_ids($entity_type, $entity);
-    unset($cache[$entity_type][$id]);
   }
 }
 
@@ -1001,3 +1039,40 @@ function title_taxonomy_allowed_values($field) {
   }
   return taxonomy_allowed_values($field);
 }
+
+/**
+ * Implements hook_module_enabled().
+ *
+ * Updates options_list_callback for taxonomy term fields.
+ *
+ * @param $modules
+ */
+function title_modules_enabled($modules) {
+  $enabled_types = array_filter(variable_get('entity_translation_entity_types', array()));
+  $enabled_taxonomy_entity_translation = isset($enabled_types['taxonomy_term']) && $enabled_types['taxonomy_term'] != '';
+  $modules = drupal_map_assoc($modules);
+  if (isset($modules['i18n_taxonomy'])) {
+    foreach (field_info_fields() as $fieldname => $field) {
+      if ($field['type'] == 'taxonomy_term_reference' && isset($field['settings']) && (empty($field['settings']['options_list_callback']) || $enabled_taxonomy_entity_translation)) {
+        $field['settings']['options_list_callback'] = 'title_taxonomy_allowed_values';
+        field_update_field($field);
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_storage_details_alter().
+ *
+ * We don't alter the storage details but the stored details of the field itself...
+ *
+ * @param array $field
+ *   The field record just read from the database.
+ */
+function title_field_storage_details_alter(&$details, &$field) {
+  $enabled_types = array_filter(variable_get('entity_translation_entity_types', array()));
+  $enabled_taxonomy_entity_translation = isset($enabled_types['taxonomy_term']) && $enabled_types['taxonomy_term'] != '';
+  if ($field['type'] == 'taxonomy_term_reference' && isset($field['settings']) && (empty($field['settings']['options_list_callback']) || $enabled_taxonomy_entity_translation)) {
+    $field['settings']['options_list_callback'] = 'title_taxonomy_allowed_values';
+  }
+}
