diff --git a/includes/simplenews.admin.inc b/includes/simplenews.admin.inc
index 1ed89b7..cf5202f 100644
--- a/includes/simplenews.admin.inc
+++ b/includes/simplenews.admin.inc
@@ -553,7 +553,7 @@ function simplenews_admin_category_form($form, &$form_state, $edit = array()) {
     );
     $form['simplenews_subject']['token_help']['browser'] = array(
       '#theme' => 'token_tree',
-      '#token_types' => array('simplenews-category', 'node'),
+      '#token_types' => array('simplenews-category', 'node', 'simplenews-newsletter', 'simplenews-subscriber'),
     );
   }
 
@@ -1532,7 +1532,7 @@ function simplenews_admin_settings_subscription($form, &$form_state) {
   );
   $form['simplenews_subscription']['subscription_mail']['token_help']['browser'] = array(
       '#theme' => 'token_tree',
-      '#token_types' => array('simplenews-category', 'node'),
+      '#token_types' => array('simplenews-category', 'simplews-subscriber'),
   );
 
   $form['simplenews_subscription']['subscription_mail']['simplenews_confirm_subscribe_subject'] = array(
diff --git a/simplenews.module b/simplenews.module
index 30841f4..8815e3b 100644
--- a/simplenews.module
+++ b/simplenews.module
@@ -345,22 +345,34 @@ function simplenews_node_type_insert($info) {
 }
 
 /**
- * Implementation of hook_node_view().
+ * Implementents hook_node_view().
  */
 function simplenews_node_view($node, $view_mode) {
   if (!simplenews_check_node_types($node->type)) {
     return;
   }
-  // Replace the tokens when view mode is 'email_*'.
-  if (strpos($view_mode, 'email_') === 0) {
 
-    if (isset($build['body'])) {
-      // @todo Where to perform the token replacement?
-      //$build['body'] = token_replace($build['body'], array('node' => $node));
+  $context = array(
+    'account' => $GLOBALS['user'],
+    'node' => $node,
+    'category' => simplenews_category_load(simplenews_newsletter_load($node->nid)->tid),
+  );
+
+  // Loop over all render array elements.
+  foreach (element_children($node->content) as $key) {
+    $element = &$node->content[$key];
+    // Make sure this is a field.
+    if (!isset($element['#field_type'])) {
+      continue;
     }
-    if (isset($build['teaser'])) {
-      // @todo Where to perform the token replacement?
-      //$build['teaser'] = token_replace($build['teaser'], array('node' => $node));
+    // Loop over all field values.
+    foreach (element_children($element) as $field_key) {
+      $item = &$element[$field_key];
+      // Only fields which result in simple markup elements are supported for
+      // token replacements for now.
+      if (isset($item['#markup'])) {
+        $item['#markup'] = token_replace($item['#markup'], $context, array());
+      }
     }
   }
 }
@@ -742,12 +754,12 @@ function _simplenews_node_form(&$form, $form_state) {
       '#type' => 'fieldset',
       '#collapsible' => TRUE,
       '#collapsed' => TRUE,
-      '#description' => t('These tokens can be used in all text fields and will be replaced on-screen and in the email. Note that receiver-* tokens are not suitable for on-screen use.'),
+      '#description' => t('These tokens can be used in all text fields except subject and will be replaced on-screen and in the email.'),
     );
 
     $form['simplenews_token_help']['browser'] = array(
       '#theme' => 'token_tree',
-      '#token_types' => array('simplenews-newsletter', 'simplenews-category'),
+      '#token_types' => array('simplenews-newsletter', 'simplenews-category', 'simplenews-subscriber', 'node'),
     );
   }
 }
@@ -2336,14 +2348,17 @@ function simplenews_token_info() {
   // @todo Add desription to the types and extend available tokens.
   $types['simplenews-subscriber'] = array(
     'name' => t('Simplenews subscriber'),
+    'description' => t('Tokens related to the newsletter recipient'),
     'needs-data' => 'account',
   );
   $types['simplenews-newsletter'] = array(
     'name' => t('Simplenews newsletter'),
+    'description' => t('Token related to this newsletter issue. DEPRECATED, use node tokens instead.'),
     'needs-data' => 'node',
   );
   $types['simplenews-category'] = array(
     'name' => t('Simplenews newsletter category'),
+    'description' => t('Tokens related to the newsletter category'),
     'needs-data' => 'category',
   );
 
@@ -2361,10 +2376,16 @@ function simplenews_token_info() {
     'description' => t('The email address of the newsletter receiver.'),
   );
 
+  $subscriber['user'] = array(
+    'name' => t('Corresponding user'),
+    'description' => t('The user object that corresponds to this subscriber. This is not set for anonymous subscribers.'),
+    'type' => 'user',
+  );
+
   // Tokens for simplenews newsletter.
   $newsletter['url'] = array(
     'name' => t('Newsletter URL'),
-    'description' => t('The URL of this newsletter.'),
+    'description' => t('The URL of this newsletter issue. DEPRECATED, use [node:path] instead.'),
   );
 
   // Tokens for simplenews newsletter category.
@@ -2376,6 +2397,11 @@ function simplenews_token_info() {
     'name' => t('Newsletter category URL'),
     'description' => t('The URL of the page listing the issues of this newsletter category.'),
   );
+  $category['term'] = array(
+    'name' => t('Corresponding term'),
+    'description' => t('The taxonomy term of this newsletter category'),
+    'type' => 'term',
+  );
 
   return array(
     'types' => $types,
@@ -2425,6 +2451,11 @@ function simplenews_tokens($type, $tokens, $data = array(), $options = array())
             break;
         }
       }
+
+      if (($user_tokens = token_find_with_prefix($tokens, 'user')) && !empty($account->uid)) {
+        $replacements += token_generate('user', $user_tokens, array('user' => user_load($account->uid)), $options);
+      }
+
       break;
 
     case 'simplenews-newsletter':
@@ -2454,11 +2485,15 @@ function simplenews_tokens($type, $tokens, $data = array(), $options = array())
             break;
 
           case 'url':
-            // @todo replace path
-            $replacements[$original] = url('taxonomy/term/' . $category->tid);
+            $uri = entity_uri('taxonomy_term', $category);
+            $replacements[$original] = url($uri['path'], $uri['options']);
             break;
         }
       }
+
+      if ($term_tokens = token_find_with_prefix($tokens, 'term')) {
+        $replacements += token_generate('taxonomy_term', $term_tokens, array('taxonomy_term' => $category), $options);
+      }
       break;
   }
 
