diff --git /dev/null b/sites/all/modules/contrib/nodereference_url/nodereference_url.token.inc
--- /dev/null
+++ nodereference_url.token.inc
@@ -0,0 +1,25 @@
+<?php
+// $Id$
+
+function nodereference_url_token_list($type = 'all') {
+  if ($type == 'field' || $type == 'all') {
+    $tokens = array();
+
+    $tokens['node reference url']['type']   = t('Referenced node type');
+    $tokens['node reference url']['target-type'] = t('Referencing node type');
+
+    return $tokens;
+  }
+}
+
+function nodereference_url_token_values($type, $object = NULL) {
+  if ($type == 'field') {
+    $item = $object[0]; // @TODO: why does nodereference_token_values use an array of items fetching just the first one?
+    $types = node_get_types('names');
+
+    $tokens['type']          = $types[$item['type']];
+    $tokens['target-type']   = $types[$item['referencing_type']];
+    
+    return $tokens;
+  }
+}
 
diff --git a/sites/all/modules/contrib/nodereference_url/nodereference_url.module b/sites/all/modules/contrib/nodereference_url/nodereference_url.module
--- nodereference_url.module
+++ nodereference_url.module
@@ -7,6 +7,15 @@
  */
 
 /**
+ * Implementation of hook_init().
+ */
+function nodereference_url_init() {
+  if (module_exists('token') && !function_exists('nodereference_url_token_values')) {
+    module_load_include('inc', 'nodereference_url', 'nodereference_url.token');
+  }
+}
+
+/**
  * Implementation of hook_theme().
  */
 function nodereference_url_theme() {
@@ -14,6 +23,9 @@
     'nodereference_url' => array(
       'arguments' => array('element' => NULL),
     ),
+    'token_list' => array(
+      'arguments' => array('token_list' => array(), 'prefix' => '[', 'suffix' => ']')
+    ),
   );
 }
 
@@ -126,6 +138,17 @@
           $link['query'] = 'destination='. urlencode(drupal_get_path_alias('node/'. $node->nid));
         }
       }
+      if (module_exists('token')) {
+        $item = (array)$node;
+        $item['referencing_type'] = $field['type_name']; 
+        $items = array($item); // @TODO: why does nodereference_token_values use an array of items fetching just the first one?
+        // @TODO: exclude unoffered tokens
+        $link['title'] = token_replace($link['title'], 'field', $items);
+        if (!empty($link['attributes']['title'])) {
+          // @TODO: exclude unoffered tokens
+          $link['attributes']['title'] = token_replace($link['attributes']['title'], 'field', $items);
+        }
+      }
     }
   }
 
@@ -222,6 +245,30 @@
           '#default_value' => isset($widget['node_link']['hover_title']) ? $widget['node_link']['hover_title'] : '',
           '#description' => t('Text shown while hovering over the link.'),
         );
+        
+        if (module_exists('token')) {
+          $form['node_link']['token_replacements'] = array(
+            '#type' => 'fieldset',
+            '#title' => t('Replacements for link title & hover title'),
+            '#collapsible' => TRUE,
+            '#collapsed' => TRUE,
+          );
+          
+          $token_list = token_get_list('field');
+          unset($token_list['node reference']['link']);
+          // unset every key but 'node reference' & 'node reference url'
+          $token_list = array(
+            'node reference' => $token_list['node reference'],
+            'node reference url' => $token_list['node reference url'],
+          );
+          
+          $form['node_link']['token_replacements']['table'] = array(
+            '#value' => theme('token_list', $token_list),
+          );
+          
+          $form['node_link']['title']['#default_value'] = isset($widget['node_link']['title']) ? $widget['node_link']['title'] : t('Add a new [target-type] to this [type]');
+        }
+        
         $form['node_link']['destination'] = array(
           '#type' => 'select',
           '#title' => t('Return path'),
@@ -384,3 +431,20 @@
 function theme_nodereference_url($element) {
   return theme('form_element', $element, $element['#display_title']);
 }
+
+function theme_token_list($token_list, $prefix = '[', $suffix = ']') {
+  $headers = array(t('Token'), t('Replacement value'));
+  $rows = array();
+  foreach ($token_list as $key => $category) {
+    $rows[] = array(array('data' => drupal_ucfirst($key) .' '. t('tokens'), 'class' => 'region', 'colspan' => 2));
+    foreach ($category as $token => $description) {
+      $row = array();
+      $row[] = $prefix . $token . $suffix;
+      $row[] = $description;
+      $rows[] = $row;
+    }
+  }
+
+  $output = theme('table', $headers, $rows, array('class' => 'description'));
+  return $output;
+}
