diff --git a/term_merge.module b/term_merge.module
index d78d3fb..9c9fa9d 100644
--- a/term_merge.module
+++ b/term_merge.module
@@ -25,6 +25,13 @@ function term_merge_menu() {
       'page arguments' => array('term_merge_term_merge_form', 3),
       'access arguments' => array('merge terms'),
       'type' => MENU_LOCAL_TASK,
+    ),
+    'admin/structure/taxonomy/merge/%taxonomy_vocabulary/search' => array(
+      'title' => 'Merge terms',
+      'page arguments' => array(4),
+      'page callback' => 'term_merge_autocomplete',
+      'access arguments' => array('merge terms'),
+      'type' => MENU_CALLBACK,
     )
   );
   return $items;
@@ -82,8 +89,27 @@ function term_merge_form_taxonomy_overview_terms_merge_submit($form, &$form_stat
  *  let them be merged into another, specified term.
  */
 function term_merge_term_merge_form($form, $form_state, $vocabulary) {
-
-  if (!isset($form_state['storage']['term_list'])) { // Create th merge form.
+  if (!isset($form_state['storage']['term_list'])) { // Create the merge form.
+    $query = db_select('taxonomy_term_data', 't')->condition('t.vid', $vocabulary->vid)->countQuery();
+    
+    if ($query->execute()->fetchField() > 100) {
+      $replacement_form_element = array (
+        '#type' => 'textfield',
+        '#autocomplete_path' => "admin/structure/taxonomy/merge/$vocabulary->vid/search",
+        '#title' => t('Into'),
+        '#description' => t('Cannot be any of the terms selected in the list to the left.'),
+        '#prefix' => '</div><div class="merge-selectors">',
+      );
+    }
+    else {
+      $replacement_form_element = array (
+        '#type' => 'select',
+        '#title' => t('Into'),
+        '#options' => _term_delete_form_replacement_term_options($vocabulary->vid, 0, FALSE),
+        '#description' => t('Cannot be any of the terms selected in the list to the left.'),
+        '#prefix' => '</div><div class="merge-selectors">',
+      );
+    }
 
     $form = array(
       'term_list' => array(
@@ -96,13 +122,7 @@ function term_merge_term_merge_form($form, $form_state, $vocabulary) {
         '#prefix' => '<div class="merge-container clearfix"><div class="terms-selector">',
       ),
 
-      'replacement_term' => array(
-        '#type' => 'select',
-        '#title' => t('Into'),
-        '#description' => t('Cannot be any of the terms selected in the list to the left.'),
-        '#options' => _term_delete_form_replacement_term_options($vocabulary->vid, 0, TRUE),
-        '#prefix' => '</div><div class="merge-selectors">',
-      ),
+      'replacement_term' => $replacement_form_element,
 
       'replacement_term_new' => array(
         '#type' => 'textfield',
@@ -155,6 +175,29 @@ function term_merge_term_merge_form($form, $form_state, $vocabulary) {
 }
 
 /**
+ * An autocomplete path for terms
+ * @param type $search 
+ */
+function term_merge_autocomplete($vid, $search) {
+  $query = db_select('taxonomy_term_data', 't')
+    ->fields('t', array('tid', 'name'))
+    ->condition('t.name', '%' . $search . '%', 'LIKE')
+    ->condition('t.vid', $vid->vid)
+    ->range(0, 30)
+    ->orderBy('t.name', 'ASC');
+  $result = $query->execute();
+
+  $matches = array();
+  foreach ($result->fetchAll() as $term) {
+    // Add a class wrapper for a few required CSS overrides.
+    $index = $term->name . " [tid:" . $term->tid . "]";
+    $matches[$index] = $term->name;
+  }
+  
+  drupal_json_output($matches);
+}
+
+/**
  *  Validation handler for term_merge_term_merge_form().
  */
 function term_merge_term_merge_form_validate($form, &$form_state) {
@@ -182,12 +225,19 @@ function term_merge_term_merge_form_validate($form, &$form_state) {
  *  Collects data about what terms to merge into what term and sends it to term_merge().
  */
 function term_merge_term_merge_form_submit($form, &$form_state) {
+  preg_match('/^.*\[tid\:([0-9]+)\]/', $form_state['values']['replacement_term'], $tid);
+  
+  if ($form_state['storage'] != null) {
+    $replacement_term = $form_state['storage']['replacement_term'];
+  }
 
   if (!isset($form_state['storage']['term_list'])) {  // Store values and rebuild form for merge confirmation.
+    // We may be using an autocomplete path (text tid: x) or not. Make sure to get the right value
+    $replacement_term = (!empty($tid)) ? $tid[1] : $form_state['values']['replacement_term'];
     $form_values = $form_state['values'];
 
     $form_state['storage']['term_list'] = $form_values['term_list'];
-    $form_state['storage']['replacement_term'] = $form_values['replacement_term'];
+    $form_state['storage']['replacement_term'] = $replacement_term;
     $form_state['storage']['replacement_term_new'] = $form_values['replacement_term_new'];
     $form_state['storage']['merge_redirect_path'] = $form_values['merge_redirect_path'];
     $form_state['storage']['keep_merged'] = $form_values['keep_merged'];
@@ -196,7 +246,6 @@ function term_merge_term_merge_form_submit($form, &$form_state) {
     $form_state['rebuild'] = TRUE;
   }
   else {  // Merge confirmed, do it!
-    $replacement_term = $form_state['storage']['replacement_term'];
     $merged_terms = $form_state['storage']['term_list'];
     $replacement_term_new = $form_state['storage']['replacement_term_new'];
 
@@ -211,9 +260,14 @@ function term_merge_term_merge_form_submit($form, &$form_state) {
 
      // Redirect user after merge.
     $form_state['redirect'] = $form_state['storage']['merge_redirect_path'];
+    var_dump($dest_tid);
+    var_dump($replacement_term);
+    var_dump($form_state['storage']);
+    
+    exit();
 
     // Now merge.
-    term_merge($merged_terms, $dest_tid, $form_state['storage']['keep_merged']);
+    //term_merge($merged_terms, $dest_tid, $form_state['storage']['keep_merged']);
   }
 }
 
@@ -368,6 +422,8 @@ function term_merge($source, $dest, $keep_merged) {
     }
   }
 
+  var_dump($update_batch['operations'][1][1][0]);
+  exit();
   // Initialize the batch process.
   batch_set($update_batch);
 }
@@ -484,7 +540,6 @@ function _term_merge_insert_field_values($update_data, &$context) {
 
   // Save the new field values if something has changed.
   if ($target_merged) {
-    field_attach_presave($entity_type, $entity);
     field_attach_update($entity_type, $entity);
   }
 }
@@ -587,3 +642,4 @@ function _term_merge_form_attach($form_element) {
 
   return $form_element;
 }
+
