diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 50dc8f3..b32f577 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -358,9 +358,6 @@ function drupal_environment_initialize() {
     $_SERVER['HTTP_HOST'] = '';
   }
 
-  // @todo Refactor with the Symfony Request object.
-  _current_path(request_path());
-
   // Enforce E_STRICT, but allow users to set levels not part of E_STRICT.
   error_reporting(E_STRICT | E_ALL | error_reporting());
 
@@ -1910,18 +1907,6 @@ function request_path() {
 }
 
 /**
- * @todo This is a temporary function pending refactoring Drupal to use
- *   Symfony's Request object exclusively.
- */
-function _current_path($path = NULL) {
-  static $current_path = '';
-  if (isset($path)) {
-    $current_path = $path;
-  }
-  return $current_path;
-}
-
-/**
  * Returns a component of the current Drupal path.
  *
  * When viewing a page at the path "admin/structure/types", for example, arg(0)
@@ -1957,9 +1942,7 @@ function arg($index = NULL, $path = NULL) {
   $arguments = &$drupal_static_fast['arguments'];
 
   if (!isset($path)) {
-    // @todo The public function current_path() is not available during early
-    //   bootstrap.
-    $path = _current_path();
+    $path = current_path();
   }
   if (!isset($arguments[$path])) {
     $arguments[$path] = explode('/', $path);
diff --git a/core/includes/path.inc b/core/includes/path.inc
index 6043749..e4674f5 100644
--- a/core/includes/path.inc
+++ b/core/includes/path.inc
@@ -82,18 +82,7 @@ function drupal_match_path($path, $patterns) {
  * @see request_path()
  */
 function current_path() {
-  // @todo Remove the check for whether the request service exists and the
-  // fallback code below, once the path alias logic has been figured out in
-  // http://drupal.org/node/1269742.
-  if (\Drupal::getContainer()->isScopeActive('request')) {
-    $path = \Drupal::request()->attributes->get('_system_path');
-    if ($path !== NULL) {
-      return $path;
-    }
-  }
-  // If we are outside the request scope, fall back to using the path stored in
-  // _current_path().
-  return _current_path();
+  return \Drupal::request()->attributes->get('_system_path');
 }
 
 /**
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/InstallerTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/InstallerTestBase.php
index e735ce3..306fd68 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/InstallerTestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/InstallerTestBase.php
@@ -130,13 +130,6 @@ protected function setUp() {
       ->set('interface.default', 'test_mail_collector')
       ->save();
 
-    // When running from run-tests.sh we don't get an empty current path which
-    // would indicate we're on the home page.
-    $path = current_path();
-    if (empty($path)) {
-      _current_path('run-tests');
-    }
-
     $this->isInstalled = TRUE;
   }
 
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
index a120883..71d47a4 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
@@ -930,13 +930,6 @@ protected function setUp() {
     // @todo Test-specific setUp() methods may set up further fixtures; find a
     //   way to execute this after setUp() is done, or to eliminate it entirely.
     $this->resetAll();
-
-    // Temporary fix so that when running from run-tests.sh we don't get an
-    // empty current path which would indicate we're on the home page.
-    $path = current_path();
-    if (empty($path)) {
-      _current_path('run-tests');
-    }
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
index 7d5e16e..3e0d57d 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
@@ -133,14 +133,14 @@ public function testNegotiatorPriorities() {
    * Ensure page-front template suggestion is added when on front page.
    */
   function testFrontPageThemeSuggestion() {
-    $original_path = _current_path();
-    // Set the current path to node because theme_get_suggestions() will query
+    $original_path = \Drupal::request()->attributes->get('_system_path');
+    // Set the system path to node because theme_get_suggestions() will query
     // it to see if we are on the front page.
     \Drupal::config('system.site')->set('page.front', 'node')->save();
-    _current_path('node');
+    \Drupal::request()->attributes->set('_system_path', 'node');
     $suggestions = theme_get_suggestions(array('node'), 'page');
     // Set it back to not annoy the batch runner.
-    _current_path($original_path);
+    \Drupal::request()->attributes->set('_system_path', $original_path);
     $this->assertTrue(in_array('page__front', $suggestions), 'Front page template was suggested.');
   }
 
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewPreviewForm.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewPreviewForm.php
index e2d2899..2b60f58 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/ViewPreviewForm.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewPreviewForm.php
@@ -70,17 +70,21 @@ public function form(array $form, array &$form_state) {
     );
 
     // Add the arguments textfield
+    if (!empty($form_state['values']['view_args'])) {
+      $preview_args = $form_state['values']['view_args'];
+    }
+    else {
+      $preview_args = \Drupal::request()->query->get('_preview_args');
+    }
     $form['controls']['view_args'] = array(
       '#type' => 'textfield',
       '#title' => $this->t('Preview with contextual filters:'),
       '#description' => $this->t('Separate contextual filter values with a "/". For example, %example.', array('%example' => '40/12/10')),
       '#id' => 'preview-args',
+      '#default_value' => $preview_args,
     );
 
-    $args = array();
-    if (!empty($form_state['values']['view_args'])) {
-      $args = explode('/', $form_state['values']['view_args']);
-    }
+    $args = !empty($preview_args) ? explode('/', $preview_args) : array();
 
     if (!empty($form_state['show_preview']) || !empty($form_state['input']['js'])) {
       $form['preview'] = array(
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
index 52d99b2..9a6550b8 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
@@ -564,8 +564,7 @@ public function endQueryCapture() {
   }
 
   public function renderPreview($display_id, $args = array()) {
-    // Save the current path so it can be restored before returning from this function.
-    $old_q = current_path();
+    $request = \Drupal::request();
 
     // Determine where the query and performance statistics should be output.
     $config = \Drupal::config('views.settings');
@@ -593,9 +592,9 @@ public function renderPreview($display_id, $args = array()) {
       // AJAX happens via HTTP POST but everything expects exposed data to
       // be in GET. Copy stuff but remove ajax-framework specific keys.
       // If we're clicking on links in a preview, though, we could actually
-      // have some input in the query parameters, so we merge request() and
-      // query() to ensure we get it all.
-      $exposed_input = array_merge(\Drupal::request()->request->all(), \Drupal::request()->query->all());
+      // have some input in the query parameters, so we merge ->request and
+      // ->query to ensure we get it all.
+      $exposed_input = array_merge($request->request->all(), $request->query->all());
       foreach (array('view_name', 'view_display_id', 'view_args', 'view_path', 'view_dom_id', 'pager_element', 'view_base_path', 'ajax_html_ids', 'ajax_page_state', 'form_id', 'form_build_id', 'form_token') as $key) {
         if (isset($exposed_input[$key])) {
           unset($exposed_input[$key]);
@@ -617,13 +616,13 @@ public function renderPreview($display_id, $args = array()) {
       // Make view links come back to preview.
       $this->override_path = 'admin/structure/views/view/' . $this->id() . '/preview/' . $display_id;
 
-      // Also override the current path so we get the pager.
-      $original_path = current_path();
-      $q = _current_path($this->override_path);
+      // Override the system path so we get the pager.
+      $original_path = $request->attributes->get('_system_path');
+      $override_path = $this->override_path;
       if ($args) {
-        $q .= '/' . implode('/', $args);
-        _current_path($q);
+        $request->query->set('_preview_args', implode('/', $args));
       }
+      $request->attributes->set('_system_path', $override_path);
 
       // Suppress contextual links of entities within the result set during a
       // Preview.
@@ -653,7 +652,8 @@ public function renderPreview($display_id, $args = array()) {
 
       // Reset variables.
       unset($this->override_path);
-      _current_path($original_path);
+      $request->attributes->set('_system_path', $original_path);
+      $request->query->remove('_preview_args');
 
       // Prepare the query information and statistics to show either above or
       // below the view preview.
@@ -757,7 +757,6 @@ public function renderPreview($display_id, $args = array()) {
       $output .= $preview . drupal_render($table);
     }
 
-    _current_path($old_q);
     return $output;
   }
 
