diff --git a/src/Tests/TokenCurrentPageTest.php b/src/Tests/TokenCurrentPageTest.php
index 8f82d1d..797d28a 100644
--- a/src/Tests/TokenCurrentPageTest.php
+++ b/src/Tests/TokenCurrentPageTest.php
@@ -41,26 +41,27 @@ class TokenCurrentPageTest extends TokenTestBase {
 
     $this->drupalCreateContentType(array('type' => 'page'));
     $node = $this->drupalCreateNode(array('title' => 'Node title', 'path' => array('alias' => '/node-alias')));
+    $query = array('foo' => 'bar');
     $tokens = array(
       '[current-page:title]' => 'Node title',
-      '[current-page:url]' => $node->toUrl('canonical', array('absolute' => TRUE))->toString(),
-      '[current-page:url:absolute]' => $node->toUrl('canonical', array('absolute' => TRUE))->toString(),
-      '[current-page:url:relative]' => $node->toUrl()->toString(),
+      '[current-page:url]' => $node->toUrl('canonical', array('absolute' => TRUE, 'query' => $query))->toString(),
+      '[current-page:url:absolute]' => $node->toUrl('canonical', array('absolute' => TRUE, 'query' => $query))->toString(),
+      '[current-page:url:relative]' => $node->toUrl('canonical', array('query' => $query))->toString(),
       '[current-page:url:alias]' => '/node-alias',
       '[current-page:url:args:value:0]' => 'node-alias',
       '[current-page:url:args:value:1]' => NULL,
-      '[current-page:url:unaliased]' => $node->toUrl('canonical', array('absolute' => TRUE, 'alias' => TRUE))->toString(),
+      '[current-page:url:unaliased]' => $node->toUrl('canonical', array('absolute' => TRUE, 'alias' => TRUE, 'query' => $query))->toString(),
       '[current-page:url:unaliased:args:value:0]' => 'node',
       '[current-page:url:unaliased:args:value:1]' => $node->id(),
       '[current-page:url:unaliased:args:value:2]' => NULL,
       '[current-page:page-number]' => 1,
-      '[current-page:query:foo]' => 'bar',
+      '[current-page:query:foo]' => $query['foo'],
       '[current-page:query:bar]' => NULL,
       // Deprecated tokens
       '[current-page:arg:0]' => 'node',
       '[current-page:arg:1]' => 1,
       '[current-page:arg:2]' => NULL,
     );
-    $this->assertPageTokens("/node/{$node->id()}", $tokens, array(), array('url_options' => array('query' => array('foo' => 'bar'))));
+    $this->assertPageTokens("/node/{$node->id()}", $tokens, array(), array('url_options' => array('query' => $query)));
   }
 }
diff --git a/token.tokens.inc b/token.tokens.inc
index 0486920..18cd659 100644
--- a/token.tokens.inc
+++ b/token.tokens.inc
@@ -738,6 +738,14 @@ function token_tokens($type, array $tokens, array $data = array(), array $option
     $request = \Drupal::request();
     foreach ($tokens as $name => $original) {
       switch ($name) {
+        case 'query:?':
+          $bubbleable_metadata->addCacheContexts(['url.path']);
+          $url = Url::createFromRequest($request)
+            ->setOptions($url_options)
+            ->setOption('query', $request->query->all())
+            ->toString();
+          $replacements[$original] = $url;
+          break;
         case 'title':
           $route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
           if ($route) {
@@ -749,6 +757,7 @@ function token_tokens($type, array $tokens, array $data = array(), array $option
           $bubbleable_metadata->addCacheContexts(['url.path']);
           $url = Url::createFromRequest($request)
             ->setOptions($url_options)
+            ->setOption('query', $request->query->all())
             ->toString();
           $replacements[$original] = $url;
           break;
@@ -791,6 +800,7 @@ function token_tokens($type, array $tokens, array $data = array(), array $option
     // Chained token relationships.
     if ($url_tokens = \Drupal::token()->findWithPrefix($tokens, 'url')) {
       $url = Url::createFromRequest($request);
+      $url->setOption('query', $request->query->all());
       // Add cache contexts to ensure this token functions on a per-path basis
       $bubbleable_metadata->addCacheContexts(['url.path']);
       $replacements += \Drupal::token()->generate('url', $url_tokens, array('url' => $url), $options, $bubbleable_metadata);
