diff --git a/apachesolr.index.inc b/apachesolr.index.inc
index d1e7de6..c3a0800 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;
 }
 
@@ -68,7 +71,6 @@ function apachesolr_index_status($env_id) {
     // 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')
-      ->condition('aie.status', 1)
       ->condition('aie.bundle', $bundles)
       ->condition(db_or()
         ->condition('aie.changed', $last_changed, '>')
@@ -338,8 +340,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 +358,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;
 }
@@ -688,36 +671,7 @@ function apachesolr_index_node_solr_document(ApacheSolrDocument $document, $node
 
 
 function apachesolr_index_node_bundles_changed($env_id, $existing_bundles, $new_bundles) {
-  $removed_bundles = array_diff($existing_bundles, $new_bundles);
-  $added_bundles = array_diff($new_bundles, $existing_bundles);
-  $indexer_table = apachesolr_get_indexer_table('node');
-  $transaction = db_transaction();
-  try {
-    if ($removed_bundles) {
-      db_delete($indexer_table)
-        ->condition('entity_type', 'node')
-        ->condition('bundle', $removed_bundles)
-        ->execute();
-    }
-    if ($added_bundles) {
-      $select = db_select('node', 'n');
-      $select->addExpression("'node'", 'entity_type');
-      $select->condition('type', $added_bundles);
-      $select->addField('n', 'nid', 'entity_id');
-      $select->addField('n', 'type', 'bundle');
-      $select->addField('n', 'status', 'status');
-      $select->addExpression(REQUEST_TIME, 'changed');
-
-      $insert = db_insert($indexer_table)
-        ->fields(array('entity_id', 'bundle', 'status', 'entity_type', 'changed'))
-        ->from($select)
-        ->execute();
-    }
-  }
-  catch (Exception $e) {
-    $transaction->rollback();
-    throw $e;
-  }
+  // Nothing to do for now.
 }
 
 /**
@@ -735,6 +689,8 @@ function apachesolr_index_node_solr_reindex($env_id) {
       ->condition('entity_type', 'node')
       ->execute();
     $select = db_select('node', 'n');
+    $select->condition('type', $bundles);
+    $select->condition('status', 1);
     $select->addExpression("'node'", 'entity_type');
     $select->addField('n', 'nid', 'entity_id');
     $select->addField('n', 'type', 'bundle');
diff --git a/apachesolr.install b/apachesolr.install
index 2080e53..f5b8f93 100644
--- a/apachesolr.install
+++ b/apachesolr.install
@@ -214,7 +214,7 @@ function apachesolr_schema() {
           'not null' => TRUE,
         ),
         'status' => array(
-          'description' => 'Boolean indicating whether the entity is visible to non-administrators (eg, published for nodes).',
+          'description' => 'Boolean indicating whether the entity should be in the index.',
           'type' => 'int',
           'not null' => TRUE,
           'default' => 1,
@@ -227,7 +227,7 @@ function apachesolr_schema() {
         ),
       ),
       'indexes' => array(
-        'changed' => array('bundle', 'status', 'changed'),
+        'bundle_changed' => array('bundle', 'changed'),
       ),
       'primary key' => array('entity_id'),
     );
@@ -801,3 +801,16 @@ function apachesolr_update_7013() {
   db_add_primary_key('apachesolr_index_bundles', array('env_id', 'entity_type', 'bundle'));
 }
 
+/**
+ * Remove status from the key.
+ */
+function apachesolr_update_7014() {
+  $types = array(
+    'other' => 'apachesolr_index_entities',
+    'node' => 'apachesolr_index_entities_node',
+  );
+  foreach ($types as $type => $table) {
+    db_drop_index($table, 'changed');
+    db_add_index($table, 'bundle_changed', array('bundle', 'changed'));
+  }
+}
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();
   }
 }
