diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index 868c948..5f8c444 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -682,11 +682,22 @@ function facetapi_facet_display_form_submit($form, &$form_state) {
     array_flip($form['#facetapi']['excluded_values'])
   ));
 
+  // Saves all defined global settings
   $global_settings = $adapter->getFacet($facet)->getSettings();
   foreach ($global_values as $key => $value) {
     $global_settings->settings[$key] = $value;
   }
 
+  // Save specific query type if widget defined one
+  $widgets = facetapi_get_widgets($realm, $facet);
+  $widget = $widgets[$facet_settings->settings['widget']];
+  if (isset($widget['handler']['query type'])) {
+    $global_settings->settings['query type'] = $widget['handler']['query type'];
+  }
+  else {
+   unset($global_settings->settings['query type']);
+  }
+
   $success = TRUE;
   if (FALSE === ctools_export_crud_save('facetapi', $facet_settings)) {
     drupal_set_message(t('Error saving configuration options.'), 'error');
diff --git a/facetapi.block.inc b/facetapi.block.inc
index 782817a..307e3ed 100644
--- a/facetapi.block.inc
+++ b/facetapi.block.inc
@@ -114,7 +114,7 @@ function facetapi_get_block($delta) {
     $variables = array('title' => $builds[$group][$facet_name]['#title']);
     return array(
       'subject' => theme('facetapi_title', $variables),
-      'content' => $builds[$group][$facet_name]
+      'content' => $builds[$group][$facet_name],
     );
   }
 }
diff --git a/facetapi.module b/facetapi.module
index d4e10a1..0ab170a 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -4,7 +4,6 @@
  * @file
  * An abstracted facet API that can be used by various search backends.
  */
-
 /**
  * Constant for the "AND" operator.
  */
@@ -527,7 +526,7 @@ function facetapi_get_facet_info($searcher) {
       }
 
       // Iterates over facet definitions, merges defaults.
-      foreach($facets as $facet_name => $info) {
+      foreach ($facets as $facet_name => $info) {
         $facet_info[$searcher][$facet_name] = $info;
         $facet_info[$searcher][$facet_name] += array(
           'name' => $facet_name,
@@ -537,7 +536,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 types' => array('term'),
           'dependency plugins' => array(),
           'default widget' => FALSE,
           'allowed operators' => array(FACETAPI_OPERATOR_AND => TRUE, FACETAPI_OPERATOR_OR => TRUE),
@@ -674,7 +673,7 @@ function facetapi_get_enabled_facets($searcher, $realm_name = NULL) {
   $cid = $searcher . ':' . (string) $realm_name;
   if (!isset($enabled_facets[$cid])) {
     // Builds array of aruments to pass to ctools_export_load_object().
-    $args = array('searcher' => $searcher,  'enabled' => 1);
+    $args = array('searcher' => $searcher, 'enabled' => 1);
     if (NULL !== $realm_name) {
       $args['realm'] = $realm_name;
     }
@@ -774,7 +773,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 types' => array('date'),
       'allowed operators' => array(FACETAPI_OPERATOR_AND => TRUE),
       'map callback' => 'facetapi_map_date',
       'min callback' => 'facetapi_get_min_date',
@@ -789,7 +788,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 types' => array('date'),
       'allowed operators' => array(FACETAPI_OPERATOR_AND => TRUE),
       'map callback' => 'facetapi_map_date',
       'min callback' => 'facetapi_get_min_date',
@@ -1031,7 +1030,6 @@ function facetapi_set_facet_status($searcher, $realm_name, $facet_name, $status,
   if (!$batch_process) {
     drupal_static('facetapi_get_enabled_facets', array(), TRUE);
   }
-
   // Pulls the list of enabled facets so we can modify it here.
   facetapi_get_enabled_facets($searcher, $realm_name);
   $enabled_facets = &drupal_static('facetapi_get_enabled_facets', array());
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..7e7a89c 100644
--- a/plugins/facetapi/adapter.inc
+++ b/plugins/facetapi/adapter.inc
@@ -94,12 +94,25 @@ 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;
+      // Backwards compatibility logic to rename the facet query type to types
+      if(isset($facet['query type']) && !isset($facet['query types'])) {
+        $facet['query types'] = $facet['query type'];
+        unset($facet['query type']);
       }
-      else {
-        $this->queryTypes[$facet['name']] = FALSE;
+
+      // Convert query types from a string to array for backwards compatibility
+      if(is_string($facet['query types'])) {
+        $facet['query types'] = array($facet['query types']);
+      }
+
+      foreach($facet['query types'] 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 +212,10 @@ abstract class FacetapiAdapter {
 
         // Stores active items per facet.
         foreach ($enabled_aliases[$field_alias] as $facet_name) {
-          $item += $this->queryTypes[$facet_name]->extract($item);
+          $facet = array('name' => $facet_name);
+          $facet = $this->getFacet($facet)->getFacet();
+          $facet_query = $this->getFacetQuery($facet, 'block');
+          $item += $facet_query->extract($item);
           $this->activeItems['filter'][$filter]['facets'][] = $facet_name;
           $this->activeItems['facet'][$facet_name][$parts[1]] = $item;
         }
@@ -401,9 +417,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 +436,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 +500,24 @@ 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);
+    // Fetch the global query type if it is set
+    if(isset($facet_settings->settings['query type'])) {
+      $query_type = $facet_settings->settings['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);
     }
   }
 
@@ -634,7 +666,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 +1075,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,11 +1141,12 @@ 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
     // facet is simply rendering markup.
+    // @Todo Add some logic here that does not quit the facet but allows it to rebuild
     if (!$this->facet['field']) {
       return $build;
     }
@@ -1132,7 +1165,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,
diff --git a/plugins/facetapi/widget.inc b/plugins/facetapi/widget.inc
index 77b150d..54914d1 100644
--- a/plugins/facetapi/widget.inc
+++ b/plugins/facetapi/widget.inc
@@ -193,8 +193,7 @@ abstract class FacetapiWidget {
 
     // Gets active sort definitions.
     $this->sorts = array_intersect_key(
-      facetapi_get_sort_info(),
-      array_filter($settings['active_sorts'])
+            facetapi_get_sort_info(), array_filter($settings['active_sorts'])
     );
 
     // Finalizes sort definitions with settings or defaults.
@@ -241,6 +240,7 @@ abstract class FacetapiWidget {
     }
     return $return;
   }
+
 }
 
 /**
