diff --git a/profiles/mcdonalds_testimonials/modules/contrib/search_api_db/search_api_db.test b/profiles/mcdonalds_testimonials/modules/contrib/search_api_db/search_api_db.test
index 80c234e..8b85866 100644
--- a/profiles/mcdonalds_testimonials/modules/contrib/search_api_db/search_api_db.test
+++ b/profiles/mcdonalds_testimonials/modules/contrib/search_api_db/search_api_db.test
@@ -45,6 +45,7 @@ class SearchApiDbTest extends DrupalWebTestCase {
     $this->searchNoResults();
     $this->indexItems();
     $this->searchSuccess1();
+    $this->checkFacets();
     $this->regressionTests();
     $this->editServer();
     $this->searchSuccess2();
@@ -237,6 +238,57 @@ class SearchApiDbTest extends DrupalWebTestCase {
     $this->assertEqual($results['warnings'], array(), 'No warnings were displayed.');
   }
 
+  protected function checkFacets() {
+    $query = $this->buildSearch();
+    $filter = $query->createFilter('OR', array('facet:type'));
+    $filter->condition('type', 'article');
+    $query->filter($filter);
+    $facets['type'] = array(
+      'field' => 'type',
+      'limit' => 0,
+      'min_count' => 1,
+      'missing' => TRUE,
+      'operator' => 'or',
+    );
+    $query->setOption('search_api_facets', $facets);
+    $query->range(0, 0);
+    $results = $query->execute();
+    $this->assertEqual($results['result count'], 2, 'OR facets query returned correct number of results.');
+    $expected = array(
+      array('count' => 2, 'filter' => '"article"'),
+      array('count' => 2, 'filter' => '"item"'),
+      array('count' => 1, 'filter' => '!'),
+    );
+    $facet_match = _search_api_settings_equals($results['search_api_facets']['type'], $expected);
+    $this->assertTrue($facet_match, 'Correct OR facets were returned');
+
+    $query = $this->buildSearch();
+    $filter = $query->createFilter('OR', array('facet:type'));
+    $filter->condition('type', 'article');
+    $query->filter($filter);
+    $filter = $query->createFilter('AND');
+    $filter->condition('type', NULL, '<>');
+    $query->filter($filter);
+    $facets['type'] = array(
+      'field' => 'type',
+      'limit' => 0,
+      'min_count' => 1,
+      'missing' => TRUE,
+      'operator' => 'or',
+    );
+    $query->setOption('search_api_facets', $facets);
+    $query->range(0, 0);
+    $results = $query->execute();
+    $this->assertEqual($results['result count'], 2, 'OR facets query returned correct number of results.');
+    $expected = array(
+      array('count' => 2, 'filter' => '"article"'),
+      array('count' => 2, 'filter' => '"item"'),
+      array('count' => 1, 'filter' => '!'),
+    );
+    $facet_match = _search_api_settings_equals($results['search_api_facets']['type'], $expected);
+    $this->assertTrue($facet_match, 'Correct OR facets were returned');
+  }
+
   protected function editServer() {
     $server = search_api_server_load($this->server_id, TRUE);
     $server->options['min_chars'] = 4;
diff --git a/profiles/mcdonalds_testimonials/modules/contrib/search_api_db/service.inc b/profiles/mcdonalds_testimonials/modules/contrib/search_api_db/service.inc
index d115ed1..a0f3dcd 100644
--- a/profiles/mcdonalds_testimonials/modules/contrib/search_api_db/service.inc
+++ b/profiles/mcdonalds_testimonials/modules/contrib/search_api_db/service.inc
@@ -138,6 +138,7 @@ class SearchApiDbService extends SearchApiAbstractService {
     $supported = drupal_map_assoc(array(
       'search_api_autocomplete',
       'search_api_facets',
+      'search_api_facets_operator_or',
     ));
     return isset($supported[$feature]);
   }
@@ -930,10 +931,9 @@ class SearchApiDbService extends SearchApiAbstractService {
       $results['result count'] = $count_query->execute()->fetchField();
     }
 
+    $facet_query = clone $db_query;
+
     if ($skip_count || $results['result count']) {
-      if ($query->getOption('search_api_facets')) {
-        $results['search_api_facets'] = $this->getFacets($query, clone $db_query);
-      }
 
       $query_options = $query->getOptions();
       if (isset($query_options['offset']) || isset($query_options['limit'])) {
@@ -994,6 +994,16 @@ class SearchApiDbService extends SearchApiAbstractService {
       $results['results'] = array();
     }
 
+    // Display facets in any case for have ability uncheck incorrect facet items
+    // and not lose already selected filters if no results found.
+    if ($query->getOption('search_api_facets')) {
+      // Check is results found.
+      if (empty($results['results'])) {
+        $query->noResultsFound = TRUE;
+      }
+      $results['search_api_facets'] = $this->getFacets($query, $facet_query);
+    }
+
     $results['warnings'] = array_keys($this->warnings);
     $results['ignored'] = array_keys($this->ignored);
 
@@ -1560,7 +1570,55 @@ class SearchApiDbService extends SearchApiAbstractService {
       }
       $field = $fields[$facet['field']];
 
-      $select = $this->connection->select($table, 't');
+      $operator = isset($facet['operator']) ? $facet['operator'] : 'and';
+      switch ($operator) {
+
+        case 'and':
+          // All "AND" facets can use the main query.
+          $select = $this->connection->select($table, 't');
+          break;
+
+        case 'or':
+          // For "OR" facets, we need to build a different base query
+          // that excludes the facet filters applied to the facet.
+          // Clone search query for use it on facet query.
+          $or_query = clone $query;
+          // Create reference to filters list of facet query.
+          $filters =& $or_query->getFilter()->getFilters();
+          // If no results found - remove all filters from facet query
+          // for "see" all selected facets and has ability "uncheck" it.
+          if (isset($query->noResultsFound)) {
+            $filters = array();
+          }
+          // Results found - remove only filter by current field (facet)
+          // from facet query for "see" all available items of current facet.
+          else {
+            foreach ($filters as $filter_id => $filter) {
+              if ($filter instanceof SearchApiQueryFilterInterface) {
+                // Get all conditions of current filter.
+                $conditions = $filter->getFilters();
+                if ($conditions) {
+                  // Get first filter condition (all conditions is by the same field)
+                  // and check is this filter by current facet, if yes - remove it
+                  // (for display all available items of current facet).
+                  $condition = reset($conditions);
+                  if ($condition && in_array($facet['field'], $condition)) {
+                    unset($filters[$filter_id]);
+                  }
+                }
+              }
+            }
+          }
+          $or_db_query = $this->createDbQuery($or_query, $fields);
+          $select = $this->connection->select($or_db_query, 't');
+          break;
+
+        default:
+          // Throw new exception: Wrong operator selected.
+          throw new SearchApiException(t('Unknown facet operator %operator.', array('%operator' => $facet['operator'])));
+          break;
+      }
+
       $alias = $this->getTableAlias($field, $select, TRUE, $facet['missing'] ? 'leftJoin' : 'innerJoin');
       $select->addField($alias, search_api_is_text_type($field['type']) ? 'word' : $field['column'], 'value');
       // Facets without missing make sure a value is present with an inner join
