diff --git a/include/ajax.search.php b/include/ajax.search.php
index 23e4a6bec9cef6ff24b535c4bcb7f15674186330..4013d27e4290e3a5ffa3187069a6fa04c1c8fcf4 100644
--- a/include/ajax.search.php
+++ b/include/ajax.search.php
@@ -29,10 +29,7 @@ class SearchAjaxAPI extends AjaxController {
             Http::response(403, 'Agent login required');
 
         $search = SavedSearch::create();
-        // Don't send the state as the souce because it is not in the
-        // ::parse format (it's in ::to_php format)
-        $form = $search->getFormFromSession('advsearch');
-        $form->loadState($_SESSION['advsearch']);
+        $form = $search->getFormFromSession('advsearch') ?: $search->getForm();
         $matches = self::_getSupportedTicketMatches();
 
         include STAFFINC_DIR . 'templates/advanced-search.tmpl.php';
@@ -64,8 +61,6 @@ class SearchAjaxAPI extends AjaxController {
             break;
 
         default:
-            // The "extended" fields are build automatically and rooted from
-            // the base of the ID numbers
             $extended = SavedSearch::getExtendedTicketFields();
 
             if (isset($extended[$name])) {
@@ -205,11 +200,12 @@ class SearchAjaxAPI extends AjaxController {
             Http::response(404, 'No such saved search');
         }
 
-        $form = $search->getForm();
-        if ($state = JsonDataParser::parse($search->config))
+        if ($state = JsonDataParser::parse($search->config)) {
+            $form = $search->loadFromState($state);
             $form->loadState($state);
-
+        }
         $matches = self::_getSupportedTicketMatches();
+
         include STAFFINC_DIR . 'templates/advanced-search.tmpl.php';
     }
 
diff --git a/include/class.search.php b/include/class.search.php
index 1236d14bb415f11e92d836764163f06b92721a38..b68a0d3ed37c6cf92e712987c141c36e4ff0f378 100644
--- a/include/class.search.php
+++ b/include/class.search.php
@@ -621,22 +621,25 @@ class SavedSearch extends VerySimpleModel {
         )));
     }
 
-    function getFormFromSession($key, $source=false) {
-        if (isset($_SESSION[$key])) {
-            $source = $source ?: array();
-            $state = $_SESSION[$key];
-            // Pull out 'other' fields from the state so the fields will be
-            // added to the form. The state will be loaded below
-            foreach ($state as $k=>$v) {
-                $info = array();
-                if (!preg_match('/^:(\w+)(?:!(\d+))?\+search/', $k, $info)) {
-                    continue;
-                }
-                list($k,) = explode('+', $k, 2);
-                $source['fields'][] = $k;
+    function loadFromState($source=false) {
+        // Pull out 'other' fields from the state so the fields will be
+        // added to the form. The state will be loaded below
+        $state = $source ?: array();
+        foreach ($state as $k=>$v) {
+            $info = array();
+            if (!preg_match('/^:(\w+)(?:!(\d+))?\+search/', $k, $info)) {
+                continue;
             }
+            list($k,) = explode('+', $k, 2);
+            $state['fields'][] = $k;
+        }
+        return $this->getForm($state);
+    }
+
+    function getFormFromSession($key) {
+        if (isset($_SESSION[$key])) {
+            return $this->loadFromState($_SESSION[$key]);
         }
-        return $this->getForm($source);
     }
 
     function getForm($source=false) {
@@ -660,7 +663,10 @@ class SavedSearch extends VerySimpleModel {
             $fields = array_merge($fields, self::getSearchField($field, $name));
         }
 
-        $form = new SimpleForm($fields, $source);
+        // Don't send the state as the souce because it is not in the
+        // ::parse format (it's in ::to_php format). Instead, source is set
+        // via ::loadState() below
+        $form = new AdvancedSearchForm($fields, $source);
         $form->addValidator(function($form) {
             $selected = 0;
             foreach ($form->getFields() as $F) {
@@ -673,6 +679,8 @@ class SavedSearch extends VerySimpleModel {
             if (!$selected)
                 $form->addError(__('No fields selected for searching'));
         });
+        if ($source)
+            $form->loadState($source);
         return $form;
     }
 
@@ -704,10 +712,9 @@ class SavedSearch extends VerySimpleModel {
             )),
         );
 
-        $extended = self::getExtendedTicketFields();
-
         // Add 'other' fields added dynamically
         if (is_array($source) && isset($source['fields'])) {
+            $extended = self::getExtendedTicketFields();
             foreach ($source['fields'] as $f) {
                 $info = array();
                 if (isset($extended[$f])) {
@@ -788,7 +795,7 @@ class SavedSearch extends VerySimpleModel {
 
     function mangleQuerySet(QuerySet $qs, $form=false) {
         $form = $form ?: $this->getForm();
-        $searchable = $this->getCurrentSearchFields($form->getSource());
+        $searchable = $this->getCurrentSearchFields($form->state);
         $qs = clone $qs;
 
         // Figure out fields to search on
@@ -888,6 +895,15 @@ class SavedSearch extends VerySimpleModel {
     }
 }
 
+class AdvancedSearchForm extends SimpleForm {
+    var $state;
+
+    function __construct($fields, $state) {
+        parent::__construct($fields);
+        $this->state = $state;
+    }
+}
+
 // Advanced search special fields
 
 class HelpTopicChoiceField extends ChoiceField {
diff --git a/include/staff/templates/advanced-search-field.tmpl.php b/include/staff/templates/advanced-search-field.tmpl.php
index 40712cc18cbf18a639437b3331a71ead5828a7b7..5191a0cf4dac8217e664798d76d925e4623e6e08 100644
--- a/include/staff/templates/advanced-search-field.tmpl.php
+++ b/include/staff/templates/advanced-search-field.tmpl.php
@@ -1,7 +1,8 @@
 <input type="hidden" name="fields[]" value="<?php echo $name; ?>"/>
 <?php foreach ($fields as $F) { ?>
 <fieldset id="field<?php echo $F->getWidget()->id;
-    ?>" <?php if (!$F->isVisible()) echo 'style="display:none;"'; ?>>
+    ?>" <?php if (!$F->isVisible()) echo 'style="display:none;"'; ?>
+    <?php if (substr($F->get('name'), -7) === '+search') echo 'class="advanced-search-field"'; ?>>
     <?php echo $F->render(); ?>
     <?php foreach ($F->errors() as $E) {
         ?><div class="error"><?php echo $E; ?></div><?php
diff --git a/include/staff/templates/advanced-search.tmpl.php b/include/staff/templates/advanced-search.tmpl.php
index 9ce8ff2dca0baecbd775c9802195f85b9ce09f26..94d193b598e851fff60469cadcf5e2706b23c32c 100644
--- a/include/staff/templates/advanced-search.tmpl.php
+++ b/include/staff/templates/advanced-search.tmpl.php
@@ -16,7 +16,8 @@ foreach ($form->errors(true) ?: array() as $message) {
 
 foreach ($form->getFields() as $name=>$field) { ?>
     <fieldset id="field<?php echo $field->getWidget()->id;
-        ?>" <?php if (!$field->isVisible()) echo 'class="hidden"'; ?>>
+        ?>" <?php if (!$field->isVisible()) echo 'class="hidden"'; ?>
+        <?php if (substr($field->get('name'), -7) === '+search') echo 'class="advanced-search-field"'; ?>>
         <?php echo $field->render(); ?>
         <?php foreach ($field->errors() as $E) {
             ?><div class="error"><?php echo $E; ?></div><?php
diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php
index ff8b36ffdcae657b0ffc3c3e0f903d45345a9db4..32d556b3f7bb66191337103b82322ac45a834842 100644
--- a/include/staff/tickets.inc.php
+++ b/include/staff/tickets.inc.php
@@ -105,9 +105,7 @@ case 'search':
         }
         break;
     } elseif (isset($_SESSION['advsearch'])) {
-        // XXX: De-duplicate and simplify this code
         $form = $search->getFormFromSession('advsearch');
-        $form->loadState($_SESSION['advsearch']);
         $tickets = $search->mangleQuerySet($tickets, $form);
         $view_all_tickets = $thisstaff->getRole()->hasPerm(SearchBackend::PERM_EVERYTHING);
         $results_type=__('Advanced Search')
diff --git a/scp/css/scp.css b/scp/css/scp.css
index 5bd0cf2ffb60593fc49e16a9ea5af2972df3ce6a..ad7c976ade5c91a161e2b1e345801a253f5fa85d 100644
--- a/scp/css/scp.css
+++ b/scp/css/scp.css
@@ -1613,10 +1613,6 @@ time.faq {
     width:100%;
 }
 
-#advanced-search div.closed_by, #advanced-search span.spinner {
-    display:none;
-}
-
 .dialog fieldset {
     margin:0;
     padding:0 0;
@@ -1672,42 +1668,14 @@ time.faq {
     vertical-align: top;
 }
 
-#advanced-search .query input {
-    width:100%;
-    padding: 4px;
-    margin-bottom: 10px;
-}
-
-#advanced-search .date_range {
-    margin-bottom: 5px;
-}
-#advanced-search .date_range input {
-    width:227px;
-    width: calc(49% - 73px);
-}
-
-#advanced-search .date_range i {
-    display:inline-block;
-    margin-left:3px;
-    position:relative;
-    top:5px;
-    width:16px;
-    height:16px;
-    background:url(../images/cal.png) bottom left no-repeat;
-}
-
-#advanced-search fieldset.sorting select {
-    width:130px;
-}
-
-#advanced-search p {
-    text-align:center;
-}
-
 .search-dropdown {
     padding-left: 19px;
 }
 
+.advanced-search-field {
+    margin-top: 5px !important;
+}
+
 .dialog input[type="submit"],
 .dialog input[type="reset"],
 .dialog input[type="button"],
diff --git a/scp/tickets.php b/scp/tickets.php
index 3f1882217e412bffdb6f770d3bccd7e05cc5a5f8..8c1f84047c82f21330b73bb3569e8ba7b680fc28 100644
--- a/scp/tickets.php
+++ b/scp/tickets.php
@@ -473,7 +473,6 @@ if (isset($_SESSION['advsearch'])) {
     // XXX: De-duplicate and simplify this code
     $search = SavedSearch::create();
     $form = $search->getFormFromSession('advsearch');
-    $form->loadState($_SESSION['advsearch']);
     $tickets = TicketModel::objects();
     $tickets = $search->mangleQuerySet($tickets, $form);
     $count = $tickets->count();