diff --git a/apachesolr.admin.inc b/apachesolr.admin.inc
index 9184e24..e7a95e7 100644
--- a/apachesolr.admin.inc
+++ b/apachesolr.admin.inc
@@ -963,6 +963,7 @@ function apachesolr_index_batch_index_entities($env_id, &$context) {
 
     $status = apachesolr_index_status($env_id);
     $context['sandbox']['progress'] = 0;
+    $context['sandbox']['submitted'] = 0;
     $context['sandbox']['max'] = $status['remaining'];
   }
 
@@ -970,8 +971,20 @@ function apachesolr_index_batch_index_entities($env_id, &$context) {
   // timeout or out of memory error.
   $limit = variable_get('apachesolr_cron_limit', 50);
 
-  $context['sandbox']['progress'] += apachesolr_index_entities($env_id, $limit);
-  $context['message'] = t('Indexed @current of @total nodes', array('@current' => $context['sandbox']['progress'], '@total' => $context['sandbox']['max']));
+  if ($context['sandbox']['max'] >= $context['sandbox']['progress'] + $limit) {
+    $context['sandbox']['progress'] += $limit;
+  }
+  else {
+    $context['sandbox']['progress'] = $context['sandbox']['max'];
+  }
+  $context['sandbox']['submitted'] += apachesolr_index_entities($env_id, $limit);
+
+  $arguments = array(
+    '@current' => $context['sandbox']['progress'],
+    '@total' => $context['sandbox']['max'],
+    '@submitted' => $context['sandbox']['submitted'],
+    );
+  $context['message'] = t('Inspected @current of @total entities. Submitted @submitted documents to Solr', $arguments);
 
   // Inform the batch engine that we are not finished, and provide an
   // estimation of the completion level we reached.
@@ -981,6 +994,7 @@ function apachesolr_index_batch_index_entities($env_id, &$context) {
   // show it to the admin.
   if ($context['finished']) {
     $context['results']['count'] = $context['sandbox']['progress'];
+    $context['results']['submitted'] = $context['sandbox']['submitted'];
   }
 }
 
@@ -991,7 +1005,10 @@ function apachesolr_index_batch_index_finished($success, $results, $operations)
   $message = '';
   // $results['count'] will not be set if Solr is unavailable.
   if (isset($results['count'])) {
-    $message .= format_plural($results['count'], '1 item processed successfully.', '@count items successfully processed.');
+    $message .= format_plural($results['count'], '1 item processed successfully. ', '@count items successfully processed. ');
+  }
+  if (isset($results['submitted'])) {
+    $message .= format_plural($results['submitted'], '1 document successfully sent to Solr.', '@count documents successfully sent to Solr.');
   }
   if ($success) {
     $type = 'status';
diff --git a/apachesolr.index.inc b/apachesolr.index.inc
index 7110b4e..39ba350 100644
--- a/apachesolr.index.inc
+++ b/apachesolr.index.inc
@@ -15,9 +15,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);
   if ($indexed !== FALSE) {
@@ -26,7 +30,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;
           }
@@ -38,7 +42,6 @@ function apachesolr_index_entities($env_id, $limit) {
       apachesolr_set_last_index_position($env_id, $entity_type, $max_changed, $max_entity_id);
       apachesolr_set_last_index_updated($env_id, APACHESOLR_REQUEST_TIME);
   }
-
   return $entities_processed;
 }
 
@@ -66,7 +69,6 @@ function apachesolr_index_status($env_id) {
   // that we get a definitive order.
   $query = "SELECT count(*)
    FROM {{$table}} aie
-   WHERE (aie.status = 1)
    AND (aie.bundle IN (" . db_placeholders($bundles, 'varchar') . "))
    AND (aie.entity_type = '%s')
    AND ((aie.changed > %d) OR ((aie.changed <= %d) AND (aie.entity_id > %d)))";
@@ -337,17 +339,16 @@ function apachesolr_index_get_entities_to_index($env_id, $entity_type, $limit) {
   }
 
   $bundles = apachesolr_get_index_bundles($env_id, $type);
-
   $table = apachesolr_get_indexer_table($entity_type);
+
   // Get $last_entity_id and $last_change.
   extract(apachesolr_get_last_index_position($env_id, $entity_type));
 
   // Find the next batch of entities to index for this entity type.  Note that
   // for ordering we're grabbing the oldest first and then ordering by ID so
   // that we get a definitive order.
-  $query = "SELECT aie.entity_type, aie.entity_id, aie.changed, aie.bundle
+  $query = "SELECT aie.entity_type, aie.entity_id, aie.changed, aie.bundle, aie.status
    FROM {{$table}} aie
-   WHERE aie.status = 1
    AND (aie.bundle IN (" . db_placeholders($bundles, 'varchar') . "))
    AND (aie.entity_type = '%s')
    AND ((aie.changed > %d) OR ((aie.changed <= %d) AND (aie.entity_id > %d)))";
@@ -358,39 +359,19 @@ function apachesolr_index_get_entities_to_index($env_id, $entity_type, $limit) {
     $arguments[] = $type;
   }
   $query .= " ORDER BY aie.entity_id ASC";
-
   $result = db_query_range($query, $arguments, 0, $limit);
 
   $status_callbacks = apachesolr_entity_get_callback($entity_type, 'status callback');
   while ($record = db_fetch_object($result)) {
-    // 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 it from the index if it would be there already
-      apachesolr_entity_delete($record->entity_id, $record->entity_type);
-      // 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.
-        $query = "DELETE FROM {{$table}} WHERE entity_type = '%s' AND entity_id = %d";
-        $arguments = array($entity_type, $entity_id);
-        db_query($query, $arguments);
+        $record->status = $record->status && $status_callback($record->entity_id, $record->entity_type);
       }
     }
+    $rows[] = $record;
   }
   return $rows;
 }
@@ -412,7 +393,7 @@ function apachesolr_index_delete_index($env_id) {
     drupal_alter('apachesolr_delete_by_query', $query);
     $solr->deleteByQuery($query);
     $solr->commit();
-    apachesolr_clear_last_index_position($env_id);
+    apachesolr_index_mark_for_reindex($env_id);
     apachesolr_set_last_index_updated($env_id, APACHESOLR_REQUEST_TIME);
   }
   catch (Exception $e) {
@@ -488,7 +469,7 @@ function apachesolr_index_delete_entity_from_index($env_id, $entity_type, $entit
 
 /**
  *
- * @param $entity_id
+ * @param $entity_type
  *
  * @throws Exception
  */
@@ -702,7 +683,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);
+  /*$removed_bundles = array_diff($existing_bundles, $new_bundles);
   $added_bundles = array_diff($new_bundles, $existing_bundles);
   $indexer_table = apachesolr_get_indexer_table('node');
   try {
@@ -726,6 +707,8 @@ function apachesolr_index_node_bundles_changed($env_id, $existing_bundles, $new_
     // Re-throw the exception so we are aware of the failure.
     throw $e;
   }
+  */
+  // Nothing to do for now.
 }
 
 /**
@@ -738,11 +721,13 @@ function apachesolr_index_node_bundles_changed($env_id, $existing_bundles, $new_
 function apachesolr_index_node_solr_reindex($env_id) {
   $indexer_table = apachesolr_get_indexer_table('node');
   try {
-    db_query("DELETE FROM {{$indexer_table}} WHERE entity_type = 'node'");
+    // Leave status 0 rows - those need to be
+    // removed from the index later.
+    db_query("DELETE FROM {{$indexer_table}} WHERE entity_type = 'node' AND status = 1");
 
     $query = "INSERT INTO {{$indexer_table}} (entity_id, bundle, status, entity_type, changed) (
       SELECT n.nid AS entity_id, n.type AS bundle, n.status AS status, 'node' AS entity_type, %d AS changed
-      FROM node n)";
+      FROM node n WHERE status = 1)";
     db_query($query, array(APACHESOLR_REQUEST_TIME));
   }
   catch (Exception $e) {
diff --git a/apachesolr.install b/apachesolr.install
index 5b65667..42af6dc 100644
--- a/apachesolr.install
+++ b/apachesolr.install
@@ -220,7 +220,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,
@@ -233,7 +233,7 @@ function apachesolr_schema() {
         ),
       ),
       'indexes' => array(
-        'changed' => array('bundle', 'status', 'changed'),
+        'bundle_changed' => array('bundle', 'changed'),
       ),
       'primary key' => array('entity_id'),
     );
@@ -291,3 +291,19 @@ function apachesolr_uninstall() {
   // Remove blocks.
   db_query('DELETE FROM {blocks} WHERE module = "apachesolr"');
 }
+
+/**
+ * Remove status from the key.
+ */
+function apachesolr_update_6301() {
+  $ret = array();
+  $types = array(
+    'other' => 'apachesolr_index_entities',
+    'node' => 'apachesolr_index_entities_node',
+  );
+  foreach ($types as $type => $table) {
+    db_drop_index($ret, $table, 'changed');
+    db_add_index($ret, $table, 'bundle_changed', array('bundle', 'changed'));
+  }
+  return $ret;
+}
\ No newline at end of file
diff --git a/apachesolr.module b/apachesolr.module
index cfb0103..ba68f16 100644
--- a/apachesolr.module
+++ b/apachesolr.module
@@ -1864,8 +1864,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);
@@ -1875,7 +1876,7 @@ function apachesolr_entity_update($entity, $type) {
     $query = "INSERT INTO {{$indexer_table}} (entity_type, entity_id, bundle, status, changed)
       VALUES ('%s', %d, '%s', %d, %d)
       ON DUPLICATE KEY UPDATE entity_type = '%s', entity_id = %d, bundle = '%s', status = %d, changed = %d";
-    db_query($query, array($type, $id, $bundle, $status, APACHESOLR_REQUEST_TIME, $type, $id, $bundle, $status, APACHESOLR_REQUEST_TIME));
+    db_query($query, array($type, $id, $bundle, 1, APACHESOLR_REQUEST_TIME, $type, $id, $bundle, 1, APACHESOLR_REQUEST_TIME));
   }
 }
 
@@ -1901,14 +1902,21 @@ function apachesolr_get_indexer_table($type) {
 function apachesolr_entity_delete($entity, $entity_type) {
   $env_id = apachesolr_default_environment();
   module_load_include('inc', 'apachesolr', 'apachesolr.index');
+  apachesolr_remove_entity($env_id, $entity_type, $entity->nid);
+}
 
-  // Always nodes
-  $id = $entity->nid;
-  if (apachesolr_index_delete_entity_from_index($env_id, $entity_type, $id)) {
+function apachesolr_remove_entity($env_id, $entity_type, $entity_id) {
+  module_load_include('inc', 'apachesolr', 'apachesolr.index');
+  $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);
     $query = "DELETE FROM {{$indexer_table}} WHERE entity_type = '%s' AND entity_id = %d";
-    db_query($query, array($entity_type, $id));
+    db_query($query, array($entity_type, $entity_id));
+  }
+  else {
+    // Set status 0 so we try to delete from the index again in the future.
+    $query = "UPDATE {{$indexer_table}} asn SET asn.changed = '%s', status = 0 WHERE asn.entity_id = %d";
+    db_query($query, array(APACHESOLR_REQUEST_TIME, 0, $entity_id));
   }
 }
 
