diff --git a/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php b/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php
index 96a66ff75f5e195dadef0cf43c702f9430632935..81fa6565a234f9168b2aa13c18733401e9646e03 100644
--- a/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php
+++ b/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php
@@ -54,6 +54,12 @@ class ContactInGroupFilter extends AbstractFieldFilterHandler {
     if (!is_array($group_ids)) {
       $group_ids = array($group_ids);
     }
+
+    // If the groups are smartgroups (saved searches) they may be out of date.
+    // This triggers a check (and rebuild if necessary).
+    \CRM_Contact_BAO_GroupContactCache::check($group_ids);
+
+    // Look in the group contact table
     $groupTableAlias = 'civicrm_group_contact_'.$this->inputFieldSpecification->alias;
     $groupFilters = array(
       new SqlDataFlow\SimpleWhereClause($groupTableAlias, 'status', '=', 'Added'),
@@ -68,11 +74,40 @@ class ContactInGroupFilter extends AbstractFieldFilterHandler {
         $groupFilters,
         $dataFlow->getName(),
         $this->inputFieldSpecification->name,
-        'IN'
+        $filter['op']
+      );
+      $whereClauses[] = $this->whereClause;
+    }
+
+    // Now look in the smartgroup group contact table
+    $groupTableAlias = 'civicrm_group_contact_cache_'.$this->inputFieldSpecification->alias;
+    $groupFilters = array(
+      new SqlDataFlow\SimpleWhereClause($groupTableAlias, 'group_id', 'IN', $group_ids),
+    );
+
+    if ($dataFlow && $dataFlow instanceof SqlDataFlow) {
+      $this->whereClause = new SqlDataFlow\InTableWhereClause(
+        'contact_id',
+        'civicrm_group_contact_cache',
+        $groupTableAlias,
+        $groupFilters,
+        $dataFlow->getName(),
+        $this->inputFieldSpecification->name,
+        $filter['op']
       );
 
-      $dataFlow->addWhereClause($this->whereClause);
+      $whereClauses[] = $this->whereClause;
+    }
+    switch ($filter['op']) {
+      case 'IN':
+        $this->whereClause = new SqlDataFlow\OrClause($whereClauses);
+        break;
+
+      case 'NOT IN':
+        $this->whereClause = new SqlDataFlow\AndClause($whereClauses);
+        break;
     }
+    $dataFlow->addWhereClause($this->whereClause);
   }
 
   /**