diff --git a/includes/webform.emails.inc b/includes/webform.emails.inc
index 39ab835..d37c125 100644
--- a/includes/webform.emails.inc
+++ b/includes/webform.emails.inc
@@ -22,7 +22,7 @@
   foreach ($node->webform['emails'] as $eid => $email) {
     $email_addresses = array_filter(explode(',', check_plain($email['email'])));
     foreach ($email_addresses as $key => $email_address) {
-      $email_addresses[$key] = webform_format_email_address($email_address, NULL, $node, NULL, FALSE);
+      $email_addresses[$key] = webform_format_email_address($email_address, NULL, $node, NULL, NULL, FALSE);
     }
 
     $form['emails'][$eid]['email'] = array(
@@ -32,7 +32,7 @@
       '#markup' => check_plain(webform_format_email_subject($email['subject'], $node)),
     );
     $form['emails'][$eid]['from'] = array(
-      '#markup' => check_plain(webform_format_email_address($email['from_address'], $email['from_name'], $node, NULL, FALSE)),
+      '#markup' => check_plain(webform_format_email_address($email['from_address'], $email['from_name'], $node, NULL, NULL, FALSE)),
     );
   }
 
diff --git a/includes/webform.submissions.inc b/includes/webform.submissions.inc
index 00f7fdc..a19c37e 100644
--- a/includes/webform.submissions.inc
+++ b/includes/webform.submissions.inc
@@ -218,7 +218,7 @@
           }
         }
       }
-      $email['from'] = webform_format_email_address($email['from_address'], $email['from_name'], $node, $submission);
+      $email['from'] = webform_format_email_address($email['from_address'], $email['from_name'], $node, $submission, $email);
     }
 
     // Update the subject if set in the themed headers.
@@ -227,7 +227,7 @@
       unset($email['headers']['Subject']);
     }
     else {
-      $email['subject'] = webform_format_email_subject($email['subject'], $node, $submission);
+      $email['subject'] = webform_format_email_subject($email['subject'], $node, $submission, $email);
     }
 
     // Replace the "email" field content with chosen email mapping.
@@ -255,7 +255,7 @@
 
       // After filtering e-mail addresses with component values, a single value
       // might contain multiple addresses (such as from checkboxes or selects).
-      $address = webform_format_email_address($address, NULL, $node, $submission, TRUE, FALSE, 'short');
+      $address = webform_format_email_address($address, NULL, $node, $submission, $email, TRUE, FALSE, 'short');
 
       if (is_array($address)) {
         foreach ($address as $new_address) {
@@ -466,7 +466,7 @@
   foreach ($node->webform['emails'] as $eid => $email) {
     $email_addresses = array_filter(explode(',', check_plain($email['email'])));
     foreach ($email_addresses as $key => $email_address) {
-      $email_addresses[$key] = webform_format_email_address($email_address, NULL, $node, $submission, FALSE);
+      $email_addresses[$key] = webform_format_email_address($email_address, NULL, $node, $submission, $email, FALSE);
     }
     $valid_email = !empty($email_addresses[0]) && valid_email_address($email_addresses[0]);
     $form['resend'][$eid] = array(
@@ -481,7 +481,7 @@
       $form['emails'][$eid]['email']['#markup'] .= ' (' . t('empty') . ')';
     }
     $form['emails'][$eid]['subject'] = array(
-      '#markup' => check_plain(webform_format_email_subject($email['subject'], $node, $submission)),
+      '#markup' => check_plain(webform_format_email_subject($email['subject'], $node, $submission, $email)),
     );
 
     $form['actions'] = array('#type' => 'actions');
diff --git a/webform.module b/webform.module
index bb9a0bb..346b068 100644
--- a/webform.module
+++ b/webform.module
@@ -3493,7 +3493,7 @@
  *   The e-mail format, defaults to the site-wide setting. May be either "short"
  *   or "long".
  */
-function webform_format_email_address($address, $name, $node = NULL, $submission = NULL, $encode = TRUE, $single = TRUE, $format = NULL) {
+function webform_format_email_address($address, $name, $node = NULL, $submission = NULL, $email = NULL, $encode = TRUE, $single = TRUE, $format = NULL) {
   if (!isset($format)) {
     $format = variable_get('webform_email_address_format', 'long');
   }
@@ -3535,15 +3535,15 @@
   // Address may be an array if a component value was used on checkboxes.
   if (is_array($address)) {
     foreach ($address as $key => $individual_address) {
-      $address[$key] = _webform_filter_values($individual_address, $node, $submission, NULL, FALSE);
+      $address[$key] = _webform_filter_values($individual_address, $node, $submission, $email, FALSE);
     }
   }
   else {
-    $address = _webform_filter_values($address, $node, $submission, NULL, FALSE);
+    $address = _webform_filter_values($address, $node, $submission, $email, FALSE);
   }
 
   if ($format == 'long' && !empty($name)) {
-    $name = _webform_filter_values($name, $node, $submission, NULL, FALSE);
+    $name = _webform_filter_values($name, $node, $submission, $email, FALSE);
     if ($encode) {
       $name = mime_header_encode($name);
     }
@@ -3557,7 +3557,7 @@
 /**
  * Given an email subject, format it with any needed replacements.
  */
-function webform_format_email_subject($subject, $node = NULL, $submission = NULL) {
+function webform_format_email_subject($subject, $node = NULL, $submission = NULL, $email = NULL) {
   if ($subject == 'default') {
     $subject = webform_variable_get('webform_default_subject');
   }
@@ -3588,7 +3588,7 @@
     $subject = reset($subject);
   }
 
-  return _webform_filter_values($subject, $node, $submission, NULL, FALSE, TRUE);
+  return _webform_filter_values($subject, $node, $submission, $email, FALSE, TRUE);
 }
 
 /**
diff --git a/webform.tokens.inc b/webform.tokens.inc
index 29f486d..6e1c57f 100644
--- a/webform.tokens.inc
+++ b/webform.tokens.inc
@@ -140,6 +140,9 @@
               if ($modifier === 'nolabel') {
                 $display_element['#theme_wrappers'] = array();
               }
+              // Individual tokens always have access granted even if they're
+              // not displayed when rendering the whole renderable.
+              $display_element['#access'] = TRUE;
               $replacements[$original] = render($display_element);
               break;
             }