diff --git a/sources/entity/tmgmt_entity.module b/sources/entity/tmgmt_entity.module
index b255dfc..9b9c3a9 100644
--- a/sources/entity/tmgmt_entity.module
+++ b/sources/entity/tmgmt_entity.module
@@ -41,7 +41,7 @@ function tmgmt_entity_tmgmt_source_plugin_info() {
  * @see TMGMTEntitySourcePluginController::getData()
  */
 function tmgmt_entity_update_entity_translation($entity, $entity_type, $data, $language) {
-  tmgmt_field_populate_entity($entity, $language, $data);
+  tmgmt_field_populate_entity($entity_type, $entity, $language, $data);
   entity_save($entity_type, $entity);
 }
 
diff --git a/sources/field/tmgmt_field.api.php b/sources/field/tmgmt_field.api.php
index 2822206..6b0c2f3 100644
--- a/sources/field/tmgmt_field.api.php
+++ b/sources/field/tmgmt_field.api.php
@@ -32,3 +32,25 @@
 function hook_tmgmt_source_translation_structure($entity_type, $entity, $field, $instance, $langcode, $items) {
 
 }
+
+/**
+ * Puts data on the entity of the field type owned by the module.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity being extracted.
+ * @param $field
+ *   The field structure.
+ * @param $instance
+ *   The field instance.
+ * @param $langcode
+ *   The language associated with $items.
+ * @param $data
+ *   Translated data array.
+ *
+ * @see tmgmt_field_populate_entity()
+ */
+function hook_tmgmt_field_type_populate_entity($entity_type, $entity, $field, $instance, $langcode, $data) {
+
+}
diff --git a/sources/field/tmgmt_field.module b/sources/field/tmgmt_field.module
index 24b2be5..f6b5fff 100644
--- a/sources/field/tmgmt_field.module
+++ b/sources/field/tmgmt_field.module
@@ -81,34 +81,44 @@ function tmgmt_field_get_source_data($entity_type, $entity, $langcode, $only_tra
 /**
  * Populates a field on an object with the provided field values.
  *
+ * @param $entity_type
+ *   The type of $entity.
  * @param $entity
  *   The object to be populated.
- * @param $language
+ * @param $langcode
  *   The field language.
- * @param $values
+ * @param $data
  *   An array of values.
  */
-function tmgmt_field_populate_entity($entity, $language, $data) {
+function tmgmt_field_populate_entity($entity_type, $entity, $langcode, $data) {
   foreach (element_children($data) as $field_name) {
-    if ($info = field_info_field($field_name)) {
-      foreach (element_children($data[$field_name]) as $delta) {
-        $columns = array();
-        foreach (element_children($data[$field_name][$delta]) as $column) {
-          if (isset($data[$field_name][$delta][$column]['#translation']['#text'])) {
-            $columns[$column] = $data[$field_name][$delta][$column]['#translation']['#text'];
+    if ($field = field_info_field($field_name)) {
+      $function = $field['module'] . '_field_type_tmgmt_populate_entity';
+      list(, , $bundle) = entity_extract_ids($entity_type, $entity);
+      $instance = field_info_instance($entity_type, $field_name, $bundle);
+      if (function_exists($function)) {
+        $function($entity_type, $entity, $field, $instance, $langcode, $data);
+      }
+      else {
+        foreach (element_children($data[$field_name]) as $delta) {
+          $columns = array();
+          foreach (element_children($data[$field_name][$delta]) as $column) {
+            if (isset($data[$field_name][$delta][$column]['#translation']['#text'])) {
+              $columns[$column] = $data[$field_name][$delta][$column]['#translation']['#text'];
+            }
+            // For elements which are not translatable, keep using the original
+            // value.
+            elseif (isset($data[$field_name][$delta][$column]['#translate']) && $data[$field_name][$delta][$column]['#translate'] == FALSE) {
+              $columns[$column] = $data[$field_name][$delta][$column]['#text'];
+            }
           }
-          // For elements which are not translatable, keep using the original
-          // value.
-          elseif (isset($data[$field_name][$delta][$column]['#translate']) && $data[$field_name][$delta][$column]['#translate'] == FALSE) {
-            $columns[$column] = $data[$field_name][$delta][$column]['#text'];
+          $langcode = $field['translatable'] ? $langcode : LANGUAGE_NONE;
+          // Make sure the array_merge() gets an array as a first parameter.
+          if (!isset($entity->{$field_name}[$langcode][$delta])) {
+            $entity->{$field_name}[$langcode][$delta] = array();
           }
+          $entity->{$field_name}[$langcode][$delta] = array_merge($entity->{$field_name}[$langcode][$delta], $columns);
         }
-        $langcode = $info['translatable'] ? $language : LANGUAGE_NONE;
-        // Make sure the array_merge() gets an array as a first parameter.
-        if (!isset($entity->{$field_name}[$langcode][$delta])) {
-          $entity->{$field_name}[$langcode][$delta] = array();
-        }
-        $entity->{$field_name}[$langcode][$delta] = array_merge($entity->{$field_name}[$langcode][$delta], $columns);
       }
     }
   }
diff --git a/sources/node/tmgmt_node.module b/sources/node/tmgmt_node.module
index 70c12e1..d4ff2eb 100644
--- a/sources/node/tmgmt_node.module
+++ b/sources/node/tmgmt_node.module
@@ -43,7 +43,7 @@ function tmgmt_node_update_node_translation($node, $data, $language) {
     $node->title = $data['node_title']['#translation']['#text'];
     unset($data['node_title']);
   }
-  tmgmt_field_populate_entity($node, $language, $data);
+  tmgmt_field_populate_entity('node', $node, $language, $data);
   // Reset translation field, which determines outdated status.
   $node->translation['status'] = 0;
   node_save($node);
