diff --git a/manila_tempest_tests/tests/api/admin/test_migration.py b/manila_tempest_tests/tests/api/admin/test_migration.py
index 5e29fb8..bdc6248 100644
--- a/manila_tempest_tests/tests/api/admin/test_migration.py
+++ b/manila_tempest_tests/tests/api/admin/test_migration.py
@@ -27,9 +27,8 @@
 CONF = config.CONF
 
 
-@ddt.ddt
-class MigrationNFSTest(base.BaseSharesAdminTest):
-    """Tests Share Migration for NFS shares.
+class MigrationBase(base.BaseSharesAdminTest):
+    """Base test class for Share Migration.
 
     Tests share migration in multi-backend environment.
 
@@ -53,11 +52,11 @@
     configuration flag to be tested.
     """
 
-    protocol = "nfs"
+    protocol = None
 
     @classmethod
     def resource_setup(cls):
-        super(MigrationNFSTest, cls).resource_setup()
+        super(MigrationBase, cls).resource_setup()
         if cls.protocol not in CONF.share.enable_protocols:
             message = "%s tests are disabled." % cls.protocol
             raise cls.skipException(message)
@@ -81,256 +80,6 @@
             extra_specs=utils.get_configured_extra_specs(
                 variation='opposite_driver_modes'))
 
-    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
-    @base.skip_if_microversion_lt("2.29")
-    @ddt.data(True, False)
-    def test_migration_cancel(self, force_host_assisted):
-
-        self._check_migration_enabled(force_host_assisted)
-
-        share = self.create_share(self.protocol)
-        share = self.shares_v2_client.get_share(share['id'])
-
-        share, dest_pool = self._setup_migration(share)
-
-        task_state = (constants.TASK_STATE_DATA_COPYING_COMPLETED
-                      if force_host_assisted
-                      else constants.TASK_STATE_MIGRATION_DRIVER_PHASE1_DONE)
-
-        share = self.migrate_share(
-            share['id'], dest_pool, wait_for_status=task_state,
-            force_host_assisted_migration=force_host_assisted)
-
-        self._validate_migration_successful(
-            dest_pool, share, task_state, complete=False)
-
-        progress = self.shares_v2_client.migration_get_progress(share['id'])
-
-        self.assertEqual(task_state, progress['task_state'])
-        self.assertEqual(100, progress['total_progress'])
-
-        share = self.migration_cancel(share['id'], dest_pool)
-
-        progress = self.shares_v2_client.migration_get_progress(share['id'])
-
-        self.assertEqual(
-            constants.TASK_STATE_MIGRATION_CANCELLED, progress['task_state'])
-        self.assertEqual(100, progress['total_progress'])
-
-        self._validate_migration_successful(
-            dest_pool, share, constants.TASK_STATE_MIGRATION_CANCELLED,
-            complete=False)
-
-    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
-    @base.skip_if_microversion_lt("2.29")
-    @ddt.data(True, False)
-    def test_migration_opposite_driver_modes(self, force_host_assisted):
-
-        self._check_migration_enabled(force_host_assisted)
-
-        share = self.create_share(self.protocol)
-        share = self.shares_v2_client.get_share(share['id'])
-
-        share, dest_pool = self._setup_migration(share, opposite=True)
-
-        # If currently configured is DHSS=False,
-        # then we need it for DHSS=True
-        if not CONF.share.multitenancy_enabled:
-
-            new_share_network_id = self.provide_share_network(
-                self.shares_v2_client, self.os_admin.networks_client,
-                isolated_creds_client=None, ignore_multitenancy_config=True)
-
-        # If currently configured is DHSS=True,
-        # then we must pass None for DHSS=False
-        else:
-            new_share_network_id = None
-
-        old_share_network_id = share['share_network_id']
-        old_share_type_id = share['share_type']
-        new_share_type_id = self.new_type_opposite['share_type']['id']
-
-        task_state = (constants.TASK_STATE_DATA_COPYING_COMPLETED
-                      if force_host_assisted
-                      else constants.TASK_STATE_MIGRATION_DRIVER_PHASE1_DONE)
-
-        share = self.migrate_share(
-            share['id'], dest_pool,
-            force_host_assisted_migration=force_host_assisted,
-            wait_for_status=task_state, new_share_type_id=new_share_type_id,
-            new_share_network_id=new_share_network_id)
-
-        self._validate_migration_successful(
-            dest_pool, share, task_state, complete=False,
-            share_network_id=old_share_network_id,
-            share_type_id=old_share_type_id)
-
-        progress = self.shares_v2_client.migration_get_progress(share['id'])
-
-        self.assertEqual(task_state, progress['task_state'])
-        self.assertEqual(100, progress['total_progress'])
-
-        share = self.migration_complete(share['id'], dest_pool)
-
-        progress = self.shares_v2_client.migration_get_progress(share['id'])
-
-        self.assertEqual(
-            constants.TASK_STATE_MIGRATION_SUCCESS, progress['task_state'])
-        self.assertEqual(100, progress['total_progress'])
-
-        self._validate_migration_successful(
-            dest_pool, share, constants.TASK_STATE_MIGRATION_SUCCESS,
-            complete=True, share_network_id=new_share_network_id,
-            share_type_id=new_share_type_id)
-
-    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
-    @base.skip_if_microversion_lt("2.29")
-    @ddt.data(True, False)
-    def test_migration_2phase(self, force_host_assisted):
-
-        self._check_migration_enabled(force_host_assisted)
-
-        share = self.create_share(self.protocol)
-        share = self.shares_v2_client.get_share(share['id'])
-
-        share, dest_pool = self._setup_migration(share)
-
-        old_share_network_id = share['share_network_id']
-        old_share_type_id = share['share_type']
-        task_state, new_share_network_id, new_share_type_id = (
-            self._get_migration_data(share, force_host_assisted))
-
-        share = self.migrate_share(
-            share['id'], dest_pool,
-            force_host_assisted_migration=force_host_assisted,
-            wait_for_status=task_state, new_share_type_id=new_share_type_id,
-            new_share_network_id=new_share_network_id)
-
-        self._validate_migration_successful(
-            dest_pool, share, task_state, complete=False,
-            share_network_id=old_share_network_id,
-            share_type_id=old_share_type_id)
-
-        progress = self.shares_v2_client.migration_get_progress(share['id'])
-
-        self.assertEqual(task_state, progress['task_state'])
-        self.assertEqual(100, progress['total_progress'])
-
-        share = self.migration_complete(share['id'], dest_pool)
-
-        progress = self.shares_v2_client.migration_get_progress(share['id'])
-
-        self.assertEqual(
-            constants.TASK_STATE_MIGRATION_SUCCESS, progress['task_state'])
-        self.assertEqual(100, progress['total_progress'])
-
-        self._validate_migration_successful(
-            dest_pool, share, constants.TASK_STATE_MIGRATION_SUCCESS,
-            complete=True, share_network_id=new_share_network_id,
-            share_type_id=new_share_type_id)
-        self._cleanup_share(share)
-
-    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
-    @base.skip_if_microversion_lt("2.29")
-    @testtools.skipUnless(CONF.share.run_extend_tests,
-                          'Extend share tests are disabled.')
-    @ddt.data(True, False)
-    def test_extend_on_migrated_share(self, force_host_assisted):
-        self._test_resize_post_migration(force_host_assisted, resize='extend')
-
-    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
-    @base.skip_if_microversion_lt("2.29")
-    @testtools.skipUnless(CONF.share.run_shrink_tests,
-                          'Shrink share tests are disabled.')
-    @ddt.data(True, False)
-    def test_shrink_on_migrated_share(self, force_host_assisted):
-        self._test_resize_post_migration(force_host_assisted, resize='shrink')
-
-    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
-    @base.skip_if_microversion_lt("2.29")
-    @testtools.skipUnless(CONF.share.run_snapshot_tests,
-                          'Snapshot tests are disabled.')
-    @testtools.skipUnless(CONF.share.run_driver_assisted_migration_tests,
-                          'Driver-assisted migration tests are disabled.')
-    @testtools.skipUnless(
-        CONF.share.run_migration_with_preserve_snapshots_tests,
-        'Migration with preserve snapshots tests are disabled.')
-    def test_migrating_share_with_snapshot(self):
-        ss_type, __ = self._create_share_type_for_snapshot_capability()
-
-        share = self.create_share(self.protocol, cleanup_in_class=False)
-        share = self.shares_v2_client.get_share(share['id'])
-
-        share, dest_pool = self._setup_migration(share)
-        snapshot1 = self.create_snapshot_wait_for_active(
-            share['id'], cleanup_in_class=False)
-        snapshot2 = self.create_snapshot_wait_for_active(
-            share['id'], cleanup_in_class=False)
-
-        task_state, new_share_network_id, __ = self._get_migration_data(share)
-
-        share = self.migrate_share(
-            share['id'], dest_pool,
-            wait_for_status=task_state,
-            new_share_type_id=ss_type['share_type']['id'],
-            new_share_network_id=new_share_network_id, preserve_snapshots=True)
-
-        share = self.migration_complete(share['id'], dest_pool)
-
-        self._validate_snapshot(share, snapshot1, snapshot2)
-
-    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
-    @base.skip_if_microversion_lt("2.29")
-    @testtools.skipUnless(CONF.share.run_snapshot_tests,
-                          'Snapshot tests are disabled.')
-    @testtools.skipUnless(CONF.share.run_driver_assisted_migration_tests,
-                          'Driver-assisted migration tests are disabled.')
-    @testtools.skipUnless(
-        CONF.share.run_migration_with_preserve_snapshots_tests,
-        'Migration with preserve snapshots tests are disabled.')
-    def test_migration_cancel_share_with_snapshot(self):
-        share = self.create_share(self.protocol)
-        share = self.shares_v2_client.get_share(share['id'])
-
-        share, dest_pool = self._setup_migration(share)
-        snapshot1 = self.create_snapshot_wait_for_active(share['id'])
-        snapshot2 = self.create_snapshot_wait_for_active(share['id'])
-
-        task_state, new_share_network_id, new_share_type_id = (
-            self._get_migration_data(share))
-
-        share = self.migrate_share(
-            share['id'], dest_pool,
-            wait_for_status=task_state, new_share_type_id=new_share_type_id,
-            new_share_network_id=new_share_network_id, preserve_snapshots=True)
-
-        share = self.migration_cancel(share['id'], dest_pool)
-        self._validate_snapshot(share, snapshot1, snapshot2)
-
-    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
-    @base.skip_if_microversion_lt("2.29")
-    @testtools.skipUnless(CONF.share.run_snapshot_tests,
-                          'Snapshot tests are disabled.')
-    @ddt.data(True, False)
-    def test_migrate_share_to_snapshot_capability_share_type(
-            self, force_host_assisted):
-        # Verify that share with no snapshot support type can be migrated
-        # to new share type which supports the snapshot
-        self._validate_share_migration_with_different_snapshot_capability_type(
-            force_host_assisted, True)
-
-    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
-    @base.skip_if_microversion_lt("2.29")
-    @testtools.skipUnless(CONF.share.run_snapshot_tests,
-                          'Snapshot tests are disabled.')
-    @ddt.data(True, False)
-    def test_migrate_share_to_no_snapshot_capability_share_type(
-            self, force_host_assisted):
-        # Verify that share with snapshot support type can be migrated
-        # to new share type which doesn't support the snapshot
-        self._validate_share_migration_with_different_snapshot_capability_type(
-            force_host_assisted, False)
-
     def _setup_migration(self, share, opposite=False):
 
         if opposite:
@@ -590,3 +339,296 @@
         # NOTE(Yogi1): Share needs to be cleaned up explicitly at the end of
         #  test otherwise, newly created share_network will not get cleaned up.
         self.method_resources.insert(0, resource)
+
+
+@ddt.ddt
+class MigrationCancelNFSTest(MigrationBase):
+    protocol = "nfs"
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+    @base.skip_if_microversion_lt("2.29")
+    @ddt.data(True, False)
+    def test_migration_cancel(self, force_host_assisted):
+        self._check_migration_enabled(force_host_assisted)
+
+        share = self.create_share(self.protocol)
+        share = self.shares_v2_client.get_share(share['id'])
+        share, dest_pool = self._setup_migration(share)
+        task_state = (constants.TASK_STATE_DATA_COPYING_COMPLETED
+                      if force_host_assisted
+                      else constants.TASK_STATE_MIGRATION_DRIVER_PHASE1_DONE)
+
+        share = self.migrate_share(
+            share['id'], dest_pool, wait_for_status=task_state,
+            force_host_assisted_migration=force_host_assisted)
+
+        self._validate_migration_successful(
+            dest_pool, share, task_state, complete=False)
+
+        progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+        self.assertEqual(task_state, progress['task_state'])
+        self.assertEqual(100, progress['total_progress'])
+
+        share = self.migration_cancel(share['id'], dest_pool)
+        progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+        self.assertEqual(
+            constants.TASK_STATE_MIGRATION_CANCELLED, progress['task_state'])
+        self.assertEqual(100, progress['total_progress'])
+
+        self._validate_migration_successful(
+            dest_pool, share, constants.TASK_STATE_MIGRATION_CANCELLED,
+            complete=False)
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+    @base.skip_if_microversion_lt("2.29")
+    @testtools.skipUnless(
+        CONF.share.run_snapshot_tests, 'Snapshot tests are disabled.')
+    @testtools.skipUnless(
+        CONF.share.run_driver_assisted_migration_tests,
+        'Driver-assisted migration tests are disabled.')
+    @testtools.skipUnless(
+        CONF.share.run_migration_with_preserve_snapshots_tests,
+        'Migration with preserve snapshots tests are disabled.')
+    def test_migration_cancel_share_with_snapshot(self):
+        share = self.create_share(self.protocol)
+        share = self.shares_v2_client.get_share(share['id'])
+
+        share, dest_pool = self._setup_migration(share)
+        snapshot1 = self.create_snapshot_wait_for_active(share['id'])
+        snapshot2 = self.create_snapshot_wait_for_active(share['id'])
+
+        task_state, new_share_network_id, new_share_type_id = (
+            self._get_migration_data(share))
+
+        share = self.migrate_share(
+            share['id'], dest_pool,
+            wait_for_status=task_state, new_share_type_id=new_share_type_id,
+            new_share_network_id=new_share_network_id, preserve_snapshots=True)
+
+        share = self.migration_cancel(share['id'], dest_pool)
+        self._validate_snapshot(share, snapshot1, snapshot2)
+
+
+@ddt.ddt
+class MigrationOppositeDriverModesNFSTest(MigrationBase):
+    protocol = "nfs"
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+    @base.skip_if_microversion_lt("2.29")
+    @ddt.data(True, False)
+    def test_migration_opposite_driver_modes(self, force_host_assisted):
+        self._check_migration_enabled(force_host_assisted)
+
+        share = self.create_share(self.protocol)
+        share = self.shares_v2_client.get_share(share['id'])
+        share, dest_pool = self._setup_migration(share, opposite=True)
+
+        if not CONF.share.multitenancy_enabled:
+            # If currently configured is DHSS=False,
+            # then we need it for DHSS=True
+            new_share_network_id = self.provide_share_network(
+                self.shares_v2_client,
+                self.os_admin.networks_client,
+                isolated_creds_client=None,
+                ignore_multitenancy_config=True,
+            )
+        else:
+            # If currently configured is DHSS=True,
+            # then we must pass None for DHSS=False
+            new_share_network_id = None
+
+        old_share_network_id = share['share_network_id']
+        old_share_type_id = share['share_type']
+        new_share_type_id = self.new_type_opposite['share_type']['id']
+
+        task_state = (constants.TASK_STATE_DATA_COPYING_COMPLETED
+                      if force_host_assisted
+                      else constants.TASK_STATE_MIGRATION_DRIVER_PHASE1_DONE)
+
+        share = self.migrate_share(
+            share['id'], dest_pool,
+            force_host_assisted_migration=force_host_assisted,
+            wait_for_status=task_state, new_share_type_id=new_share_type_id,
+            new_share_network_id=new_share_network_id)
+
+        self._validate_migration_successful(
+            dest_pool, share, task_state, complete=False,
+            share_network_id=old_share_network_id,
+            share_type_id=old_share_type_id)
+
+        progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+        self.assertEqual(task_state, progress['task_state'])
+        self.assertEqual(100, progress['total_progress'])
+
+        share = self.migration_complete(share['id'], dest_pool)
+
+        progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+        self.assertEqual(
+            constants.TASK_STATE_MIGRATION_SUCCESS, progress['task_state'])
+        self.assertEqual(100, progress['total_progress'])
+
+        self._validate_migration_successful(
+            dest_pool, share, constants.TASK_STATE_MIGRATION_SUCCESS,
+            complete=True, share_network_id=new_share_network_id,
+            share_type_id=new_share_type_id)
+
+
+@ddt.ddt
+class MigrationTwoPhaseNFSTest(MigrationBase):
+    protocol = "nfs"
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+    @base.skip_if_microversion_lt("2.29")
+    @ddt.data(True, False)
+    def test_migration_2phase(self, force_host_assisted):
+        self._check_migration_enabled(force_host_assisted)
+
+        share = self.create_share(self.protocol)
+        share = self.shares_v2_client.get_share(share['id'])
+        share, dest_pool = self._setup_migration(share)
+
+        old_share_network_id = share['share_network_id']
+        old_share_type_id = share['share_type']
+        task_state, new_share_network_id, new_share_type_id = (
+            self._get_migration_data(share, force_host_assisted))
+
+        share = self.migrate_share(
+            share['id'], dest_pool,
+            force_host_assisted_migration=force_host_assisted,
+            wait_for_status=task_state, new_share_type_id=new_share_type_id,
+            new_share_network_id=new_share_network_id)
+
+        self._validate_migration_successful(
+            dest_pool, share, task_state, complete=False,
+            share_network_id=old_share_network_id,
+            share_type_id=old_share_type_id)
+
+        progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+        self.assertEqual(task_state, progress['task_state'])
+        self.assertEqual(100, progress['total_progress'])
+
+        share = self.migration_complete(share['id'], dest_pool)
+
+        progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+        self.assertEqual(
+            constants.TASK_STATE_MIGRATION_SUCCESS, progress['task_state'])
+        self.assertEqual(100, progress['total_progress'])
+
+        self._validate_migration_successful(
+            dest_pool, share, constants.TASK_STATE_MIGRATION_SUCCESS,
+            complete=True, share_network_id=new_share_network_id,
+            share_type_id=new_share_type_id)
+        self._cleanup_share(share)
+
+
+@ddt.ddt
+class MigrationWithShareExtendingNFSTest(MigrationBase):
+    protocol = "nfs"
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+    @base.skip_if_microversion_lt("2.29")
+    @testtools.skipUnless(
+        CONF.share.run_extend_tests, 'Extend share tests are disabled.')
+    @ddt.data(True, False)
+    def test_extend_on_migrated_share(self, force_host_assisted):
+        self._test_resize_post_migration(force_host_assisted, resize='extend')
+
+
+@ddt.ddt
+class MigrationWithShareShrinkingNFSTest(MigrationBase):
+    protocol = "nfs"
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+    @base.skip_if_microversion_lt("2.29")
+    @testtools.skipUnless(
+        CONF.share.run_shrink_tests, 'Shrink share tests are disabled.')
+    @ddt.data(True, False)
+    def test_shrink_on_migrated_share(self, force_host_assisted):
+        self._test_resize_post_migration(force_host_assisted, resize='shrink')
+
+
+@ddt.ddt
+class MigrationOfShareWithSnapshotNFSTest(MigrationBase):
+    protocol = "nfs"
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+    @base.skip_if_microversion_lt("2.29")
+    @testtools.skipUnless(
+        CONF.share.run_snapshot_tests, 'Snapshot tests are disabled.')
+    @testtools.skipUnless(
+        CONF.share.run_driver_assisted_migration_tests,
+        'Driver-assisted migration tests are disabled.')
+    @testtools.skipUnless(
+        CONF.share.run_migration_with_preserve_snapshots_tests,
+        'Migration with preserve snapshots tests are disabled.')
+    def test_migrating_share_with_snapshot(self):
+        ss_type, __ = self._create_share_type_for_snapshot_capability()
+
+        share = self.create_share(self.protocol, cleanup_in_class=False)
+        share = self.shares_v2_client.get_share(share['id'])
+
+        share, dest_pool = self._setup_migration(share)
+        snapshot1 = self.create_snapshot_wait_for_active(
+            share['id'], cleanup_in_class=False)
+        snapshot2 = self.create_snapshot_wait_for_active(
+            share['id'], cleanup_in_class=False)
+
+        task_state, new_share_network_id, __ = self._get_migration_data(share)
+
+        share = self.migrate_share(
+            share['id'], dest_pool,
+            wait_for_status=task_state,
+            new_share_type_id=ss_type['share_type']['id'],
+            new_share_network_id=new_share_network_id, preserve_snapshots=True)
+
+        share = self.migration_complete(share['id'], dest_pool)
+
+        self._validate_snapshot(share, snapshot1, snapshot2)
+
+
+@ddt.ddt
+class MigrationWithDifferentSnapshotSupportNFSTest(MigrationBase):
+    protocol = "nfs"
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+    @base.skip_if_microversion_lt("2.29")
+    @testtools.skipUnless(CONF.share.run_snapshot_tests,
+                          'Snapshot tests are disabled.')
+    @ddt.data(True, False)
+    def test_migrate_share_to_snapshot_capability_share_type(
+            self, force_host_assisted):
+        # Verify that share with no snapshot support type can be migrated
+        # to new share type which supports the snapshot
+        self._validate_share_migration_with_different_snapshot_capability_type(
+            force_host_assisted, True)
+
+    @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+    @base.skip_if_microversion_lt("2.29")
+    @testtools.skipUnless(CONF.share.run_snapshot_tests,
+                          'Snapshot tests are disabled.')
+    @ddt.data(True, False)
+    def test_migrate_share_to_no_snapshot_capability_share_type(
+            self, force_host_assisted):
+        # Verify that share with snapshot support type can be migrated
+        # to new share type which doesn't support the snapshot
+        self._validate_share_migration_with_different_snapshot_capability_type(
+            force_host_assisted, False)
+
+
+# NOTE(u_glide): this function is required to exclude MigrationBase from
+# executed test cases.
+# See: https://docs.python.org/2/library/unittest.html#load-tests-protocol
+# for details.
+def load_tests(loader, tests, _):
+    result = []
+    for test_case in tests:
+        if not test_case._tests or type(test_case._tests[0]) is MigrationBase:
+            continue
+        result.append(test_case)
+    return loader.suiteClass(result)
