diff --git modules/field/field.crud.inc modules/field/field.crud.inc
index 29c9bc0..a59c0b3 100644
--- modules/field/field.crud.inc
+++ modules/field/field.crud.inc
@@ -583,11 +583,14 @@ function field_read_fields($params = array(), $include_additional = array()) {
  */
 function field_delete_field($field_name) {
   // Delete all non-deleted instances.
-  $field = field_read_field($field_name, array('include_inactive' => TRUE));
-  $instances = field_read_instances(array('field_id' => $field['id']), array('include_inactive' => TRUE));
-  foreach ($instances as $instance) {
-    // We do not want do auto-clean the field as that would call field_delete_field again
-    field_delete_instance($instance, FALSE);
+  $field = field_info_field($field_name);
+  if (isset($field['bundles'])) {
+    foreach ($field['bundles'] as $entity_type => $bundles) {
+      foreach ($bundles as $bundle) {
+        $instance = field_info_instance($entity_type, $field_name, $bundle);
+        field_delete_instance($instance, FALSE);
+      }
+    }
   }
 
   // Mark field data for deletion.
@@ -938,18 +941,15 @@ function field_delete_instance($instance, $field_cleanup = TRUE) {
   field_cache_clear();
 
   // Mark instance data for deletion.
-  $field = field_read_field($instance['field_name'], array('include_inactive' => TRUE));
+  $field = field_info_field($instance['field_name']);
   module_invoke($field['storage']['module'], 'field_storage_delete_instance', $instance);
 
   // Let modules react to the deletion of the instance.
   module_invoke_all('field_delete_instance', $instance);
 
   // Delete the field itself if we just deleted its last instance.
-  if ($field_cleanup) {
-    $instances = field_read_instances(array('field_id' => $field['id']), array('include_deleted' => 1, 'include_inactive' => 1));
-    if (empty($instances)) {
-      field_delete_field($field['field_name']);
-    }
+  if ($field_cleanup && count($field['bundles']) == 0) {
+    field_delete_field($field['field_name']);
   }
 }
 
@@ -1037,18 +1037,13 @@ function field_delete_instance($instance, $field_cleanup = TRUE) {
  *   The maximum number of field data records to purge before returning.
  */
 function field_purge_batch($batch_size) {
-  // Retrieve all deleted field instances, regardless its active status.
-  // A field is inactive when the module providing with its field type has
-  // been disabled.
-  $instances = field_read_instances(array('deleted' => 1), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
+  // Retrieve all deleted field instances. We cannot use field_info_instances()
+  // because that function does not return deleted instances.
+  $instances = field_read_instances(array('deleted' => 1), array('include_deleted' => 1));
 
   foreach ($instances as $instance) {
     // field_purge_data() will need the field array.
-    $field = field_read_field($instance['field_name'], array('include_deleted' => TRUE, 'include_inactive' => TRUE));
-    if (empty($field['storage']['active'])) {
-      // we cannot purge if the storage module is no longer available
-      continue;
-    }
+    $field = field_info_field_by_id($instance['field_id']);
     // Retrieve some entities.
     $query = new EntityFieldQuery();
     $results = $query
@@ -1074,9 +1069,9 @@ function field_purge_batch($batch_size) {
   }
 
   // Retrieve all deleted fields. Any that have no instances can be purged.
-  $fields = field_read_fields(array('deleted' => 1), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
+  $fields = field_read_fields(array('deleted' => 1), array('include_deleted' => 1));
   foreach ($fields as $field) {
-    $instances = field_read_instances(array('field_id' => $field['id']), array('include_deleted' => 1, 'include_inactive'=>1));
+    $instances = field_read_instances(array('field_id' => $field['id']), array('include_deleted' => 1));
     if (empty($instances)) {
       field_purge_field($field);
     }
@@ -1130,7 +1125,7 @@ function field_purge_instance($instance) {
     ->execute();
 
   // Notify the storage engine.
-  $field = array_shift(field_read_fields(array('id' => $instance['field_id']),array('include_deleted' => 1, 'include_inactive' => 1)));
+  $field = field_info_field_by_id($instance['field_id']);
   module_invoke($field['storage']['module'], 'field_storage_purge_instance', $instance);
 
   // Clear the cache.
@@ -1150,7 +1145,7 @@ function field_purge_instance($instance) {
  *   The field record to purge.
  */
 function field_purge_field($field) {
-  $instances = field_read_instances(array('field_id' => $field['id']), array('include_deleted' => 1, 'include_inactive' => 1));
+  $instances = field_read_instances(array('field_id' => $field['id']), array('include_deleted' => 1));
   if (count($instances) > 0) {
     throw new FieldException(t('Attempt to purge a field @field_name that still has instances.', array('@field_name' => $field['field_name'])));
   }
diff --git modules/field/field.info.inc modules/field/field.info.inc
index be30375..d4d9697 100644
--- modules/field/field.info.inc
+++ modules/field/field.info.inc
@@ -167,15 +167,15 @@ function _field_info_collate_types($reset = FALSE) {
  * @return
  *   If $reset is TRUE, nothing.
  *   If $reset is FALSE, an array containing the following elements:
- *   - fields: Array of existing fields, keyed by field name. This entry only
- *     lists non-deleted fields. Each field has an additional element,
- *     'bundles', which is an array of all non-deleted instances to which the
- *     field is assigned.
- *   - fields_id: Array of existing fields, keyed by field id. This entry lists
- *     both deleted and non-deleted fields. The bundles element is the same as
- *     for 'fields'.
+ *   - fields: Array of existing fields, keyed by field ID. This element
+ *     lists deleted and non-deleted fields, but not inactive ones. 
+ *     Each field has an additional element, 'bundles', which is an array 
+ *     of all non-deleted instances to which the field is assigned.
+ *   - field_ids: Array of field IDs, keyed by field name. This entry only lists
+ *     non-deleted, active fields.
  *   - instances: Array of existing instances, keyed by entity type, bundle
- *     name and field name. This entry only lists non-deleted instances.
+ *     name and field name. This entry only lists non-deleted instances whose 
+ *     field is active.
  */
 function _field_info_collate_fields($reset = FALSE) {
   static $info;
diff --git modules/field/modules/field_sql_storage/field_sql_storage.module modules/field/modules/field_sql_storage/field_sql_storage.module
index d3e6422..f65cdba 100644
--- modules/field/modules/field_sql_storage/field_sql_storage.module
+++ modules/field/modules/field_sql_storage/field_sql_storage.module
@@ -439,10 +439,9 @@ function field_sql_storage_field_storage_write($entity_type, $entity, $op, $fiel
 function field_sql_storage_field_storage_delete($entity_type, $entity, $fields) {
   list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
 
-  $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle), array('include_deleted' => 1, 'include_inactive' => 1));
-  foreach ($instances as $instance) {
+  foreach (field_info_instances($entity_type, $bundle) as $instance) {
     if (isset($fields[$instance['field_id']])) {
-      $field = array_shift(field_read_fields(array('id' => $instance['field_id']), array('include_deleted' => 1, 'include_inactive' => 1)));
+      $field = field_info_field_by_id($instance['field_id']);
       field_sql_storage_field_storage_purge($entity_type, $entity, $field, $instance);
     }
   }
@@ -623,7 +622,7 @@ function field_sql_storage_field_storage_delete_revision($entity_type, $entity,
  * This function simply marks for deletion all data associated with the field.
  */
 function field_sql_storage_field_storage_delete_instance($instance) {
-  $field = field_read_field($instance['field_name'], array('include_inactive' => TRUE));
+  $field = field_info_field($instance['field_name']);
   $table_name = _field_sql_storage_tablename($field);
   $revision_name = _field_sql_storage_revision_tablename($field);
   db_update($table_name)
@@ -645,9 +644,7 @@ function field_sql_storage_field_attach_rename_bundle($entity_type, $bundle_old,
   // We need to account for deleted or inactive fields and instances.
   $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle_new), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
   foreach ($instances as $instance) {
-    // We cannot use field_info_field_by_id since we want to retrieve inactive fields, too
-    $field = array_shift(field_read_fields(array('id' => $instance['field_id']), array('include_deleted' => 1, 'include_inactive' => 1)));
-
+    $field = field_info_field_by_id($instance['field_id']);
     if ($field['storage']['type'] == 'field_sql_storage') {
       $table_name = _field_sql_storage_tablename($field);
       $revision_name = _field_sql_storage_revision_tablename($field);
diff --git modules/field/tests/field.test modules/field/tests/field.test
index 4f033da..79c7c97 100644
--- modules/field/tests/field.test
+++ modules/field/tests/field.test
@@ -2096,13 +2096,11 @@ class FieldCrudTestCase extends FieldTestCase {
   function testDeleteField() {
     // TODO: Also test deletion of the data stored in the field ?
 
-    // Create three fields (so we can test which is deleted).
+    // Create two fields (so we can test that only one is deleted).
     $this->field = array('field_name' => 'field_1', 'type' => 'test_field');
     field_create_field($this->field);
     $this->another_field = array('field_name' => 'field_2', 'type' => 'test_field');
     field_create_field($this->another_field);
-    $this->inactive_field = array('field_name' => 'field_inactive', 'type' => 'test_field');
-    field_create_field($this->inactive_field;
 
     // Create instances for each.
     $this->instance_definition = array(
@@ -2114,20 +2112,9 @@ class FieldCrudTestCase extends FieldTestCase {
       ),
     );
     field_create_instance($this->instance_definition);
-    
     $this->another_instance_definition = $this->instance_definition;
     $this->another_instance_definition['field_name'] = $this->another_field['field_name'];
     field_create_instance($this->another_instance_definition);
-    
-    $this->inactive_instance_definition = $this->instance_definition;
-    $this->inactive_instance_definition['field_name'] = $this->inactive_field['field_name'];
-    field_create_instance($this->inactive_instance_definition);
-
-    // Simulate an inactive field.
-    db_update('field_config')
-      ->fields(array('active' => 0))
-      ->condition('field_name', $this->inactive_field['field_name'])
-      ->execute();
 
     // Test that the first field is not deleted, and then delete it.
     $field = field_read_field($this->field['field_name'], array('include_deleted' => TRUE));
@@ -2158,17 +2145,6 @@ class FieldCrudTestCase extends FieldTestCase {
     $another_instance = field_read_instance('test_entity', $this->another_instance_definition['field_name'], $this->another_instance_definition['bundle']);
     $this->assertTrue(!empty($another_instance) && empty($another_instance['deleted']), t('An instance of a non-deleted field is not marked for deletion.'));
 
-    // Make sure that the inactive field is marked as deleted when it is
-    // specifically loaded.
-    field_delete_field($this->inactive_field['field_name']);
-    $field = field_read_field($this->inactive_field['field_name'], array('include_deleted' => TRUE, 'include_inactive' => TRUE));
-    $this->assertTrue(!empty($field['deleted']), t('A deleted inactive field is marked for deletion.'));
-
-    // Try to load the instance of the inactive field normally and make sure
-    // it does not show up.
-    $instance = field_read_instance('test_entity', $this->inactive_instance_definition['field_name'], $this->inactive_instance_definition['bundle']);
-    $this->assertTrue(empty($instance), t('An instance for a deleted inactive field is not loaded by default.'));
-
     // Try to create a new field the same name as a deleted field and
     // write data into it.
     field_create_field($this->field);
@@ -2985,12 +2961,6 @@ class FieldBulkDeleteTestCase extends FieldTestCase {
         $id++;
       }
     }
-    
-    // Simulate an inactive field.
-    db_update('field_config')
-      ->fields(array('active' => 0))
-      ->condition('field_name', 'bf_2')
-      ->execute();
   }
 
   /**
