diff --git a/doc/source/command-objects/project.rst b/doc/source/command-objects/project.rst
new file mode 100644
index 0000000000..ba741d1dc1
--- /dev/null
+++ b/doc/source/command-objects/project.rst
@@ -0,0 +1,155 @@
+=======
+project
+=======
+
+Identity v2, v3
+
+project create
+--------------
+
+Create new project
+
+.. program:: project create
+.. code:: bash
+
+    os project create
+        [--domain <domain>]
+        [--description <description>]
+        [--enable | --disable]
+        [--property <key=value>]
+        <name>
+
+.. option:: --domain <domain>
+
+    Domain owning the project (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --description <description>
+
+    Project description
+
+.. option:: --enable
+
+    Enable project (default)
+
+.. option:: --disable
+
+    Disable project
+
+.. option:: --property <key=value>
+
+    Add a property to :ref:`\<name\> <project_create-name>`
+    (repeat option to set multiple properties)
+
+.. _project_create-name:
+.. describe:: <name>
+
+    New project name
+
+project delete
+--------------
+
+Delete an existing project
+
+.. program:: project delete
+.. code:: bash
+
+    os project delete
+        <project>
+
+.. _project_delete-project:
+.. describe:: <project>
+
+    Project to delete (name or ID)
+
+project list
+------------
+
+List projects
+
+.. program:: project list
+.. code:: bash
+
+    os project list
+        [--domain <domain>]
+        [--long]
+
+.. option:: --domain <domain>
+
+    Filter projects by :option:`\<domain\> <--domain>` (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --long
+
+    List additional fields in output
+
+project set
+-----------
+
+Set project properties
+
+.. program:: project set
+.. code:: bash
+
+    os project set
+        [--name <name>]
+        [--domain <domain>]
+        [--description <description>]
+        [--enable | --disable]
+        [--property <key=value>]
+        <project>
+
+.. option:: --name <name>
+
+    Set project name
+
+.. option:: --domain <domain>
+
+    Set domain owning :ref:`\<project\> <project_set-project>` (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --description <description>
+
+    Set project description
+
+.. option:: --enable
+
+    Enable project (default)
+
+.. option:: --disable
+
+    Disable project
+
+.. option:: --property <key=value>
+
+    Set a property on :ref:`\<project\> <project_set-project>`
+    (repeat option to set multiple properties)
+
+.. _project_set-project:
+.. describe:: <project>
+
+    Project to modify (name or ID)
+
+project show
+------------
+
+.. program:: project show
+.. code:: bash
+
+    os project show
+        [--domain <domain>]
+        <project>
+
+.. option:: --domain <domain>
+
+    Domain owning :ref:`\<project\> <project_show-project>` (name or ID)
+
+    .. versionadded:: 3
+
+.. _project_show-project:
+.. describe:: <project>
+
+    Project to show (name or ID)
diff --git a/doc/source/command-objects/role.rst b/doc/source/command-objects/role.rst
new file mode 100644
index 0000000000..1cc80d7d98
--- /dev/null
+++ b/doc/source/command-objects/role.rst
@@ -0,0 +1,180 @@
+====
+role
+====
+
+Identity v2, v3
+
+role add
+--------
+
+Add role to a user or group in a project or domain
+
+.. program:: role add
+.. code:: bash
+
+    os role add
+        --domain <domain> | --project <project>
+        --user <user> | --group <group>
+        <role>
+
+.. option:: --domain <domain>
+
+    Include `<domain>` (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --project <project>
+
+    Include `<project>` (name or ID)
+
+.. option:: --user <user>
+
+    Include `<user>` (name or ID)
+
+.. option:: --group <group>
+
+    Include `<group>` (name or ID)
+
+    .. versionadded:: 3
+
+.. describe:: <role>
+
+    Role to add to `<project>`:`<user>` (name or ID)
+
+role create
+-----------
+
+Create new role
+
+.. program:: role create
+.. code:: bash
+
+    os role create
+        <name>
+
+.. describe:: <name>
+
+    New role name
+
+role delete
+-----------
+
+Delete an existing role
+
+.. program:: role delete
+.. code:: bash
+
+    os role delete
+        <role>
+
+.. option:: <role>
+
+    Role to delete (name or ID)
+
+role list
+---------
+
+List roles
+
+.. program:: role list
+.. code:: bash
+
+    os role list
+        [--domain <domain> | --project <project]
+        [--user <user> | --group <group>]
+
+.. option:: --domain <domain>
+
+    Filter roles by <domain> (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --project <project>
+
+    Filter roles by <project> (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --user <user>
+
+    Filter roles by <user> (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --group <group>
+
+    Filter roles by <group> (name or ID)
+
+    .. versionadded:: 3
+
+role remove
+-----------
+
+Remove role from domain/project : user/group
+
+.. program:: role remove
+.. code:: bash
+
+    os role remove
+        [--domain <domain> | --project <project]
+        [--user <user> | --group <group>]
+        <role>
+
+.. option:: --domain <domain>
+
+    Include `<domain>` (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --project <project>
+
+    Include `<project>` (name or ID)
+
+.. option:: --user <user>
+
+    Include `<user>` (name or ID)
+
+.. option:: --group <group>
+
+    Include `<group>` (name or ID)
+
+    .. versionadded:: 3
+
+.. describe:: <role>
+
+    Role to remove from `<project>`:`<user>` (name or ID)
+
+role set
+--------
+
+Set role properties
+
+.. versionadded:: 3
+
+.. program:: role set
+.. code:: bash
+
+    os role set
+        [--name <name>]
+        <role>
+
+.. option:: --name <name>
+
+    Set role name
+
+.. describe:: <role>
+
+    Role to modify (name or ID)
+
+role show
+---------
+
+.. program:: role show
+.. code:: bash
+
+    os role show
+        <role>
+
+.. describe:: <role>
+
+    Role to show (name or ID)
diff --git a/doc/source/command-objects/user-role.rst b/doc/source/command-objects/user-role.rst
new file mode 100644
index 0000000000..a25e90ff8f
--- /dev/null
+++ b/doc/source/command-objects/user-role.rst
@@ -0,0 +1,25 @@
+=========
+user role
+=========
+
+user role list
+--------------
+
+List user-role assignments
+
+*Removed in version 3.*
+
+.. program:: user role list
+.. code:: bash
+
+    os user role list
+        [--project <project>]
+        [<user>]
+
+.. option:: --project <project>
+
+    Filter users by `<project>` (name or ID)
+
+.. describe:: <user>
+
+    User to list (name or ID)
diff --git a/doc/source/command-objects/user.rst b/doc/source/command-objects/user.rst
new file mode 100644
index 0000000000..53becf2799
--- /dev/null
+++ b/doc/source/command-objects/user.rst
@@ -0,0 +1,204 @@
+====
+user
+====
+
+Identity v2, v3
+
+user create
+-----------
+
+Create new user
+
+.. program:: user create
+.. code:: bash
+
+    os user create
+        [--domain <domain>]
+        [--project <project>]
+        [--password <password>]
+        [--password-prompt]
+        [--email <email-address>]
+        [--description <description>]
+        [--enable | --disable]
+        [--or-show]
+        <user-name>
+
+.. option:: --domain <domain>
+
+    Default domain (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --project <project>
+
+    Default project (name or ID)
+
+.. option:: --password <password>
+
+    Set user password
+
+.. option:: --password-prompt
+
+    Prompt interactively for password
+
+.. option:: --email <email-address>
+
+    Set user email address
+
+.. option:: --description <description>
+
+    User description
+
+    .. versionadded:: 3
+
+.. option:: --enable
+
+    Enable user (default)
+
+.. option:: --disable
+
+    Disable user
+
+.. option:: --or-show
+
+    Return existing user
+
+    If the username already exist return the existing user data and do not fail.
+
+.. describe:: <name>
+
+    New user name
+
+user delete
+-----------
+
+Delete user
+
+.. program:: user delete
+.. code:: bash
+
+    os user delete
+        <user>
+
+.. describe:: <user>
+
+    User to delete (name or ID)
+
+user list
+---------
+
+List users
+
+.. program:: user list
+.. code:: bash
+
+    os user list
+        [--domain <domain>]
+        [--project <project>]
+        [--group <group>]
+        [--long]
+
+.. option:: --domain <domain>
+
+    Filter users by `<domain>` (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --project <project>
+
+    Filter users by `<project>` (name or ID)
+
+    *Removed in version 3.*
+
+.. option:: --group <group>
+
+    Filter users by `<group>` membership (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --long
+
+    List additional fields in output
+
+user set
+--------
+
+Set user properties
+
+.. program:: user set
+.. code:: bash
+
+    os user set
+        [--name <name>]
+        [--domain <domain>]
+        [--project <project>]
+        [--password <password>]
+        [--email <email-address>]
+        [--description <description>]
+        [--enable|--disable]
+        <user>
+
+.. option:: --name <name>
+
+    Set user name
+
+.. option:: --domain <domain>
+
+    Set default domain (name or ID)
+
+    .. versionadded:: 3
+
+.. option:: --project <project>
+
+    Set default project (name or ID)
+
+.. option:: --password <password>
+
+    Set user password
+
+.. option:: --password-prompt
+
+    Prompt interactively for password
+
+.. option:: --email <email-address>
+
+    Set user email address
+
+.. option:: --description <description>
+
+    Set user description
+
+    .. versionadded:: 3
+
+.. option:: --enable
+
+    Enable user (default)
+
+.. option:: --disable
+
+    Disable user
+
+.. describe:: <user>
+
+    User to modify (name or ID)
+
+user show
+---------
+
+.. program:: user show
+.. code:: bash
+
+    os user show
+        [--domain <domain>]
+        <user>
+
+.. option:: --domain <domain>
+
+    Domain owning :ref:`\<user\> <user_show-user>` (name or ID)
+
+    .. versionadded:: 3
+
+.. _user_show-user:
+.. describe:: <user>
+
+    User to show (name or ID)
diff --git a/doc/source/commands.rst b/doc/source/commands.rst
index 506fbfc28f..250a8039d8 100644
--- a/doc/source/commands.rst
+++ b/doc/source/commands.rst
@@ -94,7 +94,7 @@ referring to both Compute and Volume quotas.
 * ``network``: Network - a virtual network for connecting servers and other resources
 * ``object``: Object Store - a single file in the Object Store
 * ``policy``: Identity - determines authorization
-* ``project``: Identity - the owner of a group of resources
+* ``project``: (**Identity**) owns a group of resources
 * ``quota``: (**Compute**, **Volume**) resource usage restrictions
 * ``request token``: Identity - temporary OAuth-based token
 * ``role``: Identity - a policy object used to determine authorization
@@ -103,8 +103,9 @@ referring to both Compute and Volume quotas.
 * ``server``: Compute - a virtual machine instance
 * ``service``: Identity - a cloud service
 * ``snapshot``: Volume - a point-in-time copy of a volume
-* ``token``: Identity - the magic text used to determine access
-* ``user``: Identity - individuals using cloud resources
+* ``token``: (**Identity**) a bearer token managed by Identity service
+* ``user``: (**Identity**) individual cloud resources users
+* ``user role``: (**Identity**) roles assigned to a user
 * ``volume``: Volume - block volumes
 * ``volume type``: Volume - deployment-specific types of volumes available
 
diff --git a/openstackclient/identity/v2_0/project.py b/openstackclient/identity/v2_0/project.py
index 2d66b400d4..df759ce6a8 100644
--- a/openstackclient/identity/v2_0/project.py
+++ b/openstackclient/identity/v2_0/project.py
@@ -42,8 +42,8 @@ class CreateProject(show.ShowOne):
         )
         parser.add_argument(
             '--description',
-            metavar='<project-description>',
-            help=_('New project description'),
+            metavar='<description>',
+            help=_('Project description'),
         )
         enable_group = parser.add_mutually_exclusive_group()
         enable_group.add_argument(
@@ -60,7 +60,7 @@ class CreateProject(show.ShowOne):
             '--property',
             metavar='<key=value>',
             action=parseractions.KeyValueAction,
-            help=_('Property to add for this project '
+            help=_('Add a property to <name> '
                    '(repeat option to set multiple properties)'),
         )
         parser.add_argument(
@@ -104,7 +104,7 @@ class CreateProject(show.ShowOne):
 
 
 class DeleteProject(command.Command):
-    """Delete project"""
+    """Delete an existing project"""
 
     log = logging.getLogger(__name__ + '.DeleteProject')
 
@@ -169,17 +169,17 @@ class SetProject(command.Command):
         parser.add_argument(
             'project',
             metavar='<project>',
-            help=_('Project to change (name or ID)'),
+            help=_('Project to modify (name or ID)'),
         )
         parser.add_argument(
             '--name',
-            metavar='<new-project-name>',
-            help=_('New project name'),
+            metavar='<name>',
+            help=_('Set project name'),
         )
         parser.add_argument(
             '--description',
-            metavar='<project-description>',
-            help=_('New project description'),
+            metavar='<description>',
+            help=_('Set project description'),
         )
         enable_group = parser.add_mutually_exclusive_group()
         enable_group.add_argument(
@@ -196,7 +196,7 @@ class SetProject(command.Command):
             '--property',
             metavar='<key=value>',
             action=parseractions.KeyValueAction,
-            help=_('Property to add for this project '
+            help=_('Set a project property '
                    '(repeat option to set multiple properties)'),
         )
         return parser
@@ -249,7 +249,7 @@ class ShowProject(show.ShowOne):
         parser.add_argument(
             'project',
             metavar='<project>',
-            help=_('Project to display (name or ID)'))
+            help=_('Project to show (name or ID)'))
         return parser
 
     def take_action(self, parsed_args):
diff --git a/openstackclient/identity/v2_0/role.py b/openstackclient/identity/v2_0/role.py
index df69e857ad..cec95095cc 100644
--- a/openstackclient/identity/v2_0/role.py
+++ b/openstackclient/identity/v2_0/role.py
@@ -38,17 +38,20 @@ class AddRole(show.ShowOne):
         parser.add_argument(
             'role',
             metavar='<role>',
-            help=_('Role name or ID to add to user'))
+            help=_('Role to add to <project>:<user> (name or ID)'),
+        )
         parser.add_argument(
             '--project',
             metavar='<project>',
             required=True,
-            help=_('Include project (name or ID)'))
+            help=_('Include <project> (name or ID)'),
+        )
         parser.add_argument(
             '--user',
             metavar='<user>',
             required=True,
-            help=_('Name or ID of user to include'))
+            help=_('Include <user> (name or ID)'),
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -80,8 +83,9 @@ class CreateRole(show.ShowOne):
         parser = super(CreateRole, self).get_parser(prog_name)
         parser.add_argument(
             'role_name',
-            metavar='<role-name>',
-            help=_('New role name'))
+            metavar='<name>',
+            help=_('New role name'),
+        )
         parser.add_argument(
             '--or-show',
             action='store_true',
@@ -110,7 +114,7 @@ class CreateRole(show.ShowOne):
 
 
 class DeleteRole(command.Command):
-    """Delete existing role"""
+    """Delete an existing role"""
 
     log = logging.getLogger(__name__ + '.DeleteRole')
 
@@ -119,7 +123,8 @@ class DeleteRole(command.Command):
         parser.add_argument(
             'role',
             metavar='<role>',
-            help=_('Name or ID of role to delete'))
+            help=_('Role to delete (name or ID)'),
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -162,11 +167,13 @@ class ListUserRole(lister.Lister):
             'user',
             metavar='<user>',
             nargs='?',
-            help=_('Name or ID of user to include'))
+            help=_('User to list (name or ID)'),
+        )
         parser.add_argument(
             '--project',
             metavar='<project>',
-            help=_('Include project (name or ID)'))
+            help=_('Filter users by <project> (name or ID)'),
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -227,17 +234,20 @@ class RemoveRole(command.Command):
         parser.add_argument(
             'role',
             metavar='<role>',
-            help=_('Role name or ID to remove from user'))
+            help=_('Role to remove from <project>:<user> (name or ID)'),
+        )
         parser.add_argument(
             '--project',
             metavar='<project>',
             required=True,
-            help=_('Project to include (name or ID)'))
+            help=_('Include <project> (name or ID)'),
+        )
         parser.add_argument(
             '--user',
             metavar='<user>',
             required=True,
-            help=_('Name or ID of user'))
+            help=_('Include <user> (name or ID)'),
+        )
         return parser
 
     def take_action(self, parsed_args):
@@ -265,7 +275,8 @@ class ShowRole(show.ShowOne):
         parser.add_argument(
             'role',
             metavar='<role>',
-            help=_('Name or ID of role to display'))
+            help=_('Role to show (name or ID)'),
+        )
         return parser
 
     def take_action(self, parsed_args):
diff --git a/openstackclient/identity/v2_0/user.py b/openstackclient/identity/v2_0/user.py
index 2ebcba188e..955e19e770 100644
--- a/openstackclient/identity/v2_0/user.py
+++ b/openstackclient/identity/v2_0/user.py
@@ -36,13 +36,18 @@ class CreateUser(show.ShowOne):
         parser = super(CreateUser, self).get_parser(prog_name)
         parser.add_argument(
             'name',
-            metavar='<user-name>',
+            metavar='<name>',
             help=_('New user name'),
         )
+        parser.add_argument(
+            '--project',
+            metavar='<project>',
+            help=_('Default project (name or ID)'),
+        )
         parser.add_argument(
             '--password',
-            metavar='<user-password>',
-            help=_('New user password'),
+            metavar='<password>',
+            help=_('Set user password'),
         )
         parser.add_argument(
             '--password-prompt',
@@ -52,13 +57,8 @@ class CreateUser(show.ShowOne):
         )
         parser.add_argument(
             '--email',
-            metavar='<user-email>',
-            help=_('New user email address'),
-        )
-        parser.add_argument(
-            '--project',
-            metavar='<project>',
-            help=_('Set default project (name or ID)'),
+            metavar='<email-address>',
+            help=_('Set user email address'),
         )
         enable_group = parser.add_mutually_exclusive_group()
         enable_group.add_argument(
@@ -258,13 +258,18 @@ class SetUser(command.Command):
         )
         parser.add_argument(
             '--name',
-            metavar='<new-user-name>',
-            help=_('New user name'),
+            metavar='<name>',
+            help=_('Set user name'),
+        )
+        parser.add_argument(
+            '--project',
+            metavar='<project>',
+            help=_('Set default project (name or ID)'),
         )
         parser.add_argument(
             '--password',
             metavar='<user-password>',
-            help=_('New user password'),
+            help=_('Set user password'),
         )
         parser.add_argument(
             '--password-prompt',
@@ -274,13 +279,8 @@ class SetUser(command.Command):
         )
         parser.add_argument(
             '--email',
-            metavar='<user-email>',
-            help=_('New user email address'),
-        )
-        parser.add_argument(
-            '--project',
-            metavar='<project>',
-            help=_('New default project (name or ID)'),
+            metavar='<email-address>',
+            help=_('Set user email address'),
         )
         enable_group = parser.add_mutually_exclusive_group()
         enable_group.add_argument(
diff --git a/openstackclient/identity/v3/project.py b/openstackclient/identity/v3/project.py
index 4fcf81278f..3b0e92fd8c 100644
--- a/openstackclient/identity/v3/project.py
+++ b/openstackclient/identity/v3/project.py
@@ -43,13 +43,13 @@ class CreateProject(show.ShowOne):
         )
         parser.add_argument(
             '--domain',
-            metavar='<project-domain>',
+            metavar='<domain>',
             help='Domain owning the project (name or ID)',
         )
         parser.add_argument(
             '--description',
-            metavar='<project-description>',
-            help='New project description',
+            metavar='<description>',
+            help='Project description',
         )
         enable_group = parser.add_mutually_exclusive_group()
         enable_group.add_argument(
@@ -66,7 +66,7 @@ class CreateProject(show.ShowOne):
             '--property',
             metavar='<key=value>',
             action=parseractions.KeyValueAction,
-            help='Property to add for this project '
+            help='Add a property to <name> '
                  '(repeat option to set multiple properties)',
         )
         parser.add_argument(
@@ -115,7 +115,7 @@ class CreateProject(show.ShowOne):
 
 
 class DeleteProject(command.Command):
-    """Delete project"""
+    """Delete an existing project"""
 
     log = logging.getLogger(__name__ + '.DeleteProject')
 
@@ -148,17 +148,17 @@ class ListProject(lister.Lister):
 
     def get_parser(self, prog_name):
         parser = super(ListProject, self).get_parser(prog_name)
+        parser.add_argument(
+            '--domain',
+            metavar='<domain>',
+            help='Filter projects by <domain> (name or ID)',
+        )
         parser.add_argument(
             '--long',
             action='store_true',
             default=False,
             help='List additional fields in output',
         )
-        parser.add_argument(
-            '--domain',
-            metavar='<project-domain>',
-            help='Filter by a specific domain (name or ID)',
-        )
         return parser
 
     def take_action(self, parsed_args):
@@ -190,22 +190,22 @@ class SetProject(command.Command):
         parser.add_argument(
             'project',
             metavar='<project>',
-            help='Project to change (name or ID)',
+            help='Project to modify (name or ID)',
         )
         parser.add_argument(
             '--name',
-            metavar='<new-project-name>',
-            help='New project name',
+            metavar='<name>',
+            help='Set project name',
         )
         parser.add_argument(
             '--domain',
-            metavar='<project-domain>',
-            help='New domain owning the project (name or ID)',
+            metavar='<domain>',
+            help='Set domain owning <project> (name or ID)',
         )
         parser.add_argument(
             '--description',
-            metavar='<project-description>',
-            help='New project description',
+            metavar='<description>',
+            help='Set project description',
         )
         enable_group = parser.add_mutually_exclusive_group()
         enable_group.add_argument(
@@ -222,7 +222,7 @@ class SetProject(command.Command):
             '--property',
             metavar='<key=value>',
             action=parseractions.KeyValueAction,
-            help='Property to add for this project '
+            help='Set a property on <project> '
                  '(repeat option to set multiple properties)',
         )
         return parser
@@ -278,7 +278,7 @@ class ShowProject(show.ShowOne):
         parser.add_argument(
             '--domain',
             metavar='<domain>',
-            help='Domain where project resides (name or ID)',
+            help='Domain owning <project> (name or ID)',
         )
         return parser
 
diff --git a/openstackclient/identity/v3/role.py b/openstackclient/identity/v3/role.py
index 7801ca6563..017ffd769f 100644
--- a/openstackclient/identity/v3/role.py
+++ b/openstackclient/identity/v3/role.py
@@ -38,29 +38,29 @@ class AddRole(command.Command):
         parser.add_argument(
             'role',
             metavar='<role>',
-            help='Name or ID of role to add',
-        )
-        user_or_group = parser.add_mutually_exclusive_group()
-        user_or_group.add_argument(
-            '--user',
-            metavar='<user>',
-            help='Name or ID of user to add a role',
-        )
-        user_or_group.add_argument(
-            '--group',
-            metavar='<group>',
-            help='Name or ID of group to add a role',
+            help='Role to add to <user> (name or ID)',
         )
         domain_or_project = parser.add_mutually_exclusive_group()
         domain_or_project.add_argument(
             '--domain',
             metavar='<domain>',
-            help='Name or ID of domain associated with user or group',
+            help='Include <domain> (name or ID)',
         )
         domain_or_project.add_argument(
             '--project',
             metavar='<project>',
-            help='Name or ID of project associated with user or group',
+            help='Include `<project>` (name or ID)',
+        )
+        user_or_group = parser.add_mutually_exclusive_group()
+        user_or_group.add_argument(
+            '--user',
+            metavar='<user>',
+            help='Include <user> (name or ID)',
+        )
+        user_or_group.add_argument(
+            '--group',
+            metavar='<group>',
+            help='Include <group> (name or ID)',
         )
         return parser
 
@@ -177,7 +177,7 @@ class CreateRole(show.ShowOne):
 
 
 class DeleteRole(command.Command):
-    """Delete existing role"""
+    """Delete an existing role"""
 
     log = logging.getLogger(__name__ + '.DeleteRole')
 
@@ -186,7 +186,7 @@ class DeleteRole(command.Command):
         parser.add_argument(
             'role',
             metavar='<role>',
-            help='Name or ID of role to delete',
+            help='Role to delete (name or ID)',
         )
         return parser
 
@@ -214,23 +214,23 @@ class ListRole(lister.Lister):
         domain_or_project.add_argument(
             '--domain',
             metavar='<domain>',
-            help='Filter role list by <domain>',
+            help='Filter roles by <domain> (name or ID)',
         )
         domain_or_project.add_argument(
             '--project',
             metavar='<project>',
-            help='Filter role list by <project>',
+            help='Filter roles by <project> (name or ID)',
         )
         user_or_group = parser.add_mutually_exclusive_group()
         user_or_group.add_argument(
             '--user',
             metavar='<user>',
-            help='Name or ID of user to list roles assigned to',
+            help='Filter roles by <user> (name or ID)',
         )
         user_or_group.add_argument(
             '--group',
             metavar='<group>',
-            help='Name or ID of group to list roles assigned to',
+            help='Filter roles by <group> (name or ID)',
         )
         return parser
 
@@ -320,7 +320,7 @@ class ListRole(lister.Lister):
 
 
 class RemoveRole(command.Command):
-    """Remove role command"""
+    """Remove role from domain/project : user/group"""
 
     log = logging.getLogger(__name__ + '.RemoveRole')
 
@@ -329,29 +329,29 @@ class RemoveRole(command.Command):
         parser.add_argument(
             'role',
             metavar='<role>',
-            help='Name or ID of role to remove',
-        )
-        user_or_group = parser.add_mutually_exclusive_group()
-        user_or_group.add_argument(
-            '--user',
-            metavar='<user>',
-            help='Name or ID of user to remove a role',
-        )
-        user_or_group.add_argument(
-            '--group',
-            metavar='<group>',
-            help='Name or ID of group to remove a role',
+            help='Role to remove (name or ID)',
         )
         domain_or_project = parser.add_mutually_exclusive_group()
         domain_or_project.add_argument(
             '--domain',
             metavar='<domain>',
-            help='Name or ID of domain associated with user or group',
+            help='Include <domain> (name or ID)',
         )
         domain_or_project.add_argument(
             '--project',
             metavar='<project>',
-            help='Name or ID of project associated with user or group',
+            help='Include <project> (name or ID)',
+        )
+        user_or_group = parser.add_mutually_exclusive_group()
+        user_or_group.add_argument(
+            '--user',
+            metavar='<user>',
+            help='Include <user> (name or ID)',
+        )
+        user_or_group.add_argument(
+            '--group',
+            metavar='<group>',
+            help='Include <group> (name or ID)',
         )
         return parser
 
@@ -431,7 +431,7 @@ class RemoveRole(command.Command):
 
 
 class SetRole(command.Command):
-    """Set role command"""
+    """Set role properties"""
 
     log = logging.getLogger(__name__ + '.SetRole')
 
@@ -440,12 +440,12 @@ class SetRole(command.Command):
         parser.add_argument(
             'role',
             metavar='<role>',
-            help='Name or ID of role to update',
+            help='Role to modify (name or ID)',
         )
         parser.add_argument(
             '--name',
-            metavar='<new-role-name>',
-            help='New role name',
+            metavar='<name>',
+            help='Set role name',
         )
         return parser
 
@@ -475,7 +475,7 @@ class ShowRole(show.ShowOne):
         parser.add_argument(
             'role',
             metavar='<role>',
-            help='Name or ID of role to display',
+            help='Role to show (name or ID)',
         )
         return parser
 
diff --git a/openstackclient/identity/v3/user.py b/openstackclient/identity/v3/user.py
index 63dd3b4f58..10ffce36b8 100644
--- a/openstackclient/identity/v3/user.py
+++ b/openstackclient/identity/v3/user.py
@@ -37,13 +37,23 @@ class CreateUser(show.ShowOne):
         parser = super(CreateUser, self).get_parser(prog_name)
         parser.add_argument(
             'name',
-            metavar='<user-name>',
+            metavar='<name>',
             help='New user name',
         )
+        parser.add_argument(
+            '--domain',
+            metavar='<domain>',
+            help='Default domain (name or ID)',
+        )
+        parser.add_argument(
+            '--project',
+            metavar='<project>',
+            help='Default project (name or ID)',
+        )
         parser.add_argument(
             '--password',
-            metavar='<user-password>',
-            help='New user password',
+            metavar='<password>',
+            help='Set user password',
         )
         parser.add_argument(
             '--password-prompt',
@@ -53,23 +63,13 @@ class CreateUser(show.ShowOne):
         )
         parser.add_argument(
             '--email',
-            metavar='<user-email>',
-            help='New user email address',
-        )
-        parser.add_argument(
-            '--project',
-            metavar='<project>',
-            help='Set default project (name or ID)',
-        )
-        parser.add_argument(
-            '--domain',
-            metavar='<domain>',
-            help='New default domain name or ID',
+            metavar='<email-address>',
+            help='Set user email address',
         )
         parser.add_argument(
             '--description',
             metavar='<description>',
-            help='Description for new user',
+            help='User description',
         )
         enable_group = parser.add_mutually_exclusive_group()
         enable_group.add_argument(
@@ -173,12 +173,12 @@ class ListUser(lister.Lister):
         parser.add_argument(
             '--domain',
             metavar='<domain>',
-            help='Filter user list by <domain> (name or ID)',
+            help='Filter users by <domain> (name or ID)',
         )
         parser.add_argument(
             '--group',
             metavar='<group>',
-            help='List memberships of <group> (name or ID)',
+            help='Filter users by <group> membership (name or ID)',
         )
         parser.add_argument(
             '--long',
@@ -240,13 +240,23 @@ class SetUser(command.Command):
         )
         parser.add_argument(
             '--name',
-            metavar='<new-user-name>',
-            help='New user name',
+            metavar='<name>',
+            help='Set user name',
+        )
+        parser.add_argument(
+            '--domain',
+            metavar='<domain>',
+            help='Set default domain (name or ID)',
+        )
+        parser.add_argument(
+            '--project',
+            metavar='<project>',
+            help='Set default project (name or ID)',
         )
         parser.add_argument(
             '--password',
-            metavar='<user-password>',
-            help='New user password',
+            metavar='<password>',
+            help='Set user password',
         )
         parser.add_argument(
             '--password-prompt',
@@ -256,23 +266,13 @@ class SetUser(command.Command):
         )
         parser.add_argument(
             '--email',
-            metavar='<user-email>',
-            help='New user email address',
-        )
-        parser.add_argument(
-            '--domain',
-            metavar='<domain>',
-            help='New domain name or ID',
-        )
-        parser.add_argument(
-            '--project',
-            metavar='<project>',
-            help='New project name or ID',
+            metavar='<email-address>',
+            help='Set user email address',
         )
         parser.add_argument(
             '--description',
             metavar='<description>',
-            help='New description',
+            help='Set user description',
         )
         enable_group = parser.add_mutually_exclusive_group()
         enable_group.add_argument(
@@ -380,7 +380,7 @@ class ShowUser(show.ShowOne):
         parser.add_argument(
             '--domain',
             metavar='<domain>',
-            help='Domain where user resides (name or ID)',
+            help='Domain owning <user> (name or ID)',
         )
         return parser