diff --git a/core/includes/entity.api.php b/core/includes/entity.api.php
index 3d2a56a..9b34085 100644
--- a/core/includes/entity.api.php
+++ b/core/includes/entity.api.php
@@ -538,6 +538,24 @@ function hook_entity_field_info_alter(&$info, $entity_type) {
 }
 
 /**
+ * Alter entity operations.
+ *
+ * @param array $operations
+ *   Operations array as returned by
+ *   \Drupal\Core\Entity\EntityStorageControllerInterface::getOperations().
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ *   The entity on which the linked operations will be performed.
+ */
+function hook_entity_operation_alter(array &$operations, \Drupal\Core\Entity\EntityInterface $entity) {
+  $uri = $entity->uri();
+  $operations['translate'] = array(
+    'title' => t('Translate'),
+    'href' => $uri['path'] . '/translate',
+    'weight' => 50,
+  );
+}
+
+/**
  * Control access to fields.
  *
  * This hook is invoked from \Drupal\Core\Entity\Field\Type\Field::access() to
diff --git a/core/lib/Drupal/Core/Entity/EntityListController.php b/core/lib/Drupal/Core/Entity/EntityListController.php
index 354b27a..b5a5f9c 100644
--- a/core/lib/Drupal/Core/Entity/EntityListController.php
+++ b/core/lib/Drupal/Core/Entity/EntityListController.php
@@ -7,10 +7,13 @@
 
 namespace Drupal\Core\Entity;
 
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
 /**
  * Provides a generic implementation of an entity list controller.
  */
-class EntityListController implements EntityListControllerInterface {
+class EntityListController implements EntityListControllerInterface, EntityControllerInterface {
 
   /**
    * The entity storage controller class.
@@ -20,6 +23,13 @@ class EntityListController implements EntityListControllerInterface {
   protected $storage;
 
   /**
+   * The module handler to invoke hooks on.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
    * The entity type name.
    *
    * @var string
@@ -36,17 +46,34 @@ class EntityListController implements EntityListControllerInterface {
   protected $entityInfo;
 
   /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) {
+    return new static(
+      $entity_type,
+      $entity_info,
+      $container->get('plugin.manager.entity')->getStorageController($entity_type),
+      $container->get('module_handler')
+    );
+  }
+
+  /**
    * Constructs a new EntityListController object.
    *
-   * @param string $entity_type.
+   * @param string $entity_type
    *   The type of entity to be listed.
-   * @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage.
+   * @param array $entity_info
+   *   An array of entity info for the entity type.
+   * @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage
    *   The entity storage controller class.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler to invoke hooks on.
    */
-  public function __construct($entity_type, EntityStorageControllerInterface $storage) {
+  public function __construct($entity_type, array $entity_info, EntityStorageControllerInterface $storage, ModuleHandlerInterface $module_handler) {
     $this->entityType = $entity_type;
     $this->storage = $storage;
-    $this->entityInfo = entity_get_info($this->entityType);
+    $this->entityInfo = $entity_info;
+    $this->moduleHandler = $module_handler;
   }
 
   /**
@@ -131,6 +158,7 @@ public function buildRow(EntityInterface $entity) {
   public function buildOperations(EntityInterface $entity) {
     // Retrieve and sort operations.
     $operations = $this->getOperations($entity);
+    $this->moduleHandler->alter('entity_operation', $operations, $entity);
     uasort($operations, 'drupal_sort_weight');
     $build = array(
       '#type' => 'operations',
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityOperationsTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityOperationsTest.php
new file mode 100644
index 0000000..a9c5319
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityOperationsTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Entity\EntityOperationsTest.
+ */
+
+namespace Drupal\system\Tests\Entity;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests for entity operations.
+ */
+class EntityOperationsTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('entity_test');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity Operations',
+      'description' => 'Check that operations can be injected from the hook.',
+      'group' => 'Entity API',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp();
+
+    // Create and login user.
+    $this->web_user = $this->drupalCreateUser(array(
+      'administer permissions',
+    ));
+    $this->drupalLogin($this->web_user);
+  }
+
+  /**
+   * Check hook_entity_operation_alter hook is executed.
+   */
+  public function testEntityOperationAlter() {
+    // Check that role listing contain our test_operation operation.
+    $this->drupalGet('admin/people/roles');
+    $roles = user_roles();
+    foreach ($roles as $role) {
+      $uri = $role->uri();
+      $this->assertLinkByHref($uri['path'] . '/test_operation');
+      $this->assertLink('Test Operation: ' . $role->label());
+    }
+  }
+}
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module
index 3ba9e09..4a39f90 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -381,7 +381,7 @@ function entity_test_entity_form_display_alter(EntityFormDisplay $form_display,
 }
 
 /**
- * Implements hook_entity_presave()
+ * Implements hook_entity_presave().
  */
 function entity_test_entity_presave(EntityInterface $entity) {
   if (isset($GLOBALS['entity_test_throw_exception'])) {
@@ -390,10 +390,22 @@ function entity_test_entity_presave(EntityInterface $entity) {
 }
 
 /**
- * Implements hook_entity_predelete()
+ * Implements hook_entity_predelete().
  */
 function entity_test_entity_predelete(EntityInterface $entity) {
   if (isset($GLOBALS['entity_test_throw_exception'])) {
     throw new Exception('Entity predelete exception', 2);
   }
 }
+
+/**
+ * Implements hook_entity_operation_alter().
+ */
+function entity_test_entity_operation_alter(array &$operations, EntityInterface $entity) {
+  $uri = $entity->uri();
+  $operations['test_operation'] = array(
+    'title' => 'Test Operation: ' . $entity->label(),
+    'href' => $uri['path'] . '/test_operation',
+    'weight' => 50,
+  );
+}
\ No newline at end of file
