--- a/profiles/merqio/modules/contrib/token/token.tokens.inc
+++ a/profiles/merqio/modules/contrib/token/token.tokens.inc
@@ -113,154 +113,34 @@
  * Implements hook_token_info().
  */
 function token_token_info() {
-  // Node tokens.
-  $info['tokens']['node']['source'] = array(
-    'name' => t('Translation source node'),
-    'description' => t("The source node for this current node's translation set."),
-    'type' => 'node',
-  );
-  $info['tokens']['node']['log'] = array(
-    'name' => t('Revision log message'),
-    'description' => t('The explanation of the most recent changes made to the node.'),
-  );
-  $info['tokens']['node']['content-type'] = array(
-    'name' => t('Content type'),
-    'description' => t('The content type of the node.'),
-    'type' => 'content-type',
-  );
+  $info = [
+    'types' => [],
+    'tokens' => []
+  ];
 
-  // Content type tokens.
-  $info['types']['content-type'] = array(
-    'name' => t('Content types'),
-    'description' => t('Tokens related to content types.'),
-    'needs-data' => 'node_type',
-  );
-  $info['tokens']['content-type']['name'] = array(
-    'name' => t('Name'),
-    'description' => t('The name of the content type.'),
-  );
-  $info['tokens']['content-type']['machine-name'] = array(
-    'name' => t('Machine-readable name'),
-    'description' => t('The unique machine-readable name of the content type.'),
-  );
-  $info['tokens']['content-type']['description'] = array(
-    'name' => t('Description'),
-    'description' => t('The optional description of the content type.'),
-  );
-  $info['tokens']['content-type']['node-count'] = array(
-    'name' => t('Node count'),
-    'description' => t('The number of nodes belonging to the content type.'),
-  );
-  $info['tokens']['content-type']['edit-url'] = array(
-    'name' => t('Edit URL'),
-    'description' => t("The URL of the content type's edit page."),
-    // 'type' => 'url',
-  );
+  // Provide field tokens for content entities.
+  $entity_manager = \Drupal::entityManager();
+  $store_entities = array_filter($entity_manager->getDefinitions(), function($definition) {
+    return $definition->getGroup() == 'content';
+  });
 
-  // Taxonomy term and vocabulary tokens.
-  if (\Drupal::moduleHandler()->moduleExists('taxonomy')) {
-    $info['tokens']['term']['edit-url'] = array(
-      'name' => t('Edit URL'),
-      'description' => t("The URL of the taxonomy term's edit page."),
-      // 'type' => 'url',
-    );
-    $info['tokens']['term']['parents'] = array(
-      'name' => t('Parents'),
-      'description' => t("An array of all the term's parents, starting with the root."),
-      'type' => 'array',
-    );
-    $info['tokens']['term']['root'] = array(
-      'name' => t('Root term'),
-      'description' => t("The root term of the taxonomy term."),
-      'type' => 'term',
-    );
-
-    $info['tokens']['vocabulary']['machine-name'] = array(
-      'name' => t('Machine-readable name'),
-      'description' => t('The unique machine-readable name of the vocabulary.'),
-    );
-    $info['tokens']['vocabulary']['edit-url'] = array(
-      'name' => t('Edit URL'),
-      'description' => t("The URL of the vocabulary's edit page."),
-      // 'type' => 'url',
-    );
+  foreach ($store_entities AS $entity_info) {
+    $info['types'][$entity_info->id()] = [
+      'name' => $entity_info->getLabel(),
+      'description' => t('Tokens related to %entity entity.', ['%entity' => $entity_info->getLabel()]),
+      'needs-data' => $entity_info->id()
+    ];
+    $fields = array_filter($entity_manager->getFieldStorageDefinitions($entity_info->id()), function($field) {
+      return $field instanceof \Drupal\Core\Field\BaseFieldDefinition;
+    });
+    foreach ($fields AS $field) {
+      $info['tokens'][$entity_info->id()][$field->getName()] = [
+        'name' => $field->getLabel(),
+        'description' => $field->getDescription() ? $field->getDescription() : ''
+      ];
-  }
+    }
+  }
 
-  // File tokens.
-  $info['tokens']['file']['basename'] = array(
-    'name' => t('Base name'),
-    'description' => t('The base name of the file.'),
-  );
-  $info['tokens']['file']['extension'] = array(
-    'name' => t('Extension'),
-    'description' => t('The extension of the file.'),
-  );
-  $info['tokens']['file']['size-raw'] = array(
-    'name' => t('File byte size'),
-    'description' => t('The size of the file, in bytes.'),
-  );
-
-  // User tokens.
-  // Add information on the restricted user tokens.
-  $info['tokens']['user']['cancel-url'] = array(
-    'name' => t('Account cancellation URL'),
-    'description' => t('The URL of the confirm delete page for the user account.'),
-    'restricted' => TRUE,
-    // 'type' => 'url',
-  );
-  $info['tokens']['user']['one-time-login-url'] = array(
-    'name' => t('One-time login URL'),
-    'description' => t('The URL of the one-time login page for the user account.'),
-    'restricted' => TRUE,
-    // 'type' => 'url',
-  );
-  $info['tokens']['user']['roles'] = array(
-    'name' => t('Roles'),
-    'description' => t('The user roles associated with the user account.'),
-    'type' => 'array',
-  );
-
-  // Current user tokens.
-  $info['tokens']['current-user']['ip-address'] = array(
-    'name' => t('IP address'),
-    'description' => 'The IP address of the current user.',
-  );
-
-  // Menu link tokens (work regardless if menu module is enabled or not).
-  $info['types']['menu-link'] = array(
-    'name' => t('Menu links'),
-    'description' => t('Tokens related to menu links.'),
-    'needs-data' => 'menu-link',
-  );
-  $info['tokens']['menu-link']['mlid'] = array(
-    'name' => t('Link ID'),
-    'description' => t('The unique ID of the menu link.'),
-  );
-  $info['tokens']['menu-link']['title'] = array(
-    'name' => t('Title'),
-    'description' => t('The title of the menu link.'),
-  );
-  $info['tokens']['menu-link']['url'] = array(
-    'name' => t('URL'),
-    'description' => t('The URL of the menu link.'),
-    'type' => 'url',
-  );
-  $info['tokens']['menu-link']['parent'] = array(
-    'name' => t('Parent'),
-    'description' => t("The menu link's parent."),
-    'type' => 'menu-link',
-  );
-  $info['tokens']['menu-link']['parents'] = array(
-    'name' => t('Parents'),
-    'description' => t("An array of all the menu link's parents, starting with the root."),
-    'type' => 'array',
-  );
-  $info['tokens']['menu-link']['root'] = array(
-    'name' => t('Root'),
-    'description' => t("The menu link's root."),
-    'type' => 'menu-link',
-  );
-
   // Current page tokens.
   $info['types']['current-page'] = array(
     'name' => t('Current page'),
@@ -1244,41 +1124,19 @@
  * Implements hook_tokens() on behalf of field.module.
  */
 function field_tokens($type, $tokens, array $data = array(), array $options = array(), BubbleableMetadata $bubbleable_metadata) {
-  $replacements = array();
-  $langcode = isset($options['langcode']) ? $options['langcode'] : NULL;
+  $replacements = [];
 
   // Entity tokens.
   if ($type == 'entity' && !empty($data['entity_type']) && !empty($data['entity']) && !empty($data['token_type'])) {
-    // The field API does weird stuff to the entity, so let's clone it.
-    /* @var \Drupal\Core\Entity\ContentEntityInterface $entity */
-    $entity = clone $data['entity'];
-    if (!($entity instanceof ContentEntityInterface)) {
-      return $replacements;
-    }
-
-    // Reset the prepared view flag in case token generation is called from
-    // inside field_attach_view().
-    unset($entity->_field_view_prepared);
-
+    $entity = $data['entity'];
     foreach ($tokens as $name => $original) {
-      // Replace the [entity:field-name] token only if token module added this
-      // token.
-      if ($entity->hasField($name) && _token_module($data['token_type'], $name) == 'token') {
-
-        // Do not continue if the field is empty or not a configurable field.
-        if ($entity->get($name)->isEmpty() || !($entity->getFieldDefinition($name) instanceof FieldConfigInterface)) {
-          continue;
-        }
-
+      if ($entity->hasField($name) && !$entity->get($name)->isEmpty()) {
         $field_output = $entity->$name->view('token');
         $field_output['#token_options'] = $options;
         $field_output['#pre_render'][] = 'token_pre_render_field_token';
-        $replacements[$original] = drupal_render($field_output);
+        $replacements[$original] = \Drupal::service('renderer')->render($field_output);
       }
     }
-
-    // Remove the cloned object from memory.
-    unset($entity);
   }
 
   return $replacements;
