diff --git a/includes/entity.inc b/includes/entity.inc
index e50cf6fb3fe669be94ccc4aefd5638848f47ed73..ba9175d9a0e44f6663d52f3212bdef32aa3f6eac 100644
--- a/includes/entity.inc
+++ b/includes/entity.inc
@@ -223,8 +223,9 @@ protected function buildQuery() {
   /**
    * Attach data to entities upon loading.
    *
-   * This will attach fields, if the entity is fieldable. It also calls
-   * hook_TYPE_load() on the loaded entities. For example
+   * This will attach fields, if the entity is fieldable. It calls
+   * hook_entity_load() for modules which need to add data to all entities.
+   * It also calls hook_TYPE_load() on the loaded entities. For example
    * hook_node_load() or hook_user_load(). If your hook_TYPE_load()
    * expects special parameters apart from the queried entities, you can set
    * $this->hookLoadArguments prior to calling the method.
@@ -241,6 +242,11 @@ protected function attachLoad(&$queried_entities) {
       }
     }
 
+    // Call hook_entity_load().
+    foreach (module_implements('entity_load') as $module) {
+      $function = $module . '_entity_load';
+      $function($queried_entities, $this->entityType);
+    }
     // Call hook_TYPE_load(). The first argument for hook_TYPE_load() are
     // always the queried entities, followed by additional arguments set in
     // $this->hookLoadArguments.
diff --git a/modules/field/field.test b/modules/field/field.test
index 86983e35bfe7ef45fc6e7d7b5219d6cada96ef62..49f763bfa70bce1976d34d9d657381ec0e916371 100644
--- a/modules/field/field.test
+++ b/modules/field/field.test
@@ -1373,7 +1373,7 @@ class FieldFormTestCase extends FieldTestCase {
     preg_match('|test-entity/(\d+)/edit|', $this->url, $match);
     $id = $match[1];
     $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');
-    $entity = field_test_entity_load($id);
+    $entity = field_test_entity_test_load($id);
     $this->assertEqual($entity->{$this->field_name}[$langcode][0]['value'], $value, 'Field value was saved');
 
     // Display edit form.
@@ -1386,7 +1386,7 @@ class FieldFormTestCase extends FieldTestCase {
     $edit = array("{$this->field_name}[$langcode][0][value]" => $value);
     $this->drupalPost(NULL, $edit, t('Save'));
     $this->assertRaw(t('test_entity @id has been updated.', array('@id' => $id)), 'Entity was updated');
-    $entity = field_test_entity_load($id);
+    $entity = field_test_entity_test_load($id);
     $this->assertEqual($entity->{$this->field_name}[$langcode][0]['value'], $value, 'Field value was updated');
 
     // Empty the field.
@@ -1394,7 +1394,7 @@ class FieldFormTestCase extends FieldTestCase {
     $edit = array("{$this->field_name}[$langcode][0][value]" => $value);
     $this->drupalPost('test-entity/' . $id . '/edit', $edit, t('Save'));
     $this->assertRaw(t('test_entity @id has been updated.', array('@id' => $id)), 'Entity was updated');
-    $entity = field_test_entity_load($id);
+    $entity = field_test_entity_test_load($id);
     $this->assertIdentical($entity->{$this->field_name}, array(), 'Field was emptied');
 
   }
@@ -1420,7 +1420,7 @@ class FieldFormTestCase extends FieldTestCase {
     preg_match('|test-entity/(\d+)/edit|', $this->url, $match);
     $id = $match[1];
     $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');
-    $entity = field_test_entity_load($id);
+    $entity = field_test_entity_test_load($id);
     $this->assertEqual($entity->{$this->field_name}[$langcode][0]['value'], $value, 'Field value was saved');
 
     // Edit with missing required value.
@@ -1500,7 +1500,7 @@ class FieldFormTestCase extends FieldTestCase {
     preg_match('|test-entity/(\d+)/edit|', $this->url, $match);
     $id = $match[1];
     $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');
-    $entity = field_test_entity_load($id);
+    $entity = field_test_entity_test_load($id);
     ksort($field_values);
     $field_values = array_values($field_values);
     $this->assertIdentical($entity->{$this->field_name}[$langcode], $field_values, 'Field values were saved in the correct order');
diff --git a/modules/field/modules/text/text.test b/modules/field/modules/text/text.test
index b4cc4dfefabba65d24ba1794dd3986e1c9eeff22..2f903e201e229511d6bb1e5914570a92ee6b2660 100644
--- a/modules/field/modules/text/text.test
+++ b/modules/field/modules/text/text.test
@@ -115,7 +115,7 @@ class TextFieldTestCase extends DrupalWebTestCase {
     $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), t('Entity was created'));
 
     // Display the object.
-    $entity = field_test_entity_load($id);
+    $entity = field_test_entity_test_load($id);
     $entity->content = field_attach_view($entity_type, $entity);
     $this->content = drupal_render($entity->content);
     $this->assertText($value, 'Filtered tags are not displayed');
@@ -179,7 +179,7 @@ class TextFieldTestCase extends DrupalWebTestCase {
     $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), t('Entity was created'));
 
     // Display the object.
-    $entity = field_test_entity_load($id);
+    $entity = field_test_entity_test_load($id);
     $entity->content = field_attach_view($entity_type, $entity);
     $this->content = drupal_render($entity->content);
     $this->assertNoRaw($value, t('HTML tags are not displayed.'));
@@ -212,7 +212,7 @@ class TextFieldTestCase extends DrupalWebTestCase {
     $this->assertRaw(t('test_entity @id has been updated.', array('@id' => $id)), t('Entity was updated'));
 
     // Display the object.
-    $entity = field_test_entity_load($id);
+    $entity = field_test_entity_test_load($id);
     $entity->content = field_attach_view($entity_type, $entity);
     $this->content = drupal_render($entity->content);
     $this->assertRaw($value, t('Value is displayed unfiltered'));
diff --git a/modules/simpletest/tests/field_test.module b/modules/simpletest/tests/field_test.module
index 8bb504389177489091a024723d122ad1d927456b..86a2751ea1298b1538a5babee007b6e2d97e40d0 100644
--- a/modules/simpletest/tests/field_test.module
+++ b/modules/simpletest/tests/field_test.module
@@ -38,7 +38,7 @@ function field_test_menu() {
       'type' => MENU_NORMAL_ITEM,
     );
   }
-  $items['test-entity/%field_test_entity/edit'] = array(
+  $items['test-entity/%field_test_entity_test/edit'] = array(
     'title' => 'Edit test entity',
     'page callback' => 'field_test_entity_edit',
     'page arguments' => array(1),
@@ -193,7 +193,7 @@ function field_test_create_stub_entity($id = 1, $vid = 1, $bundle = FIELD_TEST_B
   return $entity;
 }
 
-function field_test_entity_load($ftid, $ftvid = NULL) {
+function field_test_entity_test_load($ftid, $ftvid = NULL) {
   // Load basic strucure.
   $query = db_select('test_entity', 'fte', array())
     ->fields('fte')
diff --git a/modules/system/system.api.php b/modules/system/system.api.php
index d29a1603558fd046462df19f47b1da0ed8e01628..f6b9be1efe25fd484a2e01156b5bab76ea2c522a 100644
--- a/modules/system/system.api.php
+++ b/modules/system/system.api.php
@@ -149,6 +149,23 @@ function hook_entity_info_alter(&$entity_info) {
   $entity_info['node']['controller class'] = 'MyCustomNodeController';
 }
 
+/**
+ * Act on entities when loaded.
+ *
+ * This is a generic load hook called for all entity types loaded via the
+ * entity API.
+ *
+ * @param $entities
+ *   The entities keyed by entity ID.
+ * @param $type
+ *   The type of entities being loaded (i.e. node, user, comment).
+ */
+function hook_entity_load($entities, $type) {
+  foreach ($entities as $entity) {
+    $entity->foo = mymodule_add_something($entity, $entity_type);
+  }
+}
+
 /**
  * Perform periodic actions.
  *
diff --git a/modules/taxonomy/taxonomy.test b/modules/taxonomy/taxonomy.test
index 36fbcabec6d2baf5abc920b8fe5ceba1cc02132a..e7b41599cabff0227d900b52b3e7b7ade7ac918a 100644
--- a/modules/taxonomy/taxonomy.test
+++ b/modules/taxonomy/taxonomy.test
@@ -757,7 +757,7 @@ class TaxonomyTermFieldTestCase extends TaxonomyWebTestCase {
     $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), t('Entity was created'));
 
     // Display the object.
-    $entity = field_test_entity_load($id);
+    $entity = field_test_entity_test_load($id);
     $entities = array($id => $entity);
     field_attach_prepare_view($entity_type, $entities, 'full');
     $entity->content = field_attach_view($entity_type, $entity);