diff --git a/core/modules/user/config/install/user.role.anonymous.yml b/core/modules/user/config/install/user.role.anonymous.yml
index c89e023b..862c8212 100644
--- a/core/modules/user/config/install/user.role.anonymous.yml
+++ b/core/modules/user/config/install/user.role.anonymous.yml
@@ -3,6 +3,7 @@ status: true
 dependencies: {  }
 id: anonymous
 label: 'Anonymous user'
+description: 'The role given to users that are not logged in.'
 weight: 0
 is_admin: false
 permissions: {  }
diff --git a/core/modules/user/config/install/user.role.authenticated.yml b/core/modules/user/config/install/user.role.authenticated.yml
index 5da2abdd..97f7f37e 100644
--- a/core/modules/user/config/install/user.role.authenticated.yml
+++ b/core/modules/user/config/install/user.role.authenticated.yml
@@ -3,6 +3,7 @@ status: true
 dependencies: {  }
 id: authenticated
 label: 'Authenticated user'
+description: 'The basic role given to logged in users.'
 weight: 1
 is_admin: false
 permissions: {  }
diff --git a/core/modules/user/config/schema/user.schema.yml b/core/modules/user/config/schema/user.schema.yml
index 2f9bda44..5fef8453 100644
--- a/core/modules/user/config/schema/user.schema.yml
+++ b/core/modules/user/config/schema/user.schema.yml
@@ -113,6 +113,9 @@ user.role.*:
     label:
       type: label
       label: 'Label'
+    description:
+      type: text
+      label: 'Description'
     weight:
       type: integer
       label: 'User role weight'
diff --git a/core/modules/user/src/Entity/Role.php b/core/modules/user/src/Entity/Role.php
index 3512fee0..d2b4a48a 100644
--- a/core/modules/user/src/Entity/Role.php
+++ b/core/modules/user/src/Entity/Role.php
@@ -48,6 +48,7 @@
  *     "weight",
  *     "is_admin",
  *     "permissions",
+ *     "description",
  *   }
  * )
  */
@@ -67,6 +68,13 @@ class Role extends ConfigEntityBase implements RoleInterface {
    */
   protected $label;
 
+  /**
+   * A brief description of this role.
+   *
+   * @var string
+   */
+  public $description;
+
   /**
    * The weight of this role in administrative listings.
    *
@@ -113,6 +121,21 @@ public function setWeight($weight) {
     return $this;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDescription() {
+    return $this->description;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setDescription($description) {
+    $this->description = $description;
+    return $this;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/user/src/RoleForm.php b/core/modules/user/src/RoleForm.php
index 34aa98e8..116b54da 100644
--- a/core/modules/user/src/RoleForm.php
+++ b/core/modules/user/src/RoleForm.php
@@ -16,7 +16,10 @@ class RoleForm extends EntityForm {
    * {@inheritdoc}
    */
   public function form(array $form, FormStateInterface $form_state) {
+
+    /** @var RoleInterface $entity */
     $entity = $this->entity;
+
     $form['label'] = [
       '#type' => 'textfield',
       '#title' => $this->t('Role name'),
@@ -37,6 +40,12 @@ public function form(array $form, FormStateInterface $form_state) {
         'exists' => ['\Drupal\user\Entity\Role', 'load'],
       ],
     ];
+    $form['description'] = [
+      '#type' => 'textarea',
+      '#title' => $this->t('Description'),
+      '#default_value' => $entity->getDescription(),
+      '#description' => $this->t('The description for this role.'),
+    ];
     $form['weight'] = [
       '#type' => 'value',
       '#value' => $entity->getWeight(),
@@ -49,10 +58,13 @@ public function form(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function save(array $form, FormStateInterface $form_state) {
+
+    /** @var RoleInterface $entity */
     $entity = $this->entity;
 
     // Prevent leading and trailing spaces in role names.
     $entity->set('label', trim($entity->label()));
+    $entity->setDescription(trim($entity->getDescription()));
     $status = $entity->save();
 
     $edit_link = $this->entity->toLink($this->t('Edit'), 'edit-form')->toString();
diff --git a/core/modules/user/src/RoleInterface.php b/core/modules/user/src/RoleInterface.php
index 3c9425f6..0fa95b41 100644
--- a/core/modules/user/src/RoleInterface.php
+++ b/core/modules/user/src/RoleInterface.php
@@ -97,4 +97,22 @@ public function getWeight();
    */
   public function setWeight($weight);
 
+  /**
+   * Returns the description.
+   *
+   * @return string
+   *   The description.
+   */
+  public function getDescription();
+
+  /**
+   * Sets the description to the given value.
+   *
+   * @param string $description
+   *   The desired description.
+   *
+   * @return $this
+   */
+  public function setDescription($description);
+
 }
diff --git a/core/modules/user/src/RoleListBuilder.php b/core/modules/user/src/RoleListBuilder.php
index d864a550..6ec35fb6 100644
--- a/core/modules/user/src/RoleListBuilder.php
+++ b/core/modules/user/src/RoleListBuilder.php
@@ -63,7 +63,8 @@ public function getFormId() {
    * {@inheritdoc}
    */
   public function buildHeader() {
-    $header['label'] = t('Name');
+    $header['label'] = $this->t('Name');
+    $header['description'] = $this->t('Description');
     return $header + parent::buildHeader();
   }
 
@@ -72,6 +73,9 @@ public function buildHeader() {
    */
   public function buildRow(EntityInterface $entity) {
     $row['label'] = $entity->label();
+    $row['description'] = [
+      '#markup' => $entity->getDescription(),
+    ];
     return $row + parent::buildRow($entity);
   }
 
diff --git a/core/modules/user/tests/src/Functional/RoleListBuilderTest.php b/core/modules/user/tests/src/Functional/RoleListBuilderTest.php
new file mode 100644
index 00000000..7a086a4f
--- /dev/null
+++ b/core/modules/user/tests/src/Functional/RoleListBuilderTest.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\Tests\user\Functional;
+
+use Drupal\Tests\BrowserTestBase;
+use Drupal\user\Entity\Role;
+
+/**
+ * Tests for the RolesListBuilder.
+ *
+ * @see \Drupal\user\RoleListBuilder
+ */
+class RoleListBuilderTest extends BrowserTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'user',
+  ];
+
+  /**
+   * Ensures the rows of the list are built correctly.
+   */
+  public function testListBuilder() {
+
+    // Create a role to view.
+    /** @var \Drupal\user\RoleInterface $role */
+    $role = Role::create([
+      'id' => 'role_1',
+      'label' => 'My Role',
+      'description' => 'Lorem ipsum',
+    ]);
+    $role->save();
+
+    // Log in as an administrator.
+    $admin = $this->createUser([], NULL, TRUE);
+    $this->drupalLogin($admin);
+
+    $this->drupalGet('/admin/people/roles');
+
+    $this->assertSession()->pageTextContains('Name');
+    $this->assertSession()->pageTextContains('Description');
+
+    // Check that the role values are displayed correctly.
+    $this->assertSession()->pageTextContains($role->label());
+    $this->assertSession()->pageTextContains($role->getDescription());
+
+  }
+
+}
diff --git a/core/modules/user/tests/src/Kernel/UserRoleEntityTest.php b/core/modules/user/tests/src/Kernel/UserRoleEntityTest.php
index b597c3dd..cf73e98d 100644
--- a/core/modules/user/tests/src/Kernel/UserRoleEntityTest.php
+++ b/core/modules/user/tests/src/Kernel/UserRoleEntityTest.php
@@ -6,7 +6,13 @@
 use Drupal\user\Entity\Role;
 
 /**
+ * Tests for the Role entity.
+ *
  * @group user
+ *
+ * @coversDefaultClass \Drupal\user\Entity\Role
+ *
+ * @see \Drupal\user\Entity\Role
  */
 class UserRoleEntityTest extends KernelTestBase {
 
@@ -27,4 +33,22 @@ public function testOrderOfPermissions() {
     $this->assertEquals($role->getPermissions(), ['a', 'b', 'c']);
   }
 
+  /**
+   * Tests the setting and getting of a roles descriptions.
+   *
+   * @covers ::getDescription
+   * @covers ::setDescription
+   */
+  public function testRoleDescription() {
+
+    /** @var \Drupal\user\Entity\RoleInterface $role */
+    $role = Role::create(['id' => 'test_role']);
+
+    $description = 'Lorem ipsum.';
+    $role->setDescription($description);
+
+    $this->assertEqual($role->getDescription(), $description);
+
+  }
+
 }
