diff --git a/core/modules/migrate_drupal/config/migrate.migration.d6_user_role.yml b/core/modules/migrate_drupal/config/migrate.migration.d6_user_role.yml
new file mode 100644
index 0000000..a5b2b43
--- /dev/null
+++ b/core/modules/migrate_drupal/config/migrate.migration.d6_user_role.yml
@@ -0,0 +1,66 @@
+id: d6_user_role
+sourceIds:
+  rid:
+    type: int
+    "not null": true
+    default: 0
+destinationIds:
+  id:
+    type: varchar
+    length: 255
+source:
+  plugin: drupal6_user_role
+process:
+  id:
+    -
+      plugin: machine_name
+      source: name
+    - 
+      plugin: dedupe_entity
+      entity_type: user_role
+      field: id
+  label: name
+  permissions:
+    plugin: iterator
+    extract: perm
+    process:
+      perm:
+        plugin: static_map
+        source: perm
+        map:
+          'use PHP for block visibility': 'use PHP for settings'
+          'administer site-wide contact form': 'administer contact forms'
+          'post comments without approval': 'skip comment approval'
+          'edit own blog entries' : 'edit own blog content'
+          'edit any blog entry' : 'edit any blog content'
+          'delete own blog entries' : 'delete own blog content'
+          'delete any blog entry' : 'delete any blog content'
+          'create forum topics' : 'create forum content'
+          'delete any forum topic' : 'delete any forum content'
+          'delete own forum topics' : 'delete own forum content'
+          'edit any forum topic' : 'edit any forum content'
+          'edit own forum topics' : 'edit own forum content'
+#  permissions:
+#    -
+#      plugin: extract
+#      source: perm
+#    -
+#      plugin: static_map
+#      map:
+#        'use PHP for block visibility': 'use PHP for settings'
+#        'administer site-wide contact form': 'administer contact forms'
+#        'post comments without approval': 'skip comment approval'
+#        'edit own blog entries' : 'edit own blog content'
+#        'edit any blog entry' : 'edit any blog content'
+#        'delete own blog entries' : 'delete own blog content'
+#        'delete any blog entry' : 'delete any blog content'
+#        'create forum topics' : 'create forum content'
+#        'delete any forum topic' : 'delete any forum content'
+#        'delete own forum topics' : 'delete own forum content'
+#        'edit any forum topic' : 'edit any forum content'
+#        'edit own forum topics' : 'edit own forum content'
+#    - plugin: system_update_7000
+#    - plugin: node_update_7008
+destination:
+  plugin: entity
+  entity_type: user_role
diff --git a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Plugin/migrate/source/d6/Role.php b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Plugin/migrate/source/d6/Role.php
index 3ee3a5e..b22765b 100644
--- a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Plugin/migrate/source/d6/Role.php
+++ b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Plugin/migrate/source/d6/Role.php
@@ -13,7 +13,7 @@
 /**
  * Drupal 6 role source from database.
  *
- * @PluginId("drupal6_role")
+ * @PluginId("drupal6_user_role")
  */
 class Role extends Drupal6SqlBase {
 
@@ -21,10 +21,9 @@ class Role extends Drupal6SqlBase {
    * {@inheritdoc}
    */
   public function query() {
-    $query = $this->database
-      ->select('role', 'r')
-      ->fields('r', array('rid', 'name'));
-    $query->orderBy('rid');
+    $query = $this->select('role', 'r')
+      ->fields('r', array('rid', 'name'))
+      ->orderBy('rid');
     return $query;
   }
 
@@ -44,7 +43,7 @@ public function fields() {
   function prepareRow(Row $row, $keep = TRUE) {
     $permissions = array();
     $results = $this->database
-      ->select('permissions', 'p', array('fetch' => \PDO::FETCH_ASSOC))
+      ->select('permission', 'p', array('fetch' => \PDO::FETCH_ASSOC))
       ->fields('p', array('pid', 'rid', 'perm', 'tid'))
       ->condition('rid', $row->getSourceProperty('rid'))
       ->execute();
diff --git a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/Dump/Drupal6UserRole.php b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/Dump/Drupal6UserRole.php
new file mode 100644
index 0000000..0a746ca
--- /dev/null
+++ b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/Dump/Drupal6UserRole.php
@@ -0,0 +1,132 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\Tests\Dump\Drupal6UserRole.
+ */
+
+namespace Drupal\migrate_drupal\Tests\Dump;
+use Drupal\Core\Database\Connection;
+
+/**
+ * Database dump for testing user role migration.
+ */
+class Drupal6UserRole {
+
+  /**
+   * @param \Drupal\Core\Database\Connection $database
+   */
+  public static function load(Connection $database) {
+    $database->schema()->createTable('permission', array(
+      'description' => 'Stores permissions for users.',
+      'fields' => array(
+        'pid' => array(
+          'type' => 'serial',
+          'not null' => TRUE,
+          'description' => 'Primary Key: Unique permission ID.',
+        ),
+        'rid' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'default' => 0,
+          'description' => 'The {role}.rid to which the permissions are assigned.',
+        ),
+        'perm' => array(
+          'type' => 'text',
+          'not null' => FALSE,
+          'size' => 'big',
+          'description' => 'List of permissions being assigned.',
+        ),
+        'tid' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'default' => 0,
+          'description' => 'Originally intended for taxonomy-based permissions, but never used.',
+        ),
+      ),
+      'primary key' => array('pid'),
+      'indexes' => array('rid' => array('rid')),
+    ));
+    $database->schema()->createTable('role', array(
+      'description' => 'Stores user roles.',
+      'fields' => array(
+        'rid' => array(
+          'type' => 'serial',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'description' => 'Primary Key: Unique role id.',
+        ),
+        'name' => array(
+          'type' => 'varchar',
+          'length' => 64,
+          'not null' => TRUE,
+          'default' => '',
+          'description' => 'Unique role name.',
+        ),
+      ),
+      'unique keys' => array('name' => array('name')),
+      'primary key' => array('rid'),
+    ));
+    $database->schema()->createTable('users_roles', array(
+      'description' => 'Maps users to roles.',
+      'fields' => array(
+        'uid' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'default' => 0,
+          'description' => 'Primary Key: {users}.uid for user.',
+        ),
+        'rid' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'default' => 0,
+          'description' => 'Primary Key: {role}.rid for role.',
+        ),
+      ),
+      'primary key' => array('uid', 'rid'),
+      'indexes' => array(
+        'rid' => array('rid'),
+      ),
+    ));
+    $database->insert('permission')->fields(array('pid', 'rid', 'perm'))
+      ->values(array('pid' => 3, 'rid' => 3, 'perm' => 'migrate test role 1 test permission'))
+      ->values(array('pid' => 4, 'rid' => 4, 'perm' => 'migrate test role 2 test permission'))
+      ->values(array('pid' => 5, 'rid' => 5, 'perm' => 'migrate test role 3 test permission'))
+      ->execute();
+    $database->insert('role')->fields(array('rid', 'name'))
+      ->values(array('rid' => 3, 'name' => 'migrate test role 1'))
+      ->values(array('rid' => 4, 'name' => 'migrate test role 2'))
+      ->values(array('rid' => 5, 'name' => 'migrate test role 3'))
+      ->execute();
+    $database->insert('users_roles')->fields(array('uid', 'rid'))
+      ->values(array('uid' => 1, 'rid' => 3))
+      ->values(array('uid' => 1, 'rid' => 4))
+      ->values(array('uid' => 1, 'rid' => 5))
+      ->execute();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function transform($value) {
+    // @todo: rewrite for roles using system_update_7000 and node_update_7008.
+    $renamed_permission = $value;
+    $renamed_permission = preg_replace('/(?<=^|,\ )create\ blog\ entries(?=,|$)/', 'create blog content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )edit\ own\ blog\ entries(?=,|$)/', 'edit own blog content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )edit\ any\ blog\ entry(?=,|$)/', 'edit any blog content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )delete\ own\ blog\ entries(?=,|$)/', 'delete own blog content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )delete\ any\ blog\ entry(?=,|$)/', 'delete any blog content', $renamed_permission);
+
+    $renamed_permission = preg_replace('/(?<=^|,\ )create\ forum\ topics(?=,|$)/', 'create forum content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )delete\ any\ forum\ topic(?=,|$)/', 'delete any forum content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )delete\ own\ forum\ topics(?=,|$)/', 'delete own forum content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )edit\ any\ forum\ topic(?=,|$)/', 'edit any forum content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )edit\ own\ forum\ topics(?=,|$)/', 'edit own forum content', $renamed_permission);
+    return $renamed_permission;
+  }
+
+}
diff --git a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/MigrateD6FilterFormatTest.php b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/MigrateD6FilterFormatTest.php
index a8a97ac..36b7a1e 100644
--- a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/MigrateD6FilterFormatTest.php
+++ b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/MigrateD6FilterFormatTest.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Contains \Drupal\migrate\Tests\MigrateD6FilterFormatsTest.
+ * Contains \Drupal\migrate\Tests\MigrateD6FilterFormatTest.
  */
 
 namespace Drupal\migrate_drupal\Tests;
diff --git a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/MigrateD6UserRoleTest.php b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/MigrateD6UserRoleTest.php
new file mode 100644
index 0000000..2f2f833
--- /dev/null
+++ b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/MigrateD6UserRoleTest.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\Tests\MigrateD6UserRoleTest.
+ */
+
+namespace Drupal\migrate_drupal\Tests;
+
+use Drupal\migrate\MigrateExecutable;
+use Drupal\migrate\MigrateMessage;
+
+class MigrateD6UserRoleTest extends MigrateDrupalTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name'  => 'Migrate user roles to user.role.*.yml',
+      'description'  => 'Upgrade user roles to user.role.*.yml',
+      'group' => 'Migrate Drupal',
+    );
+  }
+
+  function testUserRole() {
+    $migration = entity_load('migration', 'd6_user_role');
+    $dumps = array(
+      drupal_get_path('module', 'migrate_drupal') . '/lib/Drupal/migrate_drupal/Tests/Dump/Drupal6UserRole.php',
+    );
+    $this->prepare($migration, $dumps);
+    $executable = new MigrateExecutable($migration, new MigrateMessage);
+    $executable->import();
+
+    $migrate_test_role = entity_load('user_role', 'migrate_test_role_1');
+    $this->assertTrue(is_object($migrate_test_role), 'The migrated role was retrieved from the database.');
+    $this->assertEqual($migrate_test_role->permissions, array(0 => 'migrate test role 1 test permission'));
+
+    // @todo: write better asserts.
+  }
+
+}
diff --git a/core/modules/migrate_drupal/tests/Drupal/migrate_drupal/Tests/D6RoleSourceTest.php b/core/modules/migrate_drupal/tests/Drupal/migrate_drupal/Tests/D6RoleSourceTest.php
index 9e3d189..106fb6e 100644
--- a/core/modules/migrate_drupal/tests/Drupal/migrate_drupal/Tests/D6RoleSourceTest.php
+++ b/core/modules/migrate_drupal/tests/Drupal/migrate_drupal/Tests/D6RoleSourceTest.php
@@ -10,7 +10,7 @@
 use Drupal\migrate\Tests\MigrateSqlSourceTestCase;
 
 /**
- * Tests comment migration from D6 to D8.
+ * Tests user role migration from D6 to D8.
  *
  * @group migrate_drupal
  */
@@ -29,7 +29,7 @@ class D6RoleSourceTest extends MigrateSqlSourceTestCase {
     // This needs to be the identifier of the actual key: rid for comment, nid
     // for node and so on.
     'source' => array(
-      'plugin' => 'drupal6_role',
+      'plugin' => 'drupal6_user_role',
     ),
     'sourceIds' => array(
       'rid' => array(
