diff --git a/entity_translation.admin.inc b/entity_translation.admin.inc
index 3bdf410..99df4ec 100644
--- a/entity_translation.admin.inc
+++ b/entity_translation.admin.inc
@@ -215,7 +215,7 @@ function entity_translation_overview($entity_type, $entity, $callback = NULL) {
     return entity_translation_overview_callback($callback, $entity);
   }
 
-  $handler = entity_translation_get_handler($entity_type, $entity);
+  $handler = EntityTranslationHandlerFactory::getInstance()->getCurrentRevisionHandler($entity_type, $entity);
   // Ensure $entity holds an entity object and not an id.
   $entity = $handler->getEntity();
   $handler->initPathScheme();
@@ -408,7 +408,7 @@ function theme_entity_translation_overview_outdated($variables){
  * Translation deletion confirmation form.
  */
 function entity_translation_delete_confirm($form, $form_state, $entity_type, $entity, $langcode) {
-  $handler = entity_translation_get_handler($entity_type, $entity);
+  $handler = EntityTranslationHandlerFactory::getInstance()->getCurrentRevisionHandler($entity_type, $entity);
   $handler->setFormLanguage($langcode);
   $languages = language_list();
 
diff --git a/entity_translation.module b/entity_translation.module
index f7ca0ab..490c168 100644
--- a/entity_translation.module
+++ b/entity_translation.module
@@ -537,7 +537,8 @@ function entity_translation_edit_page() {
   $edit_form_item = array_shift($args);
 
   // Set the current form language.
-  $handler = entity_translation_get_handler($entity_type, $entity);
+  $handler = EntityTranslationHandlerFactory::getInstance()->getCurrentRevisionHandler($entity_type, $entity);
+  $entity = $handler->getEntity();
   $handler->initPathScheme();
   $langcode = entity_translation_get_existing_language($entity_type, $entity, $langcode);
   $handler->setFormLanguage($langcode);
@@ -681,7 +682,7 @@ function entity_translation_add_page() {
   $langcode = array_shift($args);
   $edit_form_item = array_shift($args);
 
-  $handler = entity_translation_get_handler($entity_type, $entity);
+  $handler = EntityTranslationHandlerFactory::getInstance()->getCurrentRevisionHandler($entity_type, $entity);
   $handler->initPathScheme();
   $handler->setFormLanguage($langcode);
   $handler->setSourceLanguage($source);
@@ -1563,7 +1564,10 @@ function entity_translation_field_attach_submit($entity_type, $entity, $form, &$
 function entity_translation_menu_local_tasks_alter(&$data, $router_item, $root_path) {
   // When displaying the main edit form, we need to craft an additional level of
   // local tasks for each available translation.
-  $handler = entity_translation_get_handler();
+  $factory = EntityTranslationHandlerFactory::getInstance();
+  if ($last_handler = $factory->getLastHandler()) {
+    $handler = $factory->getCurrentRevisionHandler($last_handler->getEntityType(), $last_handler->getEntity());
+  }
   if (!empty($handler) && $handler->isEntityForm() && $handler->getLanguage() != LANGUAGE_NONE && drupal_multilingual()) {
     $handler->localTasksAlter($data, $router_item, $root_path);
   }
@@ -1798,7 +1802,8 @@ function entity_translation_settings($entity_type, $bundle) {
  *   A valid language code.
  */
 function entity_translation_language($entity_type, $entity) {
-  $handler = entity_translation_get_handler($entity_type, $entity);
+  $handler = EntityTranslationHandlerFactory::getInstance()->getCurrentRevisionHandler($entity_type, $entity);
+
   $langcode = $handler->getFormLanguage();
   return !empty($langcode) ? $langcode : $handler->getLanguage();
 }
diff --git a/includes/translation.handler.inc b/includes/translation.handler.inc
index c2d205a..66b818c 100644
--- a/includes/translation.handler.inc
+++ b/includes/translation.handler.inc
@@ -156,15 +156,23 @@ interface EntityTranslationHandlerInterface {
   /**
    * Returns the wrapped entity.
    *
-   * @param return
+   * @return object
    *   The wrapped entity.
    */
   public function getEntity();
 
   /**
+   * Returns the current revision for entity types supporting forward revisions.
+   *
+   * @return object
+   *   The current revision of the wrapped entity.
+   */
+  public function getCurrentEntityRevision();
+
+  /**
    * Returns the wrapped entity type.
    *
-   * @param return
+   * @return string
    *   The wrapped entity type.
    */
   public function getEntityType();
@@ -409,7 +417,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
   /**
    * Read the translation data from the storage.
    */
-  public static function loadMultiple($entity_type, $entities) {
+  public static function loadMultiple($entity_type, $entities, $reset = FALSE) {
     $entity_info = entity_get_info($entity_type);
     if (isset($entity_info['entity keys']['translations'])){
       $translations_key = $entity_info['entity keys']['translations'];
@@ -422,34 +430,66 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
     $revisionable = self::isEntityTypeRevisionable($entity_type);
     $revisions_ids = array();
     foreach ($entities as $id => $entity) {
-      $entities[$id]->{$translations_key} = self::emptyTranslations();
+      // Set empty values only if explicitly requested of if translations were
+      // not loaded yet.
+      if ($reset || !isset($entity->{$translations_key})) {
+        $entities[$id]->{$translations_key} = self::emptyTranslations();
+      }
+      else {
+        unset($entities[$id]);
+      }
       if ($revisionable) {
         list(, $revisions_id,) = entity_extract_ids($entity_type, $entity);
         $revisions_ids[$id] = $revisions_id;
       }
     }
 
-    $table = $revisionable ? 'entity_translation_revision' : 'entity_translation';
-    $query = db_select($table, 'et')
-      ->fields('et')
-      ->condition('entity_type', $entity_type);
+    if ($entities) {
+      $table = $revisionable ? 'entity_translation_revision' : 'entity_translation';
+      $query = db_select($table, 'et')
+        ->fields('et')
+        ->condition('entity_type', $entity_type);
 
-    if (!$revisionable) {
-      $query->condition('entity_id', array_keys($entities), 'IN');
-    }
-    else {
-      $query->condition('revision_id', $revisions_ids, 'IN');
-    }
+      if (!$revisionable) {
+        $query->condition('entity_id', array_keys($entities), 'IN');
+      }
+      else {
+        $query->condition('revision_id', $revisions_ids, 'IN');
+      }
 
-    $results = $query->execute();
+      if ($revisionable) {
+        $revisions_ids = array();
+        foreach ($entities as $id => $entity) {
+          list(, $revisions_id,) = entity_extract_ids($entity_type, $entity);
+          $revisions_ids[$id] = $revisions_id;
+        }
+        $table = 'entity_translation_revision';
+      }
 
-    foreach ($results as $row) {
-      $id = $row->entity_id;
-      $entities[$id]->{$translations_key}->data[$row->language] = (array) $row;
+      $query = db_select($table, 'et')
+        ->fields('et')
+        ->condition('entity_type', $entity_type);
 
-      // Only the original translation has an empty source.
-      if (empty($row->source)) {
-        $entities[$id]->{$translations_key}->original = $row->language;
+      if (!$revisionable) {
+        $query->condition('entity_id', array_keys($entities), 'IN');
+      }
+      else {
+        $query->condition('revision_id', $revisions_ids, 'IN');
+      }
+
+      $results = $query
+        ->orderBy('entity_id')
+        ->orderBy('created')
+        ->execute();
+
+      foreach ($results as $row) {
+        $id = $row->entity_id;
+        $entities[$id]->{$translations_key}->data[$row->language] = (array) $row;
+
+        // Only the original translation has an empty source.
+        if (empty($row->source)) {
+          $entities[$id]->{$translations_key}->original = $row->language;
+        }
       }
     }
   }
@@ -908,10 +948,14 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
   public function setEntity($entity) {
     $this->entity = $entity;
 
+    // Update entity properties.
+    list($this->entityId, $this->revisionId, $this->bundle) = entity_extract_ids($this->entityType, $this->entity);
+
     // Ensure translations data is populated.
     $translations_key = $this->getTranslationsKey();
     if ($translations_key && !isset($this->entity->{$translations_key})) {
-      $this->entity->{$translations_key} = self::emptyTranslations();
+      // Creates the translations key on the entity object.
+      $this->getTranslations();
     }
 
     // Update entity properties.
@@ -931,6 +975,18 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
   }
 
   /**
+   * @see EntityTranslationHandlerInterface::getCurrentEntityRevision()
+   */
+  public function getCurrentEntityRevision() {
+    // State flow and Workbench Moderation 2.x integration.
+    if (!empty($this->entityInfo['state_flow_entity']) && module_exists('state_flow') && function_exists('state_flow_entity_get_active_revision')) {
+      return state_flow_entity_get_active_revision($this->getEntity(), $this->getEntityType());
+    }
+    $entities = entity_load($this->entityType, array($this->entityId));
+    return reset($entities);
+  }
+
+  /**
    * @see EntityTranslationHandlerInterface::getEntityType()
    */
   public function getEntityType() {
diff --git a/includes/translation.handler.node.inc b/includes/translation.handler.node.inc
index d967ada..1fc0f84 100644
--- a/includes/translation.handler.node.inc
+++ b/includes/translation.handler.node.inc
@@ -25,6 +25,20 @@ class EntityTranslationNodeHandler extends EntityTranslationDefaultHandler {
   }
 
   /**
+   * @see EntityTranslationHandlerInterface::getCurrentEntityRevision()
+   */
+  public function getCurrentEntityRevision() {
+    // Workbench moderation integration -> 1.x.
+    if (module_exists('workbench_moderation') && function_exists('workbench_moderation_node_current_load')) {
+      return workbench_moderation_node_current_load($this->getEntity());
+    }
+    if (module_exists('revisioning')) {
+      return node_load($this->getEntity()->nid, revisioning_get_latest_revision_id($this->getEntity()->nid));
+    }
+    return parent::getCurrentEntityRevision();
+  }
+
+  /**
    * @see EntityTranslationDefaultHandler::getAccess()
    */
   public function getAccess($op) {
@@ -76,7 +90,7 @@ class EntityTranslationNodeHandler extends EntityTranslationDefaultHandler {
   /**
    * @see EntityTranslationDefaultHandler::entityFormLanguageWidgetSubmit()
    */
-  function entityFormLanguageWidgetSubmit($form, &$form_state) {
+  public function entityFormLanguageWidgetSubmit($form, &$form_state) {
     $this->updateFormLanguage($form_state);
   }
 
diff --git a/includes/translation.handler_factory.inc b/includes/translation.handler_factory.inc
index b3819c2..599c10a 100644
--- a/includes/translation.handler_factory.inc
+++ b/includes/translation.handler_factory.inc
@@ -109,6 +109,9 @@ class EntityTranslationHandlerFactory {
    *   The type of the entity the translation handler will wrap.
    * @param $entity
    *   The entity the translation handler will wrap.
+   *
+   * @return EntityTranslationHandlerInterface
+   *   A class implementing EntityTranslationHandlerInterface.
    */
   public function getHandlerId($entity_type, $entity) {
     if (!isset($entity->entity_translation_handler_id)) {
@@ -137,4 +140,24 @@ class EntityTranslationHandlerFactory {
     return $this->last;
   }
 
+  /**
+   * Returns a translation handler for the current revision of the entity.
+   *
+   * @param $entity_type
+   *   The type of the entity the translation handler will wrap.
+   * @param $entity
+   *   The entity whose current revision the translation handler will wrap.
+   *
+   *  @return EntityTranslationHandlerInterface
+   *   A class implementing EntityTranslationHandlerInterface.
+   */
+  public function getCurrentRevisionHandler($entity_type, $entity) {
+    $handler = $this->getHandler($entity_type, $entity);
+    if (!$handler->isNewEntity()) {
+      $revision = $handler->getCurrentEntityRevision();
+      $handler = $this->getHandler($entity_type, $revision);
+    }
+    return $handler;
+  }
+
 }
