diff --git modules/field/field.install modules/field/field.install
index 02455c4..cef7461 100644
--- modules/field/field.install
+++ modules/field/field.install
@@ -310,18 +310,22 @@ function _update_7000_field_delete_instance($field_name, $entity_type, $bundle)
 /**
  * Utility function: fetch all the field definitions from the database.
  *
+ * Warining: unlike the field_read_fields() API function, this function returns
+ * all fields by default, including deleted and inactive fields, unless
+ * specified otherwise in the $conditions parameter.
+ *
  * @param $conditions
  *   An array of conditions to limit the select query to.
+ *
+ * @return
+ *   An array of fields matching $conditions, keyed by field id.
  */
 function _update_7000_field_read_fields(array $conditions = array()) {
   $fields = array();
   $query = db_select('field_config', 'fc', array('fetch' => PDO::FETCH_ASSOC))
-    ->fields('fc')
-    ->condition('deleted', 0);
-  if (!empty($conditions)) {
-    foreach ($conditions as $column => $value) {
-      $query->condition($column, $value);
-    }
+    ->fields('fc');
+  foreach ($conditions as $column => $value) {
+    $query->condition($column, $value);
   }
   foreach ($query->execute() as $record) {
     $field = unserialize($record['data']);
@@ -338,7 +342,7 @@ function _update_7000_field_read_fields(array $conditions = array()) {
     $field['translatable'] = $record['translatable'];
     $field['deleted'] = $record['deleted'];
 
-    $fields[$field['field_name']] = $field;
+    $fields[$field['id']] = $field;
   }
   return $fields;
 }
diff --git modules/field/modules/list/list.install modules/field/modules/list/list.install
index cc7bcaf..fe5d299 100644
--- modules/field/modules/list/list.install
+++ modules/field/modules/list/list.install
@@ -51,7 +51,7 @@ function list_field_schema($field) {
  */
 function list_update_7001() {
   $fields = _update_7000_field_read_fields(array('module' => 'list'));
-  foreach ($fields as $field_name => $field) {
+  foreach ($fields as $field) {
     $update = array();
 
     // Translate the old string format into the new array format.
@@ -116,3 +116,15 @@ function _list_update_7001_extract_allowed_values($string, $position_keys) {
 
   return $values;
 }
+
+/**
+ * Re-apply list_update_7001() for deleted fields.
+ */
+function list_update_7002() {
+  // See http://drupal.org/node/1022924: list_update_7001() intitally
+  // overlooked deleted fields, which then caused fatal errors when the fields
+  // were being purged.
+  // list_update_7001() has the required checks to ensure it is reentrant, so
+  // it can simply be executed once more..
+  list_update_7001();
+}
\ No newline at end of file
diff --git modules/field/modules/text/text.install modules/field/modules/text/text.install
index cd1d9de..eee0f57 100644
--- modules/field/modules/text/text.install
+++ modules/field/modules/text/text.install
@@ -93,7 +93,7 @@ function text_update_7000() {
     'module' => 'text',
     'storage_type' => 'field_sql_storage',
   ));
-  foreach ($fields as $field_name => $field) {
+  foreach ($fields as $field) {
     if ($field['deleted']) {
       $table = "field_deleted_data_{$field['id']}";
       $revision_table = "field_deleted_revision_{$field['id']}";
diff --git modules/taxonomy/taxonomy.install modules/taxonomy/taxonomy.install
index 73c115a..2589c6e 100644
--- modules/taxonomy/taxonomy.install
+++ modules/taxonomy/taxonomy.install
@@ -568,7 +568,7 @@ function taxonomy_update_7005(&$sandbox) {
   // provides the delta value for each term reference data insert. The
   // deltas are reset for each new revision.
 
-  $field_info = _update_7000_field_read_fields();
+  $field_info = _update_7000_field_read_fields(array('type' => 'taxonomy_term_reference'));
 
   // This is a multi-pass update. On the first call we need to initialize some
   // variables.
@@ -641,7 +641,15 @@ function taxonomy_update_7005(&$sandbox) {
       // Use the valid field for this vocabulary and node type or use the
       // overflow vocabulary if there is no valid field.
       $field_name = isset($sandbox['vocabularies'][$record->vocab_id][$record->type]) ? $sandbox['vocabularies'][$record->vocab_id][$record->type] : 'taxonomyextra';
-      $field = $field_info[$field_name];
+
+      // $field_info is keyed by field id. Iterate until we find the right
+      // field. Matching on field name only is safe, since there will be no
+      // deleted field at this point of the upgrade path.
+      foreach ($field_info as $field) {
+        if ($field['field_name'] == $field_name) {
+          break;
+        }
+      }
 
       // Start deltas from 0, and increment by one for each term attached to a
       // node.
