diff --git a/inline_entity_form.module b/inline_entity_form.module
index be41f13..dc4e9c6 100644
--- a/inline_entity_form.module
+++ b/inline_entity_form.module
@@ -70,6 +70,15 @@ function inline_entity_form_autocomplete($entity_type, $field_name, $bundle, $st
       }
     }
   }
+  elseif ($field['type'] == 'taxonomy_term_reference') {
+    $match_operator = strtolower($controller->getSetting('match_operator'));
+    $taxonomy_terms = inline_entity_form_taxonomy_autocomplete_results($field, $string, $match_operator, 10);
+
+    // Loop through the taxonomy terms and convert them into autocomplete output.
+    foreach ($taxonomy_terms as $tid => $term_name) {
+      $results[] = t('@label (!entity_id)', array('@label' => $term_name, '!entity_id' => $tid));
+    }
+  }
 
   $matches = array();
   foreach ($results as $result) {
@@ -233,7 +242,7 @@ function inline_entity_form_field_widget_info() {
 
   $widgets['inline_entity_form_single'] = array(
     'label' => t('Inline entity form - Single value'),
-    'field types' => array('commerce_line_item_reference', 'commerce_product_reference', 'entityreference'),
+    'field types' => array('commerce_line_item_reference', 'commerce_product_reference', 'entityreference', 'taxonomy_term_reference'),
     'settings' => array(
       'fields' => array(),
       'type_settings' => array(),
@@ -245,7 +254,7 @@ function inline_entity_form_field_widget_info() {
   );
   $widgets['inline_entity_form'] = array(
     'label' => t('Inline entity form - Multiple values'),
-    'field types' => array('commerce_line_item_reference', 'commerce_product_reference', 'entityreference'),
+    'field types' => array('commerce_line_item_reference', 'commerce_product_reference', 'entityreference', 'taxonomy_term_reference'),
     'settings' => array(
       'fields' => array(),
       'type_settings' => array(),
@@ -334,6 +343,11 @@ function inline_entity_form_settings($field, $instance) {
     $settings['entity_type'] = 'commerce_line_item';
     $settings['column'] = 'line_item_id';
   }
+  elseif ($field['type'] == 'taxonomy_term_reference') {
+    $settings['entity_type'] = 'taxonomy_term';
+    $settings['bundles'] = array($field['settings']['allowed_values'][0]['vocabulary']);
+    $settings['column'] = 'tid';
+  }
 
   // If no specific bundle has been selected, assume all are available.
   if (empty($settings['bundles'])) {
@@ -729,6 +743,10 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
       }
     }
   }
+  // Extra validation callback for Taxonomy term reference fields.
+  if ($field['type'] == 'taxonomy_term_reference') {
+    $element['#element_validate'][] = 'inline_entity_form_taxonomy_term_reference_validation';
+  }
 
   return $element;
 }
@@ -1483,3 +1501,91 @@ function inline_entity_form_pre_render_add_fieldset_markup($form) {
 
   return $form;
 }
+
+/**
+ * Taxonomy term reference fields requires special treatment.
+ * Here are the helper functions to get them work.
+ */
+
+/**
+ * IEF widget #element_validate callback for Taxonomy term reference fields:
+ * Add dummy tid NULL values for the form element
+ * to avoid taxonomy_field_is_empty() errors.
+ */
+function inline_entity_form_taxonomy_term_reference_validation($element, &$form_state, $form) {
+  if (isset($form_state['values'][$element['#field_name']])) {
+    foreach ($form_state['values'][$element['#field_name']][$element['#language']] as $element_value_key => $element_value) {
+      if (!isset($form_state['values'][$element['#field_name']][$element['#language']][$element_value_key]['tid'])) {
+        $form_state['values'][$element['#field_name']][$element['#language']][$element_value_key]['tid'] = NULL;
+      }
+    }
+  }
+}
+
+/**
+ * Taxonomy autocomplete suggestions.
+ * Adaptation of taxonomy_autocomplete() core function
+ * to fit IEF needs.
+ *
+ * @param $field_name
+ *   The name of the term reference field.
+ * @param $string
+ *   term name entered in the autocomplete form element.
+ *   Defaults to '' (an empty string).
+ * @param $match
+ *   Operator to match filtered term names against, can be any of:
+ *   'contains', 'starts_with'
+ * @param $limit
+ *   If non-zero, limit the size of the result set. 
+ */
+function inline_entity_form_taxonomy_autocomplete_results($field, $string = '', $match = 'contains', $limit = 10) {
+  $results = &drupal_static(__FUNCTION__, array());
+
+ // Create unique id for static cache.
+  $cid = implode(':', array(
+    $field['field_name'],
+    $match,
+    ($string !== '' ? $string : '--none--'),
+    $limit,
+  ));
+
+  $term_matches = array();
+
+  if (!isset($results[$cid]) && $string != '') {
+
+    // Part of the criteria for the query come from the field's own settings.
+    $vids = array();
+    $vocabularies = taxonomy_vocabulary_get_names();
+    foreach ($field['settings']['allowed_values'] as $tree) {
+      $vids[] = $vocabularies[$tree['vocabulary']]->vid;
+    }
+
+    $query = db_select('taxonomy_term_data', 't');
+    $query->addTag('translatable');
+    $query->addTag('term_access');
+
+    $string_condition = '%' . db_like($string) . '%';
+    if ($match == 'starts_with') {
+      $string_condition = db_like($string) . '%';
+    }
+
+    // Select rows that match by term name.
+    $query
+      ->fields('t', array('tid', 'name'))
+      ->condition('t.vid', $vids)
+      ->condition('t.name', $string_condition, 'LIKE');
+    // Add a limit if specified.
+    if ($limit) {
+      $query->range(0, $limit);
+    }
+    $terms = $query
+      ->execute()
+      ->fetchAllKeyed();
+    foreach ($terms as $tid => $name) {
+      $matches[$tid] = check_plain($name);
+    }
+  }
+  $results[$cid] = $matches;
+
+  return $results[$cid];
+}
