diff --git a/src/Token.php b/src/Token.php
index 37cbe03..cac7e9f 100644
--- a/src/Token.php
+++ b/src/Token.php
@@ -114,6 +114,8 @@ class Token extends TokenBase implements TokenInterface {
       // Split token up if it has chains.
       $parts = explode(':', $token, 2);
 
+      if($parts[0] == '*') break;
+
       if (!isset($token_info['tokens'][$type][$parts[0]])) {
         // This is an invalid token (not defined).
         $invalid_tokens[] = $full_token;
diff --git a/token.tokens.inc b/token.tokens.inc
index 7685b63..1b92130 100644
--- a/token.tokens.inc
+++ b/token.tokens.inc
@@ -437,6 +437,23 @@ function token_tokens($type, array $tokens, array $data = array(), array $option
     $langcode = NULL;
   }
 
+  if($data['field_name']) {
+    $items = $data[$data['field_name']];
+    $item = $items->first();
+    $definition = $items->getItemDefinition();
+    $field_type =  $definition->getDataType();
+    if($field_type == 'field_item:datetime') {
+      $datetime = strtotime($item->value);
+      $formats = array_flip(\Drupal::token()->findWithPrefix($tokens, '*'));
+      foreach ($tokens as $name => $original) {
+        $format = $formats[$original];
+        $value = \Drupal::service('date.formatter')->format($datetime, "custom", $format);
+        $replacements[$original] = $value;
+      }
+      return $replacements;
+    }
+  }
+
   // Date tokens.
   if ($type == 'date') {
     $date = !empty($data['date']) ? $data['date'] : REQUEST_TIME;
@@ -1479,6 +1496,9 @@ function field_tokens($type, $tokens, array $data = array(), array $options = ar
       $filtered_tokens = $tokens;
       $delta = 0;
       $parts = explode(':', $token);
+
+      if($parts[0] == "*") return $replacements;
+
       if (is_numeric($parts[0])) {
         if (count($parts) > 1) {
           $delta = $parts[0];
