diff --git a/core/includes/common.inc b/core/includes/common.inc
index 79f16db..9933fde 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -210,10 +210,10 @@ function drupal_get_html_head($render = TRUE) {
  * previous request, that destination is returned. As such, a destination can
  * persist across multiple pages.
  *
- * @return
+ * @return array
  *   An associative array containing the key:
  *   - destination: The path provided via the destination query string or, if
- *     not available, the current path.
+ *     not available, the current path including the base path.
  *
  * @ingroup form_api
  */
@@ -229,7 +229,7 @@ function drupal_get_destination() {
     $destination = array('destination' => $query->get('destination'));
   }
   else {
-    $path = \Drupal::routeMatch()->getRouteName() ? Url::fromRouteMatch(\Drupal::routeMatch())->getInternalPath() : '';
+    $path = \Drupal::routeMatch()->getRouteObject() ? Url::fromRouteMatch(\Drupal::routeMatch())->toString() : '';
     $query = UrlHelper::buildQuery(UrlHelper::filterQueryParameters($query->all()));
     if ($query != '') {
       $path .= '?' . $query;
diff --git a/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
index bcab538..c7d4641 100644
--- a/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
@@ -52,7 +52,8 @@ public function checkRedirectUrl(FilterResponseEvent $event) {
     if ($response instanceOf RedirectResponse) {
       $options = array();
 
-      $destination = $event->getRequest()->query->get('destination');
+      $request = $event->getRequest();
+      $destination = $request->query->get('destination');
       // A destination from \Drupal::request()->query always overrides the
       // current RedirectResponse. We do not allow absolute URLs to be passed
       // via \Drupal::request()->query, as this can be an attack vector, with
@@ -61,15 +62,24 @@ public function checkRedirectUrl(FilterResponseEvent $event) {
       //   base path) are allowed.
       if ($destination) {
         if (!UrlHelper::isExternal($destination)) {
-          $destination = UrlHelper::parse($destination);
-
-          $path = $destination['path'];
-          $options['query'] = $destination['query'];
-          $options['fragment'] = $destination['fragment'];
-          // The 'Location' HTTP header contain an absolute URL.
-          $options['absolute'] = TRUE;
-
-          $response->setTargetUrl($this->urlGenerator->generateFromPath($path, $options));
+          // If the base path is included in the destination string, the
+          // UrlGenerator will not be used and the HTTP host and scheme are
+          // prepended.
+          if (strpos($destination, '/') === 0) {
+            $destination = $request->getSchemeAndHttpHost() . $destination;
+          }
+          else {
+            // @todo This code path supports all destination strings that do not
+            //   include the base path. Ideally we will be able to remove this.
+            $destination = UrlHelper::parse($destination);
+            $path = $destination['path'];
+            $options['query'] = $destination['query'];
+            $options['fragment'] = $destination['fragment'];
+            // The 'Location' HTTP header must always be absolute.
+            $options['absolute'] = TRUE;
+            $destination = $this->urlGenerator->generateFromPath($path, $options);
+          }
+          $response->setTargetUrl($destination);
         }
         elseif (UrlHelper::externalIsLocal($destination, $this->requestContext->getCompleteBaseUrl())) {
           $response->setTargetUrl($destination);
diff --git a/core/modules/menu_ui/src/MenuForm.php b/core/modules/menu_ui/src/MenuForm.php
index b5aef7b..c5c3187 100644
--- a/core/modules/menu_ui/src/MenuForm.php
+++ b/core/modules/menu_ui/src/MenuForm.php
@@ -275,8 +275,9 @@ protected function buildOverviewForm(array &$form, FormStateInterface $form_stat
       ),
     );
 
-    $destination = $this->getUrlGenerator()->getPathFromRoute('entity.menu.edit_form', array('menu' => $this->entity->id()));
-    $url = $destination = $this->url('entity.menu.add_link_form', array('menu' => $this->entity->id()), array('query' => array('destination' => $destination)));
+    $url = $destination = $this->url('entity.menu.add_link_form', ['menu' => $this->entity->id()], [
+      'query' => ['destination' => $this->entity->url('edit-form')],
+    ]);
     $form['links']['#empty'] = $this->t('There are no menu links yet. <a href="@url">Add link</a>.', array('@url' => $url));
     $links = $this->buildOverviewTreeForm($tree, $delta);
     foreach (Element::children($links) as $id) {
diff --git a/core/modules/user/src/Tests/UserAdminTest.php b/core/modules/user/src/Tests/UserAdminTest.php
index 135585d..de4749e 100644
--- a/core/modules/user/src/Tests/UserAdminTest.php
+++ b/core/modules/user/src/Tests/UserAdminTest.php
@@ -52,7 +52,7 @@ function testUserAdmin() {
     $this->assertText($admin_user->getUsername(), 'Found Admin user on admin users page');
 
     // Test for existence of edit link in table.
-    $link = $user_a->link(t('Edit'), 'edit-form', array('query' => array('destination' => 'admin/people')));
+    $link = $user_a->link(t('Edit'), 'edit-form', array('query' => array('destination' => $user_a->url('collection'))));
     $this->assertRaw($link, 'Found user A edit link on admin users page');
 
     // Test exposed filter elements.
