diff --git a/openstackclient/identity/v3/trust.py b/openstackclient/identity/v3/trust.py
index 447a57f2b8..41d01fa7b8 100644
--- a/openstackclient/identity/v3/trust.py
+++ b/openstackclient/identity/v3/trust.py
@@ -123,37 +123,67 @@ class CreateTrust(command.ShowOne):
         # pointless, and trusts are immutable, so let's enforce it at the
         # client level.
         try:
-            trustor_id = identity_client.find_user(
-                parsed_args.trustor, parsed_args.trustor_domain
-            ).id
-            kwargs['trustor_id'] = trustor_id
+            if parsed_args.trustor_domain:
+                trustor_domain_id = identity_client.find_domain(
+                    parsed_args.trustor_domain, ignore_missing=False
+                ).id
+                trustor_id = identity_client.find_user(
+                    parsed_args.trustor,
+                    ignore_missing=False,
+                    domain_id=trustor_domain_id,
+                ).id
+            else:
+                trustor_id = identity_client.find_user(
+                    parsed_args.trustor, ignore_missing=False
+                ).id
+            kwargs['trustor_user_id'] = trustor_id
         except sdk_exceptions.ForbiddenException:
-            kwargs['trustor_id'] = parsed_args.trustor
+            kwargs['trustor_user_id'] = parsed_args.trustor
 
         try:
-            trustee_id = identity_client.find_user(
-                parsed_args.trustee, parsed_args.trustee_domain
-            ).id
-            kwargs['trustee_id'] = trustee_id
+            if parsed_args.trustee_domain:
+                trustee_domain_id = identity_client.find_domain(
+                    parsed_args.trustee_domain, ignore_missing=False
+                ).id
+                trustee_id = identity_client.find_user(
+                    parsed_args.trustee,
+                    ignore_missing=False,
+                    domain_id=trustee_domain_id,
+                ).id
+            else:
+                trustee_id = identity_client.find_user(
+                    parsed_args.trustee, ignore_missing=False
+                ).id
+            kwargs['trustee_user_id'] = trustee_id
         except sdk_exceptions.ForbiddenException:
-            kwargs['trustee_id'] = parsed_args.trustee
+            kwargs['trustee_user_id'] = parsed_args.trustee
 
         try:
-            project_id = identity_client.find_project(
-                parsed_args.project, parsed_args.project_domain
-            ).id
+            if parsed_args.project_domain:
+                project_domain_id = identity_client.find_domain(
+                    parsed_args.project_domain, ignore_missing=False
+                ).id
+                project_id = identity_client.find_project(
+                    parsed_args.project,
+                    ignore_missing=False,
+                    domain_id=project_domain_id,
+                ).id
+            else:
+                project_id = identity_client.find_project(
+                    parsed_args.project, ignore_missing=False
+                ).id
             kwargs['project_id'] = project_id
         except sdk_exceptions.ForbiddenException:
             kwargs['project_id'] = parsed_args.project
 
-        role_ids = []
+        roles = []
         for role in parsed_args.roles:
             try:
                 role_id = identity_client.find_role(role).id
             except sdk_exceptions.ForbiddenException:
                 role_id = role
-            role_ids.append(role_id)
-        kwargs['roles'] = role_ids
+            roles.append({"id": role_id})
+        kwargs['roles'] = roles
 
         if parsed_args.expiration:
             expires_at = datetime.datetime.strptime(
@@ -161,8 +191,7 @@ class CreateTrust(command.ShowOne):
             )
             kwargs['expires_at'] = expires_at
 
-        if parsed_args.is_impersonation:
-            kwargs['is_impersonation'] = parsed_args.is_impersonation
+        kwargs['impersonation'] = bool(parsed_args.is_impersonation)
 
         trust = identity_client.create_trust(**kwargs)
 
@@ -289,9 +318,19 @@ class ListTrust(command.Lister):
             trustor = None
             if parsed_args.trustor:
                 try:
-                    trustor_id = identity_client.find_user(
-                        parsed_args.trustor, parsed_args.trustor_domain
-                    ).id
+                    if parsed_args.trustor_domain:
+                        trustor_domain_id = identity_client.find_domain(
+                            parsed_args.trustor_domain, ignore_missing=False
+                        ).id
+                        trustor_id = identity_client.find_user(
+                            parsed_args.trustor,
+                            ignore_missing=False,
+                            domain_id=trustor_domain_id,
+                        ).id
+                    else:
+                        trustor_id = identity_client.find_user(
+                            parsed_args.trustor, ignore_missing=False
+                        ).id
                     trustor = trustor_id
                 except sdk_exceptions.ForbiddenException:
                     trustor = parsed_args.trustor
@@ -299,9 +338,19 @@ class ListTrust(command.Lister):
             trustee = None
             if parsed_args.trustee:
                 try:
-                    trustee_id = identity_client.find_user(
-                        parsed_args.trustee, parsed_args.trustee_domain
-                    ).id
+                    if parsed_args.trustee_domain:
+                        trustee_domain_id = identity_client.find_domain(
+                            parsed_args.trustee_domain, ignore_missing=False
+                        ).id
+                        trustee_id = identity_client.find_user(
+                            parsed_args.trustee,
+                            ignore_missing=False,
+                            domain_id=trustee_domain_id,
+                        ).id
+                    else:
+                        trustee_id = identity_client.find_user(
+                            parsed_args.trustee, ignore_missing=False
+                        ).id
                     trustee = trustee_id
                 except sdk_exceptions.ForbiddenException:
                     trustee = parsed_args.trustee
diff --git a/openstackclient/tests/unit/identity/v3/test_trust.py b/openstackclient/tests/unit/identity/v3/test_trust.py
index 07776fa45b..5c14b7ad98 100644
--- a/openstackclient/tests/unit/identity/v3/test_trust.py
+++ b/openstackclient/tests/unit/identity/v3/test_trust.py
@@ -70,12 +70,15 @@ class TestTrustCreate(identity_fakes.TestIdentityv3):
         # Set expected values
         kwargs = {
             'project_id': self.project.id,
-            'roles': [self.role.id],
+            'roles': [{'id': self.role.id}],
+            'impersonation': False,
         }
         # TrustManager.create(trustee_id, trustor_id, impersonation=,
         #   project=, role_names=, expires_at=)
         self.identity_sdk_client.create_trust.assert_called_with(
-            trustor_id=self.user.id, trustee_id=self.user.id, **kwargs
+            trustor_user_id=self.user.id,
+            trustee_user_id=self.user.id,
+            **kwargs,
         )
 
         collist = (