diff --git a/entity_token.tokens.inc b/entity_token.tokens.inc
index e6d7819..8a7b81b 100644
--- a/entity_token.tokens.inc
+++ b/entity_token.tokens.inc
@@ -33,7 +33,20 @@ function entity_token_types_chained($type = NULL) {
   }
   // Add 'date' tokens.
   $return['date'] = 'date';
-  return isset($type) ? isset($return[$type]) : $return;
+  if (isset($type)) {
+    return (entity_property_list_extract_type($type)) ? TRUE : isset($return[$type]);
+  }
+  return $return;
+}
+
+/**
+ * Gets the the right token type for a given property type.
+ */
+function _entity_token_get_token_type($type, $valid_types) {
+  if ($item_type = entity_property_list_extract_type($type)) {
+    return ($token_type = array_search($item_type, $valid_types)) ? "list<$token_type>" : FALSE;
+  }
+  return array_search($item_type, $valid_types);
 }
 
 /**
@@ -49,10 +62,10 @@ function entity_token_token_info_alter(&$info) {
     foreach (entity_get_all_property_info($type) as $name => $property) {
       $name = str_replace('_', '-', $name);
 
-      if (!isset($info['tokens'][$token_type][$name]) && (!isset($property['type']) || in_array($property['type'], $valid_types))) {
+      if (!isset($info['tokens'][$token_type][$name]) && $property_token_type = _entity_token_get_token_type(isset($property['type']) ? $property['type'] : 'text', $valid_types)) {
         $info['tokens'][$token_type][$name] = array(
           'name' => $property['label'],
-          'type' => isset($property['type']) ? array_search($property['type'], $valid_types) : 'text',
+          'type' => $property_token_type,
           // Mark the token so we know we have to provide the value afterwards.
           'entity-token' => TRUE,
         );
@@ -110,6 +123,21 @@ function entity_token_tokens($type, $tokens, array $data = array(), array $optio
     }
     return $replacements;
   }
+  // Add support for evaluating tokens for "list<type"> types.
+  elseif ($item_type = entity_property_list_extract_type($type)) {
+    foreach ($tokens as $name => $original) {
+      if (is_numeric($name)) {
+        $wrapper = !isset($wrapper) ? _entity_token_wrap_data($type, "list<$token_types[$item_type]>", $data[$type], $options) : $wrapper;
+        try {
+          $replacements[$original] = _entity_token_get_token($wrapper->get($name), $options);
+        }
+        catch (EntityMetadataWrapperException $e) {
+          // In case tokens for not existing values are requested, just do nothing.
+        }
+      }
+    }
+    return $replacements;
+  }
 }
 
 /**
@@ -152,6 +180,19 @@ function _entity_token_get_token($wrapper, $options) {
       return $wrapper->value() ? t('true') : t('false');
     case 'uri':
     case 'text':
+      if (empty($options['sanitize'])) {
+        // When we don't need sanitized tokens decode already sanitizied texts.
+        $options['decode'] = TRUE;
+      }
       return $wrapper->value($options);
   }
+
+  // Care for outputing list values.
+  if ($wrapper instanceof EntityListWrapper) {
+    $output = array();
+    foreach ($wrapper as $item) {
+      $output[] = _entity_token_get_token($item, $options);
+    }
+    return implode(', ', $output);
+  }
 }
