diff --git modules/node.views.inc modules/node.views.inc
index 0f264dc..4f37508 100644
--- modules/node.views.inc
+++ modules/node.views.inc
@@ -666,7 +666,7 @@ function node_views_handlers() {
         'parent' => 'views_handler_field_node',
       ),
       'views_handler_field_node_link' => array(
-        'parent' => 'views_handler_field',
+        'parent' => 'views_handler_field_node',
       ),
       'views_handler_field_node_path' => array(
         'parent' => 'views_handler_field',
diff --git modules/node/views_handler_field_node.inc modules/node/views_handler_field_node.inc
index 05745f1..96bab21 100644
--- modules/node/views_handler_field_node.inc
+++ modules/node/views_handler_field_node.inc
@@ -12,6 +12,7 @@ class views_handler_field_node extends views_handler_field {
 
   function init(&$view, $options) {
     parent::init($view, $options);
+    $this->real_field = 'nid';
     if (!empty($this->options['link_to_node'])) {
       $this->additional_fields['nid'] = 'nid';
       if (module_exists('translation')) {
diff --git modules/node/views_handler_field_node_link.inc modules/node/views_handler_field_node_link.inc
index 9ef649a..acf8850 100644
--- modules/node/views_handler_field_node_link.inc
+++ modules/node/views_handler_field_node_link.inc
@@ -3,37 +3,14 @@
 /**
  * Field handler to present a link to the node.
  */
-class views_handler_field_node_link extends views_handler_field {
-  function construct() {
-    parent::construct();
-    $this->additional_fields['nid'] = 'nid';
-  }
+class views_handler_field_node_link extends views_handler_field_node {
 
   function option_definition() {
     $options = parent::option_definition();
-
-    $options['text'] = array('default' => '', 'translatable' => TRUE);
+    $options['link_to_node'] = array('default' => TRUE);
+    $options['alter']['contains']['alter_text'] = array('default' => TRUE);
+    $options['alter']['contains']['text'] = array('default' => 'view', 'translatable' => TRUE);
 
     return $options;
   }
-
-  function options_form(&$form, &$form_state) {
-    parent::options_form($form, $form_state);
-    $form['text'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Text to display'),
-      '#default_value' => $this->options['text'],
-    );
-  }
-
-  function query() {
-    $this->ensure_my_table();
-    $this->add_additional_fields();
-  }
-
-  function render($values) {
-    $text = !empty($this->options['text']) ? $this->options['text'] : t('view');
-    $nid = $values->{$this->aliases['nid']};
-    return l($text, "node/$nid");
-  }
 }
diff --git modules/node/views_handler_field_node_link_delete.inc modules/node/views_handler_field_node_link_delete.inc
index b0ac8c9..fb0c899 100644
--- modules/node/views_handler_field_node_link_delete.inc
+++ modules/node/views_handler_field_node_link_delete.inc
@@ -11,6 +11,12 @@ class views_handler_field_node_link_delete extends views_handler_field_node_link
     $this->additional_fields['format'] = array('table' => 'node_revisions', 'field' => 'format');
   }
 
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['alter']['contains']['text'] = array('default' => 'delete', 'translatable' => TRUE);
+    return $options;
+  }
+
   function render($values) {
     // ensure user has access to edit this node.
     $node = new stdClass();
@@ -20,11 +26,25 @@ class views_handler_field_node_link_delete extends views_handler_field_node_link
     $node->format = $values->{$this->aliases['format']};
     $node->status = 1; // unpublished nodes ignore access control
     if (!node_access('delete', $node)) {
+      unset($this->options['alter']['path']);
       return;
     }
 
-    $text = !empty($this->options['text']) ? $this->options['text'] : t('delete');
-    return l($text, "node/$node->nid/delete", array('query' => drupal_get_destination()));
+    return parent::render($values);
+  }
+
+  /**
+   * Render whatever the data is as a link to the node.
+   *
+   * Data should be made XSS safe prior to calling this function.
+   */
+  function render_link($data, $values) {
+    if (!empty($this->options['link_to_node']) && $data !== NULL && $data !== '') {
+      parent::render_link($data, $values);
+      $this->options['alter']['path'] = "node/" . $values->{$this->aliases['nid']} . "/delete";
+      $this->options['alter']['query'] = drupal_get_destination();
+    }
+    return $data;
   }
 }
 
diff --git modules/node/views_handler_field_node_link_edit.inc modules/node/views_handler_field_node_link_edit.inc
index b9e1749..0e78cfa 100644
--- modules/node/views_handler_field_node_link_edit.inc
+++ modules/node/views_handler_field_node_link_edit.inc
@@ -11,6 +11,12 @@ class views_handler_field_node_link_edit extends views_handler_field_node_link {
     $this->additional_fields['format'] = array('table' => 'node_revisions', 'field' => 'format');
   }
 
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['alter']['contains']['text'] = array('default' => 'edit', 'translatable' => TRUE);
+    return $options;
+  }
+
   function render($values) {
     // ensure user has access to edit this node.
     $node = new stdClass();
@@ -20,11 +26,25 @@ class views_handler_field_node_link_edit extends views_handler_field_node_link {
     $node->format = $values->{$this->aliases['format']};
     $node->status = 1; // unpublished nodes ignore access control
     if (!node_access('update', $node)) {
+      unset($this->options['alter']['path']);
       return;
     }
 
-    $text = !empty($this->options['text']) ? $this->options['text'] : t('edit');
-    return l($text, "node/$node->nid/edit", array('query' => drupal_get_destination()));
+    return parent::render($values);
+  }
+
+  /**
+   * Render whatever the data is as a link to the node.
+   *
+   * Data should be made XSS safe prior to calling this function.
+   */
+  function render_link($data, $values) {
+    if (!empty($this->options['link_to_node']) && $data !== NULL && $data !== '') {
+      parent::render_link($data, $values);
+      $this->options['alter']['path'] = "node/" . $values->{$this->aliases['nid']} . "/edit";
+      $this->options['alter']['query'] = drupal_get_destination();
+    }
+    return $data;
   }
 }
 
diff --git modules/node/views_handler_field_node_revision_link_delete.inc modules/node/views_handler_field_node_revision_link_delete.inc
index cc98a92..7c3c1ad 100644
--- modules/node/views_handler_field_node_revision_link_delete.inc
+++ modules/node/views_handler_field_node_revision_link_delete.inc
@@ -12,6 +12,12 @@ class views_handler_field_node_revision_link_delete extends views_handler_field_
     $this->additional_fields['format'] = 'format';
   }
 
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['alter']['contains']['text'] = array('default' => 'delete', 'translatable' => TRUE);
+    return $options;
+  }
+
   function access() {
     return user_access('delete revisions') || user_access('administer nodes');
   }
@@ -25,14 +31,29 @@ class views_handler_field_node_revision_link_delete extends views_handler_field_
     $node->format = $values->{$this->aliases['format']};
     $node->status = 1; // unpublished nodes ignore access control
     if (!node_access('delete', $node)) {
+      unset($this->options['alter']['path']);
       return;
     }
 
     // Current revision cannot be deleted.
     if ($node->vid == $values->{$this->aliases['node_vid']}) {
+      unset($this->options['alter']['path']);
       return;
     }
-    $text = !empty($this->options['text']) ? $this->options['text'] : t('delete');
-    return l($text, "node/$node->nid/revisions/$node->vid/delete", array('query' => drupal_get_destination()));
+    return parent::render($values);
+  }
+
+  /**
+   * Render whatever the data is as a link to the node.
+   *
+   * Data should be made XSS safe prior to calling this function.
+   */
+  function render_link($data, $values) {
+    if (!empty($this->options['link_to_node']) && $data !== NULL && $data !== '') {
+      parent::render_link($data, $values);
+      $this->options['alter']['path'] = "node/" . $values->{$this->aliases['nid']} . "/revisions/" . $values->{$this->aliases['vid']} . "/delete";
+      $this->options['alter']['query'] = drupal_get_destination();
+    }
+    return $data;
   }
 }
diff --git modules/node/views_handler_field_node_revision_link_revert.inc modules/node/views_handler_field_node_revision_link_revert.inc
index 7892e58..8d9c39e 100644
--- modules/node/views_handler_field_node_revision_link_revert.inc
+++ modules/node/views_handler_field_node_revision_link_revert.inc
@@ -12,6 +12,12 @@ class views_handler_field_node_revision_link_revert extends views_handler_field_
     $this->additional_fields['format'] = 'format';
   }
 
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['alter']['contains']['text'] = array('default' => 'revert', 'translatable' => TRUE);
+    return $options;
+  }
+
   function access() {
     return user_access('revert revisions') || user_access('administer nodes');
   }
@@ -25,15 +31,30 @@ class views_handler_field_node_revision_link_revert extends views_handler_field_
     $node->format = $values->{$this->aliases['format']};
     $node->status = 1; // unpublished nodes ignore access control
     if (!node_access('update', $node)) {
+      unset($this->options['alter']['path']);
       return;
     }
 
     // Current revision cannot be reverted.
     if ($node->vid == $values->{$this->aliases['node_vid']}) {
+      unset($this->options['alter']['path']);
       return;
     }
+    return parent::render($values);
+  }
 
-    $text = !empty($this->options['text']) ? $this->options['text'] : t('revert');
-    return l($text, "node/$node->nid/revisions/$node->vid/revert", array('query' => drupal_get_destination()));
+  /**
+   * Render whatever the data is as a link to the node.
+   *
+   * Data should be made XSS safe prior to calling this function.
+   */
+  function render_link($data, $values) {
+    if (!empty($this->options['link_to_node']) && $data !== NULL && $data !== '') {
+      parent::render_link($data, $values);
+      $this->options['alter']['path'] = "node/" . $values->{$this->aliases['nid']} . "/revisions/" . $values->{$this->aliases['vid']} . "/revert";
+      $this->options['alter']['query'] = drupal_get_destination();
+    }
+    return $data;
   }
+
 }
diff --git views.module views.module
index 78a1a4d..3f70dd8 100644
--- views.module
+++ views.module
@@ -601,6 +601,26 @@ function views_add_js($file) {
 }
 
 /**
+ * Does the same as as drupal_get_destination but just return the url.
+ *
+ * @see drupal_get_destination().
+ */
+function views_get_destination() {
+  if (isset($_REQUEST['destination'])) {
+    return urlencode($_REQUEST['destination']);
+  }
+  else {
+    // Use $_GET here to retrieve the original path in source form.
+    $path = isset($_GET['q']) ? $_GET['q'] : '';
+    $query = drupal_query_string_encode($_GET, array('q'));
+    if ($query != '') {
+      $path .= '?'. $query;
+    }
+    return urlencode($path);
+  }
+}
+
+/**
  * Load views files on behalf of modules.
  */
 function views_include_handlers() {
