diff --git a/core/includes/batch.inc b/core/includes/batch.inc
index f84c01b..81d0e93 100644
--- a/core/includes/batch.inc
+++ b/core/includes/batch.inc
@@ -157,7 +157,7 @@ function _batch_progress_page() {
   $query_options['op'] = $new_op;
   $batch['url']->setOption('query', $query_options);
 
-  $url = $batch['url']->toString(TRUE)->getGeneratedUrl();
+  $url = $batch['url']->toString();
 
   $build = array(
     '#theme' => 'progress_bar',
diff --git a/core/includes/form.inc b/core/includes/form.inc
index b4c6a71..a478030 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -836,7 +836,7 @@ function batch_process($redirect = NULL, Url $url = NULL, $redirect_callback = N
       $query_options['op'] = 'finished';
       $error_url->setOption('query', $query_options);
 
-      $batch['error_message'] = t('Please continue to <a href=":error_url">the error page</a>', array(':error_url' => $error_url->toString(TRUE)->getGeneratedUrl()));
+      $batch['error_message'] = t('Please continue to <a href=":error_url">the error page</a>', array(':error_url' => $error_url->toString()));
 
       // Clear the way for the redirection to the batch processing page, by
       // saving and unsetting the 'destination', if there is any.
@@ -861,7 +861,7 @@ function batch_process($redirect = NULL, Url $url = NULL, $redirect_callback = N
         $function($batch_url->toString(), ['query' => $query_options]);
       }
       else {
-        return new RedirectResponse($batch_url->setAbsolute()->toString(TRUE)->getGeneratedUrl());
+        return new RedirectResponse($batch_url->setAbsolute()->toString());
       }
     }
     else {
diff --git a/core/lib/Drupal/Core/GeneratedUrl.php b/core/lib/Drupal/Core/GeneratedUrl.php
index f3bf658..70cd6b2 100644
--- a/core/lib/Drupal/Core/GeneratedUrl.php
+++ b/core/lib/Drupal/Core/GeneratedUrl.php
@@ -22,6 +22,9 @@ class GeneratedUrl extends BubbleableMetadata {
   /**
    * Gets the generated URL.
    *
+   * @deprecated in Drupal 8.3.x, will be removed before Drupal 9.0.0.
+   *   Use \Drupal\Core\GeneratedUrl::toString().
+   *
    * @return string
    */
   public function getGeneratedUrl() {
@@ -29,6 +32,15 @@ public function getGeneratedUrl() {
   }
 
   /**
+   * Gets the generated URL.
+   *
+   * @return string
+   */
+  public function toString() {
+    return $this->generatedUrl;
+  }
+
+  /**
    * Sets the generated URL.
    *
    * @param string $generated_url
diff --git a/core/lib/Drupal/Core/Render/Element/FormElement.php b/core/lib/Drupal/Core/Render/Element/FormElement.php
index 513f103..9ce03f0 100644
--- a/core/lib/Drupal/Core/Render/Element/FormElement.php
+++ b/core/lib/Drupal/Core/Render/Element/FormElement.php
@@ -179,7 +179,7 @@ public static function processAutocomplete(&$element, FormStateInterface $form_s
 
     if (!empty($element['#autocomplete_route_name'])) {
       $parameters = isset($element['#autocomplete_route_parameters']) ? $element['#autocomplete_route_parameters'] : array();
-      $url = Url::fromRoute($element['#autocomplete_route_name'], $parameters)->toString(TRUE);
+      $url = Url::fromRoute($element['#autocomplete_route_name'], $parameters)->generate();
       /** @var \Drupal\Core\Access\AccessManagerInterface $access_manager */
       $access_manager = \Drupal::service('access_manager');
       $access = $access_manager->checkNamedRoute($element['#autocomplete_route_name'], $parameters, \Drupal::currentUser(), TRUE);
@@ -191,7 +191,7 @@ public static function processAutocomplete(&$element, FormStateInterface $form_s
         $element['#attributes']['class'][] = 'form-autocomplete';
         $metadata->addAttachments(['library' => ['core/drupal.autocomplete']]);
         // Provide a data attribute for the JavaScript behavior to bind to.
-        $element['#attributes']['data-autocomplete-path'] = $url->getGeneratedUrl();
+        $element['#attributes']['data-autocomplete-path'] = $url->toString();
         $metadata = $metadata->merge($url);
       }
       $metadata
diff --git a/core/lib/Drupal/Core/Render/Element/RenderElement.php b/core/lib/Drupal/Core/Render/Element/RenderElement.php
index 1f39e10..f445252 100644
--- a/core/lib/Drupal/Core/Render/Element/RenderElement.php
+++ b/core/lib/Drupal/Core/Render/Element/RenderElement.php
@@ -356,11 +356,11 @@ public static function preRenderAjaxForm($element) {
 
       // Convert \Drupal\Core\Url object to string.
       if (isset($settings['url']) && $settings['url'] instanceof Url) {
-        $url = $settings['url']->setOptions($settings['options'])->toString(TRUE);
+        $url = $settings['url']->setOptions($settings['options'])->generate();
         BubbleableMetadata::createFromRenderArray($element)
           ->merge($url)
           ->applyTo($element);
-        $settings['url'] = $url->getGeneratedUrl();
+        $settings['url'] = $url->toString();
       }
       else {
         $settings['url'] = NULL;
diff --git a/core/lib/Drupal/Core/Render/MetadataBubblingUrlGenerator.php b/core/lib/Drupal/Core/Render/MetadataBubblingUrlGenerator.php
index de52da2..0821585 100644
--- a/core/lib/Drupal/Core/Render/MetadataBubblingUrlGenerator.php
+++ b/core/lib/Drupal/Core/Render/MetadataBubblingUrlGenerator.php
@@ -95,7 +95,7 @@ public function generate($name, $parameters = array(), $referenceType = self::AB
     $options['absolute'] = is_bool($referenceType) ? $referenceType : $referenceType === self::ABSOLUTE_URL;
     $generated_url = $this->generateFromRoute($name, $parameters, $options, TRUE);
     $this->bubble($generated_url);
-    return $generated_url->getGeneratedUrl();
+    return $generated_url->toString();
   }
 
   /**
@@ -106,7 +106,7 @@ public function generateFromRoute($name, $parameters = array(), $options = array
     if (!$collect_bubbleable_metadata) {
       $this->bubble($generated_url, $options);
     }
-    return $collect_bubbleable_metadata ? $generated_url : $generated_url->getGeneratedUrl();
+    return $collect_bubbleable_metadata ? $generated_url : $generated_url->toString();
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Template/TwigExtension.php b/core/lib/Drupal/Core/Template/TwigExtension.php
index 7d67ff9..2c2df09 100644
--- a/core/lib/Drupal/Core/Template/TwigExtension.php
+++ b/core/lib/Drupal/Core/Template/TwigExtension.php
@@ -258,7 +258,7 @@ public function getUrl($name, $parameters = array(), $options = array()) {
     $generated_url = $this->urlGenerator->generateFromRoute($name, $parameters, $options, TRUE);
 
     // Return as render array, so we can bubble the bubbleable metadata.
-    $build = ['#markup' => $generated_url->getGeneratedUrl()];
+    $build = ['#markup' => $generated_url->toString()];
     $generated_url->applyTo($build);
     return $build;
   }
diff --git a/core/lib/Drupal/Core/Url.php b/core/lib/Drupal/Core/Url.php
index e7624d8..4a24d97 100644
--- a/core/lib/Drupal/Core/Url.php
+++ b/core/lib/Drupal/Core/Url.php
@@ -734,6 +734,16 @@ public function toString($collect_bubbleable_metadata = FALSE) {
 
     return $this->urlGenerator()->generateFromRoute($this->getRouteName(), $this->getRouteParameters(), $this->getOptions(), $collect_bubbleable_metadata);
   }
+  /**
+   * Generates a object representation with the a rendered URL and metadata.
+   *
+   * @see \Drupal\Core\Url::toString
+   *
+   * @return \Drupal\Core\GeneratedUrl
+   */
+  public function generate() {
+    return $this->toString(TRUE);
+  }
 
   /**
    * Returns the route information for a render array.
diff --git a/core/lib/Drupal/Core/Utility/LinkGenerator.php b/core/lib/Drupal/Core/Utility/LinkGenerator.php
index 0ec5280..9639f09 100644
--- a/core/lib/Drupal/Core/Utility/LinkGenerator.php
+++ b/core/lib/Drupal/Core/Utility/LinkGenerator.php
@@ -141,6 +141,7 @@ public function generate($text, Url $url) {
 
     // Allow other modules to modify the structure of the link.
     $this->moduleHandler->alter('link', $variables);
+    /** @var \Drupal\Core\Url $url */
     $url = $variables['url'];
 
     // Move attributes out of options since generateFromRoute() doesn't need
@@ -159,11 +160,11 @@ public function generate($text, Url $url) {
       unset($attributes['href']);
     }
     else {
-      $generated_url = $url->toString(TRUE);
+      $generated_url = $url->generate();
       $generated_link = GeneratedLink::createFromObject($generated_url);
       // The result of the URL generator is a plain-text URL to use as the href
       // attribute, and it is escaped by \Drupal\Core\Template\Attribute.
-      $attributes['href'] = $generated_url->getGeneratedUrl();
+      $attributes['href'] = $generated_url->toString();
     }
 
     if (!($variables['text'] instanceof MarkupInterface)) {
diff --git a/core/modules/comment/src/Controller/CommentController.php b/core/modules/comment/src/Controller/CommentController.php
index 5f1b504..05cf8e2 100644
--- a/core/modules/comment/src/Controller/CommentController.php
+++ b/core/modules/comment/src/Controller/CommentController.php
@@ -124,8 +124,8 @@ public function commentPermalink(Request $request, CommentInterface $comment) {
       // Find the current display page for this comment.
       $page = $this->entityManager()->getStorage('comment')->getDisplayOrdinal($comment, $field_definition->getSetting('default_mode'), $field_definition->getSetting('per_page'));
       // @todo: Cleaner sub request handling.
-      $subrequest_url = $entity->urlInfo()->setOption('query', ['page' => $page])->toString(TRUE);
-      $redirect_request = Request::create($subrequest_url->getGeneratedUrl(), 'GET', $request->query->all(), $request->cookies->all(), array(), $request->server->all());
+      $subrequest_url = $entity->urlInfo()->setOption('query', ['page' => $page])->generate();
+      $redirect_request = Request::create($subrequest_url->toString(), 'GET', $request->query->all(), $request->cookies->all(), array(), $request->server->all());
       // Carry over the session to the subrequest.
       if ($session = $request->getSession()) {
         $redirect_request->setSession($session);
diff --git a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
index 90b0b61..f9e493c 100644
--- a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
@@ -784,7 +784,7 @@ public function buildOverviewForm(array $form, FormStateInterface $form_state) {
       $info[] = $this->t('If your previous site has private files to be migrated, a copy of your files directory must be accessible on the host this site is on.');
       $info[] = $this->t('In general, enable all modules on this site that are enabled on the previous site. For example, if you have used the book module on the previous site then you must enable the book module on this site for that data to be available on this site.');
       $info[] = $this->t('Put this site into <a href=":url">maintenance mode</a>.', [
-        ':url' => Url::fromRoute('system.site_maintenance_mode')->toString(TRUE)->getGeneratedUrl(),
+        ':url' => Url::fromRoute('system.site_maintenance_mode')->toString(),
       ]);
 
       $form['info'] = [
diff --git a/core/modules/rdf/rdf.module b/core/modules/rdf/rdf.module
index 3108ee1..c7bfa75 100644
--- a/core/modules/rdf/rdf.module
+++ b/core/modules/rdf/rdf.module
@@ -238,7 +238,7 @@ function rdf_comment_storage_load($comments) {
     $entity = $comment->getCommentedEntity();
     // The current function is a storage level hook, so avoid to bubble
     // bubbleable metadata, because it can be outside of a render context.
-    $comment->rdf_data['entity_uri'] = $entity->toUrl()->toString(TRUE)->getGeneratedUrl();
+    $comment->rdf_data['entity_uri'] = $entity->toUrl()->toString();
     if ($comment->hasParentComment()) {
       $comment->rdf_data['pid_uri'] = $comment->getParentComment()->url();
     }
diff --git a/core/modules/rest/src/Plugin/rest/resource/EntityResource.php b/core/modules/rest/src/Plugin/rest/resource/EntityResource.php
index a5cb361..12a1d5d 100644
--- a/core/modules/rest/src/Plugin/rest/resource/EntityResource.php
+++ b/core/modules/rest/src/Plugin/rest/resource/EntityResource.php
@@ -170,8 +170,8 @@ public function post(EntityInterface $entity = NULL) {
       // 201 Created responses return the newly created entity in the response
       // body. These responses are not cacheable, so we add no cacheability
       // metadata here.
-      $url = $entity->urlInfo('canonical', ['absolute' => TRUE])->toString(TRUE);
-      return new ModifiedResourceResponse($entity, 201, ['Location' => $url->getGeneratedUrl()]);
+      $url = $entity->urlInfo('canonical', ['absolute' => TRUE])->generate();
+      return new ModifiedResourceResponse($entity, 201, ['Location' => $url->toString()]);
     }
     catch (EntityStorageException $e) {
       throw new HttpException(500, 'Internal Server Error', $e);
diff --git a/core/modules/system/src/Controller/DbUpdateController.php b/core/modules/system/src/Controller/DbUpdateController.php
index f378631..53c141b 100644
--- a/core/modules/system/src/Controller/DbUpdateController.php
+++ b/core/modules/system/src/Controller/DbUpdateController.php
@@ -218,7 +218,7 @@ protected function info(Request $request) {
 
     $info[] = $this->t("<strong>Back up your code</strong>. Hint: when backing up module code, do not leave that backup in the 'modules' or 'sites/*/modules' directories as this may confuse Drupal's auto-discovery mechanism.");
     $info[] = $this->t('Put your site into <a href=":url">maintenance mode</a>.', array(
-      ':url' => Url::fromRoute('system.site_maintenance_mode')->toString(TRUE)->getGeneratedUrl(),
+      ':url' => Url::fromRoute('system.site_maintenance_mode')->toString(),
     ));
     $info[] = $this->t('<strong>Back up your database</strong>. This process will change your database values and in case of emergency you may need to revert to a backup.');
     $info[] = $this->t('Install your new files in the appropriate location, as described in the handbook.');
@@ -398,7 +398,7 @@ protected function results(Request $request) {
     $dblog_exists = $this->moduleHandler->moduleExists('dblog');
     if ($dblog_exists && $this->account->hasPermission('access site reports')) {
       $log_message = $this->t('All errors have been <a href=":url">logged</a>.', array(
-        ':url' => Url::fromRoute('dblog.overview')->setOption('base_url', $base_url)->toString(TRUE)->getGeneratedUrl(),
+        ':url' => Url::fromRoute('dblog.overview')->setOption('base_url', $base_url)->toString(),
       ));
     }
     else {
@@ -406,7 +406,7 @@ protected function results(Request $request) {
     }
 
     if (!empty($_SESSION['update_success'])) {
-      $message = '<p>' . $this->t('Updates were attempted. If you see no failures below, you may proceed happily back to your <a href=":url">site</a>. Otherwise, you may need to update your database manually.', array(':url' => Url::fromRoute('<front>')->setOption('base_url', $base_url)->toString(TRUE)->getGeneratedUrl())) . ' ' . $log_message . '</p>';
+      $message = '<p>' . $this->t('Updates were attempted. If you see no failures below, you may proceed happily back to your <a href=":url">site</a>. Otherwise, you may need to update your database manually.', array(':url' => Url::fromRoute('<front>')->setOption('base_url', $base_url)->toString())) . ' ' . $log_message . '</p>';
     }
     else {
       $last = reset($_SESSION['updates_remaining']);
@@ -519,7 +519,7 @@ public function requirements($severity, array $requirements, Request $request) {
     // @todo Revisit once https://www.drupal.org/node/2548095 is in. Something
     // like Url::fromRoute('system.db_update')->setOptions() should then be
     // possible.
-    $try_again_url = Url::fromUri($request->getUriForPath(''))->setOptions(['query' => $options])->toString(TRUE)->getGeneratedUrl();
+    $try_again_url = Url::fromUri($request->getUriForPath(''))->setOptions(['query' => $options])->toString();
 
     $build['status_report'] = array(
       '#theme' => 'status_report',
diff --git a/core/modules/system/src/Tests/Theme/EngineTwigTest.php b/core/modules/system/src/Tests/Theme/EngineTwigTest.php
index 51d092d..2d40e1a 100644
--- a/core/modules/system/src/Tests/Theme/EngineTwigTest.php
+++ b/core/modules/system/src/Tests/Theme/EngineTwigTest.php
@@ -77,7 +77,7 @@ public function testTwigLinkGenerator() {
     $link_generator = $this->container->get('link_generator');
 
 
-    $generated_url = Url::fromRoute('user.register', [], ['absolute' => TRUE])->toString(TRUE)->getGeneratedUrl();
+    $generated_url = Url::fromRoute('user.register', [], ['absolute' => TRUE])->toString();
     $expected = [
       'link via the linkgenerator: ' . $link_generator->generate('register', new Url('user.register', [], ['absolute' => TRUE])),
       'link via the linkgenerator: ' . $link_generator->generate('register', new Url('user.register', [], ['absolute' => TRUE, 'attributes' => ['foo' => 'bar']])),
diff --git a/core/modules/system/system.tokens.inc b/core/modules/system/system.tokens.inc
index 66b5c7f..951ab42 100644
--- a/core/modules/system/system.tokens.inc
+++ b/core/modules/system/system.tokens.inc
@@ -131,21 +131,21 @@ function system_tokens($type, $tokens, array $data, array $options, BubbleableMe
           /** @var \Drupal\Core\GeneratedUrl $result */
           $result = \Drupal::url('<front>', array(), $url_options, TRUE);
           $bubbleable_metadata->addCacheableDependency($result);
-          $replacements[$original] = $result->getGeneratedUrl();
+          $replacements[$original] = $result->toString();
           break;
 
         case 'url-brief':
           /** @var \Drupal\Core\GeneratedUrl $result */
           $result = \Drupal::url('<front>', array(), $url_options, TRUE);
           $bubbleable_metadata->addCacheableDependency($result);
-          $replacements[$original] = preg_replace(array('!^https?://!', '!/$!'), '', $result->getGeneratedUrl());
+          $replacements[$original] = preg_replace(array('!^https?://!', '!/$!'), '', $result->toString());
           break;
 
         case 'login-url':
           /** @var \Drupal\Core\GeneratedUrl $result */
           $result = \Drupal::url('user.page', [], $url_options, TRUE);
           $bubbleable_metadata->addCacheableDependency($result);
-          $replacements[$original] = $result->getGeneratedUrl();
+          $replacements[$original] = $result->toString();
           break;
       }
     }
diff --git a/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php b/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php
index b0c1ca3..2df9ad9 100644
--- a/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php
+++ b/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php
@@ -545,7 +545,7 @@ protected function assertGenerateFromRoute($route_name, array $route_parameters,
 
     // Second, test with it set to TRUE.
     $generated_url = $this->generator->generateFromRoute($route_name, $route_parameters, $options, TRUE);
-    $this->assertSame($expected_url, $generated_url->getGeneratedUrl());
+    $this->assertSame($expected_url, $generated_url->toString());
     $this->assertEquals($expected_bubbleable_metadata, BubbleableMetadata::createFromObject($generated_url));
   }
 
diff --git a/core/tests/Drupal/Tests/Core/UrlTest.php b/core/tests/Drupal/Tests/Core/UrlTest.php
index 5324c26..be5f6d6 100644
--- a/core/tests/Drupal/Tests/Core/UrlTest.php
+++ b/core/tests/Drupal/Tests/Core/UrlTest.php
@@ -393,7 +393,7 @@ public function testToString($urls) {
       $path = array_pop($this->map[$index]);
       $this->assertSame($path, $url->toString());
       $generated_url = $url->toString(TRUE);
-      $this->assertSame($path, $generated_url->getGeneratedUrl());
+      $this->assertSame($path, $generated_url->toString());
       $this->assertInstanceOf('\Drupal\Core\Render\BubbleableMetadata', $generated_url);
     }
   }
diff --git a/core/tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php b/core/tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php
index b2d7700..83b5e62 100644
--- a/core/tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php
+++ b/core/tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php
@@ -80,7 +80,7 @@ public function testAssembleWithExternalUrl($uri, array $options, $expected) {
     $this->setupRequestStack(FALSE);
     $this->assertEquals($expected, $this->unroutedUrlAssembler->assemble($uri, $options));
     $generated_url = $this->unroutedUrlAssembler->assemble($uri, $options, TRUE);
-    $this->assertEquals($expected, $generated_url->getGeneratedUrl());
+    $this->assertEquals($expected, $generated_url->toString());
     $this->assertInstanceOf('\Drupal\Core\Render\BubbleableMetadata', $generated_url);
   }
 
