diff -u b/pathauto.services.yml b/pathauto.services.yml
--- b/pathauto.services.yml
+++ b/pathauto.services.yml
@@ -7,7 +7,7 @@
     arguments: ['@config.factory', '@pathauto.alias_storage_helper', '@language_manager', '@cache.discovery', '@transliteration', '@module_handler']
   pathauto.alias_storage_helper:
     class: Drupal\pathauto\AliasStorageHelper
-    arguments: ['@config.factory', '@entity_type.manager', '@database','@pathauto.verbose_messenger', '@string_translation']
+    arguments: ['@config.factory', '@path.alias_storage', '@entity_type.manager', '@database','@pathauto.verbose_messenger', '@string_translation']
     tags:
       - { name: backend_overridable }
   pathauto.alias_uniquifier:
diff -u b/src/AliasStorageHelper.php b/src/AliasStorageHelper.php
--- b/src/AliasStorageHelper.php
+++ b/src/AliasStorageHelper.php
@@ -7,6 +7,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Path\AliasStorageInterface;
 use Drupal\Core\Path\Entity\PathAlias;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\StringTranslation\TranslationInterface;
@@ -33,9 +34,16 @@
   protected $configFactory;
 
   /**
+   * Alias storage service.
+   *
+   * @var \Drupal\Core\Path\AliasStorageInterface
+   */
+  protected $aliasStorage;
+
+  /**
    * The path alias storage.
    *
-   * @var \Drupal\Core\Path\PathAliasStorageInterface
+   * @var \Drupal\Core\Path\PathAliasStorage
    */
   protected $pathAliasStorage;
 
@@ -58,6 +66,8 @@
    *
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
    *   The config factory.
+   * @param \Drupal\Core\Path\AliasStorageInterface $alias_storage
+   *   Alias storage service.
    * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
    *   The entity type manger.
    * @param \Drupal\Core\Database\Connection $database
@@ -67,8 +77,9 @@
    * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
    *   The string translation service.
    */
-  public function __construct(ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager, Connection $database, MessengerInterface $messenger, TranslationInterface $string_translation) {
+  public function __construct(ConfigFactoryInterface $config_factory, AliasStorageInterface $alias_storage, EntityTypeManagerInterface $entity_type_manager, Connection $database, MessengerInterface $messenger, TranslationInterface $string_translation) {
     $this->configFactory = $config_factory;
+    $this->aliasStorage = $alias_storage;
     $this->pathAliasStorage = $entity_type_manager->getStorage('path_alias');
     $this->database = $database;
     $this->messenger = $messenger;
@@ -152,16 +163,7 @@
    * {@inheritdoc}
    */
   public function loadBySource($source, $language = LanguageInterface::LANGCODE_NOT_SPECIFIED) {
-    if ($path_alias = $this->pathAliasStorage->lookupBySystemPath($source, $language)) {
-      return [
-        'source' => $path_alias->getPath(),
-        'alias' => $path_alias->getAlias(),
-        'pid' => $path_alias->id(),
-        'langcode' => $path_alias->language()->getId(),
-      ];
-    }
-
-    return FALSE;
+    return $this->aliasStorage->load(['path' => $source]);
   }
 
   /**
diff -u b/src/DeprecatedAliasStorageHelper.php b/src/AliasStorageHelper.php
--- b/src/DeprecatedAliasStorageHelper.php
+++ b/src/AliasStorageHelper.php
@@ -5,15 +5,17 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Database\Connection;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Path\AliasStorageInterface;
+use Drupal\Core\Path\Entity\PathAlias;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\StringTranslation\TranslationInterface;
 
 /**
  * Provides helper methods for accessing alias storage.
  */
-class DeprecatedAliasStorageHelper implements AliasStorageHelperInterface {
+class AliasStorageHelper implements AliasStorageHelperInterface {
 
   use StringTranslationTrait;
 
@@ -33,11 +35,18 @@
 
   /**
-   * The alias storage.
+   * Alias storage service.
    *
    * @var \Drupal\Core\Path\AliasStorageInterface
    */
   protected $aliasStorage;
 
   /**
+   * The path alias storage.
+   *
+   * @var \Drupal\Core\Path\PathAliasStorage
+   */
+  protected $pathAliasStorage;
+
+  /**
    * The database connection.
    *
@@ -58,7 +67,9 @@
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
    *   The config factory.
    * @param \Drupal\Core\Path\AliasStorageInterface $alias_storage
-   *   The alias storage.
+   *   Alias storage service.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manger.
    * @param \Drupal\Core\Database\Connection $database
    *   The database connection.
    * @param MessengerInterface $messenger
@@ -66,9 +77,10 @@
    * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
    *   The string translation service.
    */
-  public function __construct(ConfigFactoryInterface $config_factory, AliasStorageInterface $alias_storage, Connection $database, MessengerInterface $messenger, TranslationInterface $string_translation) {
+  public function __construct(ConfigFactoryInterface $config_factory, AliasStorageInterface $alias_storage, EntityTypeManagerInterface $entity_type_manager, Connection $database, MessengerInterface $messenger, TranslationInterface $string_translation) {
     $this->configFactory = $config_factory;
     $this->aliasStorage = $alias_storage;
+    $this->pathAliasStorage = $entity_type_manager->getStorage('path_alias');
     $this->database = $database;
     $this->messenger = $messenger;
     $this->stringTranslation = $string_translation;
@@ -87,82 +99,71 @@
   public function save(array $path, $existing_alias = NULL, $op = NULL) {
     $config = $this->configFactory->get('pathauto.settings');
 
+    // Set up all the variables needed to simplify the code below.
+    $source = $path['source'];
+    $alias = $path['alias'];
+    $langcode = $path['language'];
+    if ($existing_alias) {
+      /** @var \Drupal\Core\Path\PathAliasInterface $existing_alias */
+      $existing_alias = $this->pathAliasStorage->load($existing_alias['pid']);
+    }
+
     // Alert users if they are trying to create an alias that is the same as the
-    // internal path.
-    if ($path['source'] == $path['alias']) {
-      $this->messenger->addMessage($this->t('Ignoring alias %alias because it is the same as the internal path.', ['%alias' => $path['alias']]));
+    // internal system path.
+    if ($source == $alias) {
+      $this->messenger->addMessage($this->t('Ignoring alias %alias because it is the same as the internal path.', ['%alias' => $alias]));
       return NULL;
     }
 
-    // Skip replacing the current alias with an identical alias.
-    if (empty($existing_alias) || $existing_alias['alias'] != $path['alias']) {
-      $path += [
-        'pathauto' => TRUE,
-        'original' => $existing_alias,
-        'pid' => NULL,
-      ];
-
-      // If there is already an alias, respect some update actions.
-      if (!empty($existing_alias)) {
-        switch ($config->get('update_action')) {
-          case PathautoGeneratorInterface::UPDATE_ACTION_NO_NEW:
-            // Do not create the alias.
-            return NULL;
-
-          case PathautoGeneratorInterface::UPDATE_ACTION_LEAVE:
-            // Create a new alias instead of overwriting the existing by leaving
-            // $path['pid'] empty.
-            break;
-
-          case PathautoGeneratorInterface::UPDATE_ACTION_DELETE:
-            // The delete actions should overwrite the existing alias.
-            $path['pid'] = $existing_alias['pid'];
-            break;
-        }
+    // Update the existing alias if there is one and the configuration is set to
+    // replace it.
+    if ($existing_alias && $config->get('update_action') == PathautoGeneratorInterface::UPDATE_ACTION_DELETE) {
+      // Skip replacing the current alias with an identical alias.
+      if ($existing_alias->getAlias() == $alias) {
+        return NULL;
       }
 
-      // Save the path array.
-      $this->aliasStorage->save($path['source'], $path['alias'], $path['language'], $path['pid']);
+      $old_alias = $existing_alias->getAlias();
+      $existing_alias->setAlias($alias)->save();
 
-      if (!empty($existing_alias['pid'])) {
-        $this->messenger->addMessage($this->t(
-            'Created new alias %alias for %source, replacing %old_alias.',
-            [
-              '%alias' => $path['alias'],
-              '%source' => $path['source'],
-              '%old_alias' => $existing_alias['alias'],
-            ]
-          )
-        );
-      }
-      else {
-        $this->messenger->addMessage($this->t('Created new alias %alias for %source.', [
-          '%alias' => $path['alias'],
-          '%source' => $path['source'],
-        ]));
-      }
+      $this->messenger->addMessage($this->t('Created new alias %alias for %source, replacing %old_alias.', [
+        '%alias' => $alias,
+        '%source' => $source,
+        '%old_alias' => $old_alias,
+      ]));
+
+      $return = $existing_alias;
+    }
+    else {
+      // Otherwise, create a new alias.
+      $path_alias = PathAlias::create([
+        'path' => $source,
+        'alias' => $alias,
+        'langcode' => $langcode,
+      ]);
+      $path_alias->save();
+
+      $this->messenger->addMessage($this->t('Created new alias %alias for %source.', [
+        '%alias' => $path_alias->getAlias(),
+        '%source' => $path_alias->getPath(),
+      ]));
 
-      return $path;
+      $return = $path_alias;
     }
+
+    return [
+      'source' => $return->getPath(),
+      'alias' => $return->getAlias(),
+      'pid' => $return->id(),
+      'langcode' => $return->language()->getId(),
+    ];
   }
 
   /**
    * {@inheritdoc}
    */
   public function loadBySource($source, $language = LanguageInterface::LANGCODE_NOT_SPECIFIED) {
-    $alias = $this->aliasStorage->load([
-      'source' => $source,
-      'langcode' => $language,
-    ]);
-    // If no alias was fetched and if a language was specified, fallbacks to
-    // undefined language.
-    if (!$alias && ($language !== LanguageInterface::LANGCODE_NOT_SPECIFIED)) {
-      $alias = $this->aliasStorage->load([
-        'source' => $source,
-        'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
-      ]);
-    }
-    return $alias;
+    return $this->aliasStorage->load(['path' => $source]);
   }
 
   /**
@@ -170,16 +171,20 @@
    */
   public function deleteBySourcePrefix($source) {
     $pids = $this->loadBySourcePrefix($source);
-    if ($pids) {
-      $this->deleteMultiple($pids);
-    }
+    $path_aliases = $this->pathAliasStorage->loadMultiple($pids);
+    $this->pathAliasStorage->delete($path_aliases);
   }
 
   /**
    * {@inheritdoc}
    */
   public function deleteAll() {
-    $this->database->truncate('url_alias')->execute();
+    /** @var \Drupal\Core\Entity\Sql\TableMappingInterface $table_mapping */
+    $table_mapping = $this->pathAliasStorage->getTableMapping();
+    foreach ($table_mapping->getTableNames() as $table_name) {
+      $this->database->truncate($table_name)->execute();
+    }
+    $this->pathAliasStorage->resetCache();
   }
 
   /**
@@ -196,54 +201,37 @@
    * {@inheritdoc}
    */
   public function loadBySourcePrefix($source) {
-    $select = $this->database->select('url_alias', 'u')
-      ->fields('u', ['pid']);
-
-    $or_group = $select->orConditionGroup()
-      ->condition('source', $source)
-      ->condition('source', rtrim($source, '/') . '/%', 'LIKE');
-
-    return $select
-      ->condition($or_group)
-      ->execute()
-      ->fetchCol();
+    return $this->pathAliasStorage->getQuery('OR')
+      ->condition('path', $source, '=')
+      ->condition('path', rtrim($source, '/') . '/', 'STARTS_WITH')
+      ->execute();
   }
 
   /**
    * {@inheritdoc}
    */
   public function countBySourcePrefix($source) {
-    $select = $this->database->select('url_alias', 'u')
-      ->fields('u', ['pid']);
-
-    $or_group = $select->orConditionGroup()
-      ->condition('source', $source)
-      ->condition('source', rtrim($source, '/') . '/%', 'LIKE');
-
-    return $select
-      ->condition($or_group)
-      ->countQuery()
-      ->execute()
-      ->fetchField();
+    return $this->pathAliasStorage->getQuery('OR')
+      ->condition('path', $source, '=')
+      ->condition('path', rtrim($source, '/') . '/', 'STARTS_WITH')
+      ->count()
+      ->execute();
   }
 
   /**
    * {@inheritdoc}
    */
   public function countAll() {
-    return $this->database->select('url_alias')
-      ->countQuery()
-      ->execute()
-      ->fetchField();
+    return $this->pathAliasStorage->getQuery()
+      ->count()
+      ->execute();
   }
 
   /**
    * {@inheritdoc}
    */
   public function deleteMultiple($pids) {
-    foreach ($pids as $pid) {
-      $this->aliasStorage->delete(['pid' => $pid]);
-    }
+    $this->pathAliasStorage->delete($this->pathAliasStorage->loadMultiple($pids));
   }
 
 }
only in patch2:
unchanged:
--- /dev/null
+++ b/src/DeprecatedAliasStorageHelper.php
@@ -0,0 +1,249 @@
+<?php
+
+namespace Drupal\pathauto;
+
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Database\Connection;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Path\AliasStorageInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\Core\StringTranslation\TranslationInterface;
+
+/**
+ * Provides helper methods for accessing alias storage.
+ */
+class DeprecatedAliasStorageHelper implements AliasStorageHelperInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * Alias schema max length.
+   *
+   * @var int
+   */
+  protected $aliasSchemaMaxLength = 255;
+
+  /**
+   * Config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * The alias storage.
+   *
+   * @var \Drupal\Core\Path\AliasStorageInterface
+   */
+  protected $aliasStorage;
+
+  /**
+   * The database connection.
+   *
+   * @var \Drupal\Core\Database\Connection
+   */
+  protected $database;
+
+  /**
+   * The messenger.
+   *
+   * @var \Drupal\pathauto\MessengerInterface
+   */
+  protected $messenger;
+
+  /**
+   * The config factory.
+   *
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The config factory.
+   * @param \Drupal\Core\Path\AliasStorageInterface $alias_storage
+   *   The alias storage.
+   * @param \Drupal\Core\Database\Connection $database
+   *   The database connection.
+   * @param MessengerInterface $messenger
+   *   The messenger.
+   * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
+   *   The string translation service.
+   */
+  public function __construct(ConfigFactoryInterface $config_factory, AliasStorageInterface $alias_storage, Connection $database, MessengerInterface $messenger, TranslationInterface $string_translation) {
+    $this->configFactory = $config_factory;
+    $this->aliasStorage = $alias_storage;
+    $this->database = $database;
+    $this->messenger = $messenger;
+    $this->stringTranslation = $string_translation;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAliasSchemaMaxLength() {
+    return $this->aliasSchemaMaxLength;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function save(array $path, $existing_alias = NULL, $op = NULL) {
+    $config = $this->configFactory->get('pathauto.settings');
+
+    // Alert users if they are trying to create an alias that is the same as the
+    // internal path.
+    if ($path['source'] == $path['alias']) {
+      $this->messenger->addMessage($this->t('Ignoring alias %alias because it is the same as the internal path.', ['%alias' => $path['alias']]));
+      return NULL;
+    }
+
+    // Skip replacing the current alias with an identical alias.
+    if (empty($existing_alias) || $existing_alias['alias'] != $path['alias']) {
+      $path += [
+        'pathauto' => TRUE,
+        'original' => $existing_alias,
+        'pid' => NULL,
+      ];
+
+      // If there is already an alias, respect some update actions.
+      if (!empty($existing_alias)) {
+        switch ($config->get('update_action')) {
+          case PathautoGeneratorInterface::UPDATE_ACTION_NO_NEW:
+            // Do not create the alias.
+            return NULL;
+
+          case PathautoGeneratorInterface::UPDATE_ACTION_LEAVE:
+            // Create a new alias instead of overwriting the existing by leaving
+            // $path['pid'] empty.
+            break;
+
+          case PathautoGeneratorInterface::UPDATE_ACTION_DELETE:
+            // The delete actions should overwrite the existing alias.
+            $path['pid'] = $existing_alias['pid'];
+            break;
+        }
+      }
+
+      // Save the path array.
+      $this->aliasStorage->save($path['source'], $path['alias'], $path['language'], $path['pid']);
+
+      if (!empty($existing_alias['pid'])) {
+        $this->messenger->addMessage($this->t(
+            'Created new alias %alias for %source, replacing %old_alias.',
+            [
+              '%alias' => $path['alias'],
+              '%source' => $path['source'],
+              '%old_alias' => $existing_alias['alias'],
+            ]
+          )
+        );
+      }
+      else {
+        $this->messenger->addMessage($this->t('Created new alias %alias for %source.', [
+          '%alias' => $path['alias'],
+          '%source' => $path['source'],
+        ]));
+      }
+
+      return $path;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function loadBySource($source, $language = LanguageInterface::LANGCODE_NOT_SPECIFIED) {
+    $alias = $this->aliasStorage->load([
+      'source' => $source,
+      'langcode' => $language,
+    ]);
+    // If no alias was fetched and if a language was specified, fallbacks to
+    // undefined language.
+    if (!$alias && ($language !== LanguageInterface::LANGCODE_NOT_SPECIFIED)) {
+      $alias = $this->aliasStorage->load([
+        'source' => $source,
+        'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
+      ]);
+    }
+    return $alias;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteBySourcePrefix($source) {
+    $pids = $this->loadBySourcePrefix($source);
+    if ($pids) {
+      $this->deleteMultiple($pids);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteAll() {
+    $this->database->truncate('url_alias')->execute();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteEntityPathAll(EntityInterface $entity, $default_uri = NULL) {
+    $this->deleteBySourcePrefix('/' . $entity->toUrl('canonical')->getInternalPath());
+    if (isset($default_uri) && $entity->toUrl('canonical')->toString() != $default_uri) {
+      $this->deleteBySourcePrefix($default_uri);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function loadBySourcePrefix($source) {
+    $select = $this->database->select('url_alias', 'u')
+      ->fields('u', ['pid']);
+
+    $or_group = $select->orConditionGroup()
+      ->condition('source', $source)
+      ->condition('source', rtrim($source, '/') . '/%', 'LIKE');
+
+    return $select
+      ->condition($or_group)
+      ->execute()
+      ->fetchCol();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function countBySourcePrefix($source) {
+    $select = $this->database->select('url_alias', 'u')
+      ->fields('u', ['pid']);
+
+    $or_group = $select->orConditionGroup()
+      ->condition('source', $source)
+      ->condition('source', rtrim($source, '/') . '/%', 'LIKE');
+
+    return $select
+      ->condition($or_group)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function countAll() {
+    return $this->database->select('url_alias')
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteMultiple($pids) {
+    foreach ($pids as $pid) {
+      $this->aliasStorage->delete(['pid' => $pid]);
+    }
+  }
+
+}
