diff --git entity_token.tokens.inc entity_token.tokens.inc
index 6311ec0..8a01d57 100644
--- entity_token.tokens.inc
+++ entity_token.tokens.inc
@@ -34,7 +34,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);
 }
 
 /**
@@ -50,10 +63,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,
         );
@@ -111,6 +124,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;
+  }
 }
 
 /**
@@ -128,23 +156,12 @@ function _entity_token_wrap_data($token_type, $type, $data, $options) {
  * Gets the token replacement by correctly obeying the options.
  */
 function _entity_token_get_token($wrapper, $options) {
-  if (empty($options['sanitize'])) {
-    // When we don't need sanitized tokens decode already sanitizied texts.
-    $options['decode'] = TRUE;
+  // Use the label for formatting the token if a label is given.
+  if ($label = $wrapper->label()) {
+    return empty($options['sanitize']) ? $label : filter_xss($label);
   }
   $langcode = isset($options['language']) ? $options['language']->language : NULL;
 
-  // If there are options use them to format the token.
-  if ($options_list = $wrapper->optionsList()) {
-    // Flatten the options array.
-    foreach ($options_list as $entry) {
-      if (is_array($entry)) {
-        $options_list += $entry;
-      }
-    }
-    return empty($options['sanitize']) ? $options_list[$wrapper->value()] : filter_xss($options_list[$wrapper->value()]);
-  }
-
   switch ($wrapper->type()) {
     case 'integer':
       return number_format($wrapper->value());
@@ -158,6 +175,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);
+  }
 }
