diff --git a/search_api_db/src/Tests/BackendTest.php b/search_api_db/src/Tests/BackendTest.php
index 87fb38e..14aca93 100644
--- a/search_api_db/src/Tests/BackendTest.php
+++ b/search_api_db/src/Tests/BackendTest.php
@@ -288,52 +288,51 @@ class BackendTest extends EntityUnitTestBase {
    * Tests whether facets work correctly.
    */
   protected function checkFacets() {
-    // @todo Fix facets.
-//    $query = $this->buildSearch();
-//    $filter = $query->createFilter('OR', array('facet:type'));
-//    $filter->condition($this->getFieldId('type'), 'article');
-//    $query->filter($filter);
-//    $facets['type'] = array(
-//      'field' => $this->getFieldId('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->getResultCount(), 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' => '!'),
-//    );
-//    $this->assertEqual($expected, $results->getExtraData('search_api_facets')['type'], 'Correct OR facets were returned');
-//
-//    $query = $this->buildSearch();
-//    $filter = $query->createFilter('OR', array('facet:' . $this->getFieldId('type')));
-//    $filter->condition($this->getFieldId('type'), 'article');
-//    $query->filter($filter);
-//    $filter = $query->createFilter('AND');
-//    $filter->condition($this->getFieldId('type'), NULL, '<>');
-//    $query->filter($filter);
-//    $facets['type'] = array(
-//      'field' => $this->getFieldId('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->getResultCount(), 2, 'OR facets query returned correct number of results.');
-//    $expected = array(
-//      array('count' => 2, 'filter' => '"article"'),
-//      array('count' => 2, 'filter' => '"item"'),
-//    );
-//    $this->assertEqual($expected, $results->getExtraData('search_api_facets')['type'], 'Correct OR facets were returned');
+    $query = $this->buildSearch();
+    $filter = $query->createFilter('OR', array('facet:' . $this->getFieldId('category')));
+    $filter->condition($this->getFieldId('category'), 'article_category');
+    $query->filter($filter);
+    $facets['category'] = array(
+      'field' => $this->getFieldId('category'),
+      '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->getResultCount(), 2, 'OR facets query returned correct number of results.');
+    $expected = array(
+      array('count' => 2, 'filter' => '"article_category"'),
+      array('count' => 2, 'filter' => '"item_category"'),
+      array('count' => 1, 'filter' => '!'),
+    );
+    $this->assertEqual($expected, $results->getExtraData('search_api_facets')['category'], 'Correct OR facets were returned');
+
+    $query = $this->buildSearch();
+    $filter = $query->createFilter('OR', array('facet:' . $this->getFieldId('category')));
+    $filter->condition($this->getFieldId('category'), 'article_category');
+    $query->filter($filter);
+    $filter = $query->createFilter('AND');
+    $filter->condition($this->getFieldId('category'), NULL, '<>');
+    $query->filter($filter);
+    $facets['category'] = array(
+      'field' => $this->getFieldId('category'),
+      '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->getResultCount(), 2, 'OR facets query returned correct number of results.');
+    $expected = array(
+      array('count' => 2, 'filter' => '"article_category"'),
+      array('count' => 2, 'filter' => '"item_category"'),
+    );
+    $this->assertEqual($expected, $results->getExtraData('search_api_facets')['category'], 'Correct OR facets were returned');
   }
 
   /**
@@ -518,38 +517,37 @@ class BackendTest extends EntityUnitTestBase {
     $this->assertWarnings($results);
 
     // Regression tests for #2040543.
-    // @todo Fix facets.
-//    $query = $this->buildSearch();
-//    $facets['type'] = array(
-//      'field' => $this->getFieldId('type'),
-//      'limit' => 0,
-//      'min_count' => 1,
-//      'missing' => TRUE,
-//    );
-//    $query->setOption('search_api_facets', $facets);
-//    $query->range(0, 0);
-//    $results = $query->execute();
-//    $expected = array(
-//      array('count' => 2, 'filter' => '"article"'),
-//      array('count' => 2, 'filter' => '"item"'),
-//      array('count' => 1, 'filter' => '!'),
-//    );
-//    $type_facets = $results->getExtraData('search_api_facets')['type'];
-//    usort($type_facets, array($this, 'facetCompare'));
-//    $this->assertEqual($type_facets, $expected, 'Correct facets were returned');
-//
-//    $query = $this->buildSearch();
-//    $facets['type']['missing'] = FALSE;
-//    $query->setOption('search_api_facets', $facets);
-//    $query->range(0, 0);
-//    $results = $query->execute();
-//    $expected = array(
-//      array('count' => 2, 'filter' => '"article"'),
-//      array('count' => 2, 'filter' => '"item"'),
-//    );
-//    $type_facets = $results->getExtraData('search_api_facets')['type'];
-//    usort($type_facets, array($this, 'facetCompare'));
-//    $this->assertEqual($type_facets, $expected, 'Correct facets were returned');
+    $query = $this->buildSearch();
+    $facets['category'] = array(
+      'field' => $this->getFieldId('category'),
+      'limit' => 0,
+      'min_count' => 1,
+      'missing' => TRUE,
+    );
+    $query->setOption('search_api_facets', $facets);
+    $query->range(0, 0);
+    $results = $query->execute();
+    $expected = array(
+      array('count' => 2, 'filter' => '"article_category"'),
+      array('count' => 2, 'filter' => '"item_category"'),
+      array('count' => 1, 'filter' => '!'),
+    );
+    $type_facets = $results->getExtraData('search_api_facets')['category'];
+    usort($type_facets, array($this, 'facetCompare'));
+    $this->assertEqual($type_facets, $expected, 'Correct facets were returned');
+
+    $query = $this->buildSearch();
+    $facets['category']['missing'] = FALSE;
+    $query->setOption('search_api_facets', $facets);
+    $query->range(0, 0);
+    $results = $query->execute();
+    $expected = array(
+      array('count' => 2, 'filter' => '"article_category"'),
+      array('count' => 2, 'filter' => '"item_category"'),
+    );
+    $type_facets = $results->getExtraData('search_api_facets')['category'];
+    usort($type_facets, array($this, 'facetCompare'));
+    $this->assertEqual($type_facets, $expected, 'Correct facets were returned');
 
     // Regression tests for #2111753.
     $keys = array(
diff --git a/src/Query/Query.php b/src/Query/Query.php
index 36edfc6..5e4c7fb 100644
--- a/src/Query/Query.php
+++ b/src/Query/Query.php
@@ -217,10 +217,9 @@ class Query implements QueryInterface {
   /**
    * {@inheritdoc}
    */
-  // @todo Re-add tags from D7.
-  public function createFilter($conjunction = 'AND') {
+  public function createFilter($conjunction = 'AND', array $tags = array()) {
     $filter_class = $this->options['filter class'];
-    return new $filter_class($conjunction);
+    return new $filter_class($conjunction, $tags);
   }
 
   /**
diff --git a/src/Query/QueryInterface.php b/src/Query/QueryInterface.php
index ded5db2..7ff451b 100644
--- a/src/Query/QueryInterface.php
+++ b/src/Query/QueryInterface.php
@@ -49,11 +49,13 @@ interface QueryInterface {
    *
    * @param string $conjunction
    *   The conjunction to use for the filter – either 'AND' or 'OR'.
+   * @param string[] $tags
+   *   (optional) Tags to set on the filter.
    *
    * @return \Drupal\search_api\Query\FilterInterface
    *   A filter object that is set to use the specified conjunction.
    */
-  public function createFilter($conjunction = 'AND');
+  public function createFilter($conjunction = 'AND', array $tags = array());
 
   /**
    * Sets the keys to search for.
diff --git a/src/Tests/ExampleContentTrait.php b/src/Tests/ExampleContentTrait.php
index ed2ca70..d5d4bf7 100644
--- a/src/Tests/ExampleContentTrait.php
+++ b/src/Tests/ExampleContentTrait.php
@@ -42,6 +42,7 @@ trait ExampleContentTrait {
         'body' => 'test test',
         'type' => 'item',
         'keywords' => array('orange'),
+        'category' => 'item_category'
       ));
     $this->entities[1]->save();
     $this->entities[2] = entity_create('entity_test', array(
@@ -50,6 +51,7 @@ trait ExampleContentTrait {
         'body' => 'bar test',
         'type' => 'item',
         'keywords' => array('orange', 'apple', 'grape'),
+        'category' => 'item_category'
       ));
     $this->entities[2]->save();
     $this->entities[3] = entity_create('entity_test', array(
@@ -65,6 +67,7 @@ trait ExampleContentTrait {
         'body' => 'test test test',
         'type' => 'article',
         'keywords' => array('apple', 'strawberry', 'grape'),
+        'category' => 'article_category'
       ));
     $this->entities[4]->save();
     $this->entities[5] = entity_create('entity_test', array(
@@ -73,6 +76,7 @@ trait ExampleContentTrait {
         'body' => 'foo',
         'type' => 'article',
         'keywords' => array('orange', 'strawberry', 'grape', 'banana'),
+        'category' => 'article_category'
       ));
     $this->entities[5]->save();
     $count = \Drupal::entityQuery('entity_test')->count()->execute() - $count;
diff --git a/tests/search_api_test_db/config/install/field.field.entity_test.article.category.yml b/tests/search_api_test_db/config/install/field.field.entity_test.article.category.yml
new file mode 100644
index 0000000..3c5a0d4
--- /dev/null
+++ b/tests/search_api_test_db/config/install/field.field.entity_test.article.category.yml
@@ -0,0 +1,16 @@
+id: entity_test.article.category
+status: true
+langcode: en
+field_name: category
+entity_type: entity_test
+bundle: article
+label: Category
+description: ''
+required: false
+default_value: {  }
+default_value_callback: ''
+settings: {  }
+dependencies:
+  config:
+    - field.storage.entity_test.category
+field_type: string
diff --git a/tests/search_api_test_db/config/install/field.field.entity_test.item.category.yml b/tests/search_api_test_db/config/install/field.field.entity_test.item.category.yml
new file mode 100644
index 0000000..a5cd261
--- /dev/null
+++ b/tests/search_api_test_db/config/install/field.field.entity_test.item.category.yml
@@ -0,0 +1,16 @@
+id: entity_test.item.category
+status: true
+langcode: en
+field_name: category
+entity_type: entity_test
+bundle: item
+label: Category
+description: ''
+required: false
+default_value: {  }
+default_value_callback: ''
+settings: {  }
+dependencies:
+  config:
+    - field.storage.entity_test.category
+field_type: string
diff --git a/tests/search_api_test_db/config/install/field.storage.entity_test.category.yml b/tests/search_api_test_db/config/install/field.storage.entity_test.category.yml
new file mode 100644
index 0000000..063f0e6
--- /dev/null
+++ b/tests/search_api_test_db/config/install/field.storage.entity_test.category.yml
@@ -0,0 +1,16 @@
+id: entity_test.category
+status: true
+langcode: en
+field_name: category
+entity_type: entity_test
+type: string
+settings:
+  max_length: 255
+module: Core
+locked: false
+cardinality: -1
+translatable: false
+indexes: {  }
+dependencies:
+  module:
+    - entity_test
diff --git a/tests/search_api_test_db/config/install/search_api.index.database_search_index.yml b/tests/search_api_test_db/config/install/search_api.index.database_search_index.yml
index d1e4535..cfcf924 100644
--- a/tests/search_api_test_db/config/install/search_api.index.database_search_index.yml
+++ b/tests/search_api_test_db/config/install/search_api.index.database_search_index.yml
@@ -17,6 +17,8 @@ options:
       type: string
     'entity:entity_test/keywords':
       type: string
+    'entity:entity_test/category':
+      type: string
     search_api_language:
       type: string
   processors:
@@ -37,10 +39,13 @@ dependencies:
   config:
     - field.field.entity_test.article.body
     - field.field.entity_test.article.keywords
+    - field.field.entity_test.article.category
     - field.field.entity_test.item.body
     - field.field.entity_test.item.keywords
+    - field.field.entity_test.item.category
     - field.storage.entity_test.body
     - field.storage.entity_test.keywords
+    - field.storage.entity_test.category
     - search_api.server.database_search_server
   module:
     - entity_test
