diff --git a/core/modules/path/migration_templates/d6_url_alias.yml b/core/modules/path/migration_templates/d6_url_alias.yml
index 7fcbaec..220ac4d 100644
--- a/core/modules/path/migration_templates/d6_url_alias.yml
+++ b/core/modules/path/migration_templates/d6_url_alias.yml
@@ -6,7 +6,6 @@ source:
   plugin: d6_url_alias
   constants:
     slash: '/'
-
 process:
   source:
     plugin: concat
diff --git a/core/modules/path/migration_templates/d7_url_alias.yml b/core/modules/path/migration_templates/d7_url_alias.yml
new file mode 100644
index 0000000..1acecfe
--- /dev/null
+++ b/core/modules/path/migration_templates/d7_url_alias.yml
@@ -0,0 +1,22 @@
+id: d7_url_alias
+label: Drupal 7 URL aliases
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_url_alias
+  constants:
+    slash: '/'
+process:
+  source:
+    plugin: concat
+    source:
+      - constants/slash
+      - source
+  alias:
+    plugin: concat
+    source:
+      - constants/slash
+      - alias
+  langcode: language
+destination:
+  plugin: url_alias
diff --git a/core/modules/path/src/Plugin/migrate/source/UrlAliasBase.php b/core/modules/path/src/Plugin/migrate/source/UrlAliasBase.php
new file mode 100644
index 0000000..a45f404
--- /dev/null
+++ b/core/modules/path/src/Plugin/migrate/source/UrlAliasBase.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\path\Plugin\migrate\source\UrlAliasBase.
+ */
+
+namespace Drupal\path\Plugin\migrate\source;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Base class for the url_alias source plugins.
+ */
+abstract class UrlAliasBase extends DrupalSqlBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    return $this->select('url_alias', 'ua')->fields('ua');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return array(
+      'pid' => $this->t('The numeric identifier of the path alias.'),
+      'language' => $this->t('The language code of the url alias.'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['pid']['type'] = 'integer';
+    return $ids;
+  }
+
+}
diff --git a/core/modules/path/src/Plugin/migrate/source/d6/UrlAlias.php b/core/modules/path/src/Plugin/migrate/source/d6/UrlAlias.php
index 5286a63..df77f13 100644
--- a/core/modules/path/src/Plugin/migrate/source/d6/UrlAlias.php
+++ b/core/modules/path/src/Plugin/migrate/source/d6/UrlAlias.php
@@ -7,46 +7,25 @@
 
 namespace Drupal\path\Plugin\migrate\source\d6;
 
-use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+use Drupal\path\Plugin\migrate\source\UrlAliasBase;
 
 /**
- * Drupal 6 url aliases source from database.
+ * URL aliases source from database.
  *
  * @MigrateSource(
  *   id = "d6_url_alias"
  * )
  */
-class UrlAlias extends DrupalSqlBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function query() {
-    $query = $this->select('url_alias', 'ua')
-      ->fields('ua', array('pid', 'src', 'dst', 'language'));
-    $query->orderBy('pid');
-
-    return $query;
-  }
+class UrlAlias extends UrlAliasBase {
 
   /**
    * {@inheritdoc}
    */
   public function fields() {
-    return array(
-      'pid' => $this->t('The numeric identifier of the path alias.'),
-      'src' => $this->t('The internal path.'),
-      'dst' => $this->t('The user set path alias.'),
-      'language' => $this->t('The language code of the url alias.'),
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getIds() {
-    $ids['pid']['type'] = 'integer';
-    return $ids;
+    $fields = parent::fields();
+    $fields['src'] = $this->t('The internal system path.');
+    $fields['dst'] = $this->t('The path alias.');
+    return $fields;
   }
 
 }
diff --git a/core/modules/path/src/Plugin/migrate/source/d7/UrlAlias.php b/core/modules/path/src/Plugin/migrate/source/d7/UrlAlias.php
new file mode 100644
index 0000000..dac1552
--- /dev/null
+++ b/core/modules/path/src/Plugin/migrate/source/d7/UrlAlias.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\path\Plugin\migrate\source\d7\UrlAlias.
+ */
+
+namespace Drupal\path\Plugin\migrate\source\d7;
+
+use Drupal\path\Plugin\migrate\source\UrlAliasBase;
+
+/**
+ * URL aliases source from database.
+ *
+ * @MigrateSource(
+ *   id = "d7_url_alias"
+ * )
+ */
+class UrlAlias extends UrlAliasBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    $fields = parent::fields();
+    $fields['source'] = $this->t('The internal system path.');
+    $fields['alias'] = $this->t('The path alias.');
+    return $fields;
+  }
+
+}
diff --git a/core/modules/path/src/Tests/Migrate/d6/MigrateUrlAliasTest.php b/core/modules/path/src/Tests/Migrate/d6/MigrateUrlAliasTest.php
index bf08192..3ae3e96 100644
--- a/core/modules/path/src/Tests/Migrate/d6/MigrateUrlAliasTest.php
+++ b/core/modules/path/src/Tests/Migrate/d6/MigrateUrlAliasTest.php
@@ -39,7 +39,6 @@ protected function setUp() {
    * Test the url alias migration.
    */
   public function testUrlAlias() {
-    $migration = entity_load('migration', 'd6_url_alias');
     // Test that the field exists.
     $conditions = array(
       'source' => '/node/1',
diff --git a/core/modules/path/src/Tests/Migrate/d7/MigrateUrlAliasTest.php b/core/modules/path/src/Tests/Migrate/d7/MigrateUrlAliasTest.php
new file mode 100644
index 0000000..0adf49a
--- /dev/null
+++ b/core/modules/path/src/Tests/Migrate/d7/MigrateUrlAliasTest.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\path\Tests\Migrate\d7\MigrateUrlAliasTest.
+ */
+
+namespace Drupal\path\Tests\Migrate\d7;
+
+use Drupal\migrate_drupal\Tests\d7\MigrateDrupal7TestBase;
+
+/**
+ * Tests URL alias migration.
+ *
+ * @group path
+ */
+class MigrateUrlAliasTest extends MigrateDrupal7TestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['path'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installSchema('system', ['url_alias']);
+    $this->executeMigration('d7_url_alias');
+  }
+
+  /**
+   * Test the URL alias migration.
+   */
+  public function testUrlAlias() {
+    $path = \Drupal::service('path.alias_storage')->load([
+      'source' => '/taxonomy/term/4',
+      'alias' => '/term33',
+      'langcode' => 'und',
+    ]);
+    $this->assertNotNull($path, 'Loaded alias term33.');
+    $this->assertIdentical('/taxonomy/term/4', $path['source']);
+    $this->assertIdentical('/term33', $path['alias']);
+    $this->assertIdentical('und', $path['langcode']);
+  }
+
+}
diff --git a/core/modules/path/tests/src/Unit/Migrate/UrlAliasTestBase.php b/core/modules/path/tests/src/Unit/Migrate/UrlAliasTestBase.php
new file mode 100644
index 0000000..2942668
--- /dev/null
+++ b/core/modules/path/tests/src/Unit/Migrate/UrlAliasTestBase.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\path\Unit\Migrate\UrlAliasTestBase.
+ */
+
+namespace Drupal\Tests\path\Unit\Migrate;
+
+use Drupal\Tests\migrate\Unit\MigrateSqlSourceTestCase;
+
+/**
+ * Base class for url_alias source tests.
+ */
+abstract class UrlAliasTestBase extends MigrateSqlSourceTestCase {
+
+  protected $migrationConfiguration = array(
+    'id' => 'test',
+    'source' => array(
+      'plugin' => 'url_alias',
+    ),
+  );
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->databaseContents['url_alias'] = $this->expectedResults;
+    parent::setUp();
+  }
+
+}
diff --git a/core/modules/path/tests/src/Unit/Migrate/d6/UrlAliasTest.php b/core/modules/path/tests/src/Unit/Migrate/d6/UrlAliasTest.php
index 79321ad..c4b1fac 100644
--- a/core/modules/path/tests/src/Unit/Migrate/d6/UrlAliasTest.php
+++ b/core/modules/path/tests/src/Unit/Migrate/d6/UrlAliasTest.php
@@ -7,26 +7,17 @@
 
 namespace Drupal\Tests\path\Unit\Migrate\d6;
 
-use Drupal\Tests\migrate\Unit\MigrateSqlSourceTestCase;
+use Drupal\Tests\path\Unit\Migrate\UrlAliasTestBase;
 
 /**
- * Tests the D6 url alias migrations.
+ * Tests the d6_url_alias source plugin.
  *
  * @group path
  */
-class UrlAliasTest extends MigrateSqlSourceTestCase {
+class UrlAliasTest extends UrlAliasTestBase {
 
   const PLUGIN_CLASS = 'Drupal\path\Plugin\migrate\source\d6\UrlAlias';
 
-  protected $migrationConfiguration = array(
-    'id' => 'test',
-    'highWaterProperty' => array('field' => 'test'),
-    'idlist' => array(),
-    'source' => array(
-      'plugin' => 'd6_url_alias',
-    ),
-  );
-
   protected $expectedResults = array(
     array(
       'pid' => 1,
@@ -42,14 +33,4 @@ class UrlAliasTest extends MigrateSqlSourceTestCase {
     ),
   );
 
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    foreach ($this->expectedResults as $row) {
-      $this->databaseContents['url_alias'][] = $row;
-    }
-    parent::setUp();
-  }
-
 }
diff --git a/core/modules/path/tests/src/Unit/Migrate/d7/UrlAliasTest.php b/core/modules/path/tests/src/Unit/Migrate/d7/UrlAliasTest.php
new file mode 100644
index 0000000..77f6e3c
--- /dev/null
+++ b/core/modules/path/tests/src/Unit/Migrate/d7/UrlAliasTest.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\path\Unit\Migrate\d7\UrlAliasTest.
+ */
+
+namespace Drupal\Tests\path\Unit\Migrate\d7;
+
+use Drupal\Tests\path\Unit\Migrate\UrlAliasTestBase;
+
+/**
+ * Tests the d7_url_alias source plugin.
+ *
+ * @group path
+ */
+class UrlAliasTest extends UrlAliasTestBase {
+
+  const PLUGIN_CLASS = 'Drupal\path\Plugin\migrate\source\d7\UrlAlias';
+
+  protected $expectedResults = array(
+    array(
+      'pid' => 1,
+      'source' => 'node/1',
+      'alias' => 'test-article',
+      'language' => 'en',
+    ),
+    array(
+      'pid' => 2,
+      'source' => 'node/2',
+      'alias' => 'another-alias',
+      'language' => 'en',
+    ),
+  );
+
+}
