diff --git a/designate_tempest_plugin/services/dns/v2/json/transfer_accepts_client.py b/designate_tempest_plugin/services/dns/v2/json/transfer_accepts_client.py
index fe0fd0f..a0612e9 100644
--- a/designate_tempest_plugin/services/dns/v2/json/transfer_accepts_client.py
+++ b/designate_tempest_plugin/services/dns/v2/json/transfer_accepts_client.py
@@ -47,3 +47,15 @@
         """
         return self._show_request(
             'zones/tasks/transfer_accepts', uuid, params=params)
+
+    @base.handle_errors
+    def list_transfer_accept(self, params=None, headers=None):
+        """Lists all accepted zone transfers.
+        :param params: A Python dict that represents the query paramaters to
+                       include in the accept URI.
+        :param headers (dict): The headers to use for the request.
+        :return: List of accepted zone transfers
+        """
+        return self._list_request(
+            'zones/tasks/transfer_accepts', params=params,
+            headers=headers)[1]['transfer_accepts']
diff --git a/designate_tempest_plugin/tests/api/v2/test_transfer_accepts.py b/designate_tempest_plugin/tests/api/v2/test_transfer_accepts.py
index 70c9e30..1f7c1e1 100644
--- a/designate_tempest_plugin/tests/api/v2/test_transfer_accepts.py
+++ b/designate_tempest_plugin/tests/api/v2/test_transfer_accepts.py
@@ -13,6 +13,7 @@
 #    under the License.
 from oslo_log import log as logging
 from tempest.lib import decorators
+from tempest.lib import exceptions as lib_exc
 
 from designate_tempest_plugin.tests import base
 
@@ -25,6 +26,8 @@
 
 
 class TransferAcceptTest(BaseTransferAcceptTest):
+    credentials = ['primary', 'alt', 'admin']
+
     @classmethod
     def setup_credentials(cls):
         # Do not create network resources for these test.
@@ -35,20 +38,32 @@
     def setup_clients(cls):
         super(TransferAcceptTest, cls).setup_clients()
 
-        cls.zone_client = cls.os_primary.zones_client
-        cls.request_client = cls.os_primary.transfer_request_client
-        cls.client = cls.os_primary.transfer_accept_client
+        # Primary clients
+        cls.prm_zone_client = cls.os_primary.zones_client
+        cls.prm_request_client = cls.os_primary.transfer_request_client
+        cls.prm_accept_client = cls.os_primary.transfer_accept_client
+
+        # Alt clients
+        cls.alt_zone_client = cls.os_alt.zones_client
+        cls.alt_request_client = cls.os_alt.transfer_request_client
+        cls.alt_accept_client = cls.os_alt.transfer_accept_client
+
+        # Admin clients
+        cls.admin_zone_client = cls.os_admin.zones_client
+        cls.admin_request_client = cls.os_admin.transfer_request_client
+        cls.admin_accept_client = cls.os_admin.transfer_accept_client
 
     @decorators.idempotent_id('1c6baf97-a83e-4d2e-a5d8-9d37fb7808f3')
     def test_create_transfer_accept(self):
         LOG.info('Create a zone')
-        _, zone = self.zone_client.create_zone()
-        self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id'])
+        _, zone = self.prm_zone_client.create_zone()
+        self.addCleanup(
+            self.wait_zone_delete, self.prm_zone_client, zone['id'])
 
         LOG.info('Create a zone transfer_request')
-        _, transfer_request = self.request_client.create_transfer_request(
-                                  zone['id'])
-        self.addCleanup(self.request_client.delete_transfer_request,
+        _, transfer_request = self.prm_request_client.create_transfer_request(
+            zone['id'])
+        self.addCleanup(self.prm_request_client.delete_transfer_request,
                         transfer_request['id'])
 
         data = {
@@ -56,7 +71,8 @@
                  "zone_transfer_request_id": transfer_request['id']
         }
         LOG.info('Create a zone transfer_accept')
-        _, transfer_accept = self.client.create_transfer_accept(data)
+        _, transfer_accept = self.prm_accept_client.create_transfer_accept(
+            data)
 
         LOG.info('Ensure we respond with ACTIVE status')
         self.assertEqual('COMPLETE', transfer_accept['status'])
@@ -64,13 +80,14 @@
     @decorators.idempotent_id('37c6afbb-3ea3-4fd8-94ea-a426244f019a')
     def test_show_transfer_accept(self):
         LOG.info('Create a zone')
-        _, zone = self.zone_client.create_zone()
-        self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id'])
+        _, zone = self.prm_zone_client.create_zone()
+        self.addCleanup(
+            self.wait_zone_delete, self.prm_zone_client, zone['id'])
 
         LOG.info('Create a zone transfer_request')
-        _, transfer_request = self.request_client.create_transfer_request(
+        _, transfer_request = self.prm_request_client.create_transfer_request(
                                   zone['id'])
-        self.addCleanup(self.request_client.delete_transfer_request,
+        self.addCleanup(self.prm_request_client.delete_transfer_request,
                         transfer_request['id'])
 
         data = {
@@ -79,11 +96,123 @@
         }
 
         LOG.info('Create a zone transfer_accept')
-        _, transfer_accept = self.client.create_transfer_accept(data)
+        _, transfer_accept = self.prm_accept_client.create_transfer_accept(
+            data)
 
         LOG.info('Fetch the transfer_accept')
-        _, body = self.client.show_transfer_accept(transfer_accept['id'])
+        _, body = self.prm_accept_client.show_transfer_accept(
+            transfer_accept['id'])
 
         LOG.info('Ensure the fetched response matches the '
                  'created transfer_accept')
         self.assertExpected(transfer_accept, body, self.excluded_keys)
+
+    @decorators.idempotent_id('89b516f0-8c9f-11eb-a322-74e5f9e2a801')
+    def test_ownership_transferred_zone(self):
+
+        LOG.info('Create a Primary zone')
+        zone = self.prm_zone_client.create_zone()[1]
+        self.addCleanup(self.wait_zone_delete, self.prm_zone_client,
+                        zone['id'], ignore_errors=lib_exc.NotFound)
+
+        LOG.info('Create a Primary zone transfer_request')
+        transfer_request = self.prm_request_client.create_transfer_request(
+            zone['id'])[1]
+        self.addCleanup(self.prm_request_client.delete_transfer_request,
+                        transfer_request['id'])
+
+        data = {
+            "key": transfer_request['key'],
+            "zone_transfer_request_id": transfer_request['id']
+        }
+        LOG.info('Create an Alt zone transfer_accept')
+        transfer_accept = self.alt_accept_client.create_transfer_accept(
+            data)[1]
+
+        LOG.info('Ensure we respond with ACTIVE status')
+        self.assertEqual('COMPLETE', transfer_accept['status'])
+
+        # Make sure that the "project_id" of transferred zone has been changed
+        alt_transferred_zone = self.alt_zone_client.show_zone(zone['id'])[1]
+
+        self.assertNotEqual(
+            zone['project_id'], alt_transferred_zone['project_id'],
+            'Failed, shown "project_id" for a transferred zone:{} should be '
+            'different than the original "project_id" used in '
+            'creation {}:'.format(
+                alt_transferred_zone['project_id'], zone['project_id']))
+
+    @decorators.idempotent_id('0fcd314c-8cae-11eb-a322-74e5f9e2a801')
+    def test_list_transfer_accepts(self):
+        """Test list API including filtering result option"""
+
+        number_of_zones_to_transfer = 3
+        transfer_request_ids = []
+        for _ in range(number_of_zones_to_transfer):
+
+            LOG.info('Create a Primary zone')
+            zone = self.prm_zone_client.create_zone()[1]
+            self.addCleanup(self.wait_zone_delete, self.prm_zone_client,
+                            zone['id'], ignore_errors=lib_exc.NotFound)
+
+            LOG.info('Create a Primary zone transfer_request')
+            transfer_request = self.prm_request_client.create_transfer_request(
+                zone['id'])[1]
+            self.addCleanup(self.prm_request_client.delete_transfer_request,
+                            transfer_request['id'])
+
+            data = {
+                "key": transfer_request['key'],
+                "zone_transfer_request_id": transfer_request['id']
+            }
+            LOG.info('Create an Alt zone transfer_accept')
+            transfer_accept = self.alt_accept_client.create_transfer_accept(
+                data)[1]
+
+            LOG.info('Ensure we respond with ACTIVE status')
+            self.assertEqual('COMPLETE', transfer_accept['status'])
+            transfer_request_ids.append(transfer_accept['id'])
+
+        # As Admin list all accepted zone transfers, expected:
+        # each previously transferred zone is listed.
+        LOG.info('Use Admin client to list all "accepted zone transfers"')
+        admin_client_accept_ids = [
+            item['id'] for item in
+            self.admin_accept_client.list_transfer_accept(
+                headers={'x-auth-all-projects': True})]
+        for tr_id in transfer_request_ids:
+            self.assertIn(
+                tr_id, admin_client_accept_ids,
+                'Failed, expected transfer accept ID:{} is not listed in'
+                ' transfer accept IDs:{} '.format(tr_id, transfer_request_ids))
+
+        # As Admin list all accepted zone transfers in COMPLETE status only,
+        # expected: each previously transferred zone is listed.
+        LOG.info('Use Admin client to list all "accepted zone transfers", '
+                 'filter COMPLETE status only accepts.')
+        admin_client_accept_ids = [
+            item['id'] for item in
+            self.admin_accept_client.list_transfer_accept(
+                headers={'x-auth-all-projects': True},
+                params={'status': 'COMPLETE'})]
+        for tr_id in transfer_request_ids:
+            self.assertIn(
+                tr_id, admin_client_accept_ids,
+                'Failed, expected transfer accept ID:{} is not listed in'
+                ' transfer accept IDs:{} '.format(
+                    tr_id, transfer_request_ids))
+
+        # As Admin list all accepted zone transfers in "non existing" status,
+        # expected: received list is empty.
+        not_existing_status = 'zahlabut'
+        LOG.info('Use Admin client to list all "accepted zone transfers", '
+                 'filter {} status only accepts.'.format(not_existing_status))
+        admin_client_accept_ids = [
+            item['id'] for item in
+            self.admin_accept_client.list_transfer_accept(
+                headers={'x-auth-all-projects': True},
+                params={'status': not_existing_status})]
+        self.assertEmpty(
+            admin_client_accept_ids,
+            "Failed, filtered list should be empty, but actually it's not, "
+            "filtered IDs:{} ".format(admin_client_accept_ids))
