diff --git a/token.tokens.inc b/token.tokens.inc
index 690b22b..5519f6f 100644
--- a/token.tokens.inc
+++ b/token.tokens.inc
@@ -297,6 +297,19 @@ function token_token_info() {
     'description' => t('The value of a specific query string field of the current page.'),
     'dynamic' => TRUE,
   ];
+  foreach (\Drupal::entityTypeManager()->getDefinitions() as $entity_type_id => $entity_type) {
+    // Do not generate tokens if the entity doesn't define a token type or is
+    // not a content entity.
+    if (!$entity_type->get('token_type') || (!$entity_type instanceof ContentEntityTypeInterface)) {
+      continue;
+    }
+
+    $info['tokens']['current-page'][$entity_type_id] = [
+      'name' => t('The current %type', ['%type' => $entity_type_id]),
+      'description' => t("The current page object if that's a %type", ['%type' => $entity_type_id]),
+      'type' => \Drupal::service('token.entity_mapper')->getTokenTypeForEntityType($entity_type_id),
+    ];
+  }
 
   // URL tokens.
   $info['types']['url'] = [
@@ -786,6 +799,41 @@ function token_tokens($type, array $tokens, array $data = [], array $options = [
             $page = $pager_page_array[0];
           }
           $replacements[$original] = (int) $page + 1;
+          break;
+        default:
+          $entity_type_manager = \Drupal::entityTypeManager();
+          $parts = explode(':', $name);
+          $entity_type = $parts[0];
+          $entities = $entity_type_manager->getDefinitions();
+
+          if (!isset($entities[$entity_type])) {
+            continue;
+          }
+
+          /** @var \Drupal\Core\Entity\EntityInterface $entity */
+          $entity = $request->attributes->get($entity_type);
+
+          // Load the entity object if only entity ID was retrieved.
+          if (is_numeric($entity)) {
+            $entity = $entity_type_manager->getStorage($entity_type)->load($entity);
+          }
+
+          if (!is_object($entity)) {
+            continue;
+          }
+
+          // No child properties, so load the entity label.
+          if ($name == $entity_type) {
+            $label = $entity->label();
+            $replacements[$original] = $label;
+          }
+          // Load child properties via recursive tokens.
+          else {
+            $entity_tokens = \Drupal::token()->findWithPrefix($tokens, $entity_type);
+            $token_type = \Drupal::service('token.entity_mapper')->getTokenTypeForEntityType($entity_type);
+            $replacements += \Drupal::token()->generate($token_type, $entity_tokens, [$token_type => $entity], $options, $bubbleable_metadata);
+          }
+
           break;
       }
     }
