--- a/node.inc	2011-11-23 15:52:03.000000000 +0100
+++ b/node.inc	2011-11-23 15:52:10.000000000 +0100
@@ -27,52 +27,81 @@
   $instances = field_info_instances('node', field_extract_bundle('node', $type));
   foreach ($instances as $instance) {
     $field_name = $instance['field_name'];
+    $field_info = field_info_field($field_name);
+		$value_keys = array(
+      'taxonomy_term_reference' => array('tid'),
+      'node_reference' => array('nid'),
+			'datetime' => array('value','value2'),
+    );
+    $value_keys = isset($value_keys[$field_info['type']]) ? $value_keys[$field_info['type']] : array('value');
     $langcode = field_language('node', $new_node, $field_name);
-    if (isset($new_node->{$field_name}[$langcode])) {
-      foreach (array_keys($new_node->{$field_name}[$langcode]) as $delta) {
-        if (isset($new_node->{$field_name}[$langcode][$delta]['value']) && isset($old_node->{$field_name}[$langcode][$delta]['value'])) {
-          $view_old = $old_node->{$field_name}[$langcode][$delta]['value'];
-          $view_new = $new_node->{$field_name}[$langcode][$delta]['value'];
-          $result["{$field_name}_{$delta}"] = array(
-            '#name' => $instance['label'],
-            '#old' => explode("\n", $view_old),
-            '#new' => explode("\n", $view_new),
-          );
-        }
-        elseif (isset($new_node->{$field_name}[$langcode][$delta]['value'])) {
-          // We have a newly input value where there was none in the previous
-          // version of the node.
-          $view_new = $new_node->{$field_name}[$langcode][$delta]['value'];
-          $result["{$field_name}_{$delta}"] = array(
-            '#name' => $instance['label'],
-            '#old' => '',
-            '#new' => explode("\n", $view_new),
-          );
-        }
-        elseif (isset($old_node->{$field_name}[$langcode][$delta]['value'])) {
-          // We have a value that has been removed from the field.
-          $view_old = $old_node->{$field_name}[$langcode][$delta]['value'];
-          $result["{$field_name}_{$delta}"] = array(
-            '#name' => $instance['label'],
-            '#old' => explode("\n", $view_old),
-            '#new' => '',
-          );
-        }
-      }
-    }
-    elseif (isset($old_node->{$field_name}[$langcode])) {
-      // We have a value that has been removed from the field.
-      foreach (array_keys($old_node->{$field_name}[$langcode]) as $delta) {
-        if (isset($old_node->{$field_name}[$langcode][$delta]['value'])) {
-          $view_old = $old_node->{$field_name}[$langcode][$delta]['value'];
-          $result["{$field_name}_{$delta}"] = array(
-            '#name' => $instance['label'],
-            '#old' => explode("\n", $view_old),
-            '#new' => '',
-          );
-        }
-      }
-    }
+		foreach ($value_keys as $value_key) {
+		  if (isset($new_node->{$field_name}[$langcode])) {
+		    foreach (array_keys($new_node->{$field_name}[$langcode]) as $delta) {
+		      if (isset($new_node->{$field_name}[$langcode][$delta][$value_key]) && isset($old_node->{$field_name}[$langcode][$delta][$value_key])) {
+		        $view_old = node_diff_mapping_callback($old_node->{$field_name}[$langcode][$delta][$value_key], $value_key);
+		        $view_new = node_diff_mapping_callback($new_node->{$field_name}[$langcode][$delta][$value_key], $value_key);
+		        $result["{$field_name}_{$delta}_{$value_key}"] = array(
+		          '#name' => ($value_key=='value2') ? t('End of '). $instance['label'] : $instance['label'] ,
+		          '#old' => explode("\n", $view_old),
+		          '#new' => explode("\n", $view_new),
+		        );
+		      }
+		      elseif (isset($new_node->{$field_name}[$langcode][$delta][$value_key])) {
+		        // We have a newly input value where there was none in the previous
+		        // version of the node.
+		        $view_new = node_diff_mapping_callback($new_node->{$field_name}[$langcode][$delta][$value_key], $value_key);
+		        $result["{$field_name}_{$delta}_{$value_key}"] = array(
+		          '#name' => $instance['label'],
+		          '#old' => '',
+		          '#new' => explode("\n", $view_new),
+		        );
+		      }
+		      elseif (isset($old_node->{$field_name}[$langcode][$delta][$value_key])) {
+		        // We have a value that has been removed from the field.
+		        $view_old = node_diff_mapping_callback($old_node->{$field_name}[$langcode][$delta][$value_key], $value_key);
+		        $result["{$field_name}_{$delta}_{$value_key}"] = array(
+		          '#name' => $instance['label'],
+		          '#old' => explode("\n", $view_old),
+		          '#new' => '',
+		        );
+		      }
+		    }
+		  }
+		  elseif (isset($old_node->{$field_name}[$langcode])) {
+		    // We have a value that has been removed from the field.
+		    foreach (array_keys($old_node->{$field_name}[$langcode]) as $delta) {
+		      if (isset($old_node->{$field_name}[$langcode][$delta][$value_key])) {
+		        $view_old = node_diff_mapping_callback($old_node->{$field_name}[$langcode][$delta][$value_key], $value_key);
+		        $result["{$field_name}_{$delta}_{$value_key}"] = array(
+		          '#name' => $instance['label'],
+		          '#old' => explode("\n", $view_old),
+		          '#new' => '',
+		        );
+		      }
+		    }
+		  }
+		}
   }
   return $result;
 }
+
+/**
+ * Mapping callback to display meaningful information in the diff, where the field
+ * in question contains e.g. a tid or a nid.
+ */
+function node_diff_mapping_callback($value, $type) { 
+	if ($type == 'value' || $type == 'value2') {
+    return $value;
+  }
+
+  switch ($type) {
+    case 'tid':
+      $term = taxonomy_term_load($value);
+      return $term->name;
+    case 'nid':
+      $node = node_load($value);
+      return $node->title;
+  }
+  return $value;
+}
