diff --git a/project_issue.module b/project_issue.module
index 1f28efa..8b7e831 100644
--- a/project_issue.module
+++ b/project_issue.module
@@ -171,6 +171,16 @@ function project_issue_menu() {
     );
   }
 
+  // Outputs JSON for "Issue tags" taxonomy autocomplete suggestions.
+  // Original path "taxonomy/autocomplete/%/%" still works from taxonomy.module.
+  // This affects only "taxonomy/autocomplete/taxonomy_vocabulary_9" to add sorting.
+  $items['taxonomy/autocomplete/taxonomy_vocabulary_9'] = array(
+    'title' => 'Issue tags Autocomplete',
+    'page callback' => 'project_issue_issue_tag_autocomplete',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
   return $items;
 }
 
@@ -2795,3 +2805,104 @@ function project_issue_default_component_allowed_values($field, $instance, $enti
   }
   return $return;
 }
+
+/**
+ * Original function is taxonomy_autocomplete(), has been overridden to add sorting.
+ *
+ * Page callback: Outputs JSON for "Issue tags" taxonomy autocomplete suggestions.
+ *
+ * Path: taxonomy/autocomplete/taxonomy_vocabulary_9
+ *
+ * This callback outputs term name suggestions in response to Ajax requests
+ * made by the taxonomy autocomplete widget for taxonomy term reference
+ * fields. The output is a JSON object of plain-text term suggestions, keyed by
+ * the user-entered value with the completed term name appended.  Term names
+ * containing commas are wrapped in quotes.
+ *
+ * For example, suppose the user has entered the string 'red fish, blue' in the
+ * field, and there are two taxonomy terms, 'blue fish' and 'blue moon'. The
+ * JSON output would have the following structure:
+ * @code
+ *   {
+ *     "red fish, blue fish": "blue fish",
+ *     "red fish, blue moon": "blue moon",
+ *   };
+ * @endcode
+ *
+ * @param $tags_typed
+ *   (optional) A comma-separated list of term names entered in the
+ *   autocomplete form element. Only the last term is used for autocompletion.
+ *   Defaults to '' (an empty string).
+ *
+ * @see taxonomy_autocomplete()
+ * @see taxonomy_menu()
+ * @see taxonomy_field_widget_info()
+ */
+function project_issue_issue_tag_autocomplete($tags_typed = '') {
+  $time_start = microtime(true);
+  // Issues tag taxonomy vocabulary name
+  $field_name = 'taxonomy_vocabulary_9';
+  // If the request has a '/' in the search text, then the menu system will have
+  // split it into multiple arguments, recover the intended $tags_typed.
+  $args = func_get_args();
+
+  $tags_typed = implode('/', $args);
+
+  // Make sure the field exists and is a taxonomy field.
+  if (!($field = field_info_field($field_name)) || $field['type'] !== 'taxonomy_term_reference') {
+    // Error string. The JavaScript handler will realize this is not JSON and
+    // will display it as debugging information.
+    print t('Taxonomy field @field_name not found.', array('@field_name' => $field_name));
+    exit;
+  }
+
+  // The user enters a comma-separated list of tags. We only autocomplete the last tag.
+  $tags_typed = drupal_explode_tags($tags_typed);
+  $tag_last = drupal_strtolower(array_pop($tags_typed));
+
+  $term_matches = array();
+  if ($tag_last != '') {
+
+    // 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');
+
+    // Do not select already entered terms.
+    if (!empty($tags_typed)) {
+      $query->condition('t.name', $tags_typed, 'NOT IN');
+    }
+    // Select rows that match by term name.
+    $tags_return = $query
+      ->fields('t', array('tid', 'name'));
+    // Expression of issues count from taxonomy_index
+    $tags_return->addExpression('COUNT(1)', 'c');
+    $tags_return->leftJoin('taxonomy_index', 'i', 'i.tid = t.tid');
+    $result = $tags_return->condition('t.vid', $vids)
+      ->condition('t.name', '%' . db_like($tag_last) . '%', 'LIKE')
+      ->range(0, 10)
+      ->groupBy('t.tid')
+      ->orderBy('c', 'DESC')
+      ->execute()
+      ->fetchAllKeyed();
+
+    $prefix = count($tags_typed) ? drupal_implode_tags($tags_typed) . ', ' : '';
+
+    foreach ($result as $tid => $name) {
+      $n = $name;
+      // Term names containing commas or quotes must be wrapped in quotes.
+      if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) {
+        $n = '"' . str_replace('"', '""', $name) . '"';
+      }
+      $term_matches[$prefix . $n] = check_plain($name);
+    }
+  }
+
+  drupal_json_output($term_matches);
+}
