diff --git a/core/lib/Drupal/Core/Path/AliasStorage.php b/core/lib/Drupal/Core/Path/AliasStorage.php
index aa6989c..3c5fd67 100644
--- a/core/lib/Drupal/Core/Path/AliasStorage.php
+++ b/core/lib/Drupal/Core/Path/AliasStorage.php
@@ -81,13 +81,10 @@ public function save($source, $alias, $langcode = Language::LANGCODE_NOT_SPECIFI
   /**
    * {@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)
       ->execute()
       ->fetchAssoc();
   }
@@ -95,12 +92,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 68c7cdd..e1280d2 100644
--- a/core/lib/Drupal/Core/Path/AliasStorageInterface.php
+++ b/core/lib/Drupal/Core/Path/AliasStorageInterface.php
@@ -37,28 +37,71 @@
   public function save($source, $alias, $langcode = Language::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 $conditions
-   *   An array of query conditions.
+   * @param int $pid
+   *   Unique path alias identifier.
+   *
+   * @return mixed[]|bool
+   *   FALSE if no alias was found or an associative array containing the
+   */
+  public function load($pid);
+
+  /**
+   * Fetches 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.
    *
    * @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 load($conditions);
+  public function loadByPath($path, $langcode = NULL);
 
   /**
-   * Deletes a URL alias.
+   * 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.
    *
-   * @param array $conditions
-   *   An array of criteria.
+   * @return mixed[]|bool
+   *   FALSE if no alias was found or an associative array containing the
+   *   following keys:
+   */
+  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/content_translation/src/Form/ContentTranslationDeleteForm.php b/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php
index 3435315..9f6f726 100644
--- a/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php
+++ b/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php
@@ -78,8 +78,7 @@ public function submitForm(array &$form, array &$form_state) {
     // @todo This should be taken care of by the Path module.
     if (\Drupal::moduleHandler()->moduleExists('path')) {
       $path = $this->entity->getSystemPath();
-      $conditions = array('source' => $path, 'langcode' => $this->language->id);
-      \Drupal::service('path.alias_storage')->delete($conditions);
+      \Drupal::service('path.alias_storage')->deleteByPath($path, $this->language->id);
     }
 
     $form_state['redirect_route'] = $this->getCancelRoute();
diff --git a/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php.orig b/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php.orig
new file mode 100644
index 0000000..3435315
--- /dev/null
+++ b/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php.orig
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\content_translation\Form\ContentTranslationDeleteForm.
+ */
+
+namespace Drupal\content_translation\Form;
+
+use Drupal\Core\Form\ConfirmFormBase;
+use Drupal\Core\Url;
+
+/**
+ * Delete translation form for content_translation module.
+ */
+class ContentTranslationDeleteForm extends ConfirmFormBase {
+
+  /**
+   * The entity whose translation is being deleted.
+   *
+   * @var \Drupal\Core\Entity\EntityInterface
+   */
+  protected $entity;
+
+  /**
+   * The language of the translation being deleted.
+   *
+   * @var \Drupal\Core\Language\Language
+   */
+  protected $language;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'content_translation_delete_confirm';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, $_entity_type_id = NULL, $language = NULL) {
+    $this->entity = $this->getRequest()->attributes->get($_entity_type_id);
+    $this->language = language_load($language);
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConfirmText() {
+    return $this->t('Delete');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuestion() {
+    return $this->t('Are you sure you want to delete the @language translation of %label?', array('@language' => $this->language->name, '%label' => $this->entity->label()));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelRoute() {
+    return $this->entity->urlInfo('drupal:content-translation-overview');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    // Remove the translated values.
+    $this->entity->removeTranslation($this->language->id);
+    $this->entity->save();
+
+    // Remove any existing path alias for the removed translation.
+    // @todo This should be taken care of by the Path module.
+    if (\Drupal::moduleHandler()->moduleExists('path')) {
+      $path = $this->entity->getSystemPath();
+      $conditions = array('source' => $path, 'langcode' => $this->language->id);
+      \Drupal::service('path.alias_storage')->delete($conditions);
+    }
+
+    $form_state['redirect_route'] = $this->getCancelRoute();
+  }
+
+}
diff --git a/core/modules/locale/src/Tests/LocalePathTest.php b/core/modules/locale/src/Tests/LocalePathTest.php
index cae7f4b..083fdb8 100644
--- a/core/modules/locale/src/Tests/LocalePathTest.php
+++ b/core/modules/locale/src/Tests/LocalePathTest.php
@@ -114,7 +114,7 @@ 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 bec9a4e..bee59fa 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateUrlAliasTest.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateUrlAliasTest.php
@@ -48,20 +48,10 @@ protected function setUp() {
   public function testUrlAlias() {
     $migration = entity_load('migration', 'd6_url_alias');
     // Test that the field exists.
-    $conditions = array(
-      'source' => 'node/1',
-      'alias' => 'alias-one',
-      'langcode' => 'en',
-    );
-    $path = \Drupal::service('path.alias_storage')->load($conditions);
+    $path = \Drupal::service('path.alias_storage')->loadByAlias('alias-one', 'en');
     $this->assertNotNull($path, "Path alias for node/1 successfully loaded.");
     $this->assertEqual(array(1), $migration->getIdMap()->lookupDestinationID(array($path['pid'])), "Test IdMap");
-    $conditions = array(
-      'source' => 'node/2',
-      'alias' => 'alias-two',
-      'langcode' => 'en',
-    );
-    $path = \Drupal::service('path.alias_storage')->load($conditions);
+    $path = \Drupal::service('path.alias_storage')->loadByAlias('alias-two', 'en');;
     $this->assertNotNull($path, "Path alias for node/2 successfully loaded.");
 
     // Test that we can re-import using the UrlAlias destination.
@@ -78,7 +68,7 @@ public function testUrlAlias() {
     $executable = new MigrateExecutable($migration, $this);
     $executable->import();
 
-    $path = \Drupal::service('path.alias_storage')->load(array('pid' => $path['pid']));
+    $path = \Drupal::service('path.alias_storage')->load($path['pid']);
     $this->assertEqual($path['alias'], 'new-url-alias');
   }
 
diff --git a/core/modules/path/src/Form/DeleteForm.php b/core/modules/path/src/Form/DeleteForm.php
index e7b3307..fafc317 100644
--- a/core/modules/path/src/Form/DeleteForm.php
+++ b/core/modules/path/src/Form/DeleteForm.php
@@ -73,7 +73,7 @@ public function getCancelRoute() {
    * Overrides \Drupal\Core\Form\ConfirmFormBase::buildForm().
    */
   public function buildForm(array $form, array &$form_state, $pid = NULL) {
-    $this->pathAlias = $this->aliasStorage->load(array('pid' => $pid));
+    $this->pathAlias = $this->aliasStorage->load($pid);
 
     $form = parent::buildForm($form, $form_state);
 
@@ -86,7 +86,7 @@ public function buildForm(array $form, array &$form_state, $pid = NULL) {
    * Implements \Drupal\Core\Form\FormInterface::submitForm().
    */
   public function submitForm(array &$form, array &$form_state) {
-    $this->aliasStorage->delete(array('pid' => $this->pathAlias['pid']));
+    $this->aliasStorage->delete($this->pathAlias['pid']);
 
     $form_state['redirect'] = 'admin/config/search/path';
   }
diff --git a/core/modules/path/src/Form/EditForm.php b/core/modules/path/src/Form/EditForm.php
index 0c1a7ab..a2a5f9b 100644
--- a/core/modules/path/src/Form/EditForm.php
+++ b/core/modules/path/src/Form/EditForm.php
@@ -26,7 +26,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 ed44d86..8acef9b 100644
--- a/core/modules/path/src/Plugin/Field/FieldType/PathItem.php
+++ b/core/modules/path/src/Plugin/Field/FieldType/PathItem.php
@@ -69,7 +69,7 @@ public function insert() {
   public function update() {
     // Delete old alias if user erased it.
     if ($this->pid && !$this->alias) {
-      \Drupal::service('path.alias_storage')->delete(array('pid' => $this->pid));
+      \Drupal::service('path.alias_storage')->delete($this->pid);
     }
     // Only save a non-empty alias.
     elseif ($this->alias) {
@@ -85,7 +85,7 @@ public function update() {
   public function delete() {
     // Delete all aliases associated with this entity.
     $entity = $this->getEntity();
-    \Drupal::service('path.alias_storage')->delete(array('source' => $entity->getSystemPath()));
+    \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 ac465d9..9f924fb 100644
--- a/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php
+++ b/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php
@@ -32,11 +32,8 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     $entity = $items->getEntity();
     $path = array();
     if (!$entity->isNew()) {
-      $conditions = array('source' => $entity->getSystemPath());
-      if ($items->getLangcode() != Language::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 0e99995..435a039 100644
--- a/core/modules/system/src/Tests/Path/AliasTest.php
+++ b/core/modules/system/src/Tests/Path/AliasTest.php
@@ -52,7 +52,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,7 +205,7 @@ function testWhitelist() {
     $this->assertNull($whitelist->get($this->randomName()));
 
     // Remove the user alias again, whitelist entry should be removed.
-    $aliasStorage->delete(array('source' => 'user/1'));
+    $aliasStorage->deleteByPath('user/1');
     $aliasManager->cacheClear();
     $this->assertNull($whitelist->get('user'));
     $this->assertTrue($whitelist->get('admin'));
