diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php
index 2eff8924b84c1d909d8c35da3ea171d4ebf2619a..6fb369d73778254779707efab374eddd7677cf28 100644
--- a/include/ajax.tickets.php
+++ b/include/ajax.tickets.php
@@ -22,30 +22,32 @@ class TicketsAjaxAPI extends AjaxController {
    
     function search() {
 
-        $limit = isset($_GET['limit']) ? (int) $_GET['limit']:25;
+        $limit = isset($_REQUEST['limit']) ? (int) $_REQUEST['limit']:25;
         $items=array();
         $ticketid=false;
-        if(isset($_GET['id'])){
-            $WHERE=' WHERE ticketID LIKE \''.db_input($_GET['id'], false).'%\'';
+        if(is_numeric($_REQUEST['q'])) {
+            $WHERE=' WHERE ticketID LIKE \''.db_input($_REQUEST['q'], false).'%\'';
             $ticketid=true;
-        }elseif(isset($_GET['email'])){
-            $WHERE=' WHERE email LIKE \''.db_input(strtolower($_GET['email']), false).'%\'';
-        }else{
-            Http::response(400, "id or email argument is required");
+        } elseif(isset($_REQUEST['q'])) {
+            $WHERE=' WHERE email LIKE \''.db_input(strtolower($_REQUEST['q']), false).'%\'';
+        } else {
+            Http::response(400, 'Query argument is required');
         }
-        $sql='SELECT DISTINCT ticketID,email,name FROM '.TICKET_TABLE.' '.$WHERE.' ORDER BY created LIMIT '.$limit;
-        $res=db_query($sql);
-        if($res && db_num_rows($res)){
+        $sql='SELECT DISTINCT ticketID, email, name '
+            .' FROM '.TICKET_TABLE.' '.$WHERE
+            .' ORDER BY created '
+            .' LIMIT '.$limit;
+
+        if(($res=db_query($sql)) && db_num_rows($res)){
             while(list($id,$email,$name)=db_fetch_row($res)) {
                 $info=($ticketid)?$email:$id;
                 $id=($ticketid)?$id:$email;
-                # TODO: Return 'name' from email address if 'email' argument
-                #       specified?
                 $items[] = array('id'=>$id, 'value'=>$id, 'info'=>$info,
                                  'name'=>$name);
             }
         }
-        return $this->encode(array('results'=>$items));
+
+        return $this->encode($items);
     }
 
     function acquireLock($tid) {
diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php
index d0b27690e2cf138140c1707e1f3a92809493cc91..3bfc8156ace212268d53e34be15f6ccaafb4b4c3 100644
--- a/include/staff/tickets.inc.php
+++ b/include/staff/tickets.inc.php
@@ -254,7 +254,7 @@ $basic_display=!isset($_REQUEST['advance_search'])?true:false;
     <input type="hidden" name="a" value="search">
     <table>
         <tr>
-            <td><input type="text" id="query" name="query" size=30 value="<?php echo Format::htmlchars($_REQUEST['query']); ?>"></td>
+            <td><input type="text" id="ticket-search" name="query" size=30 value="<?php echo Format::htmlchars($_REQUEST['query']); ?>"></td>
             <td><input type="submit" name="basic_search" class="button" value="Search"></td>
         </tr>
     </table>
diff --git a/scp/ajax.php b/scp/ajax.php
index a65de32d2d166af48661eec772cedc414d3b87a1..7c66da27ca0b1853953bdec0c624560db3176215 100644
--- a/scp/ajax.php
+++ b/scp/ajax.php
@@ -45,7 +45,7 @@ $dispatcher = patterns("",
     url("^/config/", patterns("ajax.config.php:ConfigAjaxAPI",
         url_get("^ui",'ui')
     )),
-    url_get("^/ticket$", array("ajax.tickets.php:TicketsAjaxAPI", "search")),
+    url_get("^/tickets$", array("ajax.tickets.php:TicketsAjaxAPI", "search")),
     url("^/ticket/", patterns("ajax.tickets.php:TicketsAjaxAPI",
         url_get("^(?P<tid>\d+)/preview", "previewTicket"),
         url_get("^(?P<tid>\d+)/lock", "acquireLock"),
diff --git a/scp/js/scp.js b/scp/js/scp.js
index 4f61090529b84749a91139ef237308ed3a5e31ee..10b8d733121107ce95840054cd6024d08bba9d54 100644
--- a/scp/js/scp.js
+++ b/scp/js/scp.js
@@ -185,4 +185,21 @@ $(document).ready(function(){
         }
     }
 
+    /* Typeahead init */
+    $('#ticket-search').typeahead({
+        source: function (typeahead, query) {
+            $.ajax({
+                url: "ajax.php/tickets?q="+query,
+                dataType: 'json',
+                success: function (data) {
+                    typeahead.process(data);
+                }
+            });
+        },
+        onselect: function (obj) {
+            $('#ticket-search').closest('form').submit();
+        },
+        property: "value"
+    });
+
 });