diff --git a/core/lib/Drupal/Core/Path/AliasStorage.php b/core/lib/Drupal/Core/Path/AliasStorage.php
index 899c39e..d24c1ac 100644
--- a/core/lib/Drupal/Core/Path/AliasStorage.php
+++ b/core/lib/Drupal/Core/Path/AliasStorage.php
@@ -95,13 +95,10 @@ public function save($source, $alias, $langcode = LanguageInterface::LANGCODE_NO
   /**
    * {@inheritdoc}
    */
-  public function load($conditions) {
-    $select = $this->connection->select('url_alias');
-    foreach ($conditions as $field => $value) {
-      $select->condition($field, $value);
-    }
-    return $select
+  public function load($pid) {
+    return $this->connection->select('url_alias')
       ->fields('url_alias')
+      ->condition('pid', $pid)
       ->orderBy('pid', 'DESC')
       ->range(0, 1)
       ->execute()
@@ -111,12 +108,79 @@ public function load($conditions) {
   /**
    * {@inheritdoc}
    */
-  public function delete($conditions) {
-    $path = $this->load($conditions);
-    $query = $this->connection->delete('url_alias');
-    foreach ($conditions as $field => $value) {
-      $query->condition($field, $value);
+  public function loadByPath($path, $langcode = NULL) {
+    $query = $this->connection->select('url_alias')
+      ->fields('url_alias')
+      ->condition('source', $path);
+
+    if (isset($langcode)) {
+      $query->condition('langcode', $langcode);
+    }
+
+    return $query->execute()
+      ->fetchAssoc();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function loadByAlias($alias, $langcode = NULL) {
+    $query = $this->connection->select('url_alias')
+      ->fields('url_alias')
+      ->condition('alias', $alias);
+
+    if (isset($langcode)) {
+      $query->condition('langcode', $langcode);
+    }
+
+    return $query->execute()
+      ->fetchAssoc();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function delete($pid) {
+    $path = $this->load($pid);
+    $deleted = $this->connection->delete('url_alias')
+      ->condition('pid', $pid)
+      ->execute();
+    // @todo Switch to using an event for this instead of a hook.
+    $this->moduleHandler->invokeAll('path_delete', array($path));
+    return $deleted;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteByPath($path, $langcode = NULL) {
+    $path = $this->loadByPath($path, $langcode);
+    $query = $this->connection->delete('url_alias')
+      ->condition('source', $path);
+
+    if (isset($langcode)) {
+      $query->condition('langcode', $langcode);
     }
+
+    $deleted = $query->execute();
+    // @todo Switch to using an event for this instead of a hook.
+    $this->moduleHandler->invokeAll('path_delete', array($path));
+    return $deleted;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteByAlias($alias, $langcode = NULL) {
+    $path = $this->loadByAlias($alias, $langcode);
+
+    $query = $this->connection->delete('url_alias')
+      ->condition('alias', $alias);
+
+    if (isset($langcode)) {
+      $query->condition('langcode', $langcode);
+    }
+
     $deleted = $query->execute();
     // @todo Switch to using an event for this instead of a hook.
     $this->moduleHandler->invokeAll('path_delete', array($path));
diff --git a/core/lib/Drupal/Core/Path/AliasStorageInterface.php b/core/lib/Drupal/Core/Path/AliasStorageInterface.php
index 5ac77a3..6e0e89c 100644
--- a/core/lib/Drupal/Core/Path/AliasStorageInterface.php
+++ b/core/lib/Drupal/Core/Path/AliasStorageInterface.php
@@ -42,10 +42,11 @@
   public function save($source, $alias, $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED, $pid = NULL);
 
   /**
-   * Fetches a specific URL alias from the database.
+   * Fetches a specific URL alias from the database using a pid.
    *
    * @param array $conditions
-   *   An array of query conditions.
+   * @param int $pid
+   *   Unique path alias identifier.
    *
    * @return array|false
    *   FALSE if no alias was found or an associative array containing the
@@ -55,15 +56,68 @@ public function save($source, $alias, $langcode = LanguageInterface::LANGCODE_NO
    *   - pid (int): Unique path alias identifier.
    *   - langcode (string): The language code of the alias.
    */
-  public function load($conditions);
+  public function load($pid);
 
   /**
-   * Deletes a URL alias.
+   * Fetches a specific URL alias from the database based on path.
    *
-   * @param array $conditions
-   *   An array of criteria.
+   * @param string $source
+   *   The internal system path.
+   * @param string|null $langcode
+   *   The language code of the alias.
+   *
+   * @return mixed[]|bool
+   *   FALSE if no alias was found or an associative array containing the
+   *   following keys:
+   *   - source (string): The internal system path.
+   *   - alias (string): The URL alias.
+   *   - pid (int): Unique path alias identifier.
+   *   - langcode (string): The language code of the alias.
+   */
+  public function loadByPath($path, $langcode = NULL);
+
+  /**
+   * Fetches a specific URL alias from the database based on alias.
+   *
+   * @param string $alias
+   *   The URL alias.
+   * @param string|null $langcode
+   *   The language code of the alias.
+   *
+   * @return mixed[]|bool
+   *   FALSE if no alias was found or an associative array containing the
+   *   - pid (int): Unique path alias identifier.
+   *   - langcode (string): The language code of the alias.
+   */
+  public function loadByAlias($alias, $langcode = NULL);
+
+   /**
+   * Deletes a URL alias using a pid.
+   *
+   * @param int $pid
+   *   Unique path alias identifier.
+   */
+  public function delete($pid);
+
+  /**
+   * Deletes a specific URL alias from the database based on path.
+   *
+   * @param string $source
+   *   The internal system path.
+   * @param string|null $langcode
+   *   The language code of the alias.
+   */
+  public function deleteByPath($path, $langcode = NULL);
+
+  /**
+   * Deletes a specific URL alias from the database based on alias.
+   *
+   * @param string $alias
+   *   The URL alias.
+   * @param string|null $langcode
+   *   The language code of the alias.
    */
-  public function delete($conditions);
+  public function deleteByAlias($alias, $langcode = NULL);
 
   /**
    * Pre-loads path alias information for a given list of source paths.
diff --git a/core/modules/locale/src/Tests/LocalePathTest.php b/core/modules/locale/src/Tests/LocalePathTest.php
index 820814e..a3ffae7 100644
--- a/core/modules/locale/src/Tests/LocalePathTest.php
+++ b/core/modules/locale/src/Tests/LocalePathTest.php
@@ -112,7 +112,7 @@ public function testPathLanguageConfiguration() {
     // Same check for language 'xx'.
     $lookup_path = $this->container->get('path.alias_manager')->getAliasByPath('/node/' . $node->id(), $prefix);
     $this->assertEqual('/' . $custom_language_path, $lookup_path, 'Custom language alias has priority.');
-    $this->container->get('path.alias_storage')->delete($edit);
+    $this->container->get('path.alias_storage')->deleteByPath($edit['source'], $edit['langcode']);
 
     // Create language nodes to check priority of aliases.
     $first_node = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1, 'langcode' => 'en'));
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateUrlAliasTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateUrlAliasTest.php
index 3651890..8be9035 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateUrlAliasTest.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateUrlAliasTest.php
@@ -1,3 +1,4 @@
+    $path = \Drupal::service('path.alias_storage')->load($path['pid']);
 <?php
 
 /**
@@ -35,7 +36,7 @@ protected function setUp() {
   public function testUrlAlias() {
     $migration = entity_load('migration', 'd6_url_alias');
     // Test that the field exists.
-    $conditions = array(
+    $path = \Drupal::service('path.alias_storage')->loadByAlias('alias-two', 'en');;
       'source' => '/node/1',
       'alias' => '/alias-one',
       'langcode' => 'en',
@@ -43,7 +44,7 @@ public function testUrlAlias() {
     $path = \Drupal::service('path.alias_storage')->load($conditions);
     $this->assertNotNull($path, "Path alias for node/1 successfully loaded.");
     $this->assertIdentical($migration->getIdMap()->lookupDestinationID(array($path['pid'])), array('1'), "Test IdMap");
-    $conditions = array(
+    $path = \Drupal::service('path.alias_storage')->loadByAlias('alias-one', 'en');
       'source' => '/node/2',
       'alias' => '/alias-two',
       'langcode' => 'en',
diff --git a/core/modules/path/src/Form/DeleteForm.php b/core/modules/path/src/Form/DeleteForm.php
index 80251dc..e7dffa2 100644
--- a/core/modules/path/src/Form/DeleteForm.php
+++ b/core/modules/path/src/Form/DeleteForm.php
@@ -76,7 +76,7 @@ public function getCancelUrl() {
    * {@inheritdoc}
    */
   public function buildForm(array $form, FormStateInterface $form_state, $pid = NULL) {
-    $this->pathAlias = $this->aliasStorage->load(array('pid' => $pid));
+    $this->pathAlias = $this->aliasStorage->load($pid);
 
     $form = parent::buildForm($form, $form_state);
 
@@ -87,7 +87,7 @@ public function buildForm(array $form, FormStateInterface $form_state, $pid = NU
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-    $this->aliasStorage->delete(array('pid' => $this->pathAlias['pid']));
+    $this->aliasStorage->delete($this->pathAlias['pid']);
 
     $form_state->setRedirect('path.admin_overview');
   }
diff --git a/core/modules/path/src/Form/EditForm.php b/core/modules/path/src/Form/EditForm.php
index fc85a42..63605d8 100644
--- a/core/modules/path/src/Form/EditForm.php
+++ b/core/modules/path/src/Form/EditForm.php
@@ -27,7 +27,7 @@ public function getFormId() {
    * {@inheritdoc}
    */
   protected function buildPath($pid) {
-    return $this->aliasStorage->load(array('pid' => $pid));
+    return $this->aliasStorage->load($pid);
   }
 
   /**
diff --git a/core/modules/path/src/Plugin/Field/FieldType/PathItem.php b/core/modules/path/src/Plugin/Field/FieldType/PathItem.php
index 9815e68..c3b76cb 100644
--- a/core/modules/path/src/Plugin/Field/FieldType/PathItem.php
+++ b/core/modules/path/src/Plugin/Field/FieldType/PathItem.php
@@ -83,7 +83,7 @@ public function postSave($update) {
   public function delete() {
     // Delete all aliases associated with this entity.
     $entity = $this->getEntity();
-    \Drupal::service('path.alias_storage')->delete(array('source' => '/' . $entity->urlInfo()->getInternalPath()));
+    \Drupal::service('path.alias_storage')->deleteByPath($entity->getSystemPath());
   }
 
   /**
diff --git a/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php b/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php
index 07f1712..94b4051 100644
--- a/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php
+++ b/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php
@@ -34,10 +34,8 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     $path = array();
     if (!$entity->isNew()) {
       $conditions = array('source' => '/' . $entity->urlInfo()->getInternalPath());
-      if ($items->getLangcode() != LanguageInterface::LANGCODE_NOT_SPECIFIED) {
-        $conditions['langcode'] = $items->getLangcode();
-      }
-      $path = \Drupal::service('path.alias_storage')->load($conditions);
+      $langcode = $items->getLangcode() != Language::LANGCODE_NOT_SPECIFIED ? $items->getLangcode() : NULL;
+      $path = \Drupal::service('path.alias_storage')->loadByPath($entity->getSystemPath(), $langcode);
       if ($path === FALSE) {
         $path = array();
       }
diff --git a/core/modules/system/src/Tests/Path/AliasTest.php b/core/modules/system/src/Tests/Path/AliasTest.php
index 4281905..9185b7e 100644
--- a/core/modules/system/src/Tests/Path/AliasTest.php
+++ b/core/modules/system/src/Tests/Path/AliasTest.php
@@ -46,7 +46,7 @@ function testCRUD() {
     //Load a few aliases
     foreach ($aliases as $alias) {
       $pid = $alias['pid'];
-      $loadedAlias = $aliasStorage->load(array('pid' => $pid));
+      $loadedAlias = $aliasStorage->load($pid);
       $this->assertEqual($loadedAlias, $alias, format_string('Loaded the expected path with pid %pid.', array('%pid' => $pid)));
     }
 
@@ -69,7 +69,7 @@ function testCRUD() {
     //Delete a few aliases
     foreach ($aliases as $alias) {
       $pid = $alias['pid'];
-      $aliasStorage->delete(array('pid' => $pid));
+      $aliasStorage->delete($pid);
 
       $result = $connection->query('SELECT * FROM {url_alias} WHERE pid = :pid', array(':pid' => $pid));
       $rows = $result->fetchAll();
@@ -142,9 +142,19 @@ function testLookupPath() {
     $this->assertEqual($aliasManager->getAliasByPath($path['source']), $path['alias'], 'Recently created English alias returned.');
     $this->assertEqual($aliasManager->getPathByAlias($path['alias']), $path['source'], 'Recently created English source returned.');
 
-    // Remove the English aliases, which should cause a fallback to the most
-    // recently created language-neutral alias, 'bar'.
-    $aliasStorage->delete(array('langcode' => 'en'));
+    $path_item = $aliasStorage->loadByAlias($path['alias']);
+    $this->assertEqual($path_item['source'], $path['source'], 'Load by alias works.');
+    $aliasManager->cacheClear();
+
+    // Remove the new English alias. This should fall back to the alias of
+    // users/Dries.
+    $aliasStorage->deleteByAlias($path['alias'], 'en');
+    $aliasManager->cacheClear();
+    $this->assertEqual($aliasManager->getAliasByPath($path['source']), 'users/Dries', 'Path lookup falls back to original English alias.');
+
+    // Remove the remaining English aliases, which should cause a fallback to
+    // the most recently created language-neutral alias, 'bar'.
+    $aliasStorage->deleteByPath($path['source'], 'en');
     // Hook that clears cache is not executed with unit tests.
     $aliasManager->cacheClear();
     $this->assertEqual($aliasManager->getAliasByPath($path['source']), '/bar', 'Path lookup falls back to recently created language-neutral alias.');
@@ -195,6 +205,7 @@ function testWhitelist() {
     $this->assertNull($whitelist->get($this->randomMachineName()));
 
     // Remove the user alias again, whitelist entry should be removed.
+    $aliasStorage->deleteByPath('user/1');
     $aliasStorage->delete(array('source' => '/user/1'));
     $aliasManager->cacheClear();
     $this->assertNull($whitelist->get('user'));
