diff --git a/core/modules/file/file.field.inc b/core/modules/file/file.field.inc
index a43849d..4f44ac1 100644
--- a/core/modules/file/file.field.inc
+++ b/core/modules/file/file.field.inc
@@ -17,6 +17,7 @@ function file_field_info() {
         'display_field' => 0,
         'display_default' => 0,
         'uri_scheme' => variable_get('file_default_scheme', 'public'),
+        'translation_sync' => array('fid'),
       ),
       'instance_settings' => array(
         'file_extensions' => 'txt',
diff --git a/core/modules/image/image.field.inc b/core/modules/image/image.field.inc
index fcde8e6..b29c5e2 100644
--- a/core/modules/image/image.field.inc
+++ b/core/modules/image/image.field.inc
@@ -16,6 +16,7 @@ function image_field_info() {
       'settings' => array(
         'uri_scheme' => variable_get('file_default_scheme', 'public'),
         'default_image' => 0,
+        'translation_sync' => array('fid'),
       ),
       'instance_settings' => array(
         'file_extensions' => 'png gif jpg jpeg',
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 b08518a..6bf6370 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
@@ -364,6 +364,11 @@ public function entityFormEntityBuild($entity_type, EntityInterface $entity, arr
     if (!empty($values['retranslate'])) {
       $this->retranslate($entity, $form_langcode);
     }
+
+    // Store contextual information that can be reused during the storage pahse.
+    $attributes = drupal_container()->get('request')->attributes;
+    $attributes->set('source_langcode', $source_langcode);
+    $attributes->set('working_langcode', $form_langcode);
   }
 
   /**
diff --git a/core/modules/translation_entity/translation_entity.module b/core/modules/translation_entity/translation_entity.module
index dac1001..a0459da 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -575,12 +575,22 @@ function translation_entity_field_extra_fields() {
  * Implements hook_form_FORM_ID_alter().
  */
 function translation_entity_form_field_ui_field_edit_form_alter(array &$form, array &$form_state, $form_id) {
+  $instance = $form['#instance'];
   $field = $form['#field'];
   $field_name = $field['field_name'];
   $translatable = $field['translatable'];
+
+  if ($field['translatable'] && !empty($field['settings']['translation_sync'])) {
+    $form['instance']['settings']['translation_sync'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Synchronize translations'),
+      '#description' => t('Check this option if you just wish to translate the textual elements of this field. All the other aspects, such as the order of items or non-textual values, will be the same for all languages.'),
+      '#default_value' => !empty($instance['settings']['translation_sync']),
+    );
+  }
+
   $label = t('Field translation');
   $title = t('Users may translate this field.');
-
   $form['field']['#collapsed'] = $translatable;
 
   if (field_has_data($field)) {
@@ -614,6 +624,145 @@ function translation_entity_form_field_ui_field_edit_form_alter(array &$form, ar
 }
 
 /**
+ * Implements hook_field_info_alter().
+ */
+function translation_entity_field_info_alter(&$info) {
+  foreach ($info as $field_type => &$field_type_info) {
+    // By default no column has to be synchronized.
+    $field_type_info['settings'] += array('translation_sync' => FALSE);
+    // Synchronization can be enabled per instance.
+    $field_type_info['instance_settings'] += array('translation_sync' => FALSE);
+  }
+}
+
+/**
+ * Implements hook_field_attach_presave().
+ */
+function translation_entity_field_attach_presave($entity_type, $entity) {
+  if (translation_entity_enabled($entity_type, $entity->bundle())) {
+    $attributes = drupal_container()->get('request')->attributes;
+    $source_langcode = $attributes->get('working_langcode');
+    $original_langcode = $attributes->get('source_langcode');
+    translation_entity_sync($entity, $source_langcode, $original_langcode);
+  }
+}
+
+/**
+ * Performs field column synchronization.
+ *
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ *   The entity whose values should be synchronized.
+ * @param $source_langcode
+ *   The language of the translation whose values should be used as source for
+ *   synchronization.
+ * @param $original_langcode
+ *   (optional) If a new translation is being created, this should be the
+ *   language code of the original values. Defaults to FALSE.
+ */
+function translation_entity_sync(EntityInterface $entity, $source_langcode, $original_langcode = FALSE) {
+  $translations = $entity->getTranslationLanguages();
+
+  // If we are creating a new entity, or if we have no translations for the
+  // current entity, or we have no information about the translation being
+  // saved, then there is nothing to synchronize.
+  if (empty($source_langcode) || $entity->isNew() || (count($translations) < 2 && !$original_langcode)) {
+    return;
+  }
+
+  // If the entity language is being changed there is nothing to synchronize.
+  $entity_type = $entity->entityType();
+  $entity_unchanged = isset($entity->original) ? $entity->original : entity_load_unchanged($entity_type, $entity->id());
+  if ($entity->language()->langcode != $entity_unchanged->language()->langcode) {
+    return;
+  }
+
+  $instances = field_info_instances($entity_type, $entity->bundle());
+  foreach ($instances as $field_name => $instance) {
+    $field = field_info_field($field_name);
+
+    // If the field is empty there is nothing to synchronize. Synchronization
+    // makes sense only for translatable fields.
+    if (!empty($entity->{$field_name}) && !empty($instance['settings']['translation_sync']) && field_is_translatable($entity_type, $field)) {
+      $columns = isset($field['settings']['translation_sync']) ? $field['settings']['translation_sync'] : array();
+      $change_map = array();
+      $source_items = $entity->{$field_name}[$source_langcode];
+
+      // If a translation is being created, the original values should be used
+      // as the unchanged items. In fact there are no unchanged items to check
+      // against.
+      $langcode = $original_langcode ?: $source_langcode;
+      $unchanged_items = !empty($entity_unchanged->{$field_name}[$langcode]) ? $entity_unchanged->{$field_name}[$langcode] : array();
+
+      // By picking the maximum size between updated and unchanged items, we
+      // make sure to process also removed items.
+      $total = max(array(count($source_items), count($unchanged_items)));
+
+      // Make sure we can detect any change in the source items.
+      for ($delta = 0; $delta < $total; $delta++) {
+        foreach ($columns as $column) {
+          // Store the delta for the unchanged column value.
+          if (isset($unchanged_items[$delta][$column])) {
+            $value = $unchanged_items[$delta][$column];
+            $change_map[$column][$value]['old'] = $delta;
+          }
+          // Store the delta for the new column value.
+          if (isset($source_items[$delta][$column])) {
+            $value = $source_items[$delta][$column];
+            $change_map[$column][$value]['new'] = $delta;
+          }
+        }
+      }
+
+      // Backup field values.
+      $field_values = $entity->{$field_name};
+
+      // Reset field values so that no spurious value is stored. Source values
+      // must be preserved in any case.
+      $entity->{$field_name} = array($source_langcode => $source_items);
+
+      // Update translations.
+      foreach ($translations as $langcode => $language) {
+        // We need to synchronize only values different from the source ones.
+        if ($langcode != $source_langcode) {
+          // Process even removed items.
+          for ($delta = 0; $delta < $total; $delta++) {
+            $created = TRUE;
+            $removed = TRUE;
+
+            foreach ($columns as $column) {
+              if (isset($source_items[$delta][$column])) {
+                $value = $source_items[$delta][$column];
+                $created = $created && !isset($change_map[$column][$value]['old']);
+                $removed = $removed && !isset($change_map[$column][$value]['new']);
+              }
+            }
+
+            // If an item has been removed we do not store its translations.
+            if ($removed) {
+              continue;
+            }
+            // If a synchronized column has changed we need to override the full
+            // items array for all languages.
+            elseif ($created) {
+              $entity->{$field_name}[$langcode][$delta] = $source_items[$delta];
+            }
+            // The current item might have been reordered.
+            elseif (!empty($change_map[$column][$value])) {
+              $old_delta = $change_map[$column][$value]['old'];
+              $new_delta = $change_map[$column][$value]['new'];
+              // If for any reason the old value is not defined for the current
+              // we language we fall back to the new source value.
+              $items = isset($field_values[$langcode][$old_delta]) ? $field_values[$langcode][$old_delta] : $source_items[$new_delta];
+              $entity->{$field_name}[$langcode][$new_delta] = $items;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
  * Implements hook_element_info_alter().
  */
 function translation_entity_element_info_alter(&$type) {
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index bb86002..058ebbd 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -273,7 +273,7 @@ function user_schema() {
       'module' => array(
         'description' => 'The name of the module declaring the variable.',
         'type' => 'varchar',
-        'length' => 204,
+        'length' => 255,
         'not null' => TRUE,
         'default' => '',
       ),
