diff --git a/core/modules/field/field.attach.inc b/core/modules/field/field.attach.inc
index 482659e..4d8fdad 100644
--- a/core/modules/field/field.attach.inc
+++ b/core/modules/field/field.attach.inc
@@ -189,8 +189,8 @@ function _field_invoke($op, $entity_type, $entity, &$a = NULL, &$b = NULL, $opti
   // Iterate through the instances and collect results.
   $return = array();
   foreach ($instances as $instance) {
-    $field_name = $instance['field_name'];
-    $field = field_info_field($field_name);
+    $field = field_info_field_by_id($instance['field_id']);
+    $field_name = $field['field_name'];
     $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
     if (function_exists($function)) {
       // Determine the list of languages to iterate on.
diff --git a/core/modules/field/tests/field.test b/core/modules/field/tests/field.test
index 214eab4..34a489a 100644
--- a/core/modules/field/tests/field.test
+++ b/core/modules/field/tests/field.test
@@ -3172,15 +3172,33 @@ class FieldBulkDeleteTestCase extends FieldTestCase {
    * instances are deleted and purged.
    */
   function testPurgeField() {
+    field_test_memorize();
     $field = reset($this->fields);
 
     // Delete the first instance.
     $instance = field_info_instance($this->entity_type, $field['field_name'], 'bb_1');
     field_delete_instance($instance);
 
+    // Assert that hook_field_delete() was not called yet.
+    $mem = field_test_memorize();
+    $this->assertEqual(count($mem), 0, 'No field hooks were called.');
+
     // Purge the data.
     field_purge_batch(10);
 
+    // hook_field_delete() should have been called 10 times, once for each
+    // entity.
+    $mem = field_test_memorize();
+    $this->assertEqual(count($mem['field_test_field_delete']), 10, 'hook_field_delete() was called for the correct number of entities.');
+    $stubs = $this->_generateStubEntities($this->entity_type, $this->entities, $field['field_name']);
+    $count = count($stubs);
+    foreach ($mem['field_test_field_delete'] as $args) {
+      $entity = $args[1];
+      $this->assertEqual($stubs[$entity->ftid], $entity, 'hook_field_delete() was called with the correct stub.');
+      unset($stubs[$entity->ftid]);
+    }
+    $this->assertEqual(count($stubs), $count-10, 'hook_field_delete() was called once for each entity.');
+
     // Purge again to purge the instance.
     field_purge_batch(0);
 
@@ -3192,9 +3210,26 @@ class FieldBulkDeleteTestCase extends FieldTestCase {
     $instance = field_info_instance($this->entity_type, $field['field_name'], 'bb_2');
     field_delete_instance($instance);
 
+    // Assert that hook_field_delete() was not called yet.
+    $mem = field_test_memorize();
+    $this->assertEqual(count($mem), 0, 'No field hooks were called.');
+
     // Purge the data.
     field_purge_batch(10);
 
+    // hook_field_delete() should have been called 10 times, once for each
+    // entity.
+    $mem = field_test_memorize();
+    $this->assertEqual(count($mem['field_test_field_delete']), 10, 'hook_field_delete() was called for the correct number of entities.');
+    $stubs = $this->_generateStubEntities($this->entity_type, $this->entities, $field['field_name']);
+    $count = count($stubs);
+    foreach ($mem['field_test_field_delete'] as $args) {
+      $entity = $args[1];
+      $this->assertEqual($stubs[$entity->ftid], $entity, 'hook_field_delete() was called with the correct stub.');
+      unset($stubs[$entity->ftid]);
+    }
+    $this->assertEqual(count($stubs), $count-10, 'hook_field_delete() was called once for each entity.');
+
     // The field still exists, deleted.
     $fields = field_read_fields(array('id' => $field['id']), array('include_deleted' => 1));
     $this->assertTrue(isset($fields[$field['id']]) && $fields[$field['id']]['deleted'], 'The field exists and is deleted');
