diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php
index 7dfb02e..ed1f0b3 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php
@@ -96,6 +96,36 @@ protected function getNewEntityValues($langcode) {
   }
 
   /**
+   * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::doTestPublishedStatus().
+   */
+  protected function doTestPublishedStatus() {
+    parent::doTestPublishedStatus();
+    $entity = entity_load($this->entityType, $this->entityId);
+    $user = $this->drupalCreateUser(array('access comments'));
+    $this->drupalLogin($user);
+
+    // Check that simple users cannot see unpublished field translations.
+    $path = $this->controller->getViewPath($entity);
+    foreach ($this->langcodes as $index => $langcode) {
+      if ($index > 0) {
+        $translation = $this->getTranslation($entity, $langcode);
+        $value = $this->getValue($translation, $this->fieldName, $langcode);
+        $prefix = $index > 0 ? $langcode . '/' : '';
+        $this->drupalGet($prefix . $path);
+        $this->assertNoRaw($value, 'Unpublished field translation is not shown.');
+      }
+    }
+
+    // Check that language fallback is applied.
+    $this->drupalGet($path);
+    $value = $this->getValue($entity, $this->fieldName, $this->langcodes[0]);
+    $this->assertRaw($value, 'Published field translation is shown.');
+
+    // Login as translator again to ensure subsequent tests do not break.
+    $this->drupalLogin($this->translator);
+  }
+
+  /**
    * Tests translate link on comment content admin page.
    */
   function testTranslateLinkCommentAdminPage() {
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
index 8cd5b49..cf300bc 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
@@ -56,7 +56,58 @@ protected function setupBundle() {
    * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::getTranslatorPermission().
    */
   function getTranslatorPermissions() {
-    return array("edit any $this->bundle content", "translate $this->entityType entities", 'edit original values');
+    return array('administer nodes', "edit any $this->bundle content", "translate $this->entityType entities", 'edit original values');
+  }
+
+  /**
+   * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::doTestPublishedStatus().
+   */
+  protected function doTestPublishedStatus() {
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
+    $path = $this->controller->getEditPath($entity);
+
+    // Unpublish the node and check that the trnalstions are unpublished
+    // accordingly.
+    foreach ($this->langcodes as $index => $langcode) {
+      $prefix = $index > 0 ? $langcode . '/' : '';
+      $edit = array('status' => FALSE);
+      $this->drupalPost($prefix . $path, $edit, t('Save'));
+    }
+
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
+    foreach ($this->langcodes as $index => $langcode) {
+      $this->assertFalse($entity->translation[$langcode]['status'], 'The translation has been correctly unpublished.');
+    }
+  }
+
+  /**
+   * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::doTestAuthoringInfo().
+   */
+  protected function doTestAuthoringInfo() {
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
+    $path = $this->controller->getEditPath($entity);
+    $values = array();
+
+    // Post different authoring information for each translation.
+    foreach ($this->langcodes as $index => $langcode) {
+      $user = $this->drupalCreateUser();
+      $values[$langcode] = array(
+        'uid' => $user->uid,
+        'created' => REQUEST_TIME - mt_rand(0, 1000),
+      );
+      $edit = array(
+        'name' => $user->name,
+        'date' => format_date($values[$langcode]['created'], 'custom', 'Y-m-d H:i:s O'),
+      );
+      $prefix = $index > 0 ? $langcode . '/' : '';
+      $this->drupalPost($prefix . $path, $edit, t('Save'));
+    }
+
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
+    foreach ($this->langcodes as $langcode) {
+      $this->assertEqual($entity->translation[$langcode]['uid'] == $values[$langcode]['uid'], 'Translation author correctly stored.');
+      $this->assertEqual($entity->translation[$langcode]['created'] == $values[$langcode]['created'], 'Translation date correctly stored.');
+    }
   }
 
   /**
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
index 1da373d..69be016 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
@@ -64,7 +64,7 @@ public function retranslate(EntityInterface $entity, $langcode = NULL) {
     $updated_langcode = !empty($langcode) ? $langcode : $entity->language()->langcode;
     $translations = $entity->getTranslationLanguages();
     foreach ($translations as $langcode => $language) {
-      $entity->translation[$langcode]['translate'] = $langcode != $updated_langcode;
+      $entity->translation[$langcode]['outdated'] = $langcode != $updated_langcode;
     }
   }
 
@@ -228,8 +228,8 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
       $status = $new_translation || $entity->translation[$form_langcode]['status'];
       // If there is only one published translation we cannot unpublish it,
       // since there would be nothing left to display.
-      $enabled = !$status;
-      if (!empty($status)) {
+      $enabled = TRUE;
+      if ($status) {
         // A new translation is not available in the translation metadata, hence
         // it should count as one more.
         $published = $new_translation;
@@ -250,7 +250,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
         '#disabled' => !$enabled,
       );
 
-      $translate = !$new_translation && $entity->translation[$form_langcode]['translate'];
+      $translate = !$new_translation && $entity->translation[$form_langcode]['outdated'];
       if (!$translate) {
         $form['translation_entity']['retranslate'] = array(
           '#type' => 'checkbox',
@@ -260,7 +260,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
         );
       }
       else {
-        $form['translation_entity']['translate'] = array(
+        $form['translation_entity']['outdated'] = array(
           '#type' => 'checkbox',
           '#title' => t('This translation needs to be updated'),
           '#default_value' => $translate,
@@ -417,7 +417,7 @@ public function entityFormEntityBuild($entity_type, EntityInterface $entity, arr
       $translation['source'] = $source_langcode;
     }
 
-    $translation['translate'] = !empty($values['translate']);
+    $translation['outdated'] = !empty($values['outdated']);
     if (!empty($values['retranslate'])) {
       $this->retranslate($entity, $form_langcode);
     }
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php
index ba1b462..36b0d95 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php
@@ -27,6 +27,13 @@
   protected $langcodes;
 
   /**
+   * The translator account to use for the tests.
+   *
+   * @var \Drupal\user\Plugin\Core\Entity\User
+   */
+  protected $translator;
+
+  /**
    * The entity type being tested.
    *
    * @var string
@@ -41,6 +48,20 @@
   protected $bundle;
 
   /**
+   * The id of the entity being translated.
+   *
+   * @var mixed
+   */
+  protected $entityId;
+
+  /**
+   * The translation controller for the current entity type.
+   *
+   * @var \Drupal\translation_entity\EntityTranslationControllerInterface
+   */
+  protected $controller;
+
+  /**
    * The name of the field used to test translation.
    *
    * @var string
@@ -66,6 +87,8 @@ function setUp() {
     $this->enableTranslation();
     $this->setupTranslator();
     $this->setupTestFields();
+
+    $this->controller = translation_entity_controller($this->entityType);
   }
 
   /**
@@ -109,8 +132,8 @@ protected function enableTranslation() {
    * Creates and activates a translator user.
    */
   protected function setupTranslator() {
-    $translator = $this->drupalCreateUser($this->getTranslatorPermissions());
-    $this->drupalLogin($translator);
+    $this->translator = $this->drupalCreateUser($this->getTranslatorPermissions());
+    $this->drupalLogin($this->translator);
   }
 
   /**
@@ -144,11 +167,22 @@ protected function setupTestFields() {
    * Tests the basic translation UI.
    */
   function testTranslationUI() {
+    $this->doTestBasicTranslation();
+    $this->doTestOutdatedStatus();
+    $this->doTestPublishedStatus();
+    $this->doTestAuthoringInfo();
+    $this->doTestTranslationDeletion();
+  }
+
+  /**
+   * Tests the basic translation workflow.
+   */
+  protected function doTestBasicTranslation() {
     // Create a new test entity with original values in the default language.
     $default_langcode = $this->langcodes[0];
     $values[$default_langcode] = $this->getNewEntityValues($default_langcode);
-    $id = $this->createEntity($values[$default_langcode], $default_langcode);
-    $entity = entity_load($this->entityType, $id, TRUE);
+    $this->entityId = $this->createEntity($values[$default_langcode], $default_langcode);
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
     $this->assertTrue($entity, t('Entity found in the database.'));
 
     $translation = $this->getTranslation($entity, $default_langcode);
@@ -163,14 +197,13 @@ function testTranslationUI() {
     $langcode = 'it';
     $values[$langcode] = $this->getNewEntityValues($langcode);
 
-    $controller = translation_entity_controller($this->entityType);
-    $base_path = $controller->getBasePath($entity);
+    $base_path = $this->controller->getBasePath($entity);
     $path = $langcode . '/' . $base_path . '/translations/add/' . $default_langcode . '/' . $langcode;
     $this->drupalPost($path, $this->getEditValues($values, $langcode), t('Save'));
     if ($this->testLanguageSelector) {
       $this->assertNoFieldByXPath('//select[@id="edit-langcode"]', NULL, 'Language selector correclty disabled on translations.');
     }
-    $entity = entity_load($this->entityType, $entity->id(), TRUE);
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
 
     // Switch the source language.
     $langcode = 'fr';
@@ -180,11 +213,11 @@ function testTranslationUI() {
     $this->drupalPost($path, $edit, t('Change'));
     $this->assertFieldByXPath("//input[@name=\"{$this->fieldName}[fr][0][value]\"]", $values[$source_langcode][$this->fieldName][0]['value'], 'Source language correctly switched.');
 
-    // Add another translation and mark the other ones as outdated.
+    // Add another translation.
     $values[$langcode] = $this->getNewEntityValues($langcode);
-    $edit = $this->getEditValues($values, $langcode) + array('translation_entity[retranslate]' => TRUE);
+    $edit = $this->getEditValues($values, $langcode);
     $this->drupalPost($path, $edit, t('Save'));
-    $entity = entity_load($this->entityType, $entity->id(), TRUE);
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
 
     // Check that the entered values have been correctly stored.
     foreach ($values as $langcode => $property_values) {
@@ -196,32 +229,117 @@ function testTranslationUI() {
         $this->assertEqual($stored_value, $value, $message);
       }
     }
+  }
+
+  /**
+   * Tests up-to-date status tracking.
+   */
+  protected function doTestOutdatedStatus() {
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
+    $langcode = 'fr';
+    $default_langcode = $this->langcodes[0];
+
+    // Mark translations as outdated.
+    $edit = array('translation_entity[retranslate]' => TRUE);
+    $this->drupalPost($langcode . '/' . $this->controller->getEditPath($entity), $edit, t('Save'));
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
 
     // Check that every translation has the correct "outdated" status.
     foreach ($this->langcodes as $enabled_langcode) {
       $prefix = $enabled_langcode != $default_langcode ? $enabled_langcode . '/' : '';
-      $path = $prefix . $controller->getEditPath($entity);
+      $path = $prefix . $this->controller->getEditPath($entity);
       $this->drupalGet($path);
       if ($enabled_langcode == $langcode) {
         $this->assertFieldByXPath('//input[@name="translation_entity[retranslate]"]', FALSE, 'The retranslate flag is not checked by default.');
       }
       else {
-        $this->assertFieldByXPath('//input[@name="translation_entity[translate]"]', TRUE, 'The translate flag is checked by default.');
-        $edit = array('translation_entity[translate]' => FALSE);
+        $this->assertFieldByXPath('//input[@name="translation_entity[outdated]"]', TRUE, 'The translate flag is checked by default.');
+        $edit = array('translation_entity[outdated]' => FALSE);
         $this->drupalPost($path, $edit, t('Save'));
         $this->drupalGet($path);
         $this->assertFieldByXPath('//input[@name="translation_entity[retranslate]"]', FALSE, 'The retranslate flag is now shown.');
-        $entity = entity_load($this->entityType, $entity->id(), TRUE);
-        $this->assertFalse($entity->translation[$enabled_langcode]['translate'], 'The "outdated" status has been correctly stored.');
+        $entity = entity_load($this->entityType, $this->entityId, TRUE);
+        $this->assertFalse($entity->translation[$enabled_langcode]['outdated'], 'The "outdated" status has been correctly stored.');
+      }
+    }
+  }
+
+  /**
+   * Tests the translation publishing status.
+   */
+  protected function doTestPublishedStatus() {
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
+    $path = $this->controller->getEditPath($entity);
+
+    // Unpublish translations.
+    foreach ($this->langcodes as $index => $langcode) {
+      if ($index > 0) {
+        $edit = array('translation_entity[status]' => FALSE);
+        $this->drupalPost($langcode . '/' . $path, $edit, t('Save'));
+        $entity = entity_load($this->entityType, $this->entityId, TRUE);
+        $this->assertFalse($entity->translation[$langcode]['status'], 'The translation has been correctly unpublished.');
       }
     }
 
+    // Check that the last published translation cannot be unpublished.
+    $this->drupalGet($path);
+    $this->assertFieldByXPath('//input[@name="translation_entity[status]" and @disabled="disabled"]', TRUE, 'The last translation is published and cannot be unpublished.');
+  }
+
+  /**
+   * Tests the translation authoring information.
+   */
+  protected function doTestAuthoringInfo() {
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
+    $path = $this->controller->getEditPath($entity);
+    $values = array();
+
+    // Post different authoring information for each translation.
+    foreach ($this->langcodes as $index => $langcode) {
+      $user = $this->drupalCreateUser();
+      $values[$langcode] = array(
+        'uid' => $user->uid,
+        'created' => REQUEST_TIME - mt_rand(0, 1000),
+      );
+      $edit = array(
+        'translation_entity[name]' => $user->name,
+        'translation_entity[created]' => format_date($values[$langcode]['created'], 'custom', 'Y-m-d H:i:s O'),
+      );
+      $prefix = $index > 0 ? $langcode . '/' : '';
+      $this->drupalPost($prefix . $path, $edit, t('Save'));
+    }
+
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
+    foreach ($this->langcodes as $langcode) {
+      $this->assertEqual($entity->translation[$langcode]['uid'] == $values[$langcode]['uid'], 'Translation author correctly stored.');
+      $this->assertEqual($entity->translation[$langcode]['created'] == $values[$langcode]['created'], 'Translation date correctly stored.');
+    }
+
+    // Try to post non valid values and check that they are rejected.
+    $langcode = 'en';
+    $edit = array(
+      // User names have by default length 8.
+      'translation_entity[name]' => $this->randomName(12),
+      'translation_entity[created]' => $this->randomName(),
+    );
+    $this->drupalPost($path, $edit, t('Save'));
+    $this->assertTrue($this->xpath('//div[@id="messages"]//div[contains(@class, "error")]//ul'), 'Invalid values generate a list of form errors.');
+    $this->assertEqual($entity->translation[$langcode]['uid'] == $values[$langcode]['uid'], 'Translation author correctly kept.');
+    $this->assertEqual($entity->translation[$langcode]['created'] == $values[$langcode]['created'], 'Translation date correctly kept.');
+  }
+
+  /**
+   * Tests translation deletion.
+   */
+  protected function doTestTranslationDeletion() {
     // Confirm and delete a translation.
-    $this->drupalPost($path, array(), t('Delete translation'));
+    $langcode = 'fr';
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
+    $this->drupalPost($langcode . '/' . $this->controller->getEditPath($entity), array(), t('Delete translation'));
     $this->drupalPost(NULL, array(), t('Delete'));
-    $entity = entity_load($this->entityType, $entity->id(), TRUE);
+    $entity = entity_load($this->entityType, $this->entityId, TRUE);
     $translations = $entity->getTranslationLanguages();
-    $this->assertTrue(count($translations) == 2 && empty($translations[$enabled_langcode]), 'Translation successfully deleted.');
+    $this->assertTrue(count($translations) == 2 && empty($translations[$langcode]), 'Translation successfully deleted.');
   }
 
   /**
diff --git a/core/modules/translation_entity/translation_entity.install b/core/modules/translation_entity/translation_entity.install
index 9562d19..d850c07 100644
--- a/core/modules/translation_entity/translation_entity.install
+++ b/core/modules/translation_entity/translation_entity.install
@@ -40,7 +40,7 @@ function translation_entity_schema() {
         'default' => '',
         'description' => 'The source language from which this translation was created.',
       ),
-      'translate' => array(
+      'outdated' => array(
         'description' => 'A boolean indicating whether this translation needs to be updated.',
         'type' => 'int',
         'not null' => TRUE,
diff --git a/core/modules/translation_entity/translation_entity.module b/core/modules/translation_entity/translation_entity.module
index b50686f..1963b15 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -553,7 +553,7 @@ function translation_entity_entity_insert(EntityInterface $entity) {
     return;
   }
 
-  $fields = array('entity_type', 'entity_id', 'langcode', 'source', 'translate', 'uid', 'status', 'created', 'changed');
+  $fields = array('entity_type', 'entity_id', 'langcode', 'source', 'outdated', 'uid', 'status', 'created', 'changed');
   $query = db_insert('translation_entity')->fields($fields);
 
   foreach ($entity->getTranslationLanguages() as $langcode => $language) {
@@ -562,7 +562,7 @@ function translation_entity_entity_insert(EntityInterface $entity) {
     $translation += array(
       'source' => '',
       'uid' => $GLOBALS['user']->uid,
-      'translate' => FALSE,
+      'outdated' => FALSE,
       'status' => TRUE,
       'created' => REQUEST_TIME,
       'changed' => REQUEST_TIME,
diff --git a/core/modules/translation_entity/translation_entity.pages.inc b/core/modules/translation_entity/translation_entity.pages.inc
index 6bca6d5..bc67e44 100644
--- a/core/modules/translation_entity/translation_entity.pages.inc
+++ b/core/modules/translation_entity/translation_entity.pages.inc
@@ -88,7 +88,7 @@ function translation_entity_overview(EntityInterface $entity) {
         $translation = $entity->translation[$langcode];
         $status = !empty($translation['status']) ? t('Published') : t('Not published');
         // @todo Add a theming function here.
-        $status = '<span class="status">' . $status . '</span>' . (!empty($translation['translate']) ? ' <span class="marker">' . t('outdated') . '</span>' : '');
+        $status = '<span class="status">' . $status . '</span>' . (!empty($translation['outdated']) ? ' <span class="marker">' . t('outdated') . '</span>' : '');
 
         if ($is_original) {
           $language_name = t('<strong>@language_name</strong>', array('@language_name' => $language_name));
