diff --git a/apachesolr.index.inc b/apachesolr.index.inc
index 040b717..a2ccbc4 100644
--- a/apachesolr.index.inc
+++ b/apachesolr.index.inc
@@ -734,10 +734,84 @@ function apachesolr_vocab_name($vid) {
 }
 
 /**
+ * Construct a dynamic index name based on information about a field.
+ *
+ * array('index_type' => 'integer',
+ *        'multiple' => TRUE,
+ *        'name' => 'fieldname',
+ *        ),
+ */
+function apachesolr_index_key($field) {
+  $index_type = !empty($field['index_type']) ? $field['index_type'] : NULL;
+  switch ($index_type) {
+    case 'text':
+      $type_prefix = 't';
+      break;
+    case 'text-omitNorms':
+      $type_prefix = 'to';
+      break;
+    case 'text-edgeNgram':
+      $type_prefix = 'te';
+      break;
+    case 'text-whiteSpace':
+      $type_prefix = 'tw';
+      break;
+    case 'integer':
+      $type_prefix = 'i'; // long integer
+      break;
+    case 'half-int':
+      $type_prefix = 'h'; // 32 bit integer
+      break;
+    case 'float':
+      $type_prefix = 'f'; // float; sortable.
+      break;
+    case 'double':
+      $type_prefix = 'p'; // double; sortable d was used for date.
+      break;
+    case 'sint':
+      $type_prefix = 'is'; // long integer sortable (deprecated)
+      break;
+    case 'boolean':
+      $type_prefix = 'b';
+      break;
+    case 'date':
+      $type_prefix = 'd'; // date trie
+      break;
+    case 'tint':
+      $type_prefix = 'it'; // long integer trie; sortable, best for range queries
+      break;
+    case 'thalf-int':
+      $type_prefix = 'ht'; // 32 bit integer trie (sortable)
+      break;
+    case 'tfloat':
+      $type_prefix = 'ft'; // float trie; sortable, best for range queries.
+      break;
+    case 'tdouble':
+      $type_prefix = 'pt'; // double trie; d was used for date.
+      break;
+    case 'sfloat':
+      $type_prefix = 'fs'; // float, sortable (use for sorting missing last).
+      break;
+    case 'sdouble':
+      $type_prefix = 'ps'; // double sortable; (use for sorting missing last).
+      break;
+    case 'string':
+    default:
+      $type_prefix = 's'; // String
+  }
+  $sm = !empty($field['multiple']) ? 'm_' : 's_';
+  // Block deltas are limited to 32 chars.
+  return substr($type_prefix . $sm . $field['name'], 0, 32);
+}
+
+/**
  * Callback that converts list module field into an array
+ * For every multivalued value we also add a single value to be able to
+ * use the stats
  */
 function apachesolr_fields_default_indexing_callback($entity, $field_name, $index_key, $field_info) {
   $fields = array();
+  $numeric = TRUE;
   if (!empty($entity->{$field_name})) {
     $field = $entity->$field_name;
     list($lang, $values) = each($field);
@@ -759,13 +833,25 @@ function apachesolr_fields_default_indexing_callback($entity, $field_name, $inde
         $function = 'apachesolr_floatval';
         break;
       default:
+        $numeric = FALSE;
         $function = 'apachesolr_clean_text';
     }
-    foreach ($values as $fval) {
+    for ($i = 0; $i < count($values); $i++) {
       $fields[] = array(
         'key' => $index_key,
-        'value' => $function($fval['value']),
+        'value' => $function($values[$i]['value']),
       );
+
+      // Only store the first value of the field in a singular index
+      if ($numeric && ($i == 0)) {
+        $singular_field_info = $field_info;
+        $singular_field_info['multiple'] = FALSE;
+        $single_key = apachesolr_index_key($singular_field_info);
+        $fields[] = array(
+          'key' => $single_key,
+          'value' => $function($values[$i]['value']),
+        );
+      }
     }
   }
   return $fields;
diff --git a/apachesolr.module b/apachesolr.module
index 1a17757..8256f3d 100644
--- a/apachesolr.module
+++ b/apachesolr.module
@@ -328,7 +328,7 @@ function apachesolr_facetapi_facet_info($searcher_info) {
 }
 
 function apachesolr_default_node_facet_info($searcher_info) {
-
+  module_load_include('inc', 'apachesolr', 'apachesolr.index');
   $facets = apachesolr_common_node_facets();
   foreach (apachesolr_entity_fields('node') as $field_nm => $field_info) {
     if (!empty($field_info['facets'])) {
@@ -1414,80 +1414,10 @@ function apachesolr_current_query($env_id, DrupalSolrQueryInterface $query = NUL
 }
 
 /**
- * Construct a dynamic index name based on information about a field.
- *
- * array('index_type' => 'integer',
- *        'multiple' => TRUE,
- *        'name' => 'fieldname',
- *        ),
- */
-function apachesolr_index_key($field) {
-  $index_type = !empty($field['index_type']) ? $field['index_type'] : NULL;
-  switch ($index_type) {
-    case 'text':
-      $type_prefix = 't';
-      break;
-    case 'text-omitNorms':
-      $type_prefix = 'to';
-      break;
-    case 'text-edgeNgram':
-      $type_prefix = 'te';
-      break;
-    case 'text-whiteSpace':
-      $type_prefix = 'tw';
-      break;
-    case 'integer':
-      $type_prefix = 'i'; // long integer
-      break;
-    case 'half-int':
-      $type_prefix = 'h'; // 32 bit integer
-      break;
-    case 'float':
-      $type_prefix = 'f'; // float; sortable.
-      break;
-    case 'double':
-      $type_prefix = 'p'; // double; sortable d was used for date.
-      break;
-    case 'sint':
-      $type_prefix = 'is'; // long integer sortable (deprecated)
-      break;
-    case 'boolean':
-      $type_prefix = 'b';
-      break;
-    case 'date':
-      $type_prefix = 'd'; // date trie
-      break;
-    case 'tint':
-      $type_prefix = 'it'; // long integer trie; sortable, best for range queries
-      break;
-    case 'thalf-int':
-      $type_prefix = 'ht'; // 32 bit integer trie (sortable)
-      break;
-    case 'tfloat':
-      $type_prefix = 'ft'; // float trie; sortable, best for range queries.
-      break;
-    case 'tdouble':
-      $type_prefix = 'pt'; // double trie; d was used for date.
-      break;
-    case 'sfloat':
-      $type_prefix = 'fs'; // float, sortable (use for sorting missing last).
-      break;
-    case 'sdouble':
-      $type_prefix = 'ps'; // double sortable; (use for sorting missing last).
-      break;
-    case 'string':
-    default:
-      $type_prefix = 's'; // String
-  }
-  $sm = !empty($field['multiple']) ? 'm_' : 's_';
-  // Block deltas are limited to 32 chars.
-  return substr($type_prefix . $sm . $field['name'], 0, 32);
-}
-
-/**
  * Try to map a schema field name to a human-readable description.
  */
 function apachesolr_field_name_map($field_name) {
+  module_load_include('inc', 'apachesolr', 'apachesolr.index');
   $map = &drupal_static(__FUNCTION__);
 
   if (!isset($map)) {
@@ -1572,10 +1502,10 @@ function apachesolr_entity_info_alter(&$entity_info) {
     $entity_info[$type]['apachesolr'] += $default;
   }
 
+  $env_id = apachesolr_default_environment();
   // For any supported entity type and bundle, flag it for indexing.
   foreach ($entity_info as $entity_type => $info) {
     if ($info['apachesolr']['indexable']) {
-      $env_id = apachesolr_default_environment();
       $supported = apachesolr_get_index_bundles($env_id, $entity_type);
       foreach (array_keys($info['bundles']) as $bundle) {
         if (in_array($bundle, $supported)) {
@@ -1708,6 +1638,7 @@ function apachesolr_entity_delete($entity, $type) {
  * Returns array containing information about node fields that should be indexed
  */
 function apachesolr_entity_fields($entity_type = 'node') {
+  module_load_include('inc', 'apachesolr', 'apachesolr.index');
   $fields = &drupal_static(__FUNCTION__, array());
 
   if (!isset($fields[$entity_type])) {
@@ -1734,6 +1665,7 @@ function apachesolr_entity_fields($entity_type = 'node') {
 
     // Allow other modules to add or alter mappings.
     drupal_alter('apachesolr_field_mappings', $mappings, $entity_type);
+
     $modules = system_get_info('module');
     $instances = field_info_instances($entity_type);
     foreach (field_info_fields() as $field_name => $field) {
diff --git a/plugins/facetapi/query_type_numeric_range.inc b/plugins/facetapi/query_type_numeric_range.inc
index b43ca88..0560ad1 100644
--- a/plugins/facetapi/query_type_numeric_range.inc
+++ b/plugins/facetapi/query_type_numeric_range.inc
@@ -10,6 +10,7 @@
  */
 class ApacheSolrFacetapiNumericRange extends FacetapiQueryType implements FacetapiQueryTypeInterface {
 
+  private $single_key;
   /**
    * Returns the query type associated with the plugin.
    *
@@ -32,13 +33,17 @@ class ApacheSolrFacetapiNumericRange extends FacetapiQueryType implements Faceta
     //
     $settings = $this->adapter->getFacet($this->facet)->getSettings();
     $active = $this->adapter->getActiveItems($this->facet);
+
+    $singular_field_info = $this->facet['map options'];
+    $singular_field_info['multiple'] = FALSE;
+    $this->single_key = apachesolr_index_key($singular_field_info);
     // See:  http://wiki.apache.org/solr/StatsComponent
     $query->addParam('stats', 'true');
-    $query->addParam('stats.field', $this->facet['field']);
-    $query->addParam('stats.facet', $this->facet['field']);
+    $query->addParam('stats.field', $this->single_key);
+    $query->addParam('stats.facet', $this->single_key);
     // Range filters don't support OR operator.
     foreach ($active as $value => $item) {
-      $query->addFilter($this->facet['field'], $value);
+      $query->addFilter($this->single_key, $value);
     }
   }
 
@@ -50,22 +55,35 @@ class ApacheSolrFacetapiNumericRange extends FacetapiQueryType implements Faceta
    */
   public function build() {
     $build = array();
-    if ($response = apachesolr_static_response_cache($this->adapter->getSearcher())) {
+    // Per key we save our statistics result
+    $cache = cache_get('stats_' . $this->single_key, 'cache_apachesolr');
+    $stats_minmax = array();
 
-      //we need an additional query for the statistics of the field
+    if (!isset($cache->data)) {
+      // we need an additional query for the statistics of the field
       // We can optionally specify a Solr object.
       $solr = apachesolr_get_solr();
+
+      // We possibly need some caching for this query
       $query_stats = apachesolr_drupal_query('apachesolr_stats', array(), '', '', $solr);
       $query_stats->addParam('stats', 'true');
-      $query_stats->addParam('stats.field', $this->facet['field']);
-      $query_stats->addParam('stats.facet', $this->facet['field']);
+      $query_stats->addParam('stats.field', $this->single_key);
+      $query_stats->addParam('stats.facet', $this->single_key);
       $response_stats = $query_stats->search();
+
       if ($response_stats->response) {
-        $stats_minmax = $response_stats->stats->stats_fields->{$this->facet['field']};
+        $stats_minmax = $response_stats->stats->stats_fields->{$this->single_key};
+        cache_set('stats_' . $this->single_key, $stats_minmax, 'cache_apachesolr');
       }
+    }
+    else {
+      // Set our statistics from the cache
+      $stats_minmax = $cache->data;
+    }
 
-      if (isset($response->stats->stats_fields->{$this->facet['field']})) {
-        $stats = (array) $response->stats->stats_fields->{$this->facet['field']};
+    if ($response = apachesolr_static_response_cache($this->adapter->getSearcher())) {
+      if (isset($response->stats->stats_fields->{$this->single_key})) {
+        $stats = (array) $response->stats->stats_fields->{$this->single_key};
         foreach ($stats as $key => $val) {
           $build[$this->facet['field']]['#range_' . $key] = $val;
           $build[$this->facet['field']]['#global_range_' . $key] = $stats_minmax->$key;
