diff --git a/core/modules/field/tests/field.test b/core/modules/field/tests/field.test
index 3566484..82b6b42 100644
--- a/core/modules/field/tests/field.test
+++ b/core/modules/field/tests/field.test
@@ -1018,6 +1018,77 @@ class FieldAttachOtherTestCase extends FieldAttachTestCase {
   }
 }
 
+/**
+ * Tests field attach hooks for multiple core entity types.
+ */
+class FieldAttachHookTestCase extends FieldAttachTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Field attach hook tests',
+      'description' => 'Test field attach hooks for various core entity types',
+      'group' => 'Field API',
+    );
+  }
+
+  function setUp() {
+    // Comment and taxonomy are required to test hook_field_attach_validate().
+    parent::setup('comment', 'taxonomy');
+  }
+
+  /**
+   * Tests hook_field_attach_validate().
+   */
+  function testHookFieldAttachValidate() {
+
+    // A node type must be created to test the hook on node entities.
+    $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page'));
+    // A node must be created to test the hook on comment entities.
+    $node = $this->drupalCreateNode(array('type' => 'page'));
+
+    // A vocabulary must be created to test the hook on taxonomy terms.
+    $vocabulary = entity_create('taxonomy_vocabulary', array(
+      'name' => $this->randomName(),
+      'machine_name' => drupal_strtolower($this->randomName()),
+      'langcode' => LANGUAGE_NOT_SPECIFIED,
+      'nodes' => array('page' => 'Basic page'),
+    ));
+    taxonomy_vocabulary_save($vocabulary);
+
+    // Create an array of entity types to test the hook on. The keys are the
+    // names of the entities and values are an array containing the page where
+    // an entity of this type can be created and the name of the submit button.
+    $entity_types = array(
+      'test_entity' => array('test-entity/add/test-bundle', t('Save')),
+      'node' => array('node/add/page', t('Save')),
+      'comment' => array('comment/reply/' . $node->nid, t('Save')),
+      'taxonomy_term' => array('admin/structure/taxonomy/' . $vocabulary->machine_name . '/add', t('Save')),
+      'user' => array('admin/people/create', t('Create new account')),
+    );
+
+    $web_user = $this->drupalCreateUser(array(
+      'access field_test content',
+      'administer field_test content',
+      'create page content',
+      'post comments',
+      'administer taxonomy',
+      'administer users',
+    ));
+    $this->drupalLogin($web_user);
+
+    foreach ($entity_types as $entity_type => $entity_create_page) {
+      list($entity_add_path, $button) = $entity_create_page;
+      // Since the hook being tested runs on validation, the form can be left
+      // blank and the hook will still run.
+      $this->drupalPost($entity_add_path, array(), $button);
+      // The field_test module uses drupal_set_message() to indicate that the
+      // hook has run and to indicate that the $entity->orginial value is set.
+      $this->assertText(format_string('hook_field_attach_validate() runs for !entity_type', array('!entity_type' => $entity_type)));
+      $this->assertNoText(format_string('Orginial entity missing in hook_field_attach_validate() for !entity_type', array('!entity_type' => $entity_type)));
+    }
+  }
+}
+
 class FieldInfoTestCase extends FieldTestCase {
 
   public static function getInfo() {
diff --git a/core/modules/field/tests/field_test.module b/core/modules/field/tests/field_test.module
index 75823c6..2f361ad 100644
--- a/core/modules/field/tests/field_test.module
+++ b/core/modules/field/tests/field_test.module
@@ -261,3 +261,14 @@ function field_test_field_widget_form_alter(&$element, &$form_state, $context) {
       break;
   }
 }
+
+/**
+ * Implements hook_field_attach_validate().
+ */
+function field_test_field_attach_validate($entity_type, $entity, &$errors) {
+
+  drupal_set_message(format_string('hook_field_attach_validate() runs for !entity_type', array('!entity_type' => $entity_type)));
+  if (!isset($entity->original)) {
+    drupal_set_message(format_string('Orginial entity missing in hook_field_attach_validate() for !entity_type', array('!entity_type' => $entity_type)));
+  }
+}
