diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index 868c948..841dd31 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -764,7 +764,8 @@ function facetapi_facet_filters_form($form, &$form_state, FacetapiAdapter $adapt
   $weight = -50;
   $plugins = array();
   foreach ($filters['plugins'] as $id => $plugin) {
-    if ($class = ctools_plugin_load_class('facetapi', 'filters', $id, 'handler')) {
+    $class = ctools_plugin_load_class('facetapi', 'filters', $id, 'handler');
+    if ($class) {
       // Gets filter defaults.
       $filter_plugin = new $class($id, $adapter, $settings);
       $default = $filter_plugin->getDefaultSettings() + array(
@@ -821,7 +822,8 @@ function facetapi_facet_filters_form($form, &$form_state, FacetapiAdapter $adapt
     );
 
     // Allows plugin to add settings to the form.
-    if ($class = ctools_plugin_load_class('facetapi', 'filters', $id, 'handler')) {
+    $class = ctools_plugin_load_class('facetapi', 'filters', $id, 'handler');
+    if ($class) {
       $filter = new $class($id, $adapter, $settings);
       $filter->settingsForm($form['settings']['filters']['filter_settings'][$id], $form_state);
     }
diff --git a/facetapi.block.inc b/facetapi.block.inc
index 782817a..da2d485 100644
--- a/facetapi.block.inc
+++ b/facetapi.block.inc
@@ -26,7 +26,8 @@ function facetapi_get_block_info($realm_name = 'block') {
 
     // Adds blocks for facets that are enabled or whose delta mapping is forced.
     foreach (facetapi_get_delta_map_queue($searcher, $realm_name) as $facet_name) {
-      if ($facet = facetapi_facet_load($facet_name, $searcher)) {
+      $facet = facetapi_facet_load($facet_name, $searcher);
+      if ($facet) {
         // Gets the delta from the delta map.
         $string = facetapi_build_delta($searcher, $realm_name, $facet_name);
         $delta = array_search($string, $map);
@@ -133,7 +134,8 @@ function facetapi_get_block($delta) {
 function facetapi_get_delta_map() {
   $map = &drupal_static(__FUNCTION__);
   if (NULL === $map) {
-    if ($data = cache_get('facetapi:delta_map')) {
+    $data = cache_get('facetapi:delta_map');
+    if ($data) {
       $map = $data->data;
     }
     else {
diff --git a/facetapi.module b/facetapi.module
index d4e10a1..110ccb8 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -537,7 +537,7 @@ function facetapi_get_facet_info($searcher) {
           'field alias' => isset($info['field']) ? $info['field'] : $facet_name,
           'field api name' => FALSE,
           'field api bundles' => array(),
-          'query type' => 'term',
+          'query type' => array('term'),
           'dependency plugins' => array(),
           'default widget' => FALSE,
           'allowed operators' => array(FACETAPI_OPERATOR_AND => TRUE, FACETAPI_OPERATOR_OR => TRUE),
@@ -774,7 +774,7 @@ function facetapi_facetapi_facet_info($searcher_info) {
     $facets['created'] = array(
       'label' => t('Post date'),
       'description' => t('Filter by the date the node was posted.'),
-      'query type' => 'date',
+      'query type' => array('date'),
       'allowed operators' => array(FACETAPI_OPERATOR_AND => TRUE),
       'map callback' => 'facetapi_map_date',
       'min callback' => 'facetapi_get_min_date',
@@ -789,7 +789,7 @@ function facetapi_facetapi_facet_info($searcher_info) {
     $facets['changed'] = array(
       'label' => t('Updated date'),
       'description' => t('Filter by the date the node was last modified.'),
-      'query type' => 'date',
+      'query type' => array('date'),
       'allowed operators' => array(FACETAPI_OPERATOR_AND => TRUE),
       'map callback' => 'facetapi_map_date',
       'min callback' => 'facetapi_get_min_date',
diff --git a/facetapi.requirements.inc b/facetapi.requirements.inc
index 79cf63b..8ec16bb 100644
--- a/facetapi.requirements.inc
+++ b/facetapi.requirements.inc
@@ -54,12 +54,21 @@ function facetapi_requirement_property(array $definition, array $options) {
   $passed = TRUE;
   foreach ($options as $key => $requirement) {
     $condition = $definition[$key];
+    // The array has to have equal values
     if (is_array($requirement)) {
       if (array_intersect_key($condition, $requirement) != $requirement) {
         $passed = FALSE;
         break;
       }
     }
+    // The variable has to be present in the array of the value
+    elseif(is_array($definition[$key])) {
+      if(!in_array($requirement, $definition[$key])) {
+        $passed = FALSE;
+        break;
+      }
+    }
+    // The variable has to be equal to the value
     else {
       if ($requirement != $condition) {
         $passed = FALSE;
diff --git a/plugins/facetapi/adapter.inc b/plugins/facetapi/adapter.inc
index f45c967..7993ab3 100644
--- a/plugins/facetapi/adapter.inc
+++ b/plugins/facetapi/adapter.inc
@@ -94,12 +94,18 @@ abstract class FacetapiAdapter {
 
     // Instantiates query type plugin for each enabled facet.
     foreach($this->getEnabledFacets() as $facet) {
-      if (isset($registered_types[$facet['query type']])) {
-        $plugin = new $registered_types[$facet['query type']]($this, $facet);
-        $this->queryTypes[$facet['name']] = $plugin;
+      // Convert query types from a string to array for backwards compatibility
+      if(is_string($facet['query type'])) {
+        $facet['query type'] = array($facet['query type']);
       }
-      else {
-        $this->queryTypes[$facet['name']] = FALSE;
+      foreach($facet['query type'] as $query_type) {
+        if (isset($registered_types[$query_type])) {
+          $plugin = new $registered_types[$query_type]($this, $facet);
+          $this->queryTypes[$facet['name']][$query_type] = $plugin;
+        }
+        else {
+          $this->queryTypes[$facet['name']][] = FALSE;
+        }
       }
     }
 
@@ -199,7 +205,8 @@ abstract class FacetapiAdapter {
 
         // Stores active items per facet.
         foreach ($enabled_aliases[$field_alias] as $facet_name) {
-          $item += $this->queryTypes[$facet_name]->extract($item);
+          $facet_query = $this->getFacetQuery(array('name' => $facet_name), 'block');
+          $item += $facet_query->extract($item);
           $this->activeItems['filter'][$filter]['facets'][] = $facet_name;
           $this->activeItems['facet'][$facet_name][$parts[1]] = $item;
         }
@@ -401,9 +408,9 @@ abstract class FacetapiAdapter {
    * @param mixed $query
    *   The backend's native object.
    */
-  function addActiveFilters($query) {
+  function addActiveFilters($query, $realm_name = NULL) {
     $this->initActiveFilters($query);
-    foreach ($this->getEnabledFacets() as $facet) {
+    foreach ($this->getEnabledFacets($realm_name) as $facet) {
       $settings = $this->getFacet($facet)->getSettings();
 
       // Invoke the dependency plugins.
@@ -420,7 +427,9 @@ abstract class FacetapiAdapter {
       // facet's active items so they don't display in the current search block
       // or appear as active in the breadcrumb trail.
       if ($display && $this->queryTypes[$facet['name']]) {
-        $this->queryTypes[$facet['name']]->execute($query);
+        //Select the right query type here!
+        $query_type = $this->getFacetQuery($facet, $realm_name);
+        $query_type->execute($query);
       }
       else {
         foreach ($this->activeItems['facet'][$facet['name']] as $item) {
@@ -482,10 +491,29 @@ abstract class FacetapiAdapter {
    * @return FacetapiQueryTypeInterface
    *   The instantiated query type plugin.
    */
-  public function getFacetQuery($facet) {
-    $facet_name = (is_array($facet)) ? $facet['name'] : $facet;
-    if (isset($this->queryTypes[$facet_name])) {
-      return $this->queryTypes[$facet_name];
+  public function getFacetQuery($facet_name, $realm_name = NULL) {
+
+    $facet = $this->getFacet($facet_name);
+    $facet_settings = $facet->getSettings($realm_name);
+    // Check if widget needs another type
+    $plugin = ctools_get_plugins('facetapi', 'widgets', $facet_settings->settings['widget']);
+
+    // Is there a specific query type we have to use?
+    $query_type = NULL;
+    if(!empty($plugin) && !empty($plugin['handler']['query type'])) {
+      $query_type = $plugin['handler']['query type'];
+    }
+
+    // Convert a facet array to a string as name to be sure
+    $facet_name = (is_array($facet_name)) ? $facet_name['name'] : $facet_name;
+    $query_types = $this->queryTypes[$facet_name];
+    if(!empty($query_type) && !empty($query_types[$query_type])) {
+      return $query_types[$query_type];
+    }
+    else {
+      // Return the first query object as default
+      $query_types = array_values($query_types);
+      return array_shift($query_types);
     }
   }
 
@@ -599,15 +627,15 @@ abstract class FacetapiAdapter {
   /**
    * Initializes facet builds, adds breadcrumb trail.
    */
-  protected function processFacets() {
+  protected function processFacets($realm_name = NULL) {
     if (!$this->processed) {
       $this->processed = TRUE;
 
       // Initializes each facet's render array.
-      foreach ($this->getEnabledFacets() as $facet) {
+      foreach ($this->getEnabledFacets($realm_name) as $facet) {
         $processor = new FacetapiFacetProcessor($this->getFacet($facet));
         $this->processors[$facet['name']] = $processor;
-        $this->processors[$facet['name']]->process();
+        $this->processors[$facet['name']]->process($realm_name);
       }
 
       // Sets the breadcrumb trail if a search was executed.
@@ -634,7 +662,7 @@ abstract class FacetapiAdapter {
     }
 
     // Makes sure facet builds are initialized.
-    $this->processFacets();
+    $this->processFacets($realm_name);
 
     // Adds JavaScript, initializes render array.
     drupal_add_js(drupal_get_path('module', 'facetapi') . '/facetapi.js');
@@ -1043,13 +1071,13 @@ class FacetapiFacetProcessor {
   /**
    * Processes the facet items.
    */
-  public function process() {
+  public function process($realm_name = NULL) {
     $this->build = array();
 
     // Only initializes facet if a query type plugin is registered for it.
     // NOTE: We don't use the chaining pattern so the methods can be tested.
-    if ($this->facet->getAdapter()->getFacetQuery($this->facet->getFacet())) {
-      if ($this->build = $this->initializeBuild($this->build)) {
+    if ($this->facet->getAdapter()->getFacetQuery($this->facet->getFacet(), $realm_name)) {
+      if ($this->build = $this->initializeBuild($realm_name)) {
         $settings = $this->facet->getSettings();
         $this->build = $this->mapValues($this->build);
         if (!$settings->settings['flatten']) {
@@ -1109,7 +1137,7 @@ class FacetapiFacetProcessor {
    * @return array
    *   The initialized render array.
    */
-  protected function initializeBuild() {
+  protected function initializeBuild($realm_name = NULL) {
     $build = array();
 
     // Bails if there is no field attached to the facet, in other words if the
@@ -1132,7 +1160,7 @@ class FacetapiFacetProcessor {
 
     // Builds render arrays for each item.
     $adapter = $this->facet->getAdapter();
-    $build = $adapter->getFacetQuery($this->facet->getFacet())->build();
+    $build = $adapter->getFacetQuery($this->facet->getFacet(), $realm_name)->build();
     foreach (element_children($build) as $value) {
       $item_defaults = array(
         '#markup' => $value,
