diff --git a/app/assets/javascripts/main.js.coffee b/app/assets/javascripts/main.js.coffee
index 3334439ca87643905de7d60546572c4ce598cdfe..f6c398c0acf17f78f3d685556220ddaceee8e983 100644
--- a/app/assets/javascripts/main.js.coffee
+++ b/app/assets/javascripts/main.js.coffee
@@ -13,6 +13,12 @@ window.errorMessage = (message) ->
   ehtml.html(message)
   ehtml
 
+window.split = (val) ->
+  return val.split( /,\s*/ )
+
+window.extractLast = (term) ->
+  return split( term ).pop()
+
 # Disable button if text field is empty
 window.disableButtonIfEmptyField = (field_selector, button_selector) ->
   field = $(field_selector)
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index 6b21f463c4c3318f594686ea554230d29089de14..264b764fa26367f207294a64703409bc47c97595 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -30,4 +30,10 @@ module IssuesHelper
       open: "open"
     }
   end
+
+  def labels_autocomplete_source
+    labels = @project.issues_labels.order('count DESC')
+    labels = labels.map{ |l| { label: l.name, value: l.name } }
+    labels.to_json
+  end
 end
diff --git a/app/views/issues/_form.html.haml b/app/views/issues/_form.html.haml
index 670b4e059f4fe87f84fce15bef2fe02641ddd152..8a9a91a36a8153c72876cfe02783cfc58c9b3b62 100644
--- a/app/views/issues/_form.html.haml
+++ b/app/views/issues/_form.html.haml
@@ -55,3 +55,36 @@
           = link_to "Cancel", project_issues_path(@project), class: cancel_class
         - else
           = link_to "Cancel", project_issue_path(@project, @issue), class: cancel_class
+
+
+
+
+:javascript
+  $(function(){
+    $("#issue_label_list")
+      .bind( "keydown", function( event ) {
+        if ( event.keyCode === $.ui.keyCode.TAB &&
+          $( this ).data( "autocomplete" ).menu.active ) {
+          event.preventDefault();
+        }
+      })
+      .autocomplete({
+        minLength: 0,
+        source: function( request, response ) {
+          response( $.ui.autocomplete.filter(
+            #{raw labels_autocomplete_source}, extractLast( request.term ) ) );
+        },
+        focus: function() {
+          return false;
+        },
+        select: function(event, ui) {
+          var terms = split( this.value );
+          terms.pop();
+          terms.push( ui.item.value );
+          terms.push( "" );
+          this.value = terms.join( ", " );
+          return false;
+        }
+      });
+  });
+