diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index aa4b4af..a92f94f 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -490,6 +490,17 @@ function facetapi_facet_display_form($form, &$form_state, FacetapiAdapter $adapt
     '#description' => t('The configuration options below apply to this facet across <em>all</em> realms.'),
   );
 
+  $form['global']['query_type'] = array(
+    '#type' => 'select',
+    '#access' => count($facet['query types']) > 1,
+    '#title' => t('Query type'),
+    '#prefix' => '<div class="facetapi-global-setting">',
+    '#suffix' => '</div>',
+    '#default_value' => $global_settings->settings['query_type'],
+    '#options' => array_map('check_plain', $facet['query types']),
+    '#description' => t('Select the query type this facet will use.'),
+  );
+
   $all_options = array(
     FACETAPI_OPERATOR_AND => t('AND'),
     FACETAPI_OPERATOR_OR => t('OR'),
@@ -595,8 +606,11 @@ function facetapi_facet_display_form($form, &$form_state, FacetapiAdapter $adapt
     '#attributes' => array('title' => $cancel_title),
   );
 
-  // Adds submit handler, allow the realm and adapter to alter the form.
+  // Adds form submissions and validation handlers.
   $form['#submit'][] = 'facetapi_facet_display_form_submit';
+  $form['#validate'][] = 'facetapi_facet_display_form_validate';
+
+  // Allow the realm and adapter to alter the form.
   if ($realm['settings callback']) {
     $realm['settings callback']($form, $form_state);
   }
@@ -662,9 +676,29 @@ function theme_facetapi_sort_settings_table($variables) {
 }
 
 /**
+ * Form validation handler for facetapi_facet_display_form().
+ */
+function facetapi_facet_display_form_validate($form, &$form_state) {
+  // Gets the selected query type and widget.
+  $query_type = $form_state['values']['global']['query_type'];
+  $widget_name = $form_state['values']['widget'];
+
+  // Loads the widget plugin, makes sure it supports the selected type.
+  if ($widget = ctools_get_plugins('facetapi', 'widgets', $widget_name)) {
+    $widget_types = drupal_map_assoc($widget['handler']['query types']);
+    if (!isset($widget_types[$query_type])) {
+      $error = t('The widget does not support the %type query type', array('%type' => $query_type));
+      form_set_error('widget', $error);
+    }
+  }
+  else {
+    $error = t('Widget %name not valid.', array('%name' => $widget_name));
+    form_set_error('widget', $error);
+  }
+}
+
+/**
  * Form submission handler for facetapi_facet_display_form().
- *
- * @see facetapi_element_validate_integer()
  */
 function facetapi_facet_display_form_submit($form, &$form_state) {
 
diff --git a/facetapi.api.php b/facetapi.api.php
index 9ee5056..d69530f 100644
--- a/facetapi.api.php
+++ b/facetapi.api.php
@@ -141,8 +141,8 @@ function hook_facetapi_realm_info_alter(array &$realm_info) {
  *     with a field.
  *   - field api bundles: (optional) An array of entity names that this field
  *     contains bundle information for. Defaults to an empty array.
- *   - query type: The query type plugin ID used by the backend to execute the
- *     facet query for this field.
+ *   - query types: The query type plugins that that this facet supports. For
+ *     example, numeric fields support "term" and "range_filter" queries.
  *   - dependency plugins: (optional) An array of dependency plugin IDs that are
  *     supported by this facet.
  *   - default widget: (optional) The widget plugin ID used if no plugin has
@@ -192,7 +192,7 @@ function hook_facetapi_facet_info(array $searcher_info) {
       'field alias' => 'my_alias',
       'field api name' => FALSE,
       'field api bundles' => array(),
-      'query type' => 'term',
+      'query types' => array('term', 'date'),
       'dependency plugins' => array('role'),
       'default widget' => 'links',
       'allowed operators' => array(FACETAPI_OPERATOR_AND => TRUE, FACETAPI_OPERATOR_OR => TRUE),
diff --git a/facetapi.module b/facetapi.module
index d4e10a1..f12b0bf 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -371,8 +371,8 @@ function facetapi_realm_load($realm_name) {
  *     facet is associated with, FALSE if it is not associated with a field.
  *   - field api bundles: An array of entity names that this field contains
  *     bundle information for.
- *   - query type: The query type plugin ID used by the backend to execute the
- *     facet query for this field.
+ *   - query types: The query type plugins that that this facet supports. For
+ *     example, numeric fields support "term" and "range_filter" queries.
  *   - dependency plugins: An array of dependency plugin IDs that are supported
  *     by this facet.
  *   - default widget: The widget plugin ID used if no plugin has been selected
@@ -438,6 +438,7 @@ function facetapi_get_searcher_info() {
     foreach ((array) module_invoke($module, 'facetapi_searcher_info') as $searcher => $info) {
       // @see http://drupal.org/node/1167974
       // Converts "type" to an array and stores in "types".
+      // @todo Remove in later versions.
       if (isset($info['type']) && !isset($info['types'])) {
         $info['types'] = array($info['type']);
       }
@@ -528,6 +529,14 @@ function facetapi_get_facet_info($searcher) {
 
       // Iterates over facet definitions, merges defaults.
       foreach($facets as $facet_name => $info) {
+
+        // @see http://drupal.org/node/1161434
+        // Converts "query type" to an array and stores in "query types".
+        // @todo Remove in later versions.
+        if (isset($info['query type']) && !isset($info['query types'])) {
+          $info['query types'] = array($info['query type']);
+        }
+
         $facet_info[$searcher][$facet_name] = $info;
         $facet_info[$searcher][$facet_name] += array(
           'name' => $facet_name,
@@ -537,7 +546,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),
@@ -556,6 +565,14 @@ function facetapi_get_facet_info($searcher) {
             array('display', SORT_ASC),
           ),
         );
+
+        // @see http://drupal.org/node/1161434
+        // Makes sure old style "query type" is present.
+        // @todo Remove in later versions.
+        if (!isset($facet_info[$searcher][$facet_name]['query type'])) {
+          $type = key($facet_info[$searcher][$facet_name]['query types']);
+          $facet_info[$searcher][$facet_name]['type'] = $type;
+        }
       }
     }
 
@@ -774,7 +791,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 +806,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',
@@ -851,12 +868,14 @@ function facetapi_facetapi_widgets() {
       'handler' => array(
         'label' => t('Links'),
         'class' => 'FacetapiWidgetLinks',
+        'query types' => array('term', 'date'),
       ),
     ),
     'facetapi_checkbox_links' => array(
       'handler' => array(
         'label' => t('Links with checkboxes'),
         'class' => 'FacetapiWidgetCheckboxLinks',
+        'query types' => array('term', 'date'),
       ),
     ),
   );
diff --git a/plugins/facetapi/adapter.inc b/plugins/facetapi/adapter.inc
index f45c967..3bc550f 100644
--- a/plugins/facetapi/adapter.inc
+++ b/plugins/facetapi/adapter.inc
@@ -92,10 +92,29 @@ 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);
+    // Loads Export API.
+    // @todo is this necessary?
+    ctools_include('export');
+
+    // Loads realm info and widget info.
+    $realm_info = facetapi_get_realm_info();
+    $widgets = ctools_get_plugins('facetapi', 'widgets');
+
+    // Iterates over facets and registers query type plugins.
+    foreach ($this->getEnabledFacets() as $facet) {
+
+      // Gets widget type from setting if there are more than one available.
+      if (1 == count($facet['query types'])) {
+        $query_type = $facet['query types'][0];
+      }
+      else {
+        $settings = $this->getFacetSettingsGlobal($facet)->settings;
+        $query_type = !empty($settings['query_types']) ? $settings['query_types'] : FALSE;
+      }
+
+      // If we found a query type, register the query type plugin.
+      if ($query_type && isset($registered_types[$query_type])) {
+        $plugin = new $registered_types[$query_type]($this, $facet);
         $this->queryTypes[$facet['name']] = $plugin;
       }
       else {
@@ -444,6 +463,155 @@ abstract class FacetapiAdapter {
   }
 
   /**
+   * Initializes a new settings object.
+   *
+   * @param $name
+   *   A string containing the unique name of the configuration.
+   * @param array $facet_name
+   *   A string containing the machine readable name of the facet.
+   * @param $realm_name
+   *   A string containing the machine readable name of the realm, NULL if we
+   *   are initializing global settings.
+   *
+   * @return stdClass
+   *   An object containing the initialized settings.
+   */
+  public function initSettingsObject($name, $facet_name, $realm_name = NULL) {
+    $settings = ctools_export_crud_new('facetapi');
+    $settings->name = $name;
+    $settings->searcher = $this->info['name'];
+    $settings->realm = (string) $realm_name;
+    $settings->facet = $facet_name;
+    $settings->enabled = 0;
+    return $settings;
+  }
+
+  /**
+   * Returns realm specific settings for a facet.
+   *
+   * @param array $facet
+   *   An array containing the facet definition.
+   * @param array $realm
+   *   An array containing the realm definition.
+   *
+   * @return stdClass
+   *   An object containing the settings.
+   *
+   * @see ctools_export_crud_load()
+   */
+  public function getFacetSettings(array $facet, array $realm) {
+    // Builds the unique name of the configuration settings and loads.
+    $name = $this->info['name'] . ':' . $realm['name'] . ':' . $facet['name'];
+    if (!$settings = ctools_export_crud_load('facetapi', $name)) {
+      $settings = $this->initSettingsObject($name, $facet['name'], $realm['name']);
+
+      // Use realm's default widget if facet doesn't define one.
+      if (!empty($facet['default widget'])) {
+        $widget = $facet['default widget'];
+      }
+      else {
+        $widget = $realm['default widget'];
+      }
+
+      // Apply default settings.
+      $settings->settings = array(
+        'weight' => 0,
+        'widget' => $widget,
+        'filters' => array(),
+        'active_sorts' => array(),
+        'sort_weight' => array(),
+        'sort_order' => array(),
+        'empty_behavior' => 'none',
+      );
+
+      // Apply default sort settings.
+      $weight = -50;
+      foreach ($this->facet['default sorts'] as $sort => $default) {
+        $settings->settings['active_sorts'][$default[0]] = $default[0];
+        $settings->settings['sort_weight'][$default[0]] = $weight++;
+        $settings->settings['sort_order'][$default[0]] = $default[1];
+      }
+
+      // Apply the widget plugin's default settings.
+      $id = $settings->settings['widget'];
+      $class = ctools_plugin_load_class('facetapi', 'widgets', $id, 'handler');
+      // If we have an invalid widget, fall back to the realm's default.
+      if (!$class) {
+        $id = $settings->settings['widget'] = $realm['default widget'];
+        $class = ctools_plugin_load_class('facetapi', 'widgets', $id, 'handler');
+      }
+      $plugin = new $class($id, $realm, $this, $settings);
+      $settings->settings += $plugin->getDefaultSettings();
+
+      // @todo Save for performance?
+    }
+
+    // Ensures settings added in later versions of the module are initialized to
+    // prevent undefuned index errors after upgrading.
+    // @todo Remove in 7.x-2.x
+    $settings->settings += array(
+      'empty_behavior' => 'none',
+      'filters' => array(),
+    );
+
+    return $settings;
+  }
+
+  /**
+   * Returns realm specific settings for a facet.
+   *
+   * @param array $facet
+   *   An array containing the facet definition.
+   *
+   * @return
+   *   An object containing the settings.
+   *
+   * @see ctools_export_crud_load()
+   */
+  public function getFacetSettingsGlobal(array $facet) {
+    $name = $this->info['name'] . '::' . $facet['name'];
+    if (!$settings = ctools_export_crud_load('facetapi', $name)) {
+      $settings = $this->initSettingsObject($name, $facet['name']);
+
+      // Apply default settings.
+      $settings->settings = array(
+        'operator' => FACETAPI_OPERATOR_AND,
+        'hard_limit' => 50,
+        'dependencies' => array(),
+        'facet_mincount' => 1,
+        'facet_missing' => 0,
+        'flatten' => 0,
+        'query_type' => 'term',
+      );
+
+      // Apply the adapter's default settings.
+      $settings->settings += $this->getDefaultSettings();
+
+      // Applies each dependency plugin's default settings.
+      foreach ($facet['dependency plugins'] as $id) {
+        $class = ctools_plugin_load_class('facetapi', 'dependencies', $id, 'handler');
+        $plugin = new $class($id, $this, $facet, $settings, array());
+        $settings->settings['dependencies'] = array();
+        $settings->settings['dependencies'] += $plugin->getDefaultSettings();
+      }
+
+      // @todo Save for performance?
+    }
+
+    // Ensures settings added in later versions of the module are initialized to
+    // prevent undefuned index errors after upgrading.
+    // @todo Remove in 7.x-2.x
+    $settings->settings += array(
+      'facet_mincount' => 1,
+      'facet_missing' => 0,
+      'flatten' => 0,
+      'query_type' => 'term',
+    );
+
+    return $settings;
+  }
+
+  /**
    * Returns the enabled facets associated with the instance of the adapter.
    *
    * @param string $realm_name
@@ -820,110 +988,11 @@ class FacetapiFacet implements ArrayAccess {
    *   An object containing the settings.
    */
   public function getSettings($realm = NULL) {
-    // Normalizes the realm name.
-    if (!is_array($realm)) {
-      $realm_name = ($realm) ? $realm : '';
-      $realm = ($realm) ? facetapi_realm_load($realm_name) : array();
-    }
-    else {
-      $realm_name = $realm['name'];
-    }
-
-    // Loads the settings via the CTools API.
-    ctools_include('export');
-    $name = $this->adapter->getSearcher() . ':' . $realm_name . ':' . $this->facet['name'];
-    if (!$settings = ctools_export_crud_load('facetapi', $name)) {
-
-      // Initializes settings object.
-      $settings = ctools_export_crud_new('facetapi');
-      $settings->name = $name;
-      $settings->searcher = $this->adapter->getSearcher();
-      $settings->realm = $realm_name;
-      $settings->facet = $this->facet['name'];
-      $settings->enabled = 0;
-
-      if ($realm) {
-
-        if (!empty($this->facet['default widget'])) {
-          $widget = $this->facet['default widget'];
-        }
-        else {
-          $widget = $realm['default widget'];
-        }
-        // Initializes realm-specific settings.
-        $settings->settings = array(
-          'weight' => 0,
-          'widget' => $widget,
-          'filters' => array(),
-          'active_sorts' => array(),
-          'sort_weight' => array(),
-          'sort_order' => array(),
-          'empty_behavior' => 'none',
-        );
-
-        // Apply default sort settings.
-        $weight = -50;
-        foreach ($this->facet['default sorts'] as $sort => $default) {
-          $settings->settings['active_sorts'][$default[0]] = $default[0];
-          $settings->settings['sort_weight'][$default[0]] = $weight++;
-          $settings->settings['sort_order'][$default[0]] = $default[1];
-        }
-
-        // Loads default widget plugin, adds settings.
-        $id = $settings->settings['widget'];
-        $class = ctools_plugin_load_class('facetapi', 'widgets', $id, 'handler');
-        // If we have an invalid widget, fall back to the realm's default.
-        if (!$class) {
-          $id = $settings->settings['widget'] = $realm['default widget'];
-          $class = ctools_plugin_load_class('facetapi', 'widgets', $id, 'handler');
-        }
-        $plugin = new $class($id, $realm, $this, $settings);
-        $settings->settings += $plugin->getDefaultSettings();
-      }
-      else {
-        // Initializes settings.
-        $settings->settings = array(
-          'operator' => FACETAPI_OPERATOR_AND,
-          'hard_limit' => 50,
-          'dependencies' => array(),
-          'facet_mincount' => 1,
-          'facet_missing' => 0,
-          'flatten' => 0,
-        );
-
-        // Loads the default settings from the adapter.
-        $settings->settings += $this->adapter->getDefaultSettings();
-
-        // Loads default settings from dependency plugins.
-        foreach ($this->facet['dependency plugins'] as $id) {
-          $class = ctools_plugin_load_class('facetapi', 'dependencies', $id, 'handler');
-          $plugin = new $class($id, $this->adapter, $this->facet, $settings, $this->adapter->getAllActiveItems());
-          $settings->settings['dependencies'] = array();
-          $settings->settings['dependencies'] += $plugin->getDefaultSettings();
-        }
-      }
-
-      // @todo Explore whether we should save settings for performance.
+    if ($realm && !is_array($realm)) {
+      $realm = facetapi_realm_load($realm_name);
     }
-
-    // Ensures settings added in later versions of the module are initialized to
-    // prevent undefuned index errors after upgrading.
-    // @todo Remove in later versions.
-    if ($realm) {
-      $settings->settings += array(
-        'empty_behavior' => 'none',
-        'filters' => array(),
-      );
-    }
-    else {
-      $settings->settings += array(
-        'facet_mincount' => 1,
-        'facet_missing' => 0,
-        'flatten' => 0,
-      );
-    }
-
-    return $settings;
+    $method = ($realm) ? 'getFacetSettings' : 'getFacetSettingsGlobal';
+    return $this->adapter->$method($this->facet, $realm);
   }
 
   /**
