diff --git a/apachesolr.index.inc b/apachesolr.index.inc
index d1e7de6..312efca 100644
--- a/apachesolr.index.inc
+++ b/apachesolr.index.inc
@@ -16,9 +16,13 @@ function apachesolr_index_entities($env_id, $limit) {
     $rows = apachesolr_index_get_entities_to_index($env_id, $entity_type, $limit);
     $documents = array();
     foreach ($rows as $row) {
-      if (!empty($row)) {
+      if (!empty($row->status)) {
         $documents = array_merge($documents, apachesolr_index_entity_to_documents($row, $env_id));
       }
+      else {
+        // Delete the entity from our index if the status callback returned 0
+        apachesolr_remove_entity($env_id, $row->entity_type, $row->entity_id);
+      }
     }
 
     $indexed = apachesolr_index_send_to_solr($env_id, $documents);
@@ -28,7 +32,7 @@ function apachesolr_index_entities($env_id, $limit) {
       $max_changed = $index_position['last_changed'];
       $max_entity_id = $index_position['last_entity_id'];
       foreach ($rows as $row) {
-        if (!empty($row)) {
+        if (!empty($row->status)) {
           if ($row->changed > $max_changed) {
             $max_changed = $row->changed;
           }
@@ -41,7 +45,6 @@ function apachesolr_index_entities($env_id, $limit) {
       apachesolr_set_last_index_updated($env_id, REQUEST_TIME);
     }
   }
-
   return $entities_processed;
 }
 
@@ -338,8 +341,7 @@ function apachesolr_index_get_entities_to_index($env_id, $entity_type, $limit) {
   // for ordering we're grabbing the oldest first and then ordering by ID so
   // that we get a definitive order.
   $query = db_select($table, 'aie')
-    ->fields('aie', array('entity_type', 'entity_id', 'changed'))
-    ->condition('aie.status', 1)
+    ->fields('aie', array('entity_type', 'entity_id', 'changed', 'status'))
     ->condition('aie.bundle', $bundles)
     ->condition(db_or()
       ->condition('aie.changed', $last_changed, '>')
@@ -357,33 +359,15 @@ function apachesolr_index_get_entities_to_index($env_id, $entity_type, $limit) {
 
   $status_callbacks = apachesolr_entity_get_callback($entity_type, 'status callback');
   foreach ($records as $record) {
-    // Check status callback before sending to the index
-    $status = TRUE;
+    // 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
-        $status = $status && $status_callback($record->entity_id, $record->entity_type);
-      }
-    }
-
-    // Delete the entity from our index if the status callback returns 0
-    if ($status == TRUE) {
-      $rows[] = $record;
-    }
-    else {
-      // Discard this entry
-      $rows[] = NULL;
-      // Delete if from the index - Do not use apachesolr_entity_delete because
-      // the module does not want to load a complete entity
-      if (apachesolr_index_delete_entity_from_index($env_id, $record->entity_type, $record->entity_id)) {
-        // There was no exception, so delete from the table.
-        db_delete($table)
-          ->condition('entity_type', $entity_type)
-          ->condition('entity_id', $id)
-          ->execute();
+        $record->status = $record->status && $status_callback($record->entity_id, $record->entity_type);
       }
     }
+    $rows[] = $record;
   }
   return $rows;
 }
diff --git a/apachesolr.module b/apachesolr.module
index 455caeb..b2bec3c 100644
--- a/apachesolr.module
+++ b/apachesolr.module
@@ -1772,8 +1772,9 @@ function apachesolr_entity_update($entity, $type) {
     }
 
     // Delete the entity from our index if the status callback returns FALSE
-    if ($status == FALSE) {
-      return apachesolr_entity_delete($entity, $type);
+    if (!$status) {
+      apachesolr_entity_delete($entity, $type);
+      return;
     }
 
     $indexer_table = apachesolr_get_indexer_table($type);
@@ -1787,7 +1788,7 @@ function apachesolr_entity_update($entity, $type) {
       ))
       ->fields(array(
         'bundle' => $bundle,
-        'status' => $status,
+        'status' => 1,
         'changed' => REQUEST_TIME,
       ))
       ->execute();
@@ -1810,23 +1811,32 @@ function apachesolr_get_indexer_table($type) {
 
 /**
  * Implements hook_entity_delete().
- *
- * @see apachesolr_node_delete().
  */
 function apachesolr_entity_delete($entity, $entity_type) {
   $env_id = apachesolr_default_environment();
-  module_load_include('inc', 'apachesolr', 'apachesolr.index');
 
   // Delete the entity's entry from a fictional table of all entities.
   $info = entity_get_info($entity_type);
-  list($id) = entity_extract_ids($entity_type, $entity);
+  list($entity_id) = entity_extract_ids($entity_type, $entity);
+  apachesolr_remove_entity($env_id, $entity_type, $entity_id);
+}
+
+function apachesolr_remove_entity($env_id, $entity_type, $entity_id) {
+  module_load_include('inc', 'apachesolr', 'apachesolr.index');
 
-  if (apachesolr_index_delete_entity_from_index($env_id, $entity_type, $id)) {
+  $indexer_table = apachesolr_get_indexer_table($entity_type);
+  if (apachesolr_index_delete_entity_from_index($env_id, $entity_type, $entity_id)) {
     // There was no exception, so delete from the table.
-    $indexer_table = apachesolr_get_indexer_table($entity_type);
     db_delete($indexer_table)
       ->condition('entity_type', $entity_type)
-      ->condition('entity_id', $id)
+      ->condition('entity_id', $entity_id)
+      ->execute();
+  }
+  else {
+    // Set status 0 so we try to delete from the index again in the future.
+    db_update($indexer_table)
+      ->condition('entity_id', $entity_id)
+      ->fields(array('changed' => REQUEST_TIME, 'status' => 0))
       ->execute();
   }
 }
