diff --git a/apachesolr.index.inc b/apachesolr.index.inc
index 176b67a..895cdb1 100644
--- a/apachesolr.index.inc
+++ b/apachesolr.index.inc
@@ -379,11 +379,13 @@ function apachesolr_index_get_entities_to_index($env_id, $entity_type, $limit) {
   $status_callbacks = apachesolr_entity_get_callback($entity_type, 'status callback');
   while ($record = db_fetch_object($result)) {
     // Check status and status callbacks before sending to the index
-    foreach($status_callbacks as $status_callback) {
-      if (is_callable($status_callback)) {
-        // by placing $status in front we prevent calling any other callback
-        // after one status callback returned false
-        $record->status = $record->status && $status_callback($record->entity_id, $record->entity_type);
+    if (is_array($status_callbacks)) {
+      foreach($status_callbacks as $status_callback) {
+        if (is_callable($status_callback)) {
+          // by placing $status in front we prevent calling any other callback
+          // after one status callback returned false
+          $record->status = $record->status && $status_callback($record->entity_id, $record->entity_type);
+        }
       }
     }
     $rows[] = $record;
diff --git a/apachesolr.module b/apachesolr.module
index df8714a..a84f1cd 100644
--- a/apachesolr.module
+++ b/apachesolr.module
@@ -1695,7 +1695,9 @@ function apachesolr_field_name_map($field_name) {
     }
     foreach (apachesolr_entity_fields('node') as $field_nm => $nodefields) {
       foreach ($nodefields as $field_info) {
-        $map[apachesolr_index_key($field_info)] = t('Field of type @type: %label', array('@type' => $field_info['field']['type'], '%label' => $field_info['display_name']));
+        if (is_array($field_info)) {
+          $map[apachesolr_index_key($field_info)] = t('Field of type @type: %label', array('@type' => $field_info['field']['type'], '%label' => $field_info['display_name']));
+        }
       }
     }
     drupal_alter('apachesolr_field_name_map', $map);
@@ -1852,14 +1854,17 @@ function apachesolr_entity_update($entity, $type) {
     $id = $entity->nid;
     $bundle = $entity->type;
 
-    $status_callbacks = apachesolr_entity_get_callback($type, 'status callback');
     // Check status callback before sending to the index
+    $status_callbacks = apachesolr_entity_get_callback($type, 'status callback');
+
     $status = TRUE;
-    foreach($status_callbacks as $status_callback) {
-      if (is_callable($status_callback)) {
-        // by placing $status in front we prevent calling any other callback
-        // after one status callback returned false
-        $status = $status && $status_callback($id, $type);
+    if (is_array($status_callbacks)) {
+      foreach($status_callbacks as $status_callback) {
+        if (is_callable($status_callback)) {
+          // by placing $status in front we prevent calling any other callback
+          // after one status callback returned false
+          $status = $status && $status_callback($id, $type);
+        }
       }
     }
 
@@ -2029,19 +2034,23 @@ function apachesolr_entity_fields($entity_type = 'node') {
 function content_apachesolr_index_document_build(ApacheSolrDocument $document, $entity, $entity_type) {
   $indexed_fields = apachesolr_entity_fields($entity_type);
   foreach ($indexed_fields as $index_key => $nodefields) {
-    foreach ($nodefields as $field_info) {
-      $field_name = $field_info['field']['field_name'];
-      // See if the node has fields that can be indexed
-      if (isset($entity->{$field_name})) {
-        // Got a field.
-        $function = $field_info['indexing_callback'];
-        if ($function && function_exists($function)) {
-          // NOTE: This function should always return an array.  One
-          // entity field may be indexed to multiple Solr fields.
-          $fields = $function($entity, $field_name, $index_key, $field_info);
-          foreach ($fields as $field) {
-            // It's fine to use this method also for single value fields.
-            $document->setMultiValue($field['key'], $field['value']);
+    if (!empty($nodefields)) {
+      foreach ($nodefields as $field_info) {
+        if (is_array($field_info['field'])) {
+          $field_name = $field_info['field']['field_name'];
+        }
+        // See if the node has fields that can be indexed
+        if (isset($entity->{$field_name})) {
+          // Got a field.
+          $function = $field_info['indexing_callback'];
+          if ($function && function_exists($function)) {
+            // NOTE: This function should always return an array.  One
+            // entity field may be indexed to multiple Solr fields.
+            $fields = $function($entity, $field_name, $index_key, $field_info);
+            foreach ($fields as $field) {
+              // It's fine to use this method also for single value fields.
+              $document->setMultiValue($field['key'], $field['value']);
+            }
           }
         }
       }
diff --git a/solr-conf/schema-solr3x.xml b/solr-conf/schema-solr3x.xml
index 096b7b9..69177e7 100644
--- a/solr-conf/schema-solr3x.xml
+++ b/solr-conf/schema-solr3x.xml
@@ -90,6 +90,15 @@
     <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
     <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
 
+    <!--
+      The ExternalFileField type gets values from an external file instead of the
+      index. This is useful for data such as rankings that might change frequently
+      and require different update frequencies than the documents they are
+      associated with.
+    -->
+    <fieldType name="pfloat" class="solr.FloatField" omitNorms="true"/>
+    <fieldType name="file" keyField="id" defVal="1" stored="false" indexed="false" class="solr.ExternalFileField" valType="pfloat"/>
+
 
     <!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
          is a more restricted form of the canonical representation of dateTime
@@ -481,6 +490,9 @@
    <dynamicField name="locm_*" type="location" indexed="true"  stored="true" multiValued="true"/>
    <dynamicField name="geos_*" type="geohash" indexed="true"  stored="true" multiValued="false"/>
    <dynamicField name="geom_*" type="geohash" indexed="true"  stored="true" multiValued="true"/>
+
+   <!-- External file fields -->
+   <dynamicField name="eff_*" type="file"/>
    <!-- End added fields for Solr 3.4+ -->
 
    <!-- Sortable version of the dynamic string field -->
