diff --git a/tests/src/Functional/TokenCurrentPageTest.php b/tests/src/Functional/TokenCurrentPageTest.php
index 2770cfe..d5470f6 100644
--- a/tests/src/Functional/TokenCurrentPageTest.php
+++ b/tests/src/Functional/TokenCurrentPageTest.php
@@ -35,6 +35,8 @@ class TokenCurrentPageTest extends TokenTestBase {
       '[current-page:page-number]' => 1,
       '[current-page:query:foo]' => NULL,
       '[current-page:query:bar]' => NULL,
+      '[current-page:node:nid]' => NULL,
+      '[current-page:taxonomy_term:tid]' => NULL,
       // Deprecated tokens
       '[current-page:arg:0]' => 'user',
       '[current-page:arg:1]' => 'login',
@@ -59,6 +61,8 @@ class TokenCurrentPageTest extends TokenTestBase {
       '[current-page:page-number]' => 1,
       '[current-page:query:foo]' => 'bar',
       '[current-page:query:bar]' => NULL,
+      '[current-page:node:nid]' => $node->id(),
+      '[current-page:taxonomy_term:tid]' => NULL,
       // Deprecated tokens
       '[current-page:arg:0]' => 'node',
       '[current-page:arg:1]' => 1,
diff --git a/token.tokens.inc b/token.tokens.inc
index 4b43404..9e16068 100755
--- a/token.tokens.inc
+++ b/token.tokens.inc
@@ -293,6 +293,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'] = [
@@ -782,6 +795,52 @@ function token_tokens($type, array $tokens, array $data = [], array $options = [
             $page = $pager_page_array[0];
           }
           $replacements[$original] = (int) $page + 1;
+          break;
+        default:
+          /*
+           * This is the case that can handle the current-page:object token.
+           * We need to start by adding the url.path cache context. We need
+           * to do this regardless of whether or not the object actually exists.
+           * Otherwise, we could imagine a block that is first rendered on a
+           * custom route for which there is no current-page:object. If we then
+           * viewed a node that has this same block, we could see a cached version
+           * of the block instead of seeing a new rendering of the block that has the
+           * current-page:object token replaced with the new current page's node.
+           */
+          $bubbleable_metadata->addCacheContexts(['url.path']);
+          $entity_type_manager = \Drupal::entityTypeManager();
+          $parts = explode(':', $name);
+          $entity_type = $parts[0];
+          $entities = $entity_type_manager->getDefinitions();
+
+          if (!isset($entities[$entity_type])) {
+            break;
+          }
+
+          /** @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)) {
+            break;
+          }
+
+          // 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;
       }
     }
