diff --git a/entity_translation.module b/entity_translation.module
index df0a717..bc7ba89 100644
--- a/entity_translation.module
+++ b/entity_translation.module
@@ -280,7 +280,7 @@ function entity_translation_menu_alter(&$items) {
 }
 
 /**
- * Title callback. 
+ * Title callback.
  */
 function entity_translation_edit_title($langcode) {
   $languages = entity_translation_languages();
@@ -580,6 +580,101 @@ function theme_entity_translation_unavailable($variables) {
 }
 
 /**
+ * Implements hook_field_info_alter().
+ */
+function entity_translation_field_info_alter(&$info) {
+  $columns = array('fid');
+  $supported_types = array('file' => $columns, 'image' => $columns);
+
+  foreach ($info as $field_type => &$field_type_info) {
+    // Store columns to be synchronized.
+    $field_type_info['settings'] += array(
+      'entity_translation_sync' => isset($supported_types[$field_type]) ? $supported_types[$field_type] : FALSE,
+    );
+    // Synchronization can be enabled per instance.
+    $field_type_info['instance_settings'] += array(
+      'entity_translation_sync' => FALSE,
+    );
+  }
+}
+
+/**
+ * Implements hook_field_attach_presave().
+ */
+function entity_translation_field_attach_presave($entity_type, $entity) {
+  if (entity_translation_enabled($entity_type)) {
+    entity_translation_sync($entity_type, $entity);
+  }
+}
+
+/**
+ * Performs field column synchronization.
+ */
+function entity_translation_sync($entity_type, $entity) {
+  list($id, $rid, $bundle) = entity_extract_ids($entity_type, $entity);
+  $instances = field_info_instances($entity_type, $bundle);
+  $entity_unchanged = FALSE;
+
+  if (!empty($id)) {
+    $entity_unchanged = isset($entity->original) ? $entity->original : entity_load_unchanged($entity_type, $id);
+  }
+
+  foreach ($instances as $field_name => $instance) {
+    $field = field_info_field($field_name);
+
+    // If the field is empty or has no translations there is nothing to
+    // synchronize. Synchronization makes sense only for translatable fields.
+    if (!empty($entity->{$field_name}) && count($entity->{$field_name}) > 1 && !empty($instance['settings']['entity_translation_sync']) && field_is_translatable($entity_type, $field)) {
+      $columns = $field['settings']['entity_translation_sync'];
+      $source_langcode = entity_language($entity_type, $entity);
+
+      $created = empty($entity_unchanged) || empty($entity_unchanged->{$field_name}[$source_langcode]);
+      $changed = array();
+      $removed = array();
+
+      // Determine if any synchronized column is being changed.
+      $source_items = $entity->{$field_name}[$source_langcode];
+      $items_unchanged = empty($created) ? $entity_unchanged->{$field_name}[$source_langcode] : array();
+      $total = max(array(count($source_items), count($items_unchanged)));
+
+      // By picking the maximum size between updated and unchanged items, we
+      // make sure to process also removed items.
+      for ($delta = 0; $delta < $total; $delta++) {
+        // Added item.
+        $changed[$delta] = isset($source_items[$delta]) && !isset($items_unchanged[$delta]);
+        // Removed item.
+        $removed[$delta] = !isset($source_items[$delta]) && isset($items_unchanged[$delta]);
+
+        foreach ($columns as $column) {
+          // Changed item.
+          if ($changed[$delta] || $removed[$delta] || $source_items[$delta][$column] != $items_unchanged[$delta][$column]) {
+            $changed[$delta] = TRUE;
+            break;
+          }
+        }
+      }
+
+      // Update translations.
+      foreach ($entity->{$field_name} as $langcode => $items) {
+        if ($langcode != $source_langcode) {
+          for ($delta = 0; $delta < $total; $delta++) {
+            // If an item has been removed we need to remove all translations.
+            if (!empty($removed[$delta])) {
+              unset($entity->{$field_name}[$langcode][$delta]);
+            }
+            // If a synchronized column has changed we need to override the full
+            // items array for all languages.
+            elseif (!empty($changed[$delta])) {
+              $entity->{$field_name}[$langcode][$delta] = $source_items[$delta];
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
  * Implements hook_field_attach_insert().
  */
 function entity_translation_field_attach_insert($entity_type, $entity) {
@@ -840,11 +935,25 @@ function theme_entity_translation_language_tabs($variables) {
 /**
  * Implements hook_form_FORM_ID_alter().
  *
+ * Adds an option to enable field synchronization.
  * Enable a selector to choose whether a field is translatable.
  */
 function entity_translation_form_field_ui_field_edit_form_alter(&$form, $form_state) {
-  $field_name = $form['#field']['field_name'];
+  $instance = $form['#instance'];
+  $entity_type = $instance['entity_type'];
+  $field_name = $instance['field_name'];
   $field = field_info_field($field_name);
+
+  if (!empty($field['settings']['entity_translation_sync']) && field_is_translatable($entity_type, $field)) {
+    $form['instance']['settings']['entity_translation_sync'] = array(
+      '#prefix' => '<label>' . t('Field synchronization') . '</label>',
+      '#type' => 'checkbox',
+      '#title' => t('Enable field synchronization'),
+      '#description' => t('Check this option if you wish to synchronize the value of this field accross its translations.'),
+      '#default_value' => !empty($instance['settings']['entity_translation_sync']),
+    );
+  }
+
   $translatable = $field['translatable'];
   $label = t('Field translation');
   $title = t('Users may translate this field.');
