diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index d33d1ee..b5678cf 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -364,9 +364,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());
 
@@ -1956,69 +1953,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)
- * returns "admin", arg(1) returns "structure", and arg(2) returns "types".
- *
- * Avoid use of this function where possible, as resulting code is hard to
- * read. In menu callback functions, attempt to use named arguments. See the
- * explanation in menu.inc for how to construct callbacks that take arguments.
- * When attempting to use this function to load an element from the current
- * path, e.g. loading the node on a node page, use menu_get_object() instead.
- *
- * @param $index
- *   The index of the component, where each component is separated by a '/'
- *   (forward-slash), and where the first component has an index of 0 (zero).
- * @param $path
- *   A path to break into components. Defaults to the path of the current page.
- *
- * @return
- *   The component specified by $index, or NULL if the specified component was
- *   not found. If called without arguments, it returns an array containing all
- *   the components of the current path.
- */
-function arg($index = NULL, $path = NULL) {
-  // Even though $arguments doesn't need to be resettable for any functional
-  // reasons (the result of explode() does not depend on any run-time
-  // information), it should be resettable anyway in case a module needs to
-  // free up the memory used by it.
-  // Use the advanced drupal_static() pattern, since this is called very often.
-  static $drupal_static_fast;
-  if (!isset($drupal_static_fast)) {
-    $drupal_static_fast['arguments'] = &drupal_static(__FUNCTION__);
-  }
-  $arguments = &$drupal_static_fast['arguments'];
-
-  if (!isset($path)) {
-    // @todo The public function current_path() is not available during early
-    //   bootstrap.
-    $path = _current_path();
-  }
-  if (!isset($arguments[$path])) {
-    $arguments[$path] = explode('/', $path);
-  }
-  if (!isset($index)) {
-    return $arguments[$path];
-  }
-  if (isset($arguments[$path][$index])) {
-    return $arguments[$path][$index];
-  }
-}
-
-/**
  * Initializes and returns the class loader.
  *
  * The class loader is responsible for lazy-loading all PSR-0 compatible
diff --git a/core/includes/path.inc b/core/includes/path.inc
index 6043749..94aeeb0 100644
--- a/core/includes/path.inc
+++ b/core/includes/path.inc
@@ -82,18 +82,56 @@ 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;
-    }
+  return \Drupal::request()->attributes->get('_system_path');
+}
+
+/**
+ * Returns a component of the current Drupal path.
+ *
+ * When viewing a page at the path "admin/structure/types", for example, arg(0)
+ * returns "admin", arg(1) returns "structure", and arg(2) returns "types".
+ *
+ * Avoid use of this function where possible, as resulting code is hard to
+ * read. In menu callback functions, attempt to use named arguments. See the
+ * explanation in menu.inc for how to construct callbacks that take arguments.
+ * When attempting to use this function to load an element from the current
+ * path, e.g. loading the node on a node page, use menu_get_object() instead.
+ *
+ * @param $index
+ *   The index of the component, where each component is separated by a '/'
+ *   (forward-slash), and where the first component has an index of 0 (zero).
+ * @param $path
+ *   A path to break into components. Defaults to the path of the current page.
+ *
+ * @return
+ *   The component specified by $index, or NULL if the specified component was
+ *   not found. If called without arguments, it returns an array containing all
+ *   the components of the current path.
+ */
+function arg($index = NULL, $path = NULL) {
+  // Even though $arguments doesn't need to be resettable for any functional
+  // reasons (the result of explode() does not depend on any run-time
+  // information), it should be resettable anyway in case a module needs to
+  // free up the memory used by it.
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['arguments'] = &drupal_static(__FUNCTION__);
+  }
+  $arguments = &$drupal_static_fast['arguments'];
+
+  if (!isset($path)) {
+    $path = current_path();
+  }
+  if (!isset($arguments[$path])) {
+    $arguments[$path] = explode('/', $path);
+  }
+  if (!isset($index)) {
+    return $arguments[$path];
+  }
+  if (isset($arguments[$path][$index])) {
+    return $arguments[$path][$index];
   }
-  // If we are outside the request scope, fall back to using the path stored in
-  // _current_path().
-  return _current_path();
 }
 
 /**
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/InstallerTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/InstallerTestBase.php
index 899c7d8..7eeee5a 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 340b555..d31ab47 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/ViewUI.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
index 0aabe85..8c54b34 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);
+        $override_path .= '/' . implode('/', $args);
       }
+      $request->attributes->set('_system_path', $override_path);
 
       // Suppress contextual links of entities within the result set during a
       // Preview.
@@ -653,7 +652,7 @@ public function renderPreview($display_id, $args = array()) {
 
       // Reset variables.
       unset($this->override_path);
-      _current_path($original_path);
+      $request->attributes->set('_system_path', $original_path);
 
       // Prepare the query information and statistics to show either above or
       // below the view preview.
@@ -757,7 +756,6 @@ public function renderPreview($display_id, $args = array()) {
       $output .= $preview . drupal_render($table);
     }
 
-    _current_path($old_q);
     return $output;
   }
 
