diff --git a/references_dialog.dialog_widgets.inc b/references_dialog.dialog_widgets.inc
index 4997e4b..02efc48 100644
--- a/references_dialog.dialog_widgets.inc
+++ b/references_dialog.dialog_widgets.inc
@@ -71,6 +71,27 @@ function references_dialog_references_dialog_widgets() {
         ),
       ),
     ),
+    'references_dialog_term_reference' => array(
+      'element_type' => 'textfield',
+      'dialog_form' => 'term_reference_dialog_form',
+      'entity_type' => 'taxonomy_term',
+      'format' => '$label',
+      'views_query' => 'references_dialog_term_reference_views_query',
+      'operations' => array(
+        'search' => array(
+          'function' => 'references_dialog_get_field_search_links',
+          'title' => t('Search Dialog'),
+        ),
+        'edit' => array(
+          'function' => 'references_dialog_term_reference_edit_link',
+          'title' => t('Edit dialog'),
+        ),
+        'add' => array(
+          'function' => 'references_dialog_term_reference_add_link',
+          'title' => t('Add dialog'),
+        ),
+      ),
+    ),
   );
 }
 
@@ -326,3 +347,48 @@ function references_dialog_entityreference_views_query($view, $instance, $field)
 function references_dialog_entityreference_get_type($instance, $field) {
   return $field['settings']['target_type'];
 }
+
+/**
+ * Edit link callback for term references.
+ */
+function references_dialog_term_reference_edit_link($element, $widget_settings, $field, $instance) {
+  if (isset($element['#default_value'])) {
+    // Get Term ID from entity.
+    $term = taxonomy_term_load($element['#entity']->{$element['#field_name']}[$element['#language']][$element['#delta']]['tid']);
+    if ($term && user_access('administer taxonomy')) {
+      $path = taxonomy_term_uri($term);
+      return array(
+        array(
+          'title' => t('Edit'),
+          'href' => $path['path'] . '/edit'
+        ),
+      );
+    }
+  }
+  return array();
+}
+
+/**
+ * Add link callback for term references.
+ */
+function references_dialog_term_reference_add_link($element, $widget_settings, $field, $instance) {
+  $add_links = array();
+  if (user_access('administer taxonomy')) {
+    $add_links[] = array(
+      'title' => t('Create @type', array('@type' => strtoupper($field['settings']['allowed_values'][0]['vocabulary']))),
+      'href' => 'admin/structure/taxonomy/' . $field['settings']['allowed_values'][0]['vocabulary'] . '/add',
+    );
+  }
+  return $add_links;
+}
+
+/**
+ * View query callback for term references.
+ */
+function references_dialog_term_reference_views_query($view, $instance, $field) {
+  // We need to make sure that no entries that we can't add to our field shows
+  // up, so we need to limit the data here.
+  $vocabulary = taxonomy_vocabulary_machine_name_load($field['settings']['allowed_values'][0]['vocabulary']);
+  $types = array($vocabulary->vid);
+  $view->query->add_where(0, "$view->base_table.vid", $types);
+}
diff --git a/references_dialog.module b/references_dialog.module
index 9ad6435..5689371 100644
--- a/references_dialog.module
+++ b/references_dialog.module
@@ -251,7 +251,12 @@ function references_dialog_form_field_ui_field_edit_form_alter(&$form, $form_sta
   if (array_key_exists($form['instance']['widget']['type']['#value'], references_dialog_widgets())) {
     $field = $form['#field'];
     $instance = field_info_instance($form['instance']['entity_type']['#value'], $form['instance']['field_name']['#value'], $form['instance']['bundle']['#value']);
-    $form['instance']['widget']['settings'] += references_dialog_settings_form($field, $instance);
+    if (isset($form['instance']['widget']['settings'])) {
+      $form['instance']['widget']['settings'] += references_dialog_settings_form($field, $instance);
+    }
+    else {
+      $form['instance']['widget']['settings'] = references_dialog_settings_form($field, $instance);
+    }
   }
 }
 
@@ -694,3 +699,120 @@ function references_dialog_get_admin_path($entity_type, $op, $bundle = NULL, $en
 function theme_references_dialog_links($links) {
   return theme('links', array('links' => $links, 'attributes' => array('class' => 'references-dialog-links')));
 }
+
+/**
+ * Implements hook_field_widget_info().
+ */
+function references_dialog_field_widget_info() {
+  return array(
+    'references_dialog_term_reference' => array(
+      'label'       => t('Autocomplete term widget for References Dialog'),
+      'field types' => array('taxonomy_term_reference'),
+      'settings'    => array(
+        'size' => 60,
+        'autocomplete_path' => 'taxonomy/autocomplete',
+        'autocomplete_match' => 'starts_with',
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_settings_form().
+ */
+function references_dialog_field_widget_settings_form($field, $instance) {
+  $widget   = $instance['widget'];
+  $defaults = field_info_widget_settings($widget['type']);
+  $settings = array_merge($defaults, $widget['settings']);
+
+  $form = array();
+  if ($widget['type'] == 'references_dialog_term_reference') {
+    $form['autocomplete_match'] = array(
+      '#type'             => 'select',
+      '#title'            => t('Autocomplete matching'),
+      '#default_value'    => $settings['autocomplete_match'],
+      '#options'          => array(
+        'starts_with'     => t('Starts with'),
+        'contains'        => t('Contains'),
+      ),
+      '#description'      => t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of nodes.'),
+    );
+    $form['size'] = array(
+      '#type'             => 'textfield',
+      '#title'            => t('Size of textfield'),
+      '#default_value'    => $settings['size'],
+      '#element_validate' => array('_element_validate_integer_positive'),
+      '#required'         => TRUE,
+    );
+  }
+  return $form;
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function references_dialog_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  switch ($instance['widget']['type']) {
+    case 'references_dialog_term_reference':
+      if (isset($items[$delta]['tid'])) {
+        $term = taxonomy_term_load($items[$delta]['tid']);
+        $value = $term->name;
+      }
+      else {
+        $value = NULL;
+      }
+      $element += array(
+        '#type' => 'textfield',
+        '#default_value' => $value,
+        '#autocomplete_path' => $instance['widget']['settings']['autocomplete_path'] . '/' . $field['field_name'],
+        '#size' => $instance['widget']['settings']['size'],
+        '#maxlength' => NULL,
+        '#element_validate' => array('references_dialog_term_reference_autocomplete_validate'),
+      );
+      break;
+  }
+
+  return array('tid' => $element);
+}
+
+/**
+ * Form element validate handler for taxonomy term autocomplete element.
+ */
+function references_dialog_term_reference_autocomplete_validate($element, &$form_state) {
+  // Autocomplete widgets do not send their tids in the form, so we must detect
+  // them here and process them independently.
+  $value = array();
+  if ($element['#value']) {
+    $term = FALSE;
+    $field = field_widget_field($element, $form_state);
+    $instance = field_widget_instance($element, $form_state);
+    // Check whether we have an explicit "[tid:n]" input.
+    preg_match('/^(?:\s*|(.*) )?\[\s*tid\s*:\s*(\d+)\s*\]$/', $element['#value'], $matches);
+    if (!empty($matches)) {
+      // Explicit tid.
+      list(, $term_name, $tid) = $matches;
+      if (!empty($term_name)) {
+        $term = taxonomy_term_load($tid);
+      }
+    }
+    else {
+      // Collect candidate vocabularies.
+      $vocabularies = array();
+      foreach ($field['settings']['allowed_values'] as $tree) {
+        if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
+          $vocabularies[$vocabulary->vid] = $vocabulary;
+        }
+      }
+      if ($possibilities = taxonomy_term_load_multiple(array(), array('name' => trim($element['#value']), 'vid' => array_keys($vocabularies)))) {
+        $term = array_pop($possibilities);
+      }
+    }
+    if ($term) {
+      $value = $term->tid;
+    }
+    else {
+      form_error($element, t('%name: found no valid post for this value.', array('%name' => $instance['label'])));
+    }
+  }
+  form_set_value($element, $value, $form_state);
+}
