diff --git a/link.info b/link.info
index 2b65825..8a7e984 100644
--- a/link.info
+++ b/link.info
@@ -16,5 +16,6 @@ files[] = tests/link.entity_token.test
 files[] = tests/link.validate.test
 
 ; Views Handlers
+files[] = views/link_views_handler_field_linkfield.inc
 files[] = views/link_views_handler_argument_target.inc
 files[] = views/link_views_handler_filter_protocol.inc
diff --git a/views/link.views.inc b/views/link.views.inc
index 27d5182..991fa57 100644
--- a/views/link.views.inc
+++ b/views/link.views.inc
@@ -24,6 +24,19 @@
 }*/
 
 /**
+ * Implements hook_field_views_data_views_data_alter().
+ *
+ * Add extra tokens.
+ */
+function link_field_views_data_views_data_alter(&$data, $field) {
+  $field_name = $field['field_name'];
+  $data_key = 'field_data_' . $field_name;
+
+  // Add special handler to base field
+  $data[$data_key][$field_name]['field']['handler'] = 'LinkfieldHandlerFieldLinkfield';
+}
+
+/**
  * Return CCK Views data for the link_field_settings($op == 'views data').
  *
  * @TODO: Is there some way to tell views I have formatters for it?
diff --git a/views/link_views_handler_field_linkfield.inc b/views/link_views_handler_field_linkfield.inc
new file mode 100644
index 0000000..d91f7db
--- /dev/null
+++ b/views/link_views_handler_field_linkfield.inc
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Contains the Link attributes field handler.
+ */
+
+class LinkfieldHandlerFieldLinkfield extends views_handler_field_field {
+
+  /**
+   * Add additional tokens
+   */
+  function add_self_tokens(&$tokens, $item) {
+    $field = $this->field_info;
+    foreach ($field['columns'] as $id => $column) {
+      $tokens['[' . $this->options['id'] . '-' . $id . ']'] = t('Raw @column', array('@column' => $id));
+    }
+    $value = $item['raw']['link'];
+    $tokens['[' . $this->options['id'] . '-target' . ']'] = $value['target'];
+  }
+
+  /**
+   * Document any special tokens this field might use for itself.
+   *
+   * @see add_self_tokens() for details.
+   */
+  function document_self_tokens(&$tokens) {
+    $field = $this->field_info;
+    foreach ($field['columns'] as $id => $column) {
+      // Use filter_xss_admin because it's user data and we can't be sure it is safe.
+      // We know nothing about the data, though, so we can't really do much else.
+
+      if (isset($item['raw'])) {
+        // If $item['raw'] is an array then we can use as is, if it's an object
+        // we cast it to an array, if it's neither, we can't use it.
+        $raw = is_array($item['raw']) ? $item['raw'] :
+          (is_object($item['raw']) ? (array)$item['raw'] : NULL);
+      }
+      if (isset($raw) && isset($raw[$id]) && is_scalar($raw[$id])) {
+        $tokens['[' . $this->options['id'] . '-' . $id . ']'] = filter_xss_admin($raw[$id]);
+      }
+      else {
+        // Take sure that empty values are replaced as well.
+        $tokens['[' . $this->options['id'] . '-' . $id . ']'] = '';
+      }
+    }
+    $tokens['[' . $this->options['id'] . '-target' . ']'] = t('Link Target.');
+  }
+
+}
