diff --git a/include/class.search.php b/include/class.search.php
index 8965f2e45f7f52856d2ed728d4e6ad0c9c4dac59..74dc48638c2d5e7593eae4794aba5cf2a6d95544 100644
--- a/include/class.search.php
+++ b/include/class.search.php
@@ -330,16 +330,15 @@ class MysqlSearchBackend extends SearchBackend {
         $criteria = clone $criteria;
 
         $mode = ' IN NATURAL LANGUAGE MODE';
-        // If using boolean operators, search in boolean mode
-        if (preg_match('/["+<>(~-]\w|\w["*)]/u', $query, $T = array()))
+        // If using boolean operators, search in boolean mode. This regex
+        // will ensure proper placement of operators, whitespace, and quotes
+        // in an effort to avoid crashing the query at MySQL
+        if (preg_match('/^(?:[(+<>~-]*(\w+[*]?|"[^"]+")[)]?(\s+|$))+$/u', $query, $T = array()))
             $mode = ' IN BOOLEAN MODE';
-        #if (count(explode(' ', $query)) == 1)
+        #elseif (count(explode(' ', $query)) == 1)
         #    $mode = ' WITH QUERY EXPANSION';
         $query = $this->quote($query);
         $search = 'MATCH (Z1.title, Z1.content) AGAINST ('.db_input($query).$mode.')';
-        $tables = array();
-        $P = TABLE_PREFIX;
-        $sort = '';
 
         switch ($criteria->model) {
         case false:
@@ -353,10 +352,7 @@ class MysqlSearchBackend extends SearchBackend {
                         "(SELECT COALESCE(Z3.`object_id`, Z5.`ticket_id`) as `ticket_id`, {} AS `relevance` FROM `:_search` Z1 LEFT JOIN `:thread_entry` Z2 ON (Z1.`object_type` = 'H' AND Z1.`object_id` = Z2.`id`) LEFT JOIN `:thread` Z3 ON (Z2.`thread_id` = Z3.`id` AND Z3.`object_type` = 'T') LEFT JOIN `:ticket` Z5 ON (Z1.`object_type` = 'T' AND Z1.`object_id` = Z5.`ticket_id`) WHERE {}) Z1"),
                 )
             ));
-            // XXX: This is extremely ugly
             $criteria->filter(array('ticket_id'=>new SqlCode('Z1.`ticket_id`')))->distinct('ticket_id');
-
-            // TODO: Consider sorting preferences
         }
 
         // TODO: Ensure search table exists;
diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php
index 7b7cddd23e94e616481d7cdfda691b715864482f..8438ac2d4b844650e964619c1ae612f6a79f97a7 100644
--- a/include/staff/tickets.inc.php
+++ b/include/staff/tickets.inc.php
@@ -340,7 +340,7 @@ return false;">
     <input type="hidden" name="search-type" value=""/>
     <div class="attached input">
       <input type="text" class="basic-search" data-url="ajax.php/tickets/lookup" name="query"
-        autofocus size="30" value="<?php echo Format::htmlchars(urldecode($_REQUEST['query']), true); ?>"
+        autofocus size="30" value="<?php echo Format::htmlchars($_REQUEST['query'], true); ?>"
         autocomplete="off" autocorrect="off" autocapitalize="off">
       <button type="submit" class="attached button"><i class="icon-search"></i>
       </button>
diff --git a/scp/js/scp.js b/scp/js/scp.js
index a47af3361a58e9d5f04bdee2eb5d8aa629b982c3..fe090490ab19626257041f5afbfbce29f9489f75 100644
--- a/scp/js/scp.js
+++ b/scp/js/scp.js
@@ -1173,7 +1173,7 @@ function __(s) {
 
 // Thanks, http://stackoverflow.com/a/487049
 function addSearchParam(data) {
-    var kvp = document.location.search.substr(1).split('&');
+    var kvp = document.location.search.substr(1).replace('+', ' ').split('&');
     var i=kvp.length, x, params = {};
     while (i--) {
         x = kvp[i].split('=');