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..b77507b 100644
--- a/plugins/facetapi/adapter.inc
+++ b/plugins/facetapi/adapter.inc
@@ -58,7 +58,7 @@ abstract class FacetapiAdapter {
    *
    * @var array
    */
-  protected $activeItems;
+  protected $activeItems = array();
 
   /**
    * A boolean flagging whether the facets have been processed.
@@ -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;
         }
@@ -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);
+        $query_type->execute($query);
       }
       else {
         foreach ($this->activeItems['facet'][$facet['name']] as $item) {
@@ -452,6 +470,7 @@ abstract class FacetapiAdapter {
    *
    * @return array
    *   An array of enabled facets.
+   * @todo Logic to not hide the facet should come before this
    */
   public function getEnabledFacets($realm_name = NULL) {
     return facetapi_get_enabled_facets($this->info['name'], $realm_name);
@@ -482,10 +501,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) {
+
+    $facet = $this->getFacet($facet_name);
+    $facet_settings = $facet->getSettings();
+    // 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);
     }
   }
 
@@ -605,7 +638,8 @@ abstract class FacetapiAdapter {
 
       // Initializes each facet's render array.
       foreach ($this->getEnabledFacets() as $facet) {
-        $processor = new FacetapiFacetProcessor($this->getFacet($facet));
+        $facet = $this->getFacet($facet);
+        $processor = new FacetapiFacetProcessor($facet);
         $this->processors[$facet['name']] = $processor;
         $this->processors[$facet['name']]->process();
       }
@@ -634,7 +668,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');
@@ -1048,8 +1082,12 @@ class FacetapiFacetProcessor {
 
     // 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)) {
+    //@todo Add logic here that checks if we want to show the facet or not
+    $adapter = $this->facet->getAdapter();
+    $facet = $this->facet->getFacet();
+    $facet_query = $adapter->getFacetQuery($facet);
+    if ($facet_query) {
+      if ($this->build = $this->initializeBuild()) {
         $settings = $this->facet->getSettings();
         $this->build = $this->mapValues($this->build);
         if (!$settings->settings['flatten']) {
@@ -1114,6 +1152,7 @@ class FacetapiFacetProcessor {
 
     // 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;
     }
