diff --git a/core/includes/entity.api.php b/core/includes/entity.api.php
index fb74eaa..aa3f19f 100644
--- a/core/includes/entity.api.php
+++ b/core/includes/entity.api.php
@@ -141,17 +141,17 @@
  *       by default (e.g. right after the module exposing the view mode is
  *       enabled), but administrators can later use the Field UI to apply custom
  *       display settings specific to the view mode.
- *   - menu base path: Optional. The base menu router path to which the entity
+ *   - menu base path: (optional) The base menu router path to which the entity
  *     administration user interface responds. It can be used to generate UI
  *     links and to attach additional router items to the entity UI in a generic
  *     fashion.
- *   - menu view path: Optional. The menu router path to be used to view the
+ *   - menu view path: (optional) The menu router path to be used to view the
  *     entity.
- *   - menu edit path: Optional. The menu router path to be used to edit the
+ *   - menu edit path: (optional) The menu router path to be used to edit the
  *     entity.
- *   - menu path wildcard: Optional. A string identifying the menu loader in
+ *   - menu path wildcard: (optional) A string identifying the menu loader in
  *     the router path.
- *   - translation controller class: Optional. The name of the translation
+ *   - translation controller class: (optional) The name of the translation
  *     controller class that should be used to handle the translation process.
  *     See Drupal\translation_entity\EntityTranslationControllerInterface for
  *     more information.
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 8dcea24..f888a6f 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
@@ -116,12 +116,12 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
       unset($translations[$form_langcode]);
     }
     $is_translation = !$form_controller->isDefaultFormLangcode($form_state);
-    $no_translations = count($translations) < 2;
+    $has_translations = count($translations) > 1;
 
     // Adjust page title to specify the current language being edited, if we
     // have at least one translation.
     $languages = language_list();
-    if (isset($languages[$form_langcode]) && (!$no_translations || $new_translation)) {
+    if (isset($languages[$form_langcode]) && ($has_translations || $new_translation)) {
       $title = $this->entityFormTitle($entity);
       // When editing the original values display just the entity label.
       if ($form_langcode != $entity->language()->langcode) {
@@ -133,7 +133,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
 
     // Display source language selector only if we are creating a new
     // translation and there are at least two translations available.
-    if (!$no_translations && $new_translation) {
+    if ($has_translations && $new_translation) {
       $form['source_langcode'] = array(
         '#type' => 'fieldset',
         '#title' => t('Source language: @language', array('@language' => $languages[$source_langcode]->name)),
@@ -163,7 +163,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
     // switch this node to some language which is already in the translation
     // set.
     $language_widget = isset($form['langcode']) && $form['langcode']['#type'] == 'language_select';
-    if ($language_widget && count($translations) > 1) {
+    if ($language_widget && $has_translations) {
       $form['langcode']['#options'] = array();
       foreach (language_list(LANGUAGE_CONFIGURABLE) as $language) {
         if (empty($translations[$language->langcode]) || $language->langcode == $entity_langcode) {
@@ -174,7 +174,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
 
     if ($is_translation) {
       if ($language_widget) {
-        $form['langcode']['#disabled'] = TRUE;
+        $form['langcode']['#access'] = FALSE;
       }
 
       // Replace the delete button with the delete translation one.
@@ -200,7 +200,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
 
     // We need to display the translation tab only when there is at least one
     // translation available or a new one is about to be created.
-    if ($new_translation || count($translations) > 1) {
+    if ($new_translation || $has_translations) {
       $form['translation'] = array(
         '#type' => 'fieldset',
         '#title' => t('Translation'),
@@ -209,6 +209,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
         '#tree' => TRUE,
         '#weight' => 10,
         '#access' => $this->getTranslationAccess($entity, $form_langcode),
+        '#multilingual' => TRUE,
       );
 
       $translate = !$new_translation && $entity->retranslate[$form_langcode];
@@ -225,9 +226,15 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
           '#type' => 'checkbox',
           '#title' => t('This translation needs to be updated'),
           '#default_value' => $translate,
-          '#description' => t('When this option is checked, this translation needs to be updated because the source content has changed. Uncheck when the translation is up to date again.'),
+          '#description' => t('When this option is checked, this translation needs to be updated. Uncheck when the translation is up to date again.'),
         );
       }
+
+      if ($language_widget) {
+        $form_langcode['#multilingual'] = TRUE;
+      }
+
+      $form['#process'][] = array($this, 'entityFormSharedElements');
     }
 
     // Process the submitted values before they are stored.
@@ -240,6 +247,75 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
   }
 
   /**
+   * Process callback that handles entity form shared elements.
+   */
+  public function entityFormSharedElements($element) {
+    static $ignored_types;
+
+    // @todo Find a more reliable way to determine if a form element concerns a
+    //   multilingual value.
+    if (!isset($ignored_types)) {
+      $ignored_types = array_flip(array('actions', 'value', 'hidden', 'vertical_tabs', 'token'));
+    }
+
+    foreach (element_children($element) as $key) {
+      if (!isset($element[$key]['#type'])) {
+        $this->entityFormSharedElements($element[$key]);
+      }
+      else {
+        // Ignore non-widget form elements.
+        if (isset($ignored_types[$element[$key]['#type']])) {
+          continue;
+        }
+        // Elements are considered to be non multilingual by default.
+        if (empty($element[$key]['#multilingual'])) {
+          $this->addTranslatabilityClue($element[$key]);
+        }
+      }
+    }
+
+    return $element;
+  }
+
+  /**
+   * Adds a clue about the form element translatability.
+   *
+   * If the given element does not have a #title attribute, the function is
+   * recursively applied to child elements.
+   *
+   * @param array $element
+   *   A form element array.
+   */
+  protected function addTranslatabilityClue(&$element) {
+    static $suffix, $fapi_title_elements;
+
+    // Elements which can have a #title attribute according to FAPI Reference.
+    if (!isset($suffix)) {
+      $suffix = ' <span class="translation-entity-all-languages">(' . t('all languages') . ')</span>';
+      $fapi_title_elements = array_flip(array('checkbox', 'checkboxes', 'date', 'fieldset', 'file', 'item', 'password', 'password_confirm', 'radio', 'radios', 'select', 'text_format', 'textarea', 'textfield', 'weight'));
+    }
+
+    // Update #title attribute for all elements that are allowed to have a
+    // #title attribute according to the Form API Reference. The reason for this
+    // check is because some elements have a #title attribute even though it is
+    // not rendered, e.g. field containers.
+    if (isset($element['#type']) && isset($fapi_title_elements[$element['#type']]) && isset($element['#title'])) {
+      $element['#title'] .= $suffix;
+    }
+    // If the current element does not have a (valid) title, try child elements.
+    elseif ($children = element_children($element)) {
+      foreach ($children as $delta) {
+        $this->addTranslatabilityClue($element[$delta], $suffix);
+      }
+    }
+    // If there are no children, fall back to the current #title attribute if it
+    // exists.
+    elseif (isset($element['#title'])) {
+      $element['#title'] .= $suffix;
+    }
+  }
+
+  /**
    * Entity builder method.
    */
   public function entityFormEntityBuild($entity_type, $entity, $form, &$form_state) {
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 1ef0429..a0876a4 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
@@ -79,7 +79,7 @@ function testTranslationUI() {
     $values[$default_langcode] = array(
       'langcode' => $default_langcode,
       'name' => $this->randomName(8),
-      'user_id' => mt_rand(0, 128),
+      'user_id' => mt_rand(1, 128),
       'field_test_text' => $this->randomName(16),
     );
 
@@ -102,12 +102,13 @@ function testTranslationUI() {
     $langcode = 'it';
     $values[$langcode] = array(
       'name' => $this->randomName(8),
-      'user_id' => mt_rand(0, 128),
+      'user_id' => mt_rand(1, 128),
       'field_test_text' => $this->randomName(16),
     );
 
     $this->drupalPost($langcode . '/entity-test/manage/' . $entity->id() . '/translations/add/' . $default_langcode . '/' . $langcode, $this->getEditValues($values, $langcode), t('Save'));
-    $this->assertFieldByXPath('//select[@id="edit-langcode" and @disabled]', $default_langcode, 'Language selector correclty disabled on translations.');
+    $this->assertNoFieldByXPath('//select[@id="edit-langcode"]', NULL, 'Language selector correclty disabled on translations.');
+    $this->assertNoRaw('all languages', t('All form elements are translatable.'));
     $entity = entity_test_load($entity->id(), TRUE);
 
     // Switch the source language.
@@ -120,7 +121,7 @@ function testTranslationUI() {
     // Add another translation and mark the other ones as outdated.
     $values[$langcode] = array(
       'name' => $this->randomName(8),
-      'user_id' => mt_rand(0, 128),
+      'user_id' => mt_rand(1, 128),
       'field_test_text' => $this->randomName(16),
     );
     $edit = $this->getEditValues($values, $langcode) + array('translation[retranslate]' => TRUE);
diff --git a/core/modules/translation_entity/translation_entity.admin.inc b/core/modules/translation_entity/translation_entity.admin.inc
index 7b44892..d2352a5 100644
--- a/core/modules/translation_entity/translation_entity.admin.inc
+++ b/core/modules/translation_entity/translation_entity.admin.inc
@@ -14,7 +14,7 @@ function translation_entity_translatable_form($form, &$form_state, $field_name)
   $field = field_info_field($field_name);
   $t_args = array('%name' => $field_name);
 
-  $warning = t('By submitting this form you will trigger a batch operation.');
+  $warning = t('By submitting this form these changes will apply to the %name field everywhere it is used.', $t_args);
   if ($field['translatable']) {
     $title = t('Are you sure you want to disable translation for the %name field?', $t_args);
     $warning .= "<br>" . t("<strong>All the existing translations of this field will be deleted.</strong><br>This action cannot be undone.");
@@ -216,7 +216,7 @@ function _translation_entity_update_field($entity_type, $entity, $field_name) {
  */
 function translation_entity_translatable_batch_done($success, $results, $operations) {
   if ($success) {
-    drupal_set_message(t("Data successfully processed."));
+    drupal_set_message(t("Successfully changed field translation setting."));
   }
   else {
     // @todo: Do something about this case.
diff --git a/core/modules/translation_entity/translation_entity.module b/core/modules/translation_entity/translation_entity.module
index f8f5b07..aa10ee5 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -8,7 +8,7 @@
 use Drupal\Core\Language\Language;
 use Drupal\Core\Entity\EntityFormControllerInterface;
 use Drupal\Core\Entity\EntityInterface;
-
+use Drupal\Core\Entity\EntityNG;
 
 /**
  * Implements hook_help().
@@ -390,6 +390,31 @@ function translation_entity_form_alter(&$form, &$form_state) {
   if (($form_controller = translation_entity_form_controller($form_state)) && ($entity = $form_controller->getEntity($form_state)) && !$entity->isNew()) {
     $controller = translation_entity_controller($entity->entityType());
     $controller->entityFormAlter($form, $form_state, $entity);
+
+    // @todo Move the following lines to the code generating the property form
+    //   elements once we have an official #multilingual FAPI key.
+    $translations = $entity->getTranslationLanguages();
+    $form_langcode = $form_controller->getFormLangcode($form_state);
+
+    // Handle fields shared between translations when there is at least one
+    // translation available or a new one is being created.
+    if (!$entity->isNew() && (!isset($translations[$form_langcode]) || count($translations) > 1)) {
+      if ($entity instanceof EntityNG) {
+        foreach ($entity->getPropertyDefinitions() as $property_name => $definition) {
+          if (isset($form[$property_name])) {
+            $form[$property_name]['#multilingual'] = !empty($definition['translatable']);
+          }
+        }
+      }
+      else {
+        foreach (field_info_instances($entity_type, $entity->bundle()) as $instance) {
+          $field_name = $instance['field_name'];
+          $field = field_info_field($field_name);
+          $form[$field_name]['#multilingual'] = !empty($field['translatable']);
+        }
+      }
+    }
+
   }
 }
 
@@ -506,9 +531,11 @@ function translation_entity_form_field_ui_field_edit_form_alter(&$form, &$form_s
   $label = t('Field translation');
   $title = t('Users may translate this field.');
 
+  $form['field']['#collapsed'] = $translatable;
+
   if (field_has_data($field)) {
     $path = "admin/config/regional/translation_entity/translatable/$field_name";
-    $status = $translatable ? $title : t('This field is shared among the entity translations.');
+    $status = $translatable ? $title : t('This field has data in existing content.');
     $link_title = !$translatable ? t('Enable translation') : t('Disable translation');
 
     $form['field']['translatable'] = array(
diff --git a/core/modules/translation_entity/translation_entity.pages.inc b/core/modules/translation_entity/translation_entity.pages.inc
index 21dc11e..899dd65 100644
--- a/core/modules/translation_entity/translation_entity.pages.inc
+++ b/core/modules/translation_entity/translation_entity.pages.inc
@@ -111,7 +111,10 @@ function translation_entity_overview(EntityInterface $entity) {
             $links['add']['title'] = t('add');
           }
           elseif ($field_ui) {
-            $path = _field_ui_bundle_admin_path($entity->entityType(), $entity->bundle());
+            $entity_path = _field_ui_bundle_admin_path($entity->entityType(), $entity->bundle());
+            // Link directly to the fields tab to make it easier to find the
+            // setting to enable translation on fields.
+            $path = $entity_path . '/fields';
             $links['nofields'] = array('title' => t('no translatable fields'), 'href' => $path, 'language' => $language);
           }
         }
@@ -194,7 +197,7 @@ function translation_entity_prepare_translation(EntityInterface $entity, Languag
       else {
         $entity->setCompatibilityMode(TRUE);
         $value = $entity->$property_name;
-        $value[$target->langcode] = $value[$source->langcode];
+        $value[$target->langcode] = isset($value[$source->langcode]) ? $value[$source->langcode] : NULL;
         $entity->$property_name = $value;
         $entity->setCompatibilityMode(FALSE);
       }
