diff --git a/include/class.forms.php b/include/class.forms.php
index a0192de63c2affad1f24e7db991a0b6ab2a5c51b..ea0947e44fbd2db2450f7a5c65d96ce15f229cef 100644
--- a/include/class.forms.php
+++ b/include/class.forms.php
@@ -1252,6 +1252,18 @@ class BooleanField extends FormField {
             'set.not' => null,
         );
     }
+
+    function getSearchQ($method, $value, $name=false) {
+        $name = $name ?: $this->get('name');
+        switch ($method) {
+        case 'set':
+            return new Q(array($name => '1'));
+        case 'set.not':
+            return new Q(array($name => '0'));
+        default:
+            return parent::getSearchQ($method, $value, $name);
+        }
+    }
 }
 
 class ChoiceField extends FormField {
diff --git a/include/class.search.php b/include/class.search.php
index 43a9cb30c182d76b849ece53538812ea5abe44f5..1236d14bb415f11e92d836764163f06b92721a38 100644
--- a/include/class.search.php
+++ b/include/class.search.php
@@ -795,6 +795,7 @@ class SavedSearch extends VerySimpleModel {
         foreach ($form->getFields() as $f) {
             if (substr($f->get('name'), -7) == '+search' && $f->getClean()) {
                 $name = substr($f->get('name'), 0, -7);
+                $filter = new Q();
                 // Determine the search method and fetch the original field
                 if (($M = $form->getField("{$name}+method"))
                     && ($method = $M->getClean())
@@ -816,12 +817,6 @@ class SavedSearch extends VerySimpleModel {
                         );
                         $column = $field->get('name') ?: 'field_'.$field->get('id');
                         list($type,$id) = explode('!', $name, 2);
-                        $OP = $other_paths[$type];
-                        if ($type == ':field') {
-                            $DF = DynamicFormField::lookup($id);
-                            TicketModel::registerCustomData($DF->form);
-                            $OP = 'cdata+'.$DF->form->id.'__';
-                        }
                         // XXX: Last mile — find a better idea
                         switch (array($type, $column)) {
                         case array(':user', 'name'):
@@ -834,13 +829,21 @@ class SavedSearch extends VerySimpleModel {
                             $name = 'user__org__name';
                             break;
                         default:
+                            if ($type == ':field' && $id) {
+                                $name = 'entries__answers__value';
+                                $filter->add(array('entries__answers__field_id' => $id));
+                                break;
+                            }
+                            $OP = $other_paths[$type];
                             $name = $OP . $column;
                         }
                     }
 
                     // Add the criteria to the QuerySet
-                    if ($Q = $field->getSearchQ($method, $value, $name))
-                        $qs = $qs->filter($Q);
+                    if ($Q = $field->getSearchQ($method, $value, $name)) {
+                        $filter->add($Q);
+                        $qs = $qs->filter($filter);
+                    }
                 }
             }
         }
diff --git a/include/class.ticket.php b/include/class.ticket.php
index 86634603200f535244e7bacfc261d4e6566f0d26..1cb11c7f80f381d7e924b8adaee9ce3eeba245c5 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -81,6 +81,12 @@ class TicketModel extends VerySimpleModel {
                 'reverse' => 'TicketCData.ticket',
                 'list' => false,
             ),
+            'entries' => array(
+                'constraint' => array(
+                    "'T'" => 'DynamicFormEntry.object_type',
+                    'ticket_id' => 'DynamicFormEntry.object_id',
+                ),
+            ),
         )
     );