diff --git modules/field/field.default.inc modules/field/field.default.inc
index e2f012c..0a5fe6c 100644
--- modules/field/field.default.inc
+++ modules/field/field.default.inc
@@ -142,14 +142,18 @@ function field_default_prepare_view($entity_type, $entities, $field, $instances,
   foreach ($instances as $id => $instance) {
     if (is_string($display)) {
       $view_mode = $display;
-      $display = field_get_display($instance, $view_mode, $entities[$id]);
+      $instance_display = field_get_display($instance, $view_mode, $entities[$id]);
     }
-    if ($display['type'] !== 'hidden') {
-      $module = $display['module'];
+    else {
+      $instance_display = $display;
+    }
+
+    if ($instance_display['type'] !== 'hidden') {
+      $module = $instance_display['module'];
       $modules[$module] = $module;
       $grouped_entities[$module][$id] = $entities[$id];
       $grouped_instances[$module][$id] = $instance;
-      $grouped_displays[$module][$id] = $display;
+      $grouped_displays[$module][$id] = $instance_display;
       // hook_field_formatter_prepare_view() alters $items by reference.
       $grouped_items[$module][$id] = &$items[$id];
     }
diff --git modules/field/tests/field.test modules/field/tests/field.test
index 817cdcd..056bd55 100644
--- modules/field/tests/field.test
+++ modules/field/tests/field.test
@@ -640,7 +640,7 @@ class FieldAttachOtherTestCase extends FieldAttachTestCase {
   /**
    * Test field_attach_view() and field_attach_prepare_view().
    */
-  function testFieldAttachView() {
+  function atestFieldAttachView() {
     $entity_type = 'test_entity';
     $entity_init = field_test_create_stub_entity();
     $langcode = LANGUAGE_NONE;
@@ -763,9 +763,58 @@ class FieldAttachOtherTestCase extends FieldAttachTestCase {
   }
 
   /**
+   * Tests the 'multiple entity' behavior of field_attach_prepare_view().
+   */
+  function testFieldAttachPrepareViewMultiple() {
+    $entity_type = 'test_entity';
+    $langcode = LANGUAGE_NONE;
+
+    // Set the instance to be hidden.
+    $this->instance['display']['full']['type'] = 'hidden';
+    field_update_instance($this->instance);
+
+    // Set up a second instance on another bundle, with a formatter that uses
+    // hook_field_formatter_prepare_view().
+    field_test_create_bundle('test_bundle_2');
+    $formatter_setting = $this->randomName();
+    $this->instance2 = $this->instance;
+    $this->instance2['bundle'] = 'test_bundle_2';
+    $this->instance2['display']['full'] = array(
+      'type' => 'field_test_with_prepare_view',
+      'settings' => array(
+        'test_formatter_setting_additional' => $formatter_setting,
+      )
+    );
+    field_create_instance($this->instance2);
+
+    // Create one entity in each bundle.
+    $entity1_init = field_test_create_stub_entity(1, 1, 'test_bundle');
+    $values1 = $this->_generateTestFieldValues($this->field['cardinality']);
+    $entity1_init->{$this->field_name}[$langcode] = $values1;
+
+    $entity2_init = field_test_create_stub_entity(2, 2, 'test_bundle_2');
+    $values2 = $this->_generateTestFieldValues($this->field['cardinality']);
+    $entity2_init->{$this->field_name}[$langcode] = $values2;
+
+    // Run prepare_view, and check that the entities come out as expected.
+    $entity1 = clone($entity1_init);
+    $entity2 = clone($entity2_init);
+    field_attach_prepare_view($entity_type, array($entity1->ftid => $entity1, $entity2->ftid => $entity2), 'full');
+    $this->assertFalse(isset($entity1->{$this->field_name}[$langcode][0]['additional_formatter_value']), 'Entity 1 did not run through the prepare_view hook.');
+    $this->assertTrue(isset($entity2->{$this->field_name}[$langcode][0]['additional_formatter_value']), 'Entity 2 ran through the prepare_view hook.');
+
+    // Same thing, reversed order.
+    $entity1 = clone($entity1_init);
+    $entity2 = clone($entity2_init);
+    field_attach_prepare_view($entity_type, array($entity2->ftid => $entity2, $entity1->ftid => $entity1), 'full');
+    $this->assertFalse(isset($entity1->{$this->field_name}[$langcode][0]['additional_formatter_value']), 'Entity 1 did not run through the prepare_view hook.');
+    $this->assertTrue(isset($entity2->{$this->field_name}[$langcode][0]['additional_formatter_value']), 'Entity 2 ran through the prepare_view hook.');
+  }
+
+  /**
    * Test field cache.
    */
-  function testFieldAttachCache() {
+  function atestFieldAttachCache() {
     // Initialize random values and a test entity.
     $entity_init = field_test_create_stub_entity(1, 1, $this->instance['bundle']);
     $langcode = LANGUAGE_NONE;
@@ -857,7 +906,7 @@ class FieldAttachOtherTestCase extends FieldAttachTestCase {
    * Verify that field_attach_validate() invokes the correct
    * hook_field_validate.
    */
-  function testFieldAttachValidate() {
+  function atestFieldAttachValidate() {
     $entity_type = 'test_entity';
     $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
     $langcode = LANGUAGE_NONE;
@@ -908,7 +957,7 @@ class FieldAttachOtherTestCase extends FieldAttachTestCase {
    * This could be much more thorough, but it does verify that the correct
    * widgets show up.
    */
-  function testFieldAttachForm() {
+  function atestFieldAttachForm() {
     $entity_type = 'test_entity';
     $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
 
@@ -927,7 +976,7 @@ class FieldAttachOtherTestCase extends FieldAttachTestCase {
   /**
    * Test field_attach_submit().
    */
-  function testFieldAttachSubmit() {
+  function atestFieldAttachSubmit() {
     $entity_type = 'test_entity';
     $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
 
