diff --git a/fixtures/base.py b/fixtures/base.py
index 721d772..d1434dd 100644
--- a/fixtures/base.py
+++ b/fixtures/base.py
@@ -16,11 +16,11 @@
     return os_client.OfficialClientManager(
         username=os.environ['OS_USERNAME'],
         password=os.environ['OS_PASSWORD'],
-        tenant_name=os.environ['OS_PROJECT_NAME'],
+        project_name=os.environ['OS_PROJECT_NAME'],
         auth_url=os.environ['OS_AUTH_URL'],
         cert=False,
         domain=os.environ['OS_PROJECT_DOMAIN_NAME'],
-        )
+    )
 
 
 nodes = utils.get_pairs()
@@ -34,6 +34,7 @@
 
 @pytest.fixture(scope='session')
 def os_resources(openstack_clients):
+    logger.info("Setting up resources in admin project...")
     os_actions = os_client.OSCliActions(openstack_clients)
     os_resource = {}
     config = utils.get_configuration()
@@ -50,19 +51,16 @@
     if os_images_list.__len__() == 0:
         pytest.skip("No images with name {}. This name can be redefined "
                     "with 'image_name' env var ".format(image_name))
-
     os_resource['image_id'] = str(os_images_list[0])
-
-    os_resource['flavor_id'] = [flavor.id for flavor in
-                                openstack_clients.compute.flavors.list()
-                                if flavor.name == flavor_name]
-    flavor_is_created = False
-    if not os_resource['flavor_id']:
+    flavor_id = os_actions.get_flavor_id_by_name(flavor_name)
+    if flavor_id is None:
+        flavor_is_created = True
         os_resource['flavor_id'] = os_actions.create_flavor(
             flavor_name, flavor_ram, flavor_vcpus, flavor_disk).id
-        flavor_is_created = True
     else:
-        os_resource['flavor_id'] = str(os_resource['flavor_id'][0])
+        flavor_is_created = False
+        logger.info("Flavor {} already exists".format(flavor_name))
+        os_resource['flavor_id'] = flavor_id
 
     os_resource['sec_group'] = os_actions.create_sec_group()
     os_resource['keypair'] = openstack_clients.compute.keypairs.create(
@@ -70,12 +68,12 @@
     )
     os_resource['net1'] = os_actions.create_network_resources()
     os_resource['ext_net'] = os_actions.get_external_network()
-    adm_tenant = os_actions.get_admin_tenant()
+    adm_project = os_actions.get_project_by_name("admin")
     os_resource['router'] = os_actions.create_router(
-        os_resource['ext_net'], adm_tenant.id)
-    os_resource['net2'] = os_actions.create_network(adm_tenant.id)
+        os_resource['ext_net'], adm_project.id)
+    os_resource['net2'] = os_actions.create_network(adm_project.id)
     os_resource['subnet2'] = os_actions.create_subnet(
-        os_resource['net2'], adm_tenant.id, '10.2.7.0/24')
+        os_resource['net2'], adm_project.id, '10.2.7.0/24')
     for subnet in openstack_clients.network.list_subnets()['subnets']:
         if subnet['network_id'] == os_resource['net1']['id']:
             os_resource['subnet1'] = subnet['id']
@@ -88,7 +86,8 @@
     yield os_resource
 
     # cleanup created resources
-    logger.info("Deleting routers, networks, SG, key pair, flavor...")
+    logger.info("Deleting routers, networks, SG, key pair, flavor in {}..."
+                "".format(adm_project.name))
     openstack_clients.network.remove_interface_router(
         os_resource['router']['id'], {'subnet_id': os_resource['subnet1']})
     openstack_clients.network.remove_interface_router(
@@ -109,3 +108,104 @@
         openstack_clients.compute.flavors.delete(os_resource['flavor_id'])
     if os_actions.create_fake_ext_net:
         openstack_clients.network.delete_network(os_resource['ext_net']['id'])
+
+
+@pytest.fixture(scope='session')
+def openstack_alt_clients(openstack_clients):
+    # create alt project with regular admin user
+    tmp_os_actions = os_client.OSCliActions(openstack_clients)
+    alt_project = tmp_os_actions.create_project()
+    tmp_os_actions.add_roles_to_user_in_project(alt_project.id)
+
+    # create a client using alt project with admin user in it
+    return os_client.OfficialClientManager(
+        username=os.environ['OS_USERNAME'],
+        password=os.environ['OS_PASSWORD'],
+        project_name=alt_project.name,
+        auth_url=os.environ['OS_AUTH_URL'],
+        cert=False,
+        domain=os.environ['OS_PROJECT_DOMAIN_NAME'],
+    )
+
+
+@pytest.fixture(scope='session')
+def os_resources_alt_project(openstack_alt_clients):
+    logger.info("Setting up resources in the project {}..."
+                "".format(openstack_alt_clients.project_name))
+    alt_os_actions = os_client.OSCliActions(openstack_alt_clients)
+    os_resource_alt_project = {}
+    config = utils.get_configuration()
+    image_name = config.get('image_name', 'Ubuntu-18.04')
+    flavor_name = config.get('flavor_name', 'spt-test')
+    flavor_ram = config.get('flavor_ram', 1536)
+    flavor_vcpus = config.get('flavor_vcpus', 1)
+    flavor_disk = config.get('flavor_disk', 3)
+    os_images_list = [image.id for image in
+                      openstack_alt_clients.image.images.list(
+                          filters={'name': image_name})]
+
+    if os_images_list.__len__() == 0:
+        pytest.skip("No images with name {}. This name can be redefined "
+                    "with 'image_name' env var ".format(image_name))
+    os_resource_alt_project['image_id'] = str(os_images_list[0])
+
+    flavor_id = alt_os_actions.get_flavor_id_by_name(flavor_name)
+    if flavor_id is None:
+        flavor_is_created = True
+        os_resource_alt_project['flavor_id'] = alt_os_actions.create_flavor(
+            flavor_name, flavor_ram, flavor_vcpus, flavor_disk).id
+    else:
+        flavor_is_created = False
+        logger.info("Flavor {} already exists".format(flavor_name))
+        os_resource_alt_project['flavor_id'] = flavor_id
+
+    os_resource_alt_project['sec_group'] = alt_os_actions.create_sec_group()
+
+    alt_project = alt_os_actions.get_project_by_name(
+        openstack_alt_clients.project_name)
+    os_resource_alt_project['net1'] = alt_os_actions.create_network_resources(
+        project=alt_project.name, cidr='10.3.7.0/24')
+    os_resource_alt_project['ext_net'] = alt_os_actions.get_external_network()
+
+    os_resource_alt_project['router'] = alt_os_actions.create_router(
+        os_resource_alt_project['ext_net'], alt_project.id)
+
+    os_resource_alt_project['subnet1'] = \
+        openstack_alt_clients.network.show_network(
+            os_resource_alt_project['net1']['id'])['network']['subnets'][0]
+    openstack_alt_clients.network.add_interface_router(
+        os_resource_alt_project['router']['id'],
+        {'subnet_id': os_resource_alt_project['subnet1']})
+    yield os_resource_alt_project
+
+    # cleanup created resources
+    logger.info("Deleting routers, networks, SG, flavor in {} "
+                "project...".format(alt_project.name))
+
+    openstack_alt_clients.network.remove_interface_router(
+        os_resource_alt_project['router']['id'],
+        {'subnet_id': os_resource_alt_project['subnet1']})
+    openstack_alt_clients.network.remove_gateway_router(
+        os_resource_alt_project['router']['id'])
+    time.sleep(5)
+    openstack_alt_clients.network.delete_router(
+        os_resource_alt_project['router']['id'])
+    time.sleep(5)
+    openstack_alt_clients.network.delete_network(
+        os_resource_alt_project['net1']['id'])
+
+    openstack_alt_clients.network.delete_security_group(
+        os_resource_alt_project['sec_group']['id'])
+    if flavor_is_created:
+        openstack_alt_clients.compute.flavors.delete(
+            os_resource_alt_project['flavor_id'])
+    if alt_os_actions.create_fake_ext_net:
+        openstack_alt_clients.network.delete_network(
+            os_resource_alt_project['ext_net']['id'])
+
+    if alt_os_actions.is_project_empty(alt_project.id):
+        openstack_alt_clients.auth.projects.delete(alt_project.id)
+        logger.info("Deleted project {}".format(alt_project.name))
+    else:
+        logger.info("Project {} is not empty, skip deleting".format(
+            alt_project.name))
