diff --git a/apachesolr.admin.inc b/apachesolr.admin.inc
index bc1c986..ac3d320 100644
--- a/apachesolr.admin.inc
+++ b/apachesolr.admin.inc
@@ -334,8 +334,7 @@ function apachesolr_settings(&$form_state) {
     $confs['index'] = array(
       'class' => 'operation',
       'data' => l(t('Index'),
-        'admin/settings/apachesolr/settings/' . $data['env_id'] . '/index',
-         array('query' => array('destination' => $_GET['q']))
+        'admin/settings/apachesolr/settings/' . $data['env_id'] . '/index'
       ),
     );
     $ops['edit'] = array(
@@ -564,12 +563,12 @@ function apachesolr_status_page($environment = NULL) {
   $output['viewmore'] = l(t('View more details on the search index contents'), 'admin/reports/apachesolr');
 
   $write_status = apachesolr_environment_variable_get($env_id, 'apachesolr_read_only', APACHESOLR_READ_WRITE);
-  if (($write_status == APACHESOLR_READ_WRITE) && $env_id == apachesolr_default_environment()) {
-     $output['index_action_form'] = drupal_get_form('apachesolr_index_action_form', $env_id);
-     $output['index_config_form'] = drupal_get_form('apachesolr_index_config_form', $env_id);
+  if ($write_status == APACHESOLR_READ_WRITE) {
+    $output['index_action_form'] = drupal_get_form('apachesolr_index_action_form', $env_id);
+    $output['index_config_form'] = drupal_get_form('apachesolr_index_config_form', $env_id);
   }
   else {
-    drupal_set_message(t('Options for deleting and re-indexing are not available. This could be because the index is read-only or you are not viewing the default environment. This can be changed on the <a href="!settings_page">settings page</a>', array('!settings_page' => url('admin/settings/apachesolr/settings/' . $env_id . '/edit', array('query' =>  drupal_get_destination())))), 'warning');
+    drupal_set_message(t('Options for deleting and re-indexing are not available because the index is read-only. This can be changed on the <a href="!settings_page">settings page</a>', array('!settings_page' => url('admin/settings/apachesolr/settings/' . $env_id . '/edit', array('query' => drupal_get_destination())))), 'warning');
   }
 
   // Print in a similar way as the Drupal 7 version
@@ -898,15 +897,16 @@ function apachesolr_index_action_form_reset_submit($form, &$form_state) {
 function apachesolr_index_action_form_cron_submit($form, &$form_state) {
   if (!empty($form_state['build_info']['args'][0])) {
     $env_id = $form_state['build_info']['args'][0];
+    $form_state['redirect'] = 'admin/settings/apachesolr/settings/' . $env_id . '/index';
   }
   else {
     $env_id = apachesolr_default_environment();
+    $form_state['redirect'] = 'admin/settings/apachesolr';
   }
   // $form_state['storage'] must be unset for redirection to occur. Otherwise
   // $form_state['rebuild'] is automatically set and this form will be
   // rebuilt.
   unset($form_state['storage']);
-  $form_state['redirect'] = 'admin/settings/apachesolr';
   apachesolr_cron($env_id);
   drupal_set_message(t('Apachesolr cron succesfully executed'));
 }
@@ -932,15 +932,16 @@ function apachesolr_index_action_form_remaining_confirm(&$form_state, $environme
 function apachesolr_index_action_form_remaining_confirm_submit($form, &$form_state) {
   if (!empty($form_state['build_info']['args'][0]['env_id'])) {
     $env_id = $form_state['build_info']['args'][0]['env_id'];
+    $form_state['redirect'] = 'admin/settings/apachesolr/settings/' . $env_id . '/index';
   }
   else {
     $env_id = apachesolr_default_environment();
+    $form_state['redirect'] = 'admin/settings/apachesolr';
   }
   // $form_state['storage'] must be unset for redirection to occur. Otherwise
   // $form_state['rebuild'] is automatically set and this form will be
   // rebuilt.
   unset($form_state['storage']);
-  $form_state['redirect'] = 'admin/settings/apachesolr';
   apachesolr_index_batch_index_remaining($env_id);
 }
 
@@ -965,9 +966,11 @@ function apachesolr_index_action_form_reset_confirm(&$form_state, $environment)
 function apachesolr_index_action_form_reset_confirm_submit($form, &$form_state) {
   if (!empty($form_state['build_info']['args'][0]['env_id'])) {
     $env_id = $form_state['build_info']['args'][0]['env_id'];
+    $form_state['redirect'] = 'admin/settings/apachesolr/settings/' . $env_id . '/index';
   }
   else {
     $env_id = apachesolr_default_environment();
+    $form_state['redirect'] = 'admin/settings/apachesolr';
   }
   module_load_include('inc', 'apachesolr', 'apachesolr.index');
   apachesolr_index_mark_for_reindex($env_id);
@@ -976,7 +979,6 @@ function apachesolr_index_action_form_reset_confirm_submit($form, &$form_state)
   // $form_state['rebuild'] is automatically set and this form will be
   // rebuilt.
   unset($form_state['storage']);
-  $form_state['redirect'] = 'admin/settings/apachesolr';
 }
 
 /**
@@ -1000,9 +1002,11 @@ function apachesolr_index_action_form_delete_confirm(&$form_state, $environment)
 function apachesolr_index_action_form_delete_confirm_submit($form, &$form_state) {
   if (!empty($form_state['build_info']['args'][0]['env_id'])) {
     $env_id = $form_state['build_info']['args'][0]['env_id'];
+    $form_state['redirect'] = 'admin/settings/apachesolr/settings/' . $env_id . '/index';
   }
   else {
     $env_id = apachesolr_default_environment();
+    $form_state['redirect'] = 'admin/settings/apachesolr';
   }
   // Rebuild our tracking table.
   module_load_include('inc', 'apachesolr', 'apachesolr.index');
@@ -1012,7 +1016,6 @@ function apachesolr_index_action_form_delete_confirm_submit($form, &$form_state)
   // $form_state['rebuild'] is automatically set and this form will be
   // rebuilt.
   unset($form_state['storage']);
-  $form_state['redirect'] = 'admin/settings/apachesolr';
 }
 
 /**
diff --git a/apachesolr.index.inc b/apachesolr.index.inc
index b25e76b..0fe7aaa 100644
--- a/apachesolr.index.inc
+++ b/apachesolr.index.inc
@@ -127,9 +127,7 @@ function apachesolr_index_status($env_id) {
     // 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.
+    // Find the remaining entities to index for this entity type.
     $query = "SELECT count(*)
      FROM {{$table}} aie
      WHERE (aie.bundle IN (" . db_placeholders($bundles, 'varchar') . "))
@@ -838,6 +836,17 @@ function apachesolr_index_node_solr_reindex($env_id, $bundle = NULL) {
         FROM {node} n WHERE n.type = '%s' AND status = 1)";
       db_query($query, array(APACHESOLR_REQUEST_TIME, $bundle));
     }
+    elseif (!empty($indexable_bundles)) {
+      // Leave status 0 rows - those need to be
+      // removed from the index later.
+      $placeholders = db_placeholders($indexable_bundles, 'varchar');
+      db_query("DELETE FROM {{$indexer_table}} WHERE entity_type = 'node' AND bundle IN ({$placeholders}) AND status = 1", $indexable_bundles);
+      // Mark all nodes of the specified content type for reindexing.
+      $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 WHERE n.type IN ({$placeholders}) AND status = 1)";
+      db_query($query, array_merge(array(APACHESOLR_REQUEST_TIME), $indexable_bundles));
+    }
     else {
       // Leave status 0 rows - those need to be
       // removed from the index later.
diff --git a/apachesolr.module b/apachesolr.module
index 9c1445e..cc0dfec 100644
--- a/apachesolr.module
+++ b/apachesolr.module
@@ -864,67 +864,82 @@ function apachesolr_get_last_index_updated($env_id) {
 }
 
 /**
- * We run the indexing process only for the default environment
  * Implements hook_cron().
+ *
+ * Runs the indexing process on all writable environments or just a given
+ * environment.
+ *
  * @todo See if we can add info to the content type array for the cron_check
  */
 function apachesolr_cron($env_id = NULL) {
+  $environments = array();
   if (empty($env_id)) {
-    $env_id = apachesolr_default_environment();
+    $environments = array_keys(apachesolr_load_all_environments());
   }
-  // Indexes in read-only mode do not change the index, so will not update, delete, or optimize during cron.
-  if (apachesolr_environment_variable_get($env_id, 'apachesolr_read_only', APACHESOLR_READ_WRITE) == APACHESOLR_READ_ONLY) {
-    return;
+  else {
+    $environments[] = $env_id;
   }
+
   module_load_include('inc', 'apachesolr', 'apachesolr.index');
 
-  // For every entity type that requires extra validation
-  // Drupal 6 node only
-  $bundles = apachesolr_get_index_bundles($env_id, 'node');
+  // Optimize the index (by default once a day).
+  $optimize_interval = variable_get('apachesolr_optimize_interval', 60 * 60 * 24);
+  $time = REQUEST_TIME;
 
-  // If we're not checking any bundles of this entity type, just skip them all.
-  if (empty($bundles)) {
-    return;
-  }
+  foreach ($environments as $env_id) {
+    $last = apachesolr_environment_variable_get($env_id, 'apachesolr_last_optimize', 0);
 
-  $callbacks = apachesolr_get_index_callbacks();
-  if (isset($callbacks['node']['cron_check'])) {
-    $callback = $callbacks['node']['cron_check'];
-    call_user_func($callback);
-  }
+    // Indexes in read-only mode do not change the index, so will not update,
+    // delete, or optimize during cron.
+    if (apachesolr_environment_variable_get($env_id, 'apachesolr_read_only', APACHESOLR_READ_WRITE) == APACHESOLR_READ_ONLY) {
+      continue;
+    }
 
-  try {
-    $solr = apachesolr_get_solr($env_id);
-    // Optimize the index (by default once a day).
-    $optimize_interval = variable_get('apachesolr_optimize_interval', 60 * 60 * 24);
-    $last = variable_get('apachesolr_last_optimize', 0);
-    if ($optimize_interval && (APACHESOLR_REQUEST_TIME - $last > $optimize_interval)) {
-      $solr->optimize(FALSE, FALSE);
-      variable_set('apachesolr_last_optimize', APACHESOLR_REQUEST_TIME);
-      apachesolr_set_last_index_updated($env_id, APACHESOLR_REQUEST_TIME);
+    // For every entity type that requires extra validation
+    // Drupal 6 node only
+    $bundles = apachesolr_get_index_bundles($env_id, 'node');
+
+    // If we're not checking any bundles of this entity type, just skip them all.
+    if (empty($bundles)) {
+      return;
+    }
+
+    $callbacks = apachesolr_get_index_callbacks();
+    if (isset($callbacks['node']['cron_check'])) {
+      $callback = $callbacks['node']['cron_check'];
+      call_user_func($callback);
     }
-    // Only clear the cache if the index changed.
-    // TODO: clear on some schedule if running multi-site.
-    $updated = apachesolr_get_last_index_updated($env_id);
-    if ($updated > 0) {
-      $solr->clearCache();
-      // Re-populate the luke cache.
-      $solr->getLuke();
-      // TODO: an admin interface for setting this.  Assume for now 5 minutes.
-      if (APACHESOLR_REQUEST_TIME - $updated >= variable_get('apachesolr_cache_delay', 300)) {
-        // Clear the updated flag.
-        apachesolr_set_last_index_updated($env_id);
+
+    try {
+      $solr = apachesolr_get_solr($env_id);
+      if ($optimize_interval && ($time - $last > $optimize_interval)) {
+        $solr->optimize(FALSE, FALSE);
+        apachesolr_environment_variable_set($env_id, 'apachesolr_last_optimize', $time);
+        apachesolr_set_last_index_updated($env_id, $time);
+      }
+      // Only clear the cache if the index changed.
+      // TODO: clear on some schedule if running multi-site.
+      $updated = apachesolr_get_last_index_updated($env_id);
+      if ($updated > 0) {
+        $solr->clearCache();
+        // Re-populate the luke cache.
+        $solr->getLuke();
+        // TODO: an admin interface for setting this.  Assume for now 5 minutes.
+        if ($time - $updated >= variable_get('apachesolr_cache_delay', 300)) {
+          // Clear the updated flag.
+          apachesolr_set_last_index_updated($env_id);
+        }
       }
     }
-  }
-  catch (Exception $e) {
-    watchdog('Apache Solr', nl2br(check_plain($e->getMessage())) . ' in apachesolr_cron', NULL, WATCHDOG_ERROR);
-  }
+    catch (Exception $e) {
+      watchdog('Apache Solr', nl2br(check_plain($e->getMessage())) . ' in apachesolr_cron', NULL, WATCHDOG_ERROR);
+    }
 
-  // We can safely process the apachesolr_cron_limit nodes at a time without a
-  // timeout or out of memory error.
-  $limit = variable_get('apachesolr_cron_limit', 50);
-  apachesolr_index_entities($env_id, $limit);
+    // We can safely process the apachesolr_cron_limit nodes at a time without a
+    // timeout or out of memory error.
+    $limit = variable_get('apachesolr_cron_limit', 50);
+    apachesolr_index_entities($env_id, $limit);
+  }
 }
 
 /**
