diff --git a/.github/workflows/build-dev-image.yml b/.github/workflows/build-dev-image.yml
index 9dbee6bb91..81bbfbdbc6 100644
--- a/.github/workflows/build-dev-image.yml
+++ b/.github/workflows/build-dev-image.yml
@@ -4,6 +4,7 @@ on:
   push:
     branches:
       - develop
+      - feature/orgs
     paths-ignore:
       - '.github/**'
       - README.md
@@ -29,7 +30,7 @@ jobs:
     uses: reportportal/.github/.github/workflows/build-docker-image.yaml@main
     with:
       aws-region: ${{ vars.AWS_REGION }}
-      image-tag: 'develop-${{ github.run_number }}'
-      version: 'develop-${{ github.run_number }}'
+      image-tag: 'orgs-${{ github.run_number }}'
+      version: 'orgs-${{ github.run_number }}'
       date: ${{ needs.variables-setup.outputs.date }}
     secrets: inherit
diff --git a/.github/workflows/build-feature-image.yaml b/.github/workflows/build-feature-image.yaml
index 757cf2eb51..6875e95b31 100644
--- a/.github/workflows/build-feature-image.yaml
+++ b/.github/workflows/build-feature-image.yaml
@@ -5,6 +5,7 @@ on:
     types: [opened, synchronize, reopened]
     branches:
       - 'develop'
+      - 'feature/orgs'
 
 jobs:
   variables-setup:
diff --git a/.github/workflows/java-checks.yml b/.github/workflows/java-checks.yml
index 958772ddd2..913b9a788a 100644
--- a/.github/workflows/java-checks.yml
+++ b/.github/workflows/java-checks.yml
@@ -11,6 +11,7 @@ on:
     branches:
       - master
       - develop
+      - feature/orgs
     paths-ignore:
       - '.github/**'
       - README.md
diff --git a/build.gradle b/build.gradle
index 693542e907..403227f523 100644
--- a/build.gradle
+++ b/build.gradle
@@ -72,9 +72,9 @@ dependencies {
         implementation 'com.epam.reportportal:plugin-api'
     } else {
         implementation 'com.github.reportportal:commons-events:e337f8b7be'
-        implementation 'com.github.reportportal:commons-dao:458b67ab61'
+        implementation 'com.github.reportportal:commons-dao:ade8559'
         implementation 'com.github.reportportal:commons-rules:42d4dd5634'
-        implementation 'com.github.reportportal:commons-model:c800793'
+        implementation 'com.github.reportportal:commons-model:23adba8'
         implementation 'com.github.reportportal:commons:07566b8e'
         implementation 'com.github.reportportal:commons-fonts:d6e62dd'
         implementation 'com.github.reportportal:plugin-api:0ccfed880c'
@@ -90,6 +90,8 @@ dependencies {
 
 
     implementation 'com.opencsv:opencsv:5.8'
+    implementation 'com.github.slugify:slugify:3.0.6'
+
 
     // Fix CVE-2021-41079, CVE-2022-23181, CVE-2021-33037, CVE-2021-30640, CVE-2022-42252
     implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.82'
diff --git a/docker-compose.yml b/docker-compose.yml
index ee9e4e2b8d..e23d9c8c6f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -24,11 +24,11 @@ services:
     ports:
       - "5432:5432"
 
-  elastic:
-    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.3.0
+  opensearch:
+    image: opensearchproject/opensearch:2.11.0
     restart: always
     volumes:
-      - elastic:/usr/share/elasticsearch/data
+      - opensearch:/usr/share/opensearch/data
     environment:
       - "bootstrap.memory_lock=true"
       - "discovery.type=single-node"
@@ -77,5 +77,5 @@ services:
 
 volumes:
   reportportal-database:
-  elastic:
+  opensearch:
   minio:
\ No newline at end of file
diff --git a/project-properties.gradle b/project-properties.gradle
index 5e70950dbd..98b0d56774 100755
--- a/project-properties.gradle
+++ b/project-properties.gradle
@@ -67,6 +67,8 @@ project.ext {
             (migrationsUrl + '/migrations/76_user_bid_extension.up.sql')               : 'V076__user_bid_extension.sql',
             (migrationsUrl + '/migrations/77_email_server_documentation_link.up.sql')  : 'V077__email_server_documentation_link.sql',
             (migrationsUrl + '/migrations/78_drop_redundant_index.up.sql')             : 'V078__drop_redundant_index.sql',
+            (migrationsUrl + '/migrations/83_add_slugify_function.up.sql')             : 'V083__add_slugify_function.sql',
+            (migrationsUrl + '/migrations/84_organization_tables.up.sql')              : 'V084__organization_tables.sql',
     ]
     excludeTests = ['**/entity/**',
                     '**/aop/**',
diff --git a/src/main/java/com/epam/ta/reportportal/auth/permissions/BaseProjectPermission.java b/src/main/java/com/epam/ta/reportportal/auth/permissions/BaseProjectPermission.java
index 372b7be071..65bf7a875d 100644
--- a/src/main/java/com/epam/ta/reportportal/auth/permissions/BaseProjectPermission.java
+++ b/src/main/java/com/epam/ta/reportportal/auth/permissions/BaseProjectPermission.java
@@ -47,7 +47,7 @@ protected BaseProjectPermission(ProjectExtractor projectExtractor) {
    * subclass
    */
   @Override
-  public boolean isAllowed(Authentication authentication, Object projectName) {
+  public boolean isAllowed(Authentication authentication, Object projectKey) {
     if (!authentication.isAuthenticated()) {
       return false;
     }
@@ -56,14 +56,14 @@ public boolean isAllowed(Authentication authentication, Object projectName) {
     ReportPortalUser rpUser = (ReportPortalUser) oauth.getUserAuthentication().getPrincipal();
     BusinessRule.expect(rpUser, Objects::nonNull).verify(ErrorType.ACCESS_DENIED);
 
-    final String resolvedProjectName = String.valueOf(projectName);
+    final String resolvedProjectKey = String.valueOf(projectKey);
     final ReportPortalUser.ProjectDetails projectDetails = projectExtractor.findProjectDetails(
-            rpUser, resolvedProjectName)
+            rpUser, resolvedProjectKey)
         .orElseThrow(() -> new ReportPortalException(ErrorType.ACCESS_DENIED));
-    fillProjectDetails(rpUser, resolvedProjectName, projectDetails);
+    fillProjectDetails(rpUser, resolvedProjectKey, projectDetails);
 
     ProjectRole role = projectDetails.getProjectRole();
-    return checkAllowed(rpUser, projectName.toString(), role);
+    return checkAllowed(rpUser, projectKey.toString(), role);
   }
 
   private void fillProjectDetails(ReportPortalUser rpUser, String resolvedProjectName,
@@ -83,4 +83,4 @@ private void fillProjectDetails(ReportPortalUser rpUser, String resolvedProjectN
    * @return TRUE if access allowed
    */
   abstract protected boolean checkAllowed(ReportPortalUser user, String project, ProjectRole role);
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/epam/ta/reportportal/auth/permissions/Permissions.java b/src/main/java/com/epam/ta/reportportal/auth/permissions/Permissions.java
index c860bb5ed7..67cf598a19 100644
--- a/src/main/java/com/epam/ta/reportportal/auth/permissions/Permissions.java
+++ b/src/main/java/com/epam/ta/reportportal/auth/permissions/Permissions.java
@@ -29,20 +29,15 @@ private Permissions() {
 
   public static final String ADMIN_ONLY = "hasRole('ADMINISTRATOR')";
 
-  public static final String ALLOWED_TO_EDIT_USER =
-      "(#login.toLowerCase() == authentication.name)" + "||" + ADMIN_ONLY;
+  public static final String ALLOWED_TO_EDIT_USER = "(#login.toLowerCase() == authentication.name)" + "||" + ADMIN_ONLY;
 
-  public static final String ALLOWED_TO_REPORT =
-      "hasPermission(#projectName.toLowerCase(), 'reporterPermission')" + "||" + ADMIN_ONLY;
+  public static final String ALLOWED_TO_REPORT = "hasPermission(#projectKey.toLowerCase(), 'reporterPermission')" + "||" + ADMIN_ONLY;
 
-  public static final String ASSIGNED_TO_PROJECT = "hasPermission(#projectName.toLowerCase(), 'isAssignedToProject')";
+  public static final String ASSIGNED_TO_PROJECT = "hasPermission(#projectKey.toLowerCase(), 'isAssignedToProject')";
 
-  public static final String PROJECT_MANAGER =
-      "hasPermission(#projectName.toLowerCase(), 'projectManagerPermission')" + "||" + ADMIN_ONLY;
+  public static final String PROJECT_MANAGER = "hasPermission(#projectKey.toLowerCase(), 'projectManagerPermission')" + "||" + ADMIN_ONLY;
 
-  public static final String NOT_CUSTOMER =
-      "hasPermission(#projectName.toLowerCase(), 'notCustomerPermission')" + "||" + ADMIN_ONLY;
+  public static final String NOT_CUSTOMER = "hasPermission(#projectKey.toLowerCase(), 'notCustomerPermission')" + "||" + ADMIN_ONLY;
 
-  public static final String PROJECT_MANAGER_OR_ADMIN =
-      "hasPermission(#projectName.toLowerCase(), 'projectManagerPermission')" + "||" + ADMIN_ONLY;
-}
\ No newline at end of file
+  public static final String PROJECT_MANAGER_OR_ADMIN = "hasPermission(#projectKey.toLowerCase(), 'projectManagerPermission')" + "||" + ADMIN_ONLY;
+}
diff --git a/src/main/java/com/epam/ta/reportportal/core/file/impl/GetFileHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/file/impl/GetFileHandlerImpl.java
index 3bc74f859e..6f3b630125 100644
--- a/src/main/java/com/epam/ta/reportportal/core/file/impl/GetFileHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/file/impl/GetFileHandlerImpl.java
@@ -67,12 +67,12 @@ public BinaryData getUserPhoto(ReportPortalUser loggedInUser, boolean loadThumbn
   }
 
   @Override
-  public BinaryData getUserPhoto(String username, ReportPortalUser loggedInUser, String projectName,
+  public BinaryData getUserPhoto(String username, ReportPortalUser loggedInUser, String projectKey,
       boolean loadThumbnail) {
     User user = userRepository.findByLogin(username)
         .orElseThrow(() -> new ReportPortalException(ErrorType.USER_NOT_FOUND, username));
     ReportPortalUser.ProjectDetails projectDetails = projectExtractor.extractProjectDetailsAdmin(
-        loggedInUser, projectName);
+        loggedInUser, projectKey);
     if (loggedInUser.getUserRole() != UserRole.ADMINISTRATOR) {
       expect(
           ProjectUtils.isAssignedToProject(user, projectDetails.getProjectId()),
diff --git a/src/main/java/com/epam/ta/reportportal/core/integration/impl/CreateIntegrationHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/integration/impl/CreateIntegrationHandlerImpl.java
index e5075fac21..1304480fdc 100644
--- a/src/main/java/com/epam/ta/reportportal/core/integration/impl/CreateIntegrationHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/integration/impl/CreateIntegrationHandlerImpl.java
@@ -108,11 +108,11 @@ public EntryCreatedRS createGlobalIntegration(IntegrationRQ createRequest, Strin
   }
 
   @Override
-  public EntryCreatedRS createProjectIntegration(String projectName, IntegrationRQ createRequest,
+  public EntryCreatedRS createProjectIntegration(String projectKey, IntegrationRQ createRequest,
       String pluginName, ReportPortalUser user) {
 
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
 
     IntegrationType integrationType = integrationTypeRepository.findByName(pluginName)
         .orElseThrow(() -> new ReportPortalException(ErrorType.INTEGRATION_NOT_FOUND, pluginName));
@@ -175,11 +175,11 @@ public OperationCompletionRS updateGlobalIntegration(Long id, IntegrationRQ upda
   }
 
   @Override
-  public OperationCompletionRS updateProjectIntegration(Long id, String projectName,
+  public OperationCompletionRS updateProjectIntegration(Long id, String projectKey,
       IntegrationRQ updateRequest, ReportPortalUser user) {
 
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
 
     final Integration integration = integrationRepository.findByIdAndProjectId(id, project.getId())
         .orElseThrow(() -> new ReportPortalException(ErrorType.INTEGRATION_NOT_FOUND, id));
diff --git a/src/main/java/com/epam/ta/reportportal/core/integration/impl/DeleteIntegrationHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/integration/impl/DeleteIntegrationHandlerImpl.java
index 4137032e78..17a5ac3ecc 100644
--- a/src/main/java/com/epam/ta/reportportal/core/integration/impl/DeleteIntegrationHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/integration/impl/DeleteIntegrationHandlerImpl.java
@@ -16,6 +16,10 @@
 
 package com.epam.ta.reportportal.core.integration.impl;
 
+import static com.epam.ta.reportportal.ws.converter.converters.IntegrationConverter.TO_ACTIVITY_RESOURCE;
+import static com.epam.ta.reportportal.ws.model.ErrorType.INTEGRATION_NOT_FOUND;
+import static com.epam.ta.reportportal.ws.model.ErrorType.PROJECT_NOT_FOUND;
+
 import com.epam.ta.reportportal.commons.ReportPortalUser;
 import com.epam.ta.reportportal.commons.validation.Suppliers;
 import com.epam.ta.reportportal.core.events.activity.IntegrationDeletedEvent;
@@ -29,17 +33,12 @@
 import com.epam.ta.reportportal.exception.ReportPortalException;
 import com.epam.ta.reportportal.ws.model.ErrorType;
 import com.epam.ta.reportportal.ws.model.OperationCompletionRS;
+import java.util.Collections;
+import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
-import java.util.List;
-
-import static com.epam.ta.reportportal.ws.converter.converters.IntegrationConverter.TO_ACTIVITY_RESOURCE;
-import static com.epam.ta.reportportal.ws.model.ErrorType.INTEGRATION_NOT_FOUND;
-import static com.epam.ta.reportportal.ws.model.ErrorType.PROJECT_NOT_FOUND;
-
 /**
  * @author <a href="mailto:andrei_varabyeu@epam.com">Andrei Varabyeu</a>
  */
@@ -96,10 +95,10 @@ public OperationCompletionRS deleteGlobalIntegrationsByType(String type, ReportP
   }
 
   @Override
-  public OperationCompletionRS deleteProjectIntegration(Long integrationId, String projectName,
+  public OperationCompletionRS deleteProjectIntegration(Long integrationId, String projectKey,
       ReportPortalUser user) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey));
     Integration integration = integrationRepository.findByIdAndProjectId(integrationId,
             project.getId())
         .orElseThrow(() -> new ReportPortalException(INTEGRATION_NOT_FOUND, integrationId));
@@ -115,10 +114,10 @@ public OperationCompletionRS deleteProjectIntegration(Long integrationId, String
   }
 
   @Override
-  public OperationCompletionRS deleteProjectIntegrationsByType(String type, String projectName,
+  public OperationCompletionRS deleteProjectIntegrationsByType(String type, String projectKey,
       ReportPortalUser user) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey));
     IntegrationType integrationType = integrationTypeRepository.findByName(type)
         .orElseThrow(() -> new ReportPortalException(ErrorType.INTEGRATION_NOT_FOUND, type));
     List<Integration> integrations = integrationRepository.findAllByProjectIdAndInIntegrationTypeIds(
diff --git a/src/main/java/com/epam/ta/reportportal/core/integration/impl/GetIntegrationHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/integration/impl/GetIntegrationHandlerImpl.java
index 887f3a205c..730e9c0864 100644
--- a/src/main/java/com/epam/ta/reportportal/core/integration/impl/GetIntegrationHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/integration/impl/GetIntegrationHandlerImpl.java
@@ -73,9 +73,9 @@ public GetIntegrationHandlerImpl(@Qualifier("integrationServiceMapping")
   }
 
   @Override
-  public IntegrationResource getProjectIntegrationById(Long integrationId, String projectName) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+  public IntegrationResource getProjectIntegrationById(Long integrationId, String projectKey) {
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
     Integration integration =
         integrationRepository.findByIdAndProjectId(integrationId, project.getId()).orElseThrow(
             () -> new ReportPortalException(ErrorType.INTEGRATION_NOT_FOUND, integrationId));
@@ -194,17 +194,17 @@ public List<IntegrationResource> getGlobalIntegrations(String pluginName) {
   }
 
   @Override
-  public List<IntegrationResource> getProjectIntegrations(String projectName) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+  public List<IntegrationResource> getProjectIntegrations(String projectKey) {
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
     return integrationRepository.findAllByProjectIdOrderByCreationDateDesc(project.getId()).stream()
         .map(TO_INTEGRATION_RESOURCE).collect(Collectors.toList());
   }
 
   @Override
-  public List<IntegrationResource> getProjectIntegrations(String pluginName, String projectName) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+  public List<IntegrationResource> getProjectIntegrations(String pluginName, String projectKey) {
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
     IntegrationType integrationType = integrationTypeRepository.findByName(pluginName)
         .orElseThrow(() -> new ReportPortalException(ErrorType.INTEGRATION_NOT_FOUND, pluginName));
     return integrationRepository.findAllByProjectIdAndTypeOrderByCreationDateDesc(project.getId(),
@@ -213,9 +213,9 @@ public List<IntegrationResource> getProjectIntegrations(String pluginName, Strin
   }
 
   @Override
-  public boolean testConnection(Long integrationId, String projectName) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+  public boolean testConnection(Long integrationId, String projectKey) {
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
 
     Integration integration =
         integrationRepository.findByIdAndProjectId(integrationId, project.getId()).orElseGet(
diff --git a/src/main/java/com/epam/ta/reportportal/core/jasper/impl/ProjectJasperReportHandler.java b/src/main/java/com/epam/ta/reportportal/core/jasper/impl/ProjectJasperReportHandler.java
index 8d058df594..3c94a8b580 100644
--- a/src/main/java/com/epam/ta/reportportal/core/jasper/impl/ProjectJasperReportHandler.java
+++ b/src/main/java/com/epam/ta/reportportal/core/jasper/impl/ProjectJasperReportHandler.java
@@ -68,7 +68,7 @@ public Map<String, Object> convertParams(ProjectInfo project) {
     params.put(ProjectReportConstants.PROJECT_TYPE, project.getProjectType());
     params.put(ProjectReportConstants.PROJECT_NAME, project.getName());
     params.put(ProjectReportConstants.ORGANIZATION,
-        ofNullable(project.getOrganization()).orElse(EMPTY_STRING));
+        ofNullable(project.getOrganizationSlug()).orElse(EMPTY_STRING));
     params.put(ProjectReportConstants.MEMBERS, project.getUsersQuantity());
     params.put(ProjectReportConstants.LAUNCHES, project.getLaunchesQuantity());
 
diff --git a/src/main/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerImpl.java
index be6d10999f..eb6e9978ff 100644
--- a/src/main/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerImpl.java
@@ -107,7 +107,7 @@ public FinishLaunchRS finishLaunch(String launchId, FinishExecutionRQ finishLaun
     FinishLaunchRS response = new FinishLaunchRS();
     response.setId(launch.getUuid());
     response.setNumber(launch.getNumber());
-    response.setLink(generateLaunchLink(baseUrl, projectDetails.getProjectName(),
+    response.setLink(generateLaunchLink(baseUrl, projectDetails.getProjectKey(),
         String.valueOf(launch.getId())
     ));
     return response;
diff --git a/src/main/java/com/epam/ta/reportportal/core/launch/impl/GetLaunchHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/launch/impl/GetLaunchHandlerImpl.java
index 666232300e..39943bc95e 100644
--- a/src/main/java/com/epam/ta/reportportal/core/launch/impl/GetLaunchHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/launch/impl/GetLaunchHandlerImpl.java
@@ -169,10 +169,10 @@ private Launch findLaunch(String launchId, ReportPortalUser.ProjectDetails proje
   }
 
   @Override
-  public LaunchResource getLaunchByProjectName(String projectName, Pageable pageable, Filter filter,
+  public LaunchResource getLaunchByProjectName(String projectKey, Pageable pageable, Filter filter,
       String username) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
 
     Page<Launch> launches =
         launchRepository.findByFilter(ProjectFilter.of(filter, project.getId()), pageable);
@@ -408,4 +408,4 @@ private void fillWithAdditionalParams(Map<String, Object> params, Launch launch,
     params.put(LaunchReportConstants.TEST_ITEMS, dataProvider.getTestItemsOfLaunch(launch));
   }
 
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/epam/ta/reportportal/core/log/ElasticLogService.java b/src/main/java/com/epam/ta/reportportal/core/log/ElasticLogService.java
index c836c6d521..afa2e92f3a 100644
--- a/src/main/java/com/epam/ta/reportportal/core/log/ElasticLogService.java
+++ b/src/main/java/com/epam/ta/reportportal/core/log/ElasticLogService.java
@@ -39,7 +39,7 @@
 
 @Primary
 @Service
-@ConditionalOnProperty(prefix = "rp.elasticsearch", name = "host")
+@ConditionalOnProperty(prefix = "rp.searchengine", name = "host")
 public class ElasticLogService implements LogService {
 
   private final AmqpTemplate amqpTemplate;
diff --git a/src/main/java/com/epam/ta/reportportal/core/organization/GetOrganizationHandler.java b/src/main/java/com/epam/ta/reportportal/core/organization/GetOrganizationHandler.java
new file mode 100644
index 0000000000..4accde691d
--- /dev/null
+++ b/src/main/java/com/epam/ta/reportportal/core/organization/GetOrganizationHandler.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2024 EPAM Systems
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.epam.ta.reportportal.core.organization;
+
+import com.epam.ta.reportportal.commons.ReportPortalUser;
+import com.epam.ta.reportportal.model.OrganizationResource;
+import java.util.List;
+
+/**
+ * @author Andrei Piankouski
+ */
+public interface GetOrganizationHandler {
+
+  /**
+   * Get Organization resource information
+   *
+   * @param organizationId Organization id
+   * @param user           User
+   * @return {@link OrganizationResource}
+   */
+  OrganizationResource getResource(Long organizationId, ReportPortalUser user);
+
+  /**
+   * Get List of all Organizations
+   *
+   * @return The {@link List} of the {@link OrganizationResource}
+   */
+  List<OrganizationResource> getAllOrganization();
+}
diff --git a/src/main/java/com/epam/ta/reportportal/core/organization/impl/GetOrganizationHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/organization/impl/GetOrganizationHandlerImpl.java
new file mode 100644
index 0000000000..0b1a603502
--- /dev/null
+++ b/src/main/java/com/epam/ta/reportportal/core/organization/impl/GetOrganizationHandlerImpl.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2024 EPAM Systems
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.epam.ta.reportportal.core.organization.impl;
+
+import com.epam.ta.reportportal.commons.ReportPortalUser;
+import com.epam.ta.reportportal.core.organization.GetOrganizationHandler;
+import com.epam.ta.reportportal.dao.organization.OrganizationRepository;
+import com.epam.ta.reportportal.entity.organization.Organization;
+import com.epam.ta.reportportal.exception.ReportPortalException;
+import com.epam.ta.reportportal.model.OrganizationResource;
+import com.epam.ta.reportportal.ws.converter.converters.OrganizationConverter;
+import com.epam.ta.reportportal.ws.model.ErrorType;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Andrei Piankouski
+ */
+@Service
+public class GetOrganizationHandlerImpl implements GetOrganizationHandler {
+
+  private final OrganizationRepository organizationRepository;
+
+  @Autowired
+  public GetOrganizationHandlerImpl(OrganizationRepository organizationRepository) {
+    this.organizationRepository = organizationRepository;
+  }
+
+  @Override
+  public OrganizationResource getResource(Long organizationId, ReportPortalUser user) {
+    Organization organization = organizationRepository.findById(organizationId)
+        .orElseThrow(
+            () -> new ReportPortalException(ErrorType.ORGANIZATION_NOT_FOUND, organizationId));
+    return OrganizationConverter.TO_ORGANIZATION_RESOURCE.apply(organization);
+  }
+
+  @Override
+  public List<OrganizationResource> getAllOrganization() {
+    List<Organization> organizations = organizationRepository.findAll();
+    return organizations.stream().map(OrganizationConverter.TO_ORGANIZATION_RESOURCE).toList();
+  }
+
+}
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/GetProjectHandler.java b/src/main/java/com/epam/ta/reportportal/core/project/GetProjectHandler.java
index 7e215e4328..75789f170e 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/GetProjectHandler.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/GetProjectHandler.java
@@ -38,12 +38,12 @@ public interface GetProjectHandler {
   /**
    * Get project users info
    *
-   * @param projectName {@link com.epam.ta.reportportal.entity.project.Project#name}
+   * @param projectKey {@link com.epam.ta.reportportal.entity.project.Project#name}
    * @param filter      {@link Filter}
    * @param pageable    {@link Pageable}
    * @return list of {@link UserResource}
    */
-  Iterable<UserResource> getProjectUsers(String projectName, Filter filter, Pageable pageable);
+  Iterable<UserResource> getProjectUsers(String projectKey, Filter filter, Pageable pageable);
 
   boolean exists(Long id);
 
@@ -64,11 +64,11 @@ public interface GetProjectHandler {
   /**
    * Get project resource information
    *
-   * @param projectName Project name
+   * @param projectKey Project name
    * @param user        User
    * @return {@link ProjectResource}
    */
-  ProjectResource getResource(String projectName, ReportPortalUser user);
+  ProjectResource getResource(String projectKey, ReportPortalUser user);
 
   /**
    * Get list of specified usernames
@@ -115,4 +115,4 @@ Iterable<SearchUserResource> getUserNames(String value,
   void exportProjects(ReportFormat reportFormat, Queryable filter, OutputStream outputStream);
 
   Map<String, Boolean> getAnalyzerIndexingStatus();
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/impl/CreateProjectHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/project/impl/CreateProjectHandlerImpl.java
index 29aa901691..bff3c788c5 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/impl/CreateProjectHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/impl/CreateProjectHandlerImpl.java
@@ -32,7 +32,9 @@
 import com.epam.ta.reportportal.dao.ProjectRepository;
 import com.epam.ta.reportportal.dao.ProjectUserRepository;
 import com.epam.ta.reportportal.dao.UserRepository;
+import com.epam.ta.reportportal.dao.organization.OrganizationRepository;
 import com.epam.ta.reportportal.entity.enums.ProjectType;
+import com.epam.ta.reportportal.entity.organization.Organization;
 import com.epam.ta.reportportal.entity.project.Project;
 import com.epam.ta.reportportal.entity.project.ProjectAttribute;
 import com.epam.ta.reportportal.entity.project.ProjectRole;
@@ -43,6 +45,7 @@
 import com.epam.ta.reportportal.model.EntryCreatedRS;
 import com.epam.ta.reportportal.model.project.CreateProjectRQ;
 import com.epam.ta.reportportal.util.PersonalProjectService;
+import com.epam.ta.reportportal.util.SlugifyUtils;
 import com.epam.ta.reportportal.ws.model.ErrorType;
 import java.util.Date;
 import java.util.Optional;
@@ -73,13 +76,14 @@ public class CreateProjectHandlerImpl implements CreateProjectHandler {
   private final ApplicationEventPublisher applicationEventPublisher;
 
   private final ProjectUserRepository projectUserRepository;
+  private final OrganizationRepository organizationRepository;
 
   @Autowired
   public CreateProjectHandlerImpl(PersonalProjectService personalProjectService,
       ProjectRepository projectRepository, UserRepository userRepository,
       AttributeRepository attributeRepository, IssueTypeRepository issueTypeRepository,
       ApplicationEventPublisher applicationEventPublisher,
-      ProjectUserRepository projectUserRepository) {
+      ProjectUserRepository projectUserRepository, OrganizationRepository organizationRepository) {
     this.personalProjectService = personalProjectService;
     this.projectRepository = projectRepository;
     this.userRepository = userRepository;
@@ -87,11 +91,13 @@ public CreateProjectHandlerImpl(PersonalProjectService personalProjectService,
     this.issueTypeRepository = issueTypeRepository;
     this.applicationEventPublisher = applicationEventPublisher;
     this.projectUserRepository = projectUserRepository;
+    this.organizationRepository = organizationRepository;
   }
 
   @Override
   public EntryCreatedRS createProject(CreateProjectRQ createProjectRQ, ReportPortalUser user) {
     String projectName = createProjectRQ.getProjectName().toLowerCase().trim();
+    Long orgId = createProjectRQ.getOrganizationId();
 
     expect(projectName, not(equalTo(RESERVED_PROJECT_NAME))).verify(ErrorType.INCORRECT_REQUEST,
         Suppliers.formattedSupplier("Project with name '{}' is reserved by system", projectName)
@@ -105,7 +111,12 @@ public EntryCreatedRS createProject(CreateProjectRQ createProjectRQ, ReportPorta
         )
     );
 
-    Optional<Project> existProject = projectRepository.findByName(projectName);
+    Organization organization = organizationRepository.findById(orgId)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.ORGANIZATION_NOT_FOUND, orgId));
+    var projectSlug = SlugifyUtils.slugify(projectName);
+    var projectKey = generateProjectKey(organization, projectSlug);
+
+    Optional<Project> existProject = projectRepository.findByKey(projectKey);
     expect(existProject, not(isPresent())).verify(ErrorType.PROJECT_ALREADY_EXISTS, projectName);
 
     ProjectType projectType = ProjectType.findByName(createProjectRQ.getEntryType()).orElseThrow(
@@ -120,6 +131,10 @@ public EntryCreatedRS createProject(CreateProjectRQ createProjectRQ, ReportPorta
         .orElseThrow(() -> new ReportPortalException(ErrorType.USER_NOT_FOUND, user.getUsername()));
 
     Project project = new Project();
+
+    project.setOrganization(organization);
+    project.setKey(projectKey);
+    project.setSlug(projectSlug);
     project.setName(projectName);
     project.setCreationDate(new Date());
 
@@ -161,4 +176,8 @@ public Project createPersonal(User user) {
     publishProjectCreatedEvent(null, RP_SUBJECT_NAME, personalProject);
     return personalProject;
   }
+
+  private String generateProjectKey(Organization organization, String projectSlug) {
+    return organization.getSlug() + "-" + projectSlug;
+  }
 }
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/impl/DeleteProjectHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/project/impl/DeleteProjectHandlerImpl.java
index 117f156ff8..789ed82ead 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/impl/DeleteProjectHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/impl/DeleteProjectHandlerImpl.java
@@ -167,12 +167,12 @@ private void publishProjectBulkDeletedEvent(ReportPortalUser user, Collection<St
   }
 
   @Override
-  public OperationCompletionRS deleteProjectIndex(String projectName, String username) {
+  public OperationCompletionRS deleteProjectIndex(String projectKey, String username) {
     expect(analyzerServiceClient.hasClients(), Predicate.isEqual(true)).verify(
         ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, "There are no analyzer deployed.");
 
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
 
     User user = userRepository.findByLogin(username)
         .orElseThrow(() -> new ReportPortalException(ErrorType.USER_NOT_FOUND, username));
@@ -195,7 +195,7 @@ public OperationCompletionRS deleteProjectIndex(String projectName, String usern
             false
         ));
     return new OperationCompletionRS(
-        "Project index with name = '" + projectName + "' is successfully deleted.");
+        "Project index with key = '" + projectKey + "' is successfully deleted.");
   }
 
   private OperationCompletionRS deleteProject(Project project) {
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/impl/GetProjectHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/project/impl/GetProjectHandlerImpl.java
index 77a69d497a..2e05d505b3 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/impl/GetProjectHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/impl/GetProjectHandlerImpl.java
@@ -93,10 +93,10 @@ public GetProjectHandlerImpl(ProjectRepository projectRepository, UserRepository
   }
 
   @Override
-  public Iterable<UserResource> getProjectUsers(String projectName, Filter filter,
+  public Iterable<UserResource> getProjectUsers(String projectKey, Filter filter,
       Pageable pageable) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
     if (CollectionUtils.isEmpty(project.getUsers())) {
       return Collections.emptyList();
     }
@@ -127,7 +127,7 @@ public Project get(Long id) {
 
   @Override
   public Project get(String name) {
-    return projectRepository.findByName(name)
+    return projectRepository.findByKey(name)
         .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, name));
   }
 
@@ -138,10 +138,10 @@ public Project getRaw(String name) {
   }
 
   @Override
-  public ProjectResource getResource(String projectName, ReportPortalUser user) {
+  public ProjectResource getResource(String projectKey, ReportPortalUser user) {
 
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
 
     return projectConverter.TO_PROJECT_RESOURCE.apply(project);
   }
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/impl/GetProjectInfoHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/project/impl/GetProjectInfoHandlerImpl.java
index 8cc2dcae97..9eff14dac6 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/impl/GetProjectInfoHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/impl/GetProjectInfoHandlerImpl.java
@@ -164,10 +164,10 @@ public Iterable<ProjectInfoResource> getAllProjectsInfo(Queryable filter, Pageab
   }
 
   @Override
-  public ProjectInfoResource getProjectInfo(String projectName, String interval) {
+  public ProjectInfoResource getProjectInfo(String projectKey, String interval) {
 
-    Project project = projectRepository.findByName(normalizeId(projectName))
-        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(normalizeId(projectKey))
+        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey));
 
     InfoInterval infoInterval = InfoInterval.findByInterval(interval)
         .orElseThrow(() -> new ReportPortalException(BAD_REQUEST_ERROR, interval));
@@ -179,7 +179,7 @@ public ProjectInfoResource getProjectInfo(String projectName, String interval) {
         projectRepository.findProjectInfoByFilter(filter, Pageable.unpaged());
     ProjectInfoResource projectInfoResource =
         ProjectSettingsConverter.TO_PROJECT_INFO_RESOURCE.apply(result.get().findFirst()
-            .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName)));
+            .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey)));
 
     LocalDateTime startIntervalDate = getStartIntervalDate(infoInterval);
 
@@ -207,10 +207,10 @@ public ProjectInfoResource getProjectInfo(String projectName, String interval) {
   }
 
   @Override
-  public Map<String, ?> getProjectInfoWidgetContent(String projectName, String interval,
+  public Map<String, ?> getProjectInfoWidgetContent(String projectKey, String interval,
       String widgetCode) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey));
 
     InfoInterval infoInterval = InfoInterval.findByInterval(interval)
         .orElseThrow(() -> new ReportPortalException(BAD_REQUEST_ERROR, interval));
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/impl/UpdateProjectHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/project/impl/UpdateProjectHandlerImpl.java
index 743ec71b59..2c58eacb05 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/impl/UpdateProjectHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/impl/UpdateProjectHandlerImpl.java
@@ -174,10 +174,10 @@ public UpdateProjectHandlerImpl(ProjectExtractor projectExtractor,
   }
 
   @Override
-  public OperationCompletionRS updateProject(String projectName, UpdateProjectRQ updateProjectRQ,
+  public OperationCompletionRS updateProject(String projectKey, UpdateProjectRQ updateProjectRQ,
       ReportPortalUser user) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
     ProjectAttributesActivityResource before = TO_ACTIVITY_RESOURCE.apply(project);
     updateProjectConfiguration(updateProjectRQ.getConfiguration(), project);
     ofNullable(updateProjectRQ.getUserRoles()).ifPresent(
@@ -193,10 +193,10 @@ public OperationCompletionRS updateProject(String projectName, UpdateProjectRQ u
   }
 
   @Override
-  public OperationCompletionRS updateProjectNotificationConfig(String projectName,
+  public OperationCompletionRS updateProjectNotificationConfig(String projectKey,
       ReportPortalUser user, ProjectNotificationConfigDTO updateProjectNotificationConfigRQ) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
     ProjectResource before = projectConverter.TO_PROJECT_RESOURCE.apply(project);
 
     updateSenderCases(project, updateProjectNotificationConfigRQ.getSenderCases());
@@ -211,17 +211,17 @@ public OperationCompletionRS updateProjectNotificationConfig(String projectName,
             user.getUserId(), user.getUsername()
         ));
     return new OperationCompletionRS(
-        "Notification configuration of project - '" + projectName + "' is successfully updated.");
+        "Notification configuration of project - '" + projectKey + "' is successfully updated.");
   }
 
   @Override
-  public OperationCompletionRS unassignUsers(String projectName, UnassignUsersRQ unassignUsersRQ,
+  public OperationCompletionRS unassignUsers(String projectKey, UnassignUsersRQ unassignUsersRQ,
       ReportPortalUser user) {
     expect(unassignUsersRQ.getUsernames(), not(List::isEmpty)).verify(BAD_REQUEST_ERROR,
         "Request should contain at least one username."
     );
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey));
     User modifier = userRepository.findById(user.getUserId())
         .orElseThrow(() -> new ReportPortalException(USER_NOT_FOUND, user.getUsername()));
     if (!UserRole.ADMINISTRATOR.equals(modifier.getRole())) {
@@ -243,11 +243,11 @@ public OperationCompletionRS unassignUsers(String projectName, UnassignUsersRQ u
   }
 
   @Override
-  public OperationCompletionRS assignUsers(String projectName, AssignUsersRQ assignUsersRQ,
+  public OperationCompletionRS assignUsers(String projectKey, AssignUsersRQ assignUsersRQ,
       ReportPortalUser user) {
     if (UserRole.ADMINISTRATOR.equals(user.getUserRole())) {
-      Project project = projectRepository.findByName(normalizeId(projectName)).orElseThrow(
-          () -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, normalizeId(projectName)));
+      Project project = projectRepository.findByKey(normalizeId(projectKey)).orElseThrow(
+          () -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, normalizeId(projectKey)));
 
       List<String> assignedUsernames =
           project.getUsers().stream().map(u -> u.getUser().getLogin()).collect(toList());
@@ -264,9 +264,9 @@ public OperationCompletionRS assignUsers(String projectName, AssignUsersRQ assig
       );
 
       ReportPortalUser.ProjectDetails projectDetails =
-          projectExtractor.extractProjectDetails(user, projectName);
+          projectExtractor.extractProjectDetails(user, projectKey);
       Project project = projectRepository.findById(projectDetails.getProjectId()).orElseThrow(
-          () -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, normalizeId(projectName)));
+          () -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, normalizeId(projectKey)));
 
       List<String> assignedUsernames =
           project.getUsers().stream().map(u -> u.getUser().getLogin()).collect(toList());
@@ -283,16 +283,16 @@ public OperationCompletionRS assignUsers(String projectName, AssignUsersRQ assig
 
     return new OperationCompletionRS(
         "User(s) with username='" + assignUsersRQ.getUserNames().keySet()
-            + "' was successfully assigned to project='" + normalizeId(projectName) + "'");
+            + "' was successfully assigned to project='" + normalizeId(projectKey) + "'");
   }
 
   @Override
-  public OperationCompletionRS indexProjectData(String projectName, ReportPortalUser user) {
+  public OperationCompletionRS indexProjectData(String projectKey, ReportPortalUser user) {
     expect(analyzerServiceClient.hasClients(), Predicate.isEqual(true)).verify(
         ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, "There are no analyzer deployed.");
 
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey));
 
     expect(ofNullable(indexerStatusCache.getIndexingStatus().getIfPresent(project.getId())).orElse(
         false), equalTo(false)).verify(ErrorType.FORBIDDEN_OPERATION,
@@ -334,7 +334,7 @@ private List<ProjectUser> unassignUsers(List<String> usernames, User modifier, P
       });
     } else {
       ReportPortalUser.ProjectDetails projectDetails =
-          projectExtractor.extractProjectDetails(user, project.getName());
+          projectExtractor.extractProjectDetails(user, project.getKey());
 
       usernames.forEach(username -> {
         User userForUnassign = userRepository.findByLogin(username)
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/CreateProjectSettingsHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/CreateProjectSettingsHandlerImpl.java
index 74f41a536a..081f605972 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/CreateProjectSettingsHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/CreateProjectSettingsHandlerImpl.java
@@ -109,10 +109,10 @@ public CreateProjectSettingsHandlerImpl(ProjectRepository projectRepository,
   }
 
   @Override
-  public IssueSubTypeCreatedRS createProjectIssueSubType(String projectName, ReportPortalUser user,
+  public IssueSubTypeCreatedRS createProjectIssueSubType(String projectKey, ReportPortalUser user,
       CreateIssueSubTypeRQ rq) {
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey));
 
     expect(NOT_ISSUE_FLAG.getValue().equalsIgnoreCase(rq.getTypeRef()), equalTo(false)).verify(
         INCORRECT_REQUEST, "Impossible to create sub-type for 'Not Issue' type.");
@@ -172,11 +172,11 @@ private void updateWidgets(Project project, IssueType issueType) {
   }
 
   @Override
-  public EntryCreatedRS createPatternTemplate(String projectName,
+  public EntryCreatedRS createPatternTemplate(String projectKey,
       CreatePatternTemplateRQ createPatternTemplateRQ, ReportPortalUser user) {
 
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
 
     PatternTemplate patternTemplate = createPatternTemplateMapping.get(
         PatternTemplateType.fromString(createPatternTemplateRQ.getType()).orElseThrow(
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/DeleteProjectSettingsHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/DeleteProjectSettingsHandlerImpl.java
index 487e53bb15..0ba96704e9 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/DeleteProjectSettingsHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/DeleteProjectSettingsHandlerImpl.java
@@ -16,13 +16,31 @@
 
 package com.epam.ta.reportportal.core.project.settings.impl;
 
+import static com.epam.ta.reportportal.commons.Predicates.in;
+import static com.epam.ta.reportportal.commons.Predicates.not;
+import static com.epam.ta.reportportal.commons.validation.BusinessRule.expect;
+import static com.epam.ta.reportportal.entity.enums.TestItemIssueGroup.AUTOMATION_BUG;
+import static com.epam.ta.reportportal.entity.enums.TestItemIssueGroup.NO_DEFECT;
+import static com.epam.ta.reportportal.entity.enums.TestItemIssueGroup.PRODUCT_BUG;
+import static com.epam.ta.reportportal.entity.enums.TestItemIssueGroup.SYSTEM_ISSUE;
+import static com.epam.ta.reportportal.entity.enums.TestItemIssueGroup.TO_INVESTIGATE;
+import static com.epam.ta.reportportal.ws.converter.converters.IssueTypeConverter.TO_ACTIVITY_RESOURCE;
+import static com.epam.ta.reportportal.ws.model.ErrorType.FORBIDDEN_OPERATION;
+import static com.epam.ta.reportportal.ws.model.ErrorType.ISSUE_TYPE_NOT_FOUND;
+import static com.epam.ta.reportportal.ws.model.ErrorType.PROJECT_NOT_FOUND;
+
 import com.epam.ta.reportportal.commons.ReportPortalUser;
 import com.epam.ta.reportportal.commons.validation.Suppliers;
 import com.epam.ta.reportportal.core.events.MessageBus;
 import com.epam.ta.reportportal.core.events.activity.DefectTypeDeletedEvent;
 import com.epam.ta.reportportal.core.events.activity.PatternDeletedEvent;
 import com.epam.ta.reportportal.core.project.settings.DeleteProjectSettingsHandler;
-import com.epam.ta.reportportal.dao.*;
+import com.epam.ta.reportportal.dao.IssueEntityRepository;
+import com.epam.ta.reportportal.dao.IssueTypeRepository;
+import com.epam.ta.reportportal.dao.PatternTemplateRepository;
+import com.epam.ta.reportportal.dao.ProjectRepository;
+import com.epam.ta.reportportal.dao.StatisticsFieldRepository;
+import com.epam.ta.reportportal.dao.WidgetRepository;
 import com.epam.ta.reportportal.entity.enums.TestItemIssueGroup;
 import com.epam.ta.reportportal.entity.item.issue.IssueEntity;
 import com.epam.ta.reportportal.entity.item.issue.IssueType;
@@ -36,22 +54,14 @@
 import com.epam.ta.reportportal.ws.model.ErrorType;
 import com.epam.ta.reportportal.ws.model.OperationCompletionRS;
 import com.google.common.collect.Sets;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static com.epam.ta.reportportal.commons.Predicates.in;
-import static com.epam.ta.reportportal.commons.Predicates.not;
-import static com.epam.ta.reportportal.commons.validation.BusinessRule.expect;
-import static com.epam.ta.reportportal.entity.enums.TestItemIssueGroup.*;
-import static com.epam.ta.reportportal.ws.converter.converters.IssueTypeConverter.TO_ACTIVITY_RESOURCE;
-import static com.epam.ta.reportportal.ws.model.ErrorType.*;
-
 /**
  * @author <a href="mailto:ihar_kahadouski@epam.com">Ihar Kahadouski</a>
  */
@@ -91,9 +101,9 @@ public DeleteProjectSettingsHandlerImpl(ProjectRepository projectRepository, Sta
 	}
 
 	@Override
-	public OperationCompletionRS deleteProjectIssueSubType(String projectName, ReportPortalUser user, Long id) {
-		Project project = projectRepository.findByName(projectName)
-				.orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName));
+	public OperationCompletionRS deleteProjectIssueSubType(String projectKey, ReportPortalUser user, Long id) {
+		Project project = projectRepository.findByKey(projectKey)
+				.orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey));
 
 		ProjectIssueType type = project.getProjectIssueTypes()
 				.stream()
@@ -161,10 +171,10 @@ private void updateWidgets(Project project, IssueType issueType) {
 	}
 
 	@Override
-	public OperationCompletionRS deletePatternTemplate(String projectName, ReportPortalUser user, Long id) {
+	public OperationCompletionRS deletePatternTemplate(String projectKey, ReportPortalUser user, Long id) {
 
-		Project project = projectRepository.findByName(projectName)
-				.orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+		Project project = projectRepository.findByKey(projectKey)
+				.orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
 
 		PatternTemplate patternTemplate = patternTemplateRepository.findByIdAndProjectId(id, project.getId())
 				.orElseThrow(() -> new ReportPortalException(ErrorType.PATTERN_TEMPLATE_NOT_FOUND_IN_PROJECT, id, project.getName()));
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/GetProjectSettingsHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/GetProjectSettingsHandlerImpl.java
index 692c78d1de..282b37bc51 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/GetProjectSettingsHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/GetProjectSettingsHandlerImpl.java
@@ -34,17 +34,17 @@
 @Transactional(readOnly = true)
 public class GetProjectSettingsHandlerImpl implements GetProjectSettingsHandler {
 
-  private final ProjectRepository repository;
+  private final ProjectRepository projectRepository;
 
   @Autowired
   public GetProjectSettingsHandlerImpl(ProjectRepository repository) {
-    this.repository = repository;
+    this.projectRepository = repository;
   }
 
   @Override
-  public ProjectSettingsResource getProjectSettings(String projectName) {
-    Project project = repository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+  public ProjectSettingsResource getProjectSettings(String projectKey) {
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
     return ProjectSettingsConverter.TO_PROJECT_SETTINGS_RESOURCE.apply(project);
   }
 }
diff --git a/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/UpdateProjectSettingsHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/UpdateProjectSettingsHandlerImpl.java
index ce46d5e925..6630e2b878 100644
--- a/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/UpdateProjectSettingsHandlerImpl.java
+++ b/src/main/java/com/epam/ta/reportportal/core/project/settings/impl/UpdateProjectSettingsHandlerImpl.java
@@ -84,14 +84,14 @@ public UpdateProjectSettingsHandlerImpl(ProjectRepository projectRepository,
   }
 
   @Override
-  public OperationCompletionRS updateProjectIssueSubType(String projectName, ReportPortalUser user,
+  public OperationCompletionRS updateProjectIssueSubType(String projectKey, ReportPortalUser user,
       UpdateIssueSubTypeRQ updateIssueSubTypeRQ) {
-    expect(updateIssueSubTypeRQ.getIds().size() > 0, equalTo(true)).verify(FORBIDDEN_OPERATION,
+    expect(!updateIssueSubTypeRQ.getIds().isEmpty(), equalTo(true)).verify(FORBIDDEN_OPERATION,
         "Please specify at least one item data for update."
     );
 
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(PROJECT_NOT_FOUND, projectKey));
 
     List<IssueTypeActivityResource> issueTypeActivityResources =
         updateIssueSubTypeRQ.getIds().stream().map(subTypeRQ -> TO_ACTIVITY_RESOURCE.apply(
@@ -107,11 +107,11 @@ public OperationCompletionRS updateProjectIssueSubType(String projectName, Repor
   }
 
   @Override
-  public OperationCompletionRS updatePatternTemplate(Long id, String projectName,
+  public OperationCompletionRS updatePatternTemplate(Long id, String projectKey,
       UpdatePatternTemplateRQ updatePatternTemplateRQ, ReportPortalUser user) {
 
-    Project project = projectRepository.findByName(projectName)
-        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+    Project project = projectRepository.findByKey(projectKey)
+        .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
 
     PatternTemplate patternTemplate = patternTemplateRepository.findById(id).orElseThrow(
         () -> new ReportPortalException(ErrorType.PATTERN_TEMPLATE_NOT_FOUND_IN_PROJECT, id,
diff --git a/src/main/java/com/epam/ta/reportportal/demodata/DemoDataController.java b/src/main/java/com/epam/ta/reportportal/demodata/DemoDataController.java
index 123cdfa3f1..570b85d6fe 100644
--- a/src/main/java/com/epam/ta/reportportal/demodata/DemoDataController.java
+++ b/src/main/java/com/epam/ta/reportportal/demodata/DemoDataController.java
@@ -16,6 +16,8 @@
 
 package com.epam.ta.reportportal.demodata;
 
+import static com.epam.ta.reportportal.auth.permissions.Permissions.PROJECT_MANAGER;
+
 import com.epam.ta.reportportal.commons.ReportPortalUser;
 import com.epam.ta.reportportal.demodata.model.DemoDataRq;
 import com.epam.ta.reportportal.demodata.model.DemoDataRs;
@@ -25,15 +27,17 @@
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import static com.epam.ta.reportportal.auth.permissions.Permissions.PROJECT_MANAGER;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * @author Ihar Kahadouski
  */
 @RestController
-@RequestMapping("/v1/demo/{projectName}")
+@RequestMapping("/v1/demo/{projectKey}")
 @PreAuthorize(PROJECT_MANAGER)
 class DemoDataController {
 
@@ -48,8 +52,8 @@ class DemoDataController {
 
 	@PostMapping("/generate")
 	@ApiOperation(value = "generate")
-	public DemoDataRs generate(@PathVariable String projectName, @Validated @RequestBody DemoDataRq demoDataRq,
+	public DemoDataRs generate(@PathVariable String projectKey, @Validated @RequestBody DemoDataRq demoDataRq,
 			@AuthenticationPrincipal ReportPortalUser user) {
-		return demoDataService.generate(demoDataRq, projectExtractor.extractProjectDetailsAdmin(user, projectName), user);
+		return demoDataService.generate(demoDataRq, projectExtractor.extractProjectDetailsAdmin(user, projectKey), user);
 	}
 }
diff --git a/src/main/java/com/epam/ta/reportportal/model/OrganizationResource.java b/src/main/java/com/epam/ta/reportportal/model/OrganizationResource.java
new file mode 100644
index 0000000000..e3e7a6cff0
--- /dev/null
+++ b/src/main/java/com/epam/ta/reportportal/model/OrganizationResource.java
@@ -0,0 +1,50 @@
+package com.epam.ta.reportportal.model;
+
+/*
+ * Copyright 2024 EPAM Systems
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import javax.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * Basic JSON representation of Organization.
+ *
+ * @author Andrei Piankouski
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@Getter
+@Setter
+@ToString
+public class OrganizationResource {
+
+  @NotNull
+  @JsonProperty(value = "organizationId", required = true)
+  private Long organizationId;
+
+  @NotNull
+  @JsonProperty(value = "organizationName", required = true)
+  private String organizationName;
+
+  @NotNull
+  @JsonProperty(value = "organizationSlug", required = true)
+  private String organizationSlug;
+
+}
diff --git a/src/main/java/com/epam/ta/reportportal/model/project/CreateProjectRQ.java b/src/main/java/com/epam/ta/reportportal/model/project/CreateProjectRQ.java
index 43c511c17a..cd15712f80 100644
--- a/src/main/java/com/epam/ta/reportportal/model/project/CreateProjectRQ.java
+++ b/src/main/java/com/epam/ta/reportportal/model/project/CreateProjectRQ.java
@@ -17,6 +17,7 @@
 package com.epam.ta.reportportal.model.project;
 
 import static com.epam.ta.reportportal.ws.model.ValidationConstraints.PROJECT_NAME_REGEXP;
+import static com.epam.ta.reportportal.ws.model.ValidationConstraints.PROJECT_SLUG_REGEXP;
 
 import com.epam.ta.reportportal.ws.annotations.In;
 import com.epam.ta.reportportal.ws.model.ValidationConstraints;
@@ -27,6 +28,8 @@
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
 
 /**
  * Create project request initial model
@@ -35,6 +38,8 @@
  * @author Andrei_Ramanchuk
  */
 @JsonInclude(Include.NON_NULL)
+@Getter
+@Setter
 public class CreateProjectRQ {
 
 	@NotBlank
@@ -50,28 +55,13 @@ public class CreateProjectRQ {
 	@ApiModelProperty(required = true, allowableValues = "INTERNAL")
 	private String entryType;
 
-	public String getProjectName() {
-		return projectName;
-	}
+  @JsonProperty(value = "organizationId")
+  private Long organizationId;
 
-	public void setProjectName(String projectName) {
-		this.projectName = projectName;
-	}
+  @Pattern(regexp = PROJECT_SLUG_REGEXP)
+  @Size(min = ValidationConstraints.MIN_NAME_LENGTH, max = ValidationConstraints.MAX_NAME_LENGTH)
+  @JsonProperty(value = "projectSlug", required = true)
+  @ApiModelProperty(required = true)
+  private String projectSlug;
 
-	public String getEntryType() {
-		return entryType;
-	}
-
-	public void setEntryType(String value) {
-		this.entryType = value;
-	}
-
-	@Override
-	public String toString() {
-		final StringBuilder sb = new StringBuilder("CreateProjectRQ{");
-		sb.append("projectName='").append(projectName).append('\'');
-		sb.append(", entryType='").append(entryType).append('\'');
-		sb.append('}');
-		return sb.toString();
-	}
 }
diff --git a/src/main/java/com/epam/ta/reportportal/model/project/ProjectInfoResource.java b/src/main/java/com/epam/ta/reportportal/model/project/ProjectInfoResource.java
index 1e6e3c3a84..594d92d7a6 100644
--- a/src/main/java/com/epam/ta/reportportal/model/project/ProjectInfoResource.java
+++ b/src/main/java/com/epam/ta/reportportal/model/project/ProjectInfoResource.java
@@ -23,6 +23,9 @@
 import java.util.List;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
 
 /**
  * Project info resource representation for responses<br>
@@ -34,6 +37,9 @@
  * @author Dzmitry_Kavalets
  * @author Andrei_Ramanchuk
  */
+@Getter
+@Setter
+@ToString
 public class ProjectInfoResource {
 
   @NotNull
@@ -78,94 +84,18 @@ public class ProjectInfoResource {
   @JsonProperty(value = "organization")
   private String organization;
 
-  public ProjectInfoResource() {
-  }
-
-  public Long getProjectId() {
-    return projectId;
-  }
-
-  public void setProjectId(Long projectId) {
-    this.projectId = projectId;
-  }
-
-  public String getProjectName() {
-    return projectName;
-  }
-
-  public void setProjectName(String projectName) {
-    this.projectName = projectName;
-  }
-
-  public Integer getUsersQuantity() {
-    return usersQuantity;
-  }
-
-  public void setUsersQuantity(Integer usersQuantity) {
-    this.usersQuantity = usersQuantity;
-  }
-
-  public Integer getLaunchesQuantity() {
-    return launchesQuantity;
-  }
-
-  public void setLaunchesQuantity(Integer launchesQuantity) {
-    this.launchesQuantity = launchesQuantity;
-  }
-
-  public void setLaunchesPerUser(List<LaunchesPerUser> value) {
-    this.launchesPerUser = value;
-  }
-
-  public List<LaunchesPerUser> getLaunchesPerUser() {
-    return launchesPerUser;
-  }
-
-  public void setUniqueTickets(Integer value) {
-    this.uniqueTickets = value;
-  }
-
-  public Integer getUniqueTickets() {
-    return uniqueTickets;
-  }
-
-  public void setLaunchesPerWeek(String value) {
-    this.launchesPerWeek = value;
-  }
-
-  public String getLaunchesPerWeek() {
-    return launchesPerWeek;
-  }
-
-  public Date getLastRun() {
-    return lastRun;
-  }
-
-  public void setLastRun(Date lastRun) {
-    this.lastRun = lastRun;
-  }
-
-  public Date getCreationDate() {
-    return creationDate;
-  }
-
-  public void setCreationDate(Date creationDate) {
-    this.creationDate = creationDate;
-  }
+  @NotBlank
+  @JsonProperty(value = "projectKey")
+  private String projectKey;
 
-  public String getEntryType() {
-    return entryType;
-  }
+  @NotBlank
+  @JsonProperty(value = "projectSlug")
+  private String projectSlug;
 
-  public void setEntryType(String entryType) {
-    this.entryType = entryType;
-  }
+  @JsonProperty(value = "organizationId")
+  private String organizationId;
 
-  public String getOrganization() {
-    return organization;
-  }
+  @JsonProperty(value = "organizationSlug")
+  private String organizationSlug;
 
-  public void setOrganization(String organization) {
-    this.organization = organization;
-  }
 }
diff --git a/src/main/java/com/epam/ta/reportportal/model/project/ProjectResource.java b/src/main/java/com/epam/ta/reportportal/model/project/ProjectResource.java
index 0702c6a410..361c96e9ed 100644
--- a/src/main/java/com/epam/ta/reportportal/model/project/ProjectResource.java
+++ b/src/main/java/com/epam/ta/reportportal/model/project/ProjectResource.java
@@ -21,12 +21,18 @@
 import java.util.Date;
 import java.util.List;
 import javax.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
 
 /**
  * Project resource representation for responses
  *
  * @author Pavel Bortnik
  */
+
+@Getter
+@Setter
 public class ProjectResource {
 
   @NotNull
@@ -37,6 +43,12 @@ public class ProjectResource {
   @JsonProperty(value = "projectName", required = true)
   private String projectName;
 
+  @JsonProperty(value = "projectKey")
+  private String projectKey;
+
+  @JsonProperty(value = "projectSlug")
+  private String projectSlug;
+
   @JsonProperty(value = "entryType", required = true)
   private String entryType;
 
@@ -53,6 +65,12 @@ public class ProjectResource {
   @JsonProperty(value = "organization")
   private String organization;
 
+  @JsonProperty(value = "organizationId")
+  private Long organizationId;
+
+  @JsonProperty(value = "organizationSlug")
+  private String organizationSlug;
+
   @JsonProperty(value = "allocatedStorage")
   private Long allocatedStorage;
 
@@ -60,79 +78,9 @@ public class ProjectResource {
   @JsonProperty(value = "creationDate")
   private Date creationDate;
 
-  public Date getCreationDate() {
-    return creationDate;
-  }
-
-  public void setCreationDate(Date creationDate) {
-    this.creationDate = creationDate;
-  }
-
-  public Long getProjectId() {
-    return projectId;
-  }
-
-  public void setProjectId(Long projectId) {
-    this.projectId = projectId;
-  }
-
-  public String getProjectName() {
-    return projectName;
-  }
-
-  public void setProjectName(String projectName) {
-    this.projectName = projectName;
-  }
-
-  public String getEntryType() {
-    return entryType;
-  }
-
-  public void setEntryType(String entryType) {
-    this.entryType = entryType;
-  }
-
-  public void setConfiguration(
-      ProjectConfiguration configuration) {
-    this.configuration = configuration;
-  }
-
-  public ProjectConfiguration getConfiguration() {
-    return configuration;
-  }
-
-  public List<IntegrationResource> getIntegrations() {
-    return integrations;
-  }
-
-  public void setIntegrations(List<IntegrationResource> integrations) {
-    this.integrations = integrations;
-  }
-
-  public List<ProjectUser> getUsers() {
-    return users;
-  }
-
-  public void setUsers(List<ProjectUser> users) {
-    this.users = users;
-  }
-
-  public String getOrganization() {
-    return organization;
-  }
-
-  public void setOrganization(String organization) {
-    this.organization = organization;
-  }
-
-  public Long getAllocatedStorage() {
-    return allocatedStorage;
-  }
-
-  public void setAllocatedStorage(Long allocatedStorage) {
-    this.allocatedStorage = allocatedStorage;
-  }
-
+  @Getter
+  @Setter
+  @ToString
   public static class ProjectUser {
 
     @JsonProperty(value = "login")
@@ -141,25 +89,5 @@ public static class ProjectUser {
     @JsonProperty(value = "projectRole")
     private String projectRole;
 
-    public String getLogin() {
-      return login;
-    }
-
-    public void setLogin(String login) {
-      this.login = login;
-    }
-
-    public void setProjectRole(String value) {
-      this.projectRole = value;
-    }
-
-    public String getProjectRole() {
-      return projectRole;
-    }
-
-    @Override
-    public String toString() {
-      return "ProjectUser{" + "projectRole='" + projectRole + '\'' + '}';
-    }
   }
 }
diff --git a/src/main/java/com/epam/ta/reportportal/model/user/UserResource.java b/src/main/java/com/epam/ta/reportportal/model/user/UserResource.java
index 6867eaf2bb..80f549a11e 100644
--- a/src/main/java/com/epam/ta/reportportal/model/user/UserResource.java
+++ b/src/main/java/com/epam/ta/reportportal/model/user/UserResource.java
@@ -19,8 +19,12 @@
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.HashMap;
 import java.util.Map;
 import javax.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
 
 /**
  * User resource representation for responses
@@ -28,154 +32,69 @@
  * @author Andrei_Ramanchuk
  */
 @JsonInclude(Include.NON_NULL)
+@Getter
+@Setter
+@ToString
 public class UserResource {
 
-	@NotNull
-	@JsonProperty(value = "id", required = true)
-	private Long id;
+  @NotNull
+  @JsonProperty(value = "id", required = true)
+  private Long id;
 
-	@NotNull
-	@JsonProperty(value = "userId", required = true)
-	private String userId;
+  @NotNull
+  @JsonProperty(value = "userId", required = true)
+  private String userId;
 
-	@JsonProperty(value = "email", required = true)
-	private String email;
+  @JsonProperty(value = "email", required = true)
+  private String email;
 
-	@JsonProperty(value = "photoId")
-	private String photoId;
+  @JsonProperty(value = "photoId")
+  private String photoId;
 
-	@JsonProperty(value = "fullName")
-	private String fullName;
+  @JsonProperty(value = "fullName")
+  private String fullName;
 
-	@JsonProperty(value = "accountType")
-	private String accountType;
+  @JsonProperty(value = "accountType")
+  private String accountType;
 
-	@JsonProperty(value = "userRole")
-	private String userRole;
+  @JsonProperty(value = "userRole")
+  private String userRole;
 
-	@JsonProperty(value = "photoLoaded")
-	private boolean isLoaded;
+  @JsonProperty(value = "photoLoaded")
+  private boolean isLoaded;
 
-	@JsonProperty(value = "metadata")
-	private Object metadata;
+  @JsonProperty(value = "metadata")
+  private Object metadata;
 
-	@JsonProperty(value = "assignedProjects")
-	private Map<String, AssignedProject> assignedProjects;
+  @JsonProperty(value = "assignedProjects")
+  private Map<String, AssignedProject> assignedProjects = new HashMap<>();
 
-	public Long getId() {
-		return id;
-	}
+  @JsonProperty(value = "assignedOrganizations")
+  private Map<String, AssignedOrganization> assignedOrganizations = new HashMap<>();
 
-	public void setId(Long id) {
-		this.id = id;
-	}
+  @Getter
+  @Setter
+  @ToString
+  public static class AssignedProject {
 
-	public void setUserId(String value) {
-		this.userId = value;
-	}
+    private String projectRole;
+    private String entryType;
+    private String projectKey;
+    private String projectSlug;
+    private String projectName;
+    private Long organizationId;
 
-	public String getUserId() {
-		return userId;
-	}
+  }
 
-	public void setEmail(String value) {
-		this.email = value;
-	}
+  @Getter
+  @Setter
+  @ToString
+  public static class AssignedOrganization {
 
-	public String getEmail() {
-		return email;
-	}
+    private Long organizationId;
+    private String organizationRole;
+    private String organizationName;
 
-	public void setPhotoId(String value) {
-		this.photoId = value;
-	}
+  }
 
-	public String getPhotoId() {
-		return photoId;
-	}
-
-	public void setFullName(String value) {
-		this.fullName = value;
-	}
-
-	public String getFullName() {
-		return fullName;
-	}
-
-	public void setAccountType(String value) {
-		this.accountType = value;
-	}
-
-	public String getAccountType() {
-		return accountType;
-	}
-
-	public String getUserRole() {
-		return userRole;
-	}
-
-	public void setUserRole(String value) {
-		this.userRole = value;
-	}
-
-	public Object getMetadata() {
-		return metadata;
-	}
-
-	public void setMetadata(Object metadata) {
-		this.metadata = metadata;
-	}
-
-	public void setIsLoaded(boolean value) {
-		this.isLoaded = value;
-	}
-
-	public boolean getIsLoaded() {
-		return isLoaded;
-	}
-
-	public Map<String, AssignedProject> getAssignedProjects() {
-		return assignedProjects;
-	}
-
-	public void setAssignedProjects(Map<String, AssignedProject> assignedProjects) {
-		this.assignedProjects = assignedProjects;
-	}
-
-	public static class AssignedProject {
-
-		private String projectRole;
-		private String entryType;
-
-		public String getEntryType() {
-			return entryType;
-		}
-
-		public void setEntryType(String entryType) {
-			this.entryType = entryType;
-		}
-
-		public void setProjectRole(String projectRole) {
-			this.projectRole = projectRole;
-		}
-
-		public String getProjectRole() {
-			return projectRole;
-		}
-
-		@Override
-		public String toString() {
-			final StringBuilder sb = new StringBuilder("AssignedProject{");
-			sb.append("projectRole='").append(projectRole).append('\'');
-			sb.append('}');
-			return sb.toString();
-		}
-	}
-
-	@Override
-	public String toString() {
-		return "UserResource{" + "id=" + id + ", userId='" + userId + '\'' + ", email='" + email + '\'' + ", photoId='" + photoId + '\''
-				+ ", fullName='" + fullName + '\'' + ", accountType='" + accountType + '\'' + ", userRole='" + userRole + '\''
-				+ ", isLoaded=" + isLoaded + ", metadata=" + metadata + ", assignedProjects=" + assignedProjects + '}';
-	}
 }
diff --git a/src/main/java/com/epam/ta/reportportal/util/ProjectExtractor.java b/src/main/java/com/epam/ta/reportportal/util/ProjectExtractor.java
index 998001d160..908fd5bd6c 100644
--- a/src/main/java/com/epam/ta/reportportal/util/ProjectExtractor.java
+++ b/src/main/java/com/epam/ta/reportportal/util/ProjectExtractor.java
@@ -44,15 +44,15 @@ public ProjectExtractor(ProjectUserRepository projectUserRepository) {
    * Extracts project details for specified user by specified project name
    *
    * @param user        User
-   * @param projectName Project name
+   * @param projectKey Project name
    * @return Project Details
    */
   public ReportPortalUser.ProjectDetails extractProjectDetails(ReportPortalUser user,
-      String projectName) {
-    final String normalizedProjectName = normalizeId(projectName);
+      String projectKey) {
+    final String normalizedProjectName = normalizeId(projectKey);
 
     if (user.getUserRole().equals(ADMINISTRATOR)) {
-      return extractProjectDetailsAdmin(user, projectName);
+      return extractProjectDetailsAdmin(user, projectKey);
     }
     return user.getProjectDetails().computeIfAbsent(normalizedProjectName,
         k -> findProjectDetails(user, normalizedProjectName).orElseThrow(
@@ -66,12 +66,12 @@ public ReportPortalUser.ProjectDetails extractProjectDetails(ReportPortalUser us
    * Find project details for specified user by specified project name
    *
    * @param user        User
-   * @param projectName Project name
+   * @param projectKey Project unique key
    * @return {@link Optional} with Project Details
    */
   public Optional<ReportPortalUser.ProjectDetails> findProjectDetails(ReportPortalUser user,
-      String projectName) {
-    return projectUserRepository.findDetailsByUserIdAndProjectName(user.getUserId(), projectName);
+      String projectKey) {
+    return projectUserRepository.findDetailsByUserIdAndProjectKey(user.getUserId(), projectKey);
   }
 
   /**
@@ -79,24 +79,24 @@ public Optional<ReportPortalUser.ProjectDetails> findProjectDetails(ReportPortal
    * - he is added as a PROJECT_MANAGER to the project
    *
    * @param user        User
-   * @param projectName Project name
+   * @param projectKey Project unique key
    * @return Project Details
    */
   public ReportPortalUser.ProjectDetails extractProjectDetailsAdmin(ReportPortalUser user,
-      String projectName) {
+      String projectKey) {
 
     //dirty hack to allow everything for user with 'admin' authority
     if (user.getUserRole().getAuthority().equals(ADMINISTRATOR.getAuthority())) {
-      ReportPortalUser.ProjectDetails projectDetails = projectUserRepository.findAdminDetailsProjectName(
-              normalizeId(projectName))
-          .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectName));
+      ReportPortalUser.ProjectDetails projectDetails = projectUserRepository.findAdminDetailsProjectKey(
+              normalizeId(projectKey))
+          .orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectKey));
       user.getProjectDetails().put(
-          normalizeId(projectName),
+          normalizeId(projectKey),
           projectDetails
       );
     }
 
-    return Optional.ofNullable(user.getProjectDetails().get(normalizeId(projectName))).orElseThrow(
+    return Optional.ofNullable(user.getProjectDetails().get(normalizeId(projectKey))).orElseThrow(
         () -> new ReportPortalException(ErrorType.ACCESS_DENIED,
             "Please check the list of your available projects."
         ));
diff --git a/src/main/java/com/epam/ta/reportportal/util/SlugifyUtils.java b/src/main/java/com/epam/ta/reportportal/util/SlugifyUtils.java
new file mode 100644
index 0000000000..f2dc5f2e11
--- /dev/null
+++ b/src/main/java/com/epam/ta/reportportal/util/SlugifyUtils.java
@@ -0,0 +1,15 @@
+package com.epam.ta.reportportal.util;
+
+import com.github.slugify.Slugify;
+
+public class SlugifyUtils {
+
+  private SlugifyUtils() {
+  }
+
+  public static String slugify(String inputStr) {
+    var slg = Slugify.builder().build();
+    return slg.slugify(inputStr);
+  }
+
+}
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/ActivityController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/ActivityController.java
index 20a093a88d..df688e46be 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/ActivityController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/ActivityController.java
@@ -35,9 +35,9 @@
  import org.springframework.security.access.prepost.PreAuthorize;
  import org.springframework.security.core.annotation.AuthenticationPrincipal;
  import org.springframework.transaction.annotation.Transactional;
+ import org.springframework.web.bind.annotation.GetMapping;
  import org.springframework.web.bind.annotation.PathVariable;
  import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
  import org.springframework.web.bind.annotation.ResponseStatus;
  import org.springframework.web.bind.annotation.RestController;
 
@@ -45,7 +45,7 @@
   * @author Ihar_Kahadouski
   */
  @RestController
- @RequestMapping("/v1/{projectName}/activity")
+ @RequestMapping("/v1/{projectKey}/activity")
  @Transactional(readOnly = true)
  @PreAuthorize(ASSIGNED_TO_PROJECT)
  public class ActivityController {
@@ -60,23 +60,23 @@ public ActivityController(ActivityHandler activityHandler, ProjectExtractor proj
      this.projectExtractor = projectExtractor;
    }
 
-   @RequestMapping(value = "/{activityId}", method = RequestMethod.GET)
+   @GetMapping(value = "/{activityId}")
    @ResponseStatus(OK)
-   public ActivityResource getActivity(@PathVariable String projectName,
+   public ActivityResource getActivity(@PathVariable String projectKey,
        @PathVariable Long activityId, @AuthenticationPrincipal ReportPortalUser user) {
      ReportPortalUser.ProjectDetails projectDetails =
-         projectExtractor.extractProjectDetailsAdmin(user, EntityUtils.normalizeId(projectName));
+         projectExtractor.extractProjectDetailsAdmin(user, EntityUtils.normalizeId(projectKey));
      return activityHandler.getActivity(projectDetails, activityId);
    }
 
-   @RequestMapping(value = "/item/{itemId}", method = RequestMethod.GET)
+   @GetMapping(value = "/item/{itemId}")
    @ResponseStatus(OK)
    @ApiOperation("Get activities for test item")
-   public Iterable<ActivityEventResource> getTestItemActivities(@PathVariable String projectName,
+   public Iterable<ActivityEventResource> getTestItemActivities(@PathVariable String projectKey,
        @PathVariable Long itemId, @FilterFor(Activity.class) Filter filter,
        @SortFor(Activity.class) Pageable pageable, @AuthenticationPrincipal ReportPortalUser user) {
      ReportPortalUser.ProjectDetails projectDetails =
-         projectExtractor.extractProjectDetailsAdmin(user, EntityUtils.normalizeId(projectName));
+         projectExtractor.extractProjectDetailsAdmin(user, EntityUtils.normalizeId(projectKey));
      return activityHandler.getItemActivities(projectDetails, itemId, filter, pageable);
    }
- }
\ No newline at end of file
+ }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/ActivityEventController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/ActivityEventController.java
index 79931aa40d..f3ef2bc6ad 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/ActivityEventController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/ActivityEventController.java
@@ -99,13 +99,13 @@ public PagedResponse<ActivityEventResource> getActivities(
     return activityEventHandler.getActivityEventsHistory(filter, pageable);
   }
 
-  @GetMapping("/{projectName}/subjectName")
+  @GetMapping("/{projectKey}/subjectName")
   @PreAuthorize(ADMIN_ONLY)
   @ApiOperation(value = "Load project activities subjectNames by filter", notes = "Only for current project")
-  public List<String> getProjectSubjectName(@PathVariable String projectName,
+  public List<String> getProjectSubjectName(@PathVariable String projectKey,
       @RequestParam(FilterCriteriaResolver.DEFAULT_FILTER_PREFIX + Condition.CNT + "subjectName")
       String value, @AuthenticationPrincipal ReportPortalUser user) {
     return activityEventHandler.getSubjectNames(
-        projectExtractor.extractProjectDetails(user, projectName), value);
+        projectExtractor.extractProjectDetails(user, projectKey), value);
   }
 }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/BugTrackingSystemController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/BugTrackingSystemController.java
index 82a0c12a6f..5bcc32d95e 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/BugTrackingSystemController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/BugTrackingSystemController.java
@@ -67,30 +67,30 @@ public BugTrackingSystemController(ProjectExtractor projectExtractor,
   }
 
   @Transactional(readOnly = true)
-  @GetMapping(value = "/{projectName}/{integrationId}/fields-set")
+  @GetMapping(value = "/{projectKey}/{integrationId}/fields-set")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Get list of fields required for posting ticket in concrete integration")
   @PreAuthorize(PROJECT_MANAGER)
   public List<PostFormField> getSetOfIntegrationSystemFields(
       @RequestParam(value = "issueType") String issuetype,
-      @PathVariable String projectName, @PathVariable Long integrationId,
+      @PathVariable String projectKey, @PathVariable Long integrationId,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getTicketHandler.getSubmitTicketFields(issuetype,
         integrationId,
-        projectExtractor.extractProjectDetails(user, EntityUtils.normalizeId(projectName))
+        projectExtractor.extractProjectDetails(user, EntityUtils.normalizeId(projectKey))
     );
   }
 
   @Transactional(readOnly = true)
-  @GetMapping(value = "/{projectName}/{integrationId}/issue_types")
+  @GetMapping(value = "/{projectKey}/{integrationId}/issue_types")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Get list of allowable issue types for bug tracking system")
   @PreAuthorize(PROJECT_MANAGER)
-  public List<String> getAllowableIssueTypes(@PathVariable String projectName,
+  public List<String> getAllowableIssueTypes(@PathVariable String projectKey,
       @PathVariable Long integrationId,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getTicketHandler.getAllowableIssueTypes(integrationId,
-        projectExtractor.extractProjectDetails(user, EntityUtils.normalizeId(projectName)));
+        projectExtractor.extractProjectDetails(user, EntityUtils.normalizeId(projectKey)));
   }
 
   @Transactional(readOnly = true)
@@ -115,29 +115,29 @@ public List<String> getAllowableIssueTypes(@PathVariable Long integrationId,
   }
 
   @Transactional
-  @PostMapping(value = "/{projectName}/{integrationId}/ticket")
+  @PostMapping(value = "/{projectKey}/{integrationId}/ticket")
   @ResponseStatus(HttpStatus.CREATED)
   @ApiOperation("Post ticket to the bts integration")
   public Ticket createIssue(@Validated @RequestBody PostTicketRQ ticketRQ,
-      @PathVariable String projectName,
+      @PathVariable String projectKey,
       @PathVariable Long integrationId, @AuthenticationPrincipal ReportPortalUser user) {
     return createTicketHandler.createIssue(ticketRQ,
         integrationId,
-        projectExtractor.extractProjectDetails(user, EntityUtils.normalizeId(projectName)),
+        projectExtractor.extractProjectDetails(user, EntityUtils.normalizeId(projectKey)),
         user
     );
   }
 
   @Transactional(readOnly = true)
-  @GetMapping(value = "/{projectName}/ticket/{ticketId}")
+  @GetMapping(value = "/{projectKey}/ticket/{ticketId}")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Get ticket from the bts integration")
-  public Ticket getTicket(@PathVariable String ticketId, @PathVariable String projectName,
+  public Ticket getTicket(@PathVariable String ticketId, @PathVariable String projectKey,
       @RequestParam(value = "btsUrl") String btsUrl,
       @RequestParam(value = "btsProject") String btsProject,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getTicketHandler.getTicket(ticketId, btsUrl, btsProject,
-        projectExtractor.extractProjectDetails(user, EntityUtils.normalizeId(projectName)));
+        projectExtractor.extractProjectDetails(user, EntityUtils.normalizeId(projectKey)));
   }
 
 }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java
index 3132b143ba..83b71bc339 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java
@@ -58,7 +58,7 @@
  */
 @RestController
 @PreAuthorize(ASSIGNED_TO_PROJECT)
-@RequestMapping("/v1/{projectName}/dashboard")
+@RequestMapping("/v1/{projectKey}/dashboard")
 public class DashboardController {
 
   private final ProjectExtractor projectExtractor;
@@ -82,74 +82,74 @@ public DashboardController(ProjectExtractor projectExtractor,
   @PostMapping
   @ResponseStatus(CREATED)
   @ApiOperation("Create dashboard for specified project")
-  public EntryCreatedRS createDashboard(@PathVariable String projectName,
+  public EntryCreatedRS createDashboard(@PathVariable String projectKey,
       @RequestBody @Validated CreateDashboardRQ createRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return createDashboardHandler.createDashboard(
-        projectExtractor.extractProjectDetails(user, projectName), createRQ, user);
+        projectExtractor.extractProjectDetails(user, projectKey), createRQ, user);
   }
 
   @Transactional(readOnly = true)
   @GetMapping
   @ResponseStatus(OK)
   @ApiOperation("Get all permitted dashboard resources for specified project")
-  public Iterable<DashboardResource> getAllDashboards(@PathVariable String projectName,
+  public Iterable<DashboardResource> getAllDashboards(@PathVariable String projectKey,
       @SortFor(Dashboard.class) Pageable pageable, @FilterFor(Dashboard.class) Filter filter,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getDashboardHandler.getDashboards(
-        projectExtractor.extractProjectDetails(user, projectName), pageable, filter, user);
+        projectExtractor.extractProjectDetails(user, projectKey), pageable, filter, user);
   }
 
   @Transactional
   @PutMapping("/{dashboardId}/add")
   @ResponseStatus(OK)
   @ApiOperation("Add widget to specified dashboard")
-  public OperationCompletionRS addWidget(@PathVariable String projectName,
+  public OperationCompletionRS addWidget(@PathVariable String projectKey,
       @PathVariable Long dashboardId, @RequestBody @Validated AddWidgetRq addWidgetRq,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateDashboardHandler.addWidget(
-        dashboardId, projectExtractor.extractProjectDetails(user, projectName), addWidgetRq, user);
+        dashboardId, projectExtractor.extractProjectDetails(user, projectKey), addWidgetRq, user);
   }
 
   @Transactional
   @DeleteMapping("/{dashboardId}/{widgetId}")
   @ResponseStatus(OK)
   @ApiOperation("Remove widget from specified dashboard")
-  public OperationCompletionRS removeWidget(@PathVariable String projectName,
+  public OperationCompletionRS removeWidget(@PathVariable String projectKey,
       @PathVariable Long dashboardId, @PathVariable Long widgetId,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateDashboardHandler.removeWidget(
-        widgetId, dashboardId, projectExtractor.extractProjectDetails(user, projectName), user);
+        widgetId, dashboardId, projectExtractor.extractProjectDetails(user, projectKey), user);
   }
 
   @Transactional
   @PutMapping(value = "/{dashboardId}")
   @ResponseStatus(OK)
   @ApiOperation("Update specified dashboard for specified project")
-  public OperationCompletionRS updateDashboard(@PathVariable String projectName,
+  public OperationCompletionRS updateDashboard(@PathVariable String projectKey,
       @PathVariable Long dashboardId, @RequestBody @Validated UpdateDashboardRQ updateRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateDashboardHandler.updateDashboard(
-        projectExtractor.extractProjectDetails(user, projectName), updateRQ, dashboardId, user);
+        projectExtractor.extractProjectDetails(user, projectKey), updateRQ, dashboardId, user);
   }
 
   @Transactional
   @DeleteMapping(value = "/{dashboardId}")
   @ResponseStatus(OK)
   @ApiOperation("Delete specified dashboard by ID for specified project")
-  public OperationCompletionRS deleteDashboard(@PathVariable String projectName,
+  public OperationCompletionRS deleteDashboard(@PathVariable String projectKey,
       @PathVariable Long dashboardId, @AuthenticationPrincipal ReportPortalUser user) {
     return deleteDashboardHandler.deleteDashboard(
-        dashboardId, projectExtractor.extractProjectDetails(user, projectName), user);
+        dashboardId, projectExtractor.extractProjectDetails(user, projectKey), user);
   }
 
   @Transactional
   @GetMapping(value = "/{dashboardId}")
   @ResponseStatus(OK)
   @ApiOperation("Get specified dashboard by ID for specified project")
-  public DashboardResource getDashboard(@PathVariable String projectName,
+  public DashboardResource getDashboard(@PathVariable String projectKey,
       @PathVariable Long dashboardId, @AuthenticationPrincipal ReportPortalUser user) {
     return getDashboardHandler.getDashboard(
-        dashboardId, projectExtractor.extractProjectDetails(user, projectName));
+        dashboardId, projectExtractor.extractProjectDetails(user, projectKey));
   }
 }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/FileStorageController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/FileStorageController.java
index c0dff7cca4..6538b79089 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/FileStorageController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/FileStorageController.java
@@ -73,12 +73,12 @@ public FileStorageController(ProjectExtractor projectExtractor, EditUserHandler
 
   @Transactional(readOnly = true)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
-  @GetMapping(value = "/{projectName}/{dataId}")
-  public void getFile(@PathVariable String projectName, @PathVariable("dataId") Long dataId,
+  @GetMapping(value = "/{projectKey}/{dataId}")
+  public void getFile(@PathVariable String projectKey, @PathVariable("dataId") Long dataId,
       HttpServletResponse response,
       @AuthenticationPrincipal ReportPortalUser user) {
     toResponse(response, getFileHandler.loadFileById(dataId,
-        projectExtractor.extractProjectDetails(user, projectName)));
+        projectExtractor.extractProjectDetails(user, projectKey)));
   }
 
   @Transactional(readOnly = true)
@@ -92,15 +92,15 @@ public void getMyPhoto(@AuthenticationPrincipal ReportPortalUser user,
 
   @Transactional(readOnly = true)
   @PreAuthorize(NOT_CUSTOMER)
-  @GetMapping(value = "/{projectName}/userphoto")
+  @GetMapping(value = "/{projectKey}/userphoto")
   @ApiOperation("Get user's photo")
-  public void getUserPhoto(@PathVariable String projectName,
+  public void getUserPhoto(@PathVariable String projectKey,
       @RequestParam(value = "id") String username,
       @RequestParam(value = "loadThumbnail", required = false) boolean loadThumbnail,
       HttpServletResponse response,
       @AuthenticationPrincipal ReportPortalUser user) {
     BinaryData userPhoto = getFileHandler.getUserPhoto(EntityUtils.normalizeId(username), user,
-        projectName, loadThumbnail);
+        projectKey, loadThumbnail);
     toResponse(response, userPhoto);
   }
 
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/IntegrationController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/IntegrationController.java
index 629c209862..5d8223c3b9 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/IntegrationController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/IntegrationController.java
@@ -96,24 +96,24 @@ public List<IntegrationResource> getGlobalIntegrations(
   }
 
   @Transactional(readOnly = true)
-  @GetMapping("/project/{projectName}/all")
+  @GetMapping("/project/{projectKey}/all")
   @ResponseStatus(HttpStatus.OK)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
   @ApiOperation("Get available project integrations")
-  public List<IntegrationResource> getProjectIntegrations(@PathVariable String projectName,
+  public List<IntegrationResource> getProjectIntegrations(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser reportPortalUser) {
-    return getIntegrationHandler.getProjectIntegrations(normalizeId(projectName));
+    return getIntegrationHandler.getProjectIntegrations(normalizeId(projectKey));
   }
 
   @Transactional(readOnly = true)
-  @GetMapping("/project/{projectName}/all/{pluginName}")
+  @GetMapping("/project/{projectKey}/all/{pluginName}")
   @ResponseStatus(HttpStatus.OK)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
   @ApiOperation("Get available project integrations for plugin")
   public List<IntegrationResource> getProjectIntegrations(
-      @AuthenticationPrincipal ReportPortalUser reportPortalUser, @PathVariable String projectName,
+      @AuthenticationPrincipal ReportPortalUser reportPortalUser, @PathVariable String projectKey,
       @PathVariable String pluginName) {
-    return getIntegrationHandler.getProjectIntegrations(pluginName, normalizeId(projectName));
+    return getIntegrationHandler.getProjectIntegrations(pluginName, normalizeId(projectKey));
   }
 
   @Transactional
@@ -127,27 +127,27 @@ public EntryCreatedRS createGlobalIntegration(@RequestBody @Valid IntegrationRQ
   }
 
   @Transactional
-  @PostMapping(value = "/{projectName}/{pluginName}")
+  @PostMapping(value = "/{projectKey}/{pluginName}")
   @ResponseStatus(HttpStatus.CREATED)
   @ApiOperation("Create project Report Portal integration instance")
   @PreAuthorize(PROJECT_MANAGER)
   public EntryCreatedRS createProjectIntegration(@RequestBody @Valid IntegrationRQ createRequest,
-      @PathVariable String pluginName, @PathVariable String projectName,
+      @PathVariable String pluginName, @PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return createIntegrationHandler.createProjectIntegration(normalizeId(projectName),
+    return createIntegrationHandler.createProjectIntegration(normalizeId(projectKey),
         createRequest, pluginName, user
     );
 
   }
 
   @Transactional(readOnly = true)
-  @GetMapping(value = "{projectName}/{integrationId}/connection/test")
+  @GetMapping(value = "{projectKey}/{integrationId}/connection/test")
   @ResponseStatus(HttpStatus.OK)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
   @ApiOperation("Test connection to the integration through the project config")
   public boolean testIntegrationConnection(@PathVariable Long integrationId,
-      @PathVariable String projectName, @AuthenticationPrincipal ReportPortalUser user) {
-    return getIntegrationHandler.testConnection(integrationId, normalizeId(projectName));
+      @PathVariable String projectKey, @AuthenticationPrincipal ReportPortalUser user) {
+    return getIntegrationHandler.testConnection(integrationId, normalizeId(projectKey));
   }
 
   @Transactional(readOnly = true)
@@ -171,13 +171,13 @@ public IntegrationResource getGlobalIntegration(@PathVariable Long integrationId
   }
 
   @Transactional(readOnly = true)
-  @GetMapping(value = "/{projectName}/{integrationId}")
+  @GetMapping(value = "/{projectKey}/{integrationId}")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Get integration instance")
   @PreAuthorize(ASSIGNED_TO_PROJECT)
-  public IntegrationResource getProjectIntegration(@PathVariable String projectName,
+  public IntegrationResource getProjectIntegration(@PathVariable String projectKey,
       @PathVariable Long integrationId, @AuthenticationPrincipal ReportPortalUser user) {
-    return getIntegrationHandler.getProjectIntegrationById(integrationId, normalizeId(projectName));
+    return getIntegrationHandler.getProjectIntegrationById(integrationId, normalizeId(projectKey));
   }
 
   @Transactional
@@ -193,15 +193,15 @@ public OperationCompletionRS updateGlobalIntegration(@PathVariable Long integrat
   }
 
   @Transactional
-  @PutMapping(value = "/{projectName}/{integrationId}")
+  @PutMapping(value = "/{projectKey}/{integrationId}")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Update project integration instance")
   @PreAuthorize(PROJECT_MANAGER)
   public OperationCompletionRS updateProjectIntegration(@PathVariable Long integrationId,
-      @RequestBody @Valid IntegrationRQ updateRequest, @PathVariable String projectName,
+      @RequestBody @Valid IntegrationRQ updateRequest, @PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user) {
     return createIntegrationHandler.updateProjectIntegration(integrationId,
-        normalizeId(projectName), updateRequest, user
+        normalizeId(projectKey), updateRequest, user
     );
 
   }
@@ -227,41 +227,41 @@ public OperationCompletionRS deleteAllIntegrations(@PathVariable String type,
   }
 
   @Transactional
-  @DeleteMapping(value = "/{projectName}/{integrationId}")
+  @DeleteMapping(value = "/{projectKey}/{integrationId}")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Delete project integration instance")
   @PreAuthorize(PROJECT_MANAGER)
-  public OperationCompletionRS deleteProjectIntegration(@PathVariable String projectName,
+  public OperationCompletionRS deleteProjectIntegration(@PathVariable String projectKey,
       @PathVariable Long integrationId, @AuthenticationPrincipal ReportPortalUser user) {
     return deleteIntegrationHandler.deleteProjectIntegration(integrationId,
-        normalizeId(projectName), user
+        normalizeId(projectKey), user
     );
   }
 
   @Transactional
-  @DeleteMapping(value = "/{projectName}/all/{type}")
+  @DeleteMapping(value = "/{projectKey}/all/{type}")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Delete all integrations assigned to specified project")
   @PreAuthorize(PROJECT_MANAGER)
   public OperationCompletionRS deleteAllProjectIntegrations(@PathVariable String type,
-      @PathVariable String projectName, @AuthenticationPrincipal ReportPortalUser user) {
-    return deleteIntegrationHandler.deleteProjectIntegrationsByType(type, normalizeId(projectName),
+      @PathVariable String projectKey, @AuthenticationPrincipal ReportPortalUser user) {
+    return deleteIntegrationHandler.deleteProjectIntegrationsByType(type, normalizeId(projectKey),
         user
     );
   }
 
   @Transactional
-  @PutMapping(value = "{projectName}/{integrationId}/{command}", consumes = {
+  @PutMapping(value = "{projectKey}/{integrationId}/{command}", consumes = {
       APPLICATION_JSON_VALUE })
   @ResponseStatus(HttpStatus.OK)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
   @ApiOperation("Execute command to the integration instance")
-  public Object executeIntegrationCommand(@PathVariable String projectName,
+  public Object executeIntegrationCommand(@PathVariable String projectKey,
       @PathVariable("integrationId") Long integrationId, @PathVariable("command") String command,
       @RequestBody Map<String, Object> executionParams,
       @AuthenticationPrincipal ReportPortalUser user) {
     return executeIntegrationHandler.executeCommand(
-        projectExtractor.extractProjectDetails(user, projectName), integrationId, command,
+        projectExtractor.extractProjectDetails(user, projectKey), integrationId, command,
         executionParams
     );
   }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/LaunchAsyncController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/LaunchAsyncController.java
index 49c2521396..151501ca23 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/LaunchAsyncController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/LaunchAsyncController.java
@@ -82,11 +82,11 @@ public LaunchAsyncController(ProjectExtractor projectExtractor,
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(CREATED)
   @ApiOperation("Starts launch for specified project")
-  public StartLaunchRS startLaunch(@PathVariable String projectName,
+  public StartLaunchRS startLaunch(@PathVariable String projectKey,
       @ApiParam(value = "Start launch request body", required = true) @RequestBody @Validated
       StartLaunchRQ startLaunchRQ, @AuthenticationPrincipal ReportPortalUser user) {
     return startLaunchHandler.startLaunch(user,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), startLaunchRQ
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), startLaunchRQ
     );
   }
 
@@ -95,11 +95,11 @@ public StartLaunchRS startLaunch(@PathVariable String projectName,
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Finish launch for specified project")
-  public FinishLaunchRS finishLaunch(@PathVariable String projectName,
+  public FinishLaunchRS finishLaunch(@PathVariable String projectKey,
       @PathVariable String launchId, @RequestBody @Validated FinishExecutionRQ finishLaunchRQ,
       @AuthenticationPrincipal ReportPortalUser user, HttpServletRequest request) {
     return finishLaunchHandler.finishLaunch(launchId, finishLaunchRQ,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user,
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user,
         composeBaseUrl(request)
     );
   }
@@ -110,11 +110,11 @@ public FinishLaunchRS finishLaunch(@PathVariable String projectName,
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Merge set of specified launches in common one")
-  public LaunchResource mergeLaunches(@PathVariable String projectName,
+  public LaunchResource mergeLaunches(@PathVariable String projectKey,
       @ApiParam(value = "Merge launches request body", required = true) @RequestBody @Validated
       MergeLaunchesRQ mergeLaunchesRQ, @AuthenticationPrincipal ReportPortalUser user) {
     return mergeLaunchesHandler.mergeLaunches(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user,
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user,
         mergeLaunchesRQ
     );
   }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/LaunchController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/LaunchController.java
index 93c1331a03..ce0614c779 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/LaunchController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/LaunchController.java
@@ -88,7 +88,6 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestPart;
-import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
@@ -104,7 +103,7 @@
  * @author Andrei_Ramanchuk
  */
 @RestController
-@RequestMapping("/v1/{projectName}/launch")
+@RequestMapping("/v1/{projectKey}/launch")
 public class LaunchController {
 
   private final ProjectExtractor projectExtractor;
@@ -143,11 +142,11 @@ public LaunchController(ProjectExtractor projectExtractor, StartLaunchHandler st
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(CREATED)
   @ApiOperation("Starts launch for specified project")
-  public StartLaunchRS startLaunch(@PathVariable String projectName,
+  public StartLaunchRS startLaunch(@PathVariable String projectKey,
       @ApiParam(value = "Start launch request body", required = true) @RequestBody @Validated
       @Valid StartLaunchRQ startLaunchRQ, @AuthenticationPrincipal ReportPortalUser user) {
     return startLaunchHandler.startLaunch(user,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), startLaunchRQ
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), startLaunchRQ
     );
   }
 
@@ -155,11 +154,11 @@ public StartLaunchRS startLaunch(@PathVariable String projectName,
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Finish launch for specified project")
-  public FinishLaunchRS finishLaunch(@PathVariable String projectName,
+  public FinishLaunchRS finishLaunch(@PathVariable String projectKey,
       @PathVariable String launchId, @RequestBody @Validated FinishExecutionRQ finishLaunchRQ,
       @AuthenticationPrincipal ReportPortalUser user, HttpServletRequest request) {
     return finishLaunchHandler.finishLaunch(launchId, finishLaunchRQ,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user,
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user,
         composeBaseUrl(request)
     );
   }
@@ -171,11 +170,11 @@ public FinishLaunchRS finishLaunch(@PathVariable String projectName,
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Force finish launch for specified project")
-  public OperationCompletionRS forceFinishLaunch(@PathVariable String projectName,
+  public OperationCompletionRS forceFinishLaunch(@PathVariable String projectKey,
       @PathVariable Long launchId, @RequestBody @Validated FinishExecutionRQ finishExecutionRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return stopLaunchHandler.stopLaunch(launchId, finishExecutionRQ,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user
     );
   }
 
@@ -184,11 +183,11 @@ public OperationCompletionRS forceFinishLaunch(@PathVariable String projectName,
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Force finish launch")
-  public List<OperationCompletionRS> bulkForceFinish(@PathVariable String projectName,
+  public List<OperationCompletionRS> bulkForceFinish(@PathVariable String projectKey,
       @RequestBody @Validated BulkRQ<Long, FinishExecutionRQ> rq,
       @AuthenticationPrincipal ReportPortalUser user) {
     return stopLaunchHandler.stopLaunch(rq,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user
     );
   }
 
@@ -197,11 +196,11 @@ public List<OperationCompletionRS> bulkForceFinish(@PathVariable String projectN
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Updates launch for specified project")
-  public OperationCompletionRS updateLaunch(@PathVariable String projectName,
+  public OperationCompletionRS updateLaunch(@PathVariable String projectKey,
       @PathVariable Long launchId, @RequestBody @Validated UpdateLaunchRQ updateLaunchRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateLaunchHandler.updateLaunch(launchId,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user, updateLaunchRQ
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user, updateLaunchRQ
     );
   }
 
@@ -210,11 +209,11 @@ public OperationCompletionRS updateLaunch(@PathVariable String projectName,
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Updates launches for specified project")
-  public List<OperationCompletionRS> updateLaunches(@PathVariable String projectName,
+  public List<OperationCompletionRS> updateLaunches(@PathVariable String projectKey,
       @RequestBody @Validated BulkRQ<Long, UpdateLaunchRQ> rq,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateLaunchHandler.updateLaunch(rq,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user
     );
   }
 
@@ -223,10 +222,10 @@ public List<OperationCompletionRS> updateLaunches(@PathVariable String projectNa
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Delete specified launch by ID")
-  public OperationCompletionRS deleteLaunch(@PathVariable String projectName,
+  public OperationCompletionRS deleteLaunch(@PathVariable String projectKey,
       @PathVariable Long launchId, @AuthenticationPrincipal ReportPortalUser user) {
     return deleteLaunchMessageHandler.deleteLaunch(launchId,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user
     );
   }
 
@@ -234,10 +233,10 @@ public OperationCompletionRS deleteLaunch(@PathVariable String projectName,
   @GetMapping("/{launchId}")
   @ResponseStatus(OK)
   @ApiOperation("Get specified launch by ID")
-  public LaunchResource getLaunch(@PathVariable String projectName, @PathVariable String launchId,
+  public LaunchResource getLaunch(@PathVariable String projectKey, @PathVariable String launchId,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getLaunch(launchId,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName))
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey))
     );
   }
 
@@ -245,10 +244,10 @@ public LaunchResource getLaunch(@PathVariable String projectName, @PathVariable
   @GetMapping("/uuid/{launchId}")
   @ResponseStatus(OK)
   @ApiOperation("Get specified launch by UUID")
-  public LaunchResource getLaunchByUuid(@PathVariable String projectName,
+  public LaunchResource getLaunchByUuid(@PathVariable String projectKey,
       @PathVariable String launchId, @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getLaunch(launchId,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName))
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey))
     );
   }
 
@@ -256,11 +255,11 @@ public LaunchResource getLaunchByUuid(@PathVariable String projectName,
   @GetMapping
   @ResponseStatus(OK)
   @ApiOperation("Get list of project launches by filter")
-  public Iterable<LaunchResource> getProjectLaunches(@PathVariable String projectName,
+  public Iterable<LaunchResource> getProjectLaunches(@PathVariable String projectKey,
       @FilterFor(Launch.class) Filter filter, @SortFor(Launch.class) Pageable pageable,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getProjectLaunches(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), filter, pageable,
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), filter, pageable,
         user.getUsername()
     );
   }
@@ -269,55 +268,54 @@ public Iterable<LaunchResource> getProjectLaunches(@PathVariable String projectN
   @GetMapping(value = "/latest")
   @ResponseStatus(OK)
   @ApiOperation("Get list of latest project launches by filter")
-  public Iterable<LaunchResource> getLatestLaunches(@PathVariable String projectName,
+  public Iterable<LaunchResource> getLatestLaunches(@PathVariable String projectKey,
       @FilterFor(Launch.class) Filter filter, @SortFor(Launch.class) Pageable pageable,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getLatestLaunches(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), filter, pageable);
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), filter, pageable);
   }
 
   @GetMapping(value = "/mode")
-  @ResponseBody
   @ResponseStatus(OK)
   @ApiOperation("Get launches of specified project from DEBUG mode")
-  public Iterable<LaunchResource> getDebugLaunches(@PathVariable String projectName,
+  public Iterable<LaunchResource> getDebugLaunches(@PathVariable String projectKey,
       @FilterFor(Launch.class) Filter filter, @SortFor(Launch.class) Pageable pageable,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getDebugLaunches(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), filter, pageable);
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), filter, pageable);
   }
 
   @Transactional(readOnly = true)
   @GetMapping(value = "/attribute/keys")
   @ResponseStatus(OK)
   @ApiOperation("Get all unique attribute keys of project launches")
-  public List<String> getAttributeKeys(@PathVariable String projectName,
+  public List<String> getAttributeKeys(@PathVariable String projectKey,
       @RequestParam(value = "filter." + "cnt." + "attributeKey") String value,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getAttributeKeys(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), value);
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), value);
   }
 
   @Transactional(readOnly = true)
   @GetMapping(value = "/attribute/values")
   @ResponseStatus(OK)
   @ApiOperation("Get all unique attribute values of project launches")
-  public List<String> getAttributeValues(@PathVariable String projectName,
+  public List<String> getAttributeValues(@PathVariable String projectKey,
       @RequestParam(value = "filter." + "eq." + "attributeKey", required = false) String key,
       @RequestParam(value = "filter." + "cnt." + "attributeValue") String value,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getAttributeValues(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), key, value);
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), key, value);
   }
 
   @GetMapping(value = "/cluster/{launchId}")
   @ResponseStatus(OK)
   @ApiOperation("Get all index clusters of the launch")
-  public Iterable<ClusterInfoResource> getClusters(@PathVariable String projectName,
+  public Iterable<ClusterInfoResource> getClusters(@PathVariable String projectKey,
       @PathVariable String launchId, Pageable pageable,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getClusters(launchId,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), pageable
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), pageable
     );
   }
 
@@ -326,11 +324,11 @@ public Iterable<ClusterInfoResource> getClusters(@PathVariable String projectNam
   @PreAuthorize(PROJECT_MANAGER_OR_ADMIN)
   @ResponseStatus(OK)
   @ApiOperation("Bulk update attributes and description")
-  public OperationCompletionRS bulkUpdate(@PathVariable String projectName,
+  public OperationCompletionRS bulkUpdate(@PathVariable String projectKey,
       @RequestBody @Validated BulkInfoUpdateRQ bulkInfoUpdateRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateLaunchHandler.bulkInfoUpdate(bulkInfoUpdateRQ,
-        projectExtractor.extractProjectDetails(user, projectName)
+        projectExtractor.extractProjectDetails(user, projectKey)
     );
   }
 
@@ -338,33 +336,33 @@ public OperationCompletionRS bulkUpdate(@PathVariable String projectName,
   @GetMapping(value = "/owners")
   @ResponseStatus(OK)
   @ApiOperation("Get all unique owners of project launches")
-  public List<String> getAllOwners(@PathVariable String projectName,
+  public List<String> getAllOwners(@PathVariable String projectKey,
       @RequestParam(value = "filter." + "cnt." + "user") String value,
       @RequestParam(value = "mode", required = false, defaultValue = "DEFAULT") String mode,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getOwners(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), value, mode);
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), value, mode);
   }
 
   @Transactional(readOnly = true)
   @GetMapping(value = "/names")
   @ResponseStatus(OK)
   @ApiOperation("Get launch names of project")
-  public List<String> getAllLaunchNames(@PathVariable String projectName,
+  public List<String> getAllLaunchNames(@PathVariable String projectKey,
       @RequestParam(value = "filter." + "cnt." + "name", required = false, defaultValue = "")
       String value, @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getLaunchNames(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), value);
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), value);
   }
 
   @Transactional(readOnly = true)
   @GetMapping(value = "/compare")
   @ResponseStatus(OK)
   @ApiOperation("Compare launches")
-  public Map<String, List<ChartStatisticsContent>> compareLaunches(@PathVariable String projectName,
+  public Map<String, List<ChartStatisticsContent>> compareLaunches(@PathVariable String projectKey,
       @RequestParam(value = "ids") Long[] ids, @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getLaunchesComparisonInfo(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), ids);
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), ids);
   }
 
   @Transactional
@@ -372,11 +370,11 @@ public Map<String, List<ChartStatisticsContent>> compareLaunches(@PathVariable S
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Merge set of specified launches in common one")
-  public LaunchResource mergeLaunches(@PathVariable String projectName,
+  public LaunchResource mergeLaunches(@PathVariable String projectKey,
       @ApiParam(value = "Merge launches request body", required = true) @RequestBody @Validated
       MergeLaunchesRQ mergeLaunchesRQ, @AuthenticationPrincipal ReportPortalUser user) {
     return mergeLaunchesHandler.mergeLaunches(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user,
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user,
         mergeLaunchesRQ
     );
   }
@@ -385,22 +383,22 @@ public LaunchResource mergeLaunches(@PathVariable String projectName,
   @PostMapping(value = "/analyze")
   @ResponseStatus(OK)
   @ApiOperation("Start launch auto-analyzer on demand")
-  public OperationCompletionRS startLaunchAnalyzer(@PathVariable String projectName,
+  public OperationCompletionRS startLaunchAnalyzer(@PathVariable String projectKey,
       @RequestBody @Validated AnalyzeLaunchRQ analyzeLaunchRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateLaunchHandler.startLaunchAnalyzer(analyzeLaunchRQ,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user
     );
   }
 
   @PostMapping(value = "/cluster")
   @ResponseStatus(OK)
   @ApiOperation("Create launch clusters")
-  public OperationCompletionRS createClusters(@PathVariable String projectName,
+  public OperationCompletionRS createClusters(@PathVariable String projectKey,
       @RequestBody @Validated CreateClustersRQ createClustersRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateLaunchHandler.createClusters(createClustersRQ,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user
     );
   }
 
@@ -408,10 +406,10 @@ public OperationCompletionRS createClusters(@PathVariable String projectName,
   @GetMapping(value = "/status")
   @ResponseStatus(OK)
 
-  public Map<String, String> getStatuses(@PathVariable String projectName,
+  public Map<String, String> getStatuses(@PathVariable String projectKey,
       @RequestParam(value = "ids") Long[] ids, @AuthenticationPrincipal ReportPortalUser user) {
     return getLaunchMessageHandler.getStatuses(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), ids);
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), ids);
   }
 
   @Transactional(readOnly = true)
@@ -419,7 +417,7 @@ public Map<String, String> getStatuses(@PathVariable String projectName,
   @ResponseStatus(OK)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
   @ApiOperation(value = "Export specified launch", notes = "Only following formats are supported: pdf (by default), xls, html.")
-  public void getLaunchReport(@PathVariable String projectName, @PathVariable Long launchId,
+  public void getLaunchReport(@PathVariable String projectKey, @PathVariable Long launchId,
       @ApiParam(allowableValues = "pdf, xls, html")
       @RequestParam(value = "view", required = false, defaultValue = "pdf") String view,
       @AuthenticationPrincipal ReportPortalUser user, HttpServletResponse response) {
@@ -447,11 +445,11 @@ public void getLaunchReport(@PathVariable String projectName, @PathVariable Long
   @PreAuthorize(ALLOWED_TO_REPORT)
   @ResponseStatus(OK)
   @ApiOperation("Delete specified launches by ids")
-  public DeleteBulkRS deleteLaunches(@PathVariable String projectName,
+  public DeleteBulkRS deleteLaunches(@PathVariable String projectKey,
       @RequestBody @Valid DeleteBulkRQ deleteBulkRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return deleteLaunchMessageHandler.deleteLaunches(deleteBulkRQ,
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user
     );
   }
 
@@ -459,12 +457,12 @@ public DeleteBulkRS deleteLaunches(@PathVariable String projectName,
   @PostMapping(value = "/import", consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })
   @ResponseStatus(OK)
   @ApiOperation(value = "Import junit xml report", notes = "Only following formats are supported: zip and xml.")
-  public OperationCompletionRS importLaunch(@PathVariable String projectName,
+  public OperationCompletionRS importLaunch(@PathVariable String projectKey,
       @RequestParam("file") MultipartFile file, @AuthenticationPrincipal ReportPortalUser user,
       HttpServletRequest request,
       @RequestPart(required = false) @Valid LaunchImportRQ launchImportRq) {
     return importLaunchHandler.importLaunch(
-        projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user, "XUNIT", file,
+        projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user, "XUNIT", file,
         composeBaseUrl(request), launchImportRq
     );
   }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/LogAsyncController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/LogAsyncController.java
index 980ac468fa..e77a925a53 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/LogAsyncController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/LogAsyncController.java
@@ -62,7 +62,7 @@
  * @author Konstantin Antipin
  */
 @RestController
-@RequestMapping("/v2/{projectName}/log")
+@RequestMapping("/v2/{projectKey}/log")
 @PreAuthorize(ASSIGNED_TO_PROJECT)
 public class LogAsyncController {
 
@@ -90,12 +90,12 @@ public LogAsyncController(ProjectExtractor projectExtractor,
   @ResponseStatus(CREATED)
   @ApiIgnore
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public EntryCreatedAsyncRS createLog(@PathVariable String projectName,
+  public EntryCreatedAsyncRS createLog(@PathVariable String projectKey,
       @RequestBody SaveLogRQ createLogRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     validateSaveRQ(validator, createLogRQ);
     return createLogHandler.createLog(createLogRQ, null,
-        projectExtractor.extractProjectDetails(user, projectName));
+        projectExtractor.extractProjectDetails(user, projectKey));
   }
 
   @HttpLogging
@@ -103,12 +103,12 @@ public EntryCreatedAsyncRS createLog(@PathVariable String projectName,
   @ResponseStatus(CREATED)
   @ApiOperation("Create log")
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public EntryCreatedAsyncRS createLogEntry(@PathVariable String projectName,
+  public EntryCreatedAsyncRS createLogEntry(@PathVariable String projectKey,
       @RequestBody SaveLogRQ createLogRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     validateSaveRQ(validator, createLogRQ);
     return createLogHandler.createLog(createLogRQ, null,
-        projectExtractor.extractProjectDetails(user, projectName));
+        projectExtractor.extractProjectDetails(user, projectKey));
   }
 
   @HttpLogging
@@ -118,7 +118,7 @@ public EntryCreatedAsyncRS createLogEntry(@PathVariable String projectName,
   // request mappings
   //	@Async
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public ResponseEntity<BatchSaveOperatingRS> createLog(@PathVariable String projectName,
+  public ResponseEntity<BatchSaveOperatingRS> createLog(@PathVariable String projectKey,
       @RequestPart(value = Constants.LOG_REQUEST_JSON_PART) SaveLogRQ[] createLogRQs,
       HttpServletRequest request,
       @AuthenticationPrincipal ReportPortalUser user) {
@@ -140,7 +140,7 @@ public ResponseEntity<BatchSaveOperatingRS> createLog(@PathVariable String proje
            * There is no filename in request. Use simple save
            * method
            */
-          responseItem = createLog(projectName, createLogRq, user);
+          responseItem = createLog(projectKey, createLogRq, user);
 
         } else {
           /* Find by request part */
@@ -156,7 +156,7 @@ public ResponseEntity<BatchSaveOperatingRS> createLog(@PathVariable String proje
            */
           //noinspection ConstantConditions
           responseItem = createLogHandler.createLog(createLogRq, data,
-              projectExtractor.extractProjectDetails(user, projectName));
+              projectExtractor.extractProjectDetails(user, projectKey));
         }
         response.addResponse(new BatchElementCreatedRS(responseItem.getId()));
       } catch (Exception e) {
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/LogController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/LogController.java
index 50628ef033..7a065a5933 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/LogController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/LogController.java
@@ -88,7 +88,7 @@
  * @author Pavel Bortnik
  */
 @RestController
-@RequestMapping("/v1/{projectName}/log")
+@RequestMapping("/v1/{projectKey}/log")
 @PreAuthorize(ASSIGNED_TO_PROJECT)
 public class LogController {
 
@@ -122,11 +122,11 @@ public LogController(ProjectExtractor projectExtractor,
   @ResponseStatus(CREATED)
   @ApiIgnore
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public EntryCreatedAsyncRS createLog(@PathVariable String projectName,
+  public EntryCreatedAsyncRS createLog(@PathVariable String projectKey,
       @RequestBody SaveLogRQ createLogRQ, @AuthenticationPrincipal ReportPortalUser user) {
     validateSaveRQ(validator, createLogRQ);
     return createLogHandler.createLog(createLogRQ, null,
-        projectExtractor.extractProjectDetails(user, projectName)
+        projectExtractor.extractProjectDetails(user, projectKey)
     );
   }
 
@@ -135,11 +135,11 @@ public EntryCreatedAsyncRS createLog(@PathVariable String projectName,
   @ResponseStatus(CREATED)
   @ApiOperation("Create log")
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public EntryCreatedAsyncRS createLogEntry(@PathVariable String projectName,
+  public EntryCreatedAsyncRS createLogEntry(@PathVariable String projectKey,
       @RequestBody SaveLogRQ createLogRQ, @AuthenticationPrincipal ReportPortalUser user) {
     validateSaveRQ(validator, createLogRQ);
     return createLogHandler.createLog(createLogRQ, null,
-        projectExtractor.extractProjectDetails(user, projectName)
+        projectExtractor.extractProjectDetails(user, projectKey)
     );
   }
 
@@ -149,7 +149,7 @@ public EntryCreatedAsyncRS createLogEntry(@PathVariable String projectName,
   // request mappings
   //	@Async
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public ResponseEntity<BatchSaveOperatingRS> createLog(@PathVariable String projectName,
+  public ResponseEntity<BatchSaveOperatingRS> createLog(@PathVariable String projectKey,
       @RequestPart(value = Constants.LOG_REQUEST_JSON_PART) SaveLogRQ[] createLogRQs,
       HttpServletRequest request, @AuthenticationPrincipal ReportPortalUser user) {
 
@@ -170,7 +170,7 @@ public ResponseEntity<BatchSaveOperatingRS> createLog(@PathVariable String proje
            * There is no filename in request. Use simple save
            * method
            */
-          responseItem = createLog(projectName, createLogRq, user);
+          responseItem = createLog(projectKey, createLogRq, user);
 
         } else {
           /* Find by request part */
@@ -188,7 +188,7 @@ public ResponseEntity<BatchSaveOperatingRS> createLog(@PathVariable String proje
            */
           //noinspection ConstantConditions
           responseItem = createLogHandler.createLog(createLogRq, data,
-              projectExtractor.extractProjectDetails(user, projectName)
+              projectExtractor.extractProjectDetails(user, projectKey)
           );
         }
         response.addResponse(new BatchElementCreatedRS(responseItem.getId()));
@@ -207,45 +207,45 @@ public ResponseEntity<BatchSaveOperatingRS> createLog(@PathVariable String proje
   @RequestMapping(value = "/{logId}", method = RequestMethod.DELETE)
   @ApiOperation("Delete log")
   @Transactional
-  public OperationCompletionRS deleteLog(@PathVariable String projectName, @PathVariable Long logId,
+  public OperationCompletionRS deleteLog(@PathVariable String projectKey, @PathVariable Long logId,
       @AuthenticationPrincipal ReportPortalUser user) {
     return deleteLogHandler.deleteLog(logId,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 
   @RequestMapping(method = RequestMethod.GET)
   @ApiOperation("Get logs by filter")
   @Transactional(readOnly = true)
-  public Iterable<LogResource> getLogs(@PathVariable String projectName,
+  public Iterable<LogResource> getLogs(@PathVariable String projectKey,
       @RequestParam(value = DEFAULT_FILTER_PREFIX + UNDR + CRITERIA_PATH, required = false)
       String underPath, @FilterFor(Log.class) Filter filter,
       @SortDefault({ "logTime" }) @SortFor(Log.class) Pageable pageable,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLogHandler.getLogs(underPath,
-        projectExtractor.extractProjectDetails(user, projectName), filter, pageable
+        projectExtractor.extractProjectDetails(user, projectKey), filter, pageable
     );
   }
 
   @PostMapping(value = "/under")
   @ApiOperation("Get logs under items")
   @Transactional(readOnly = true)
-  public Map<Long, List<LogResource>> getLogsUnder(@PathVariable String projectName,
+  public Map<Long, List<LogResource>> getLogsUnder(@PathVariable String projectKey,
       @RequestBody GetLogsUnderRq logsUnderRq, @AuthenticationPrincipal ReportPortalUser user) {
     return getLogHandler.getLogs(logsUnderRq,
-        projectExtractor.extractProjectDetails(user, projectName)
+        projectExtractor.extractProjectDetails(user, projectKey)
     );
   }
 
   @GetMapping(value = "/{logId}/page")
   @ApiOperation("Get logs by filter")
   @Transactional(readOnly = true)
-  public Map<String, Serializable> getPageNumber(@PathVariable String projectName,
+  public Map<String, Serializable> getPageNumber(@PathVariable String projectKey,
       @PathVariable Long logId, @FilterFor(Log.class) Filter filter,
       @SortFor(Log.class) Pageable pageable, @AuthenticationPrincipal ReportPortalUser user) {
     return ImmutableMap.<String, Serializable>builder().put("number",
         getLogHandler.getPageNumber(logId,
-            projectExtractor.extractProjectDetails(user, projectName), filter, pageable
+            projectExtractor.extractProjectDetails(user, projectKey), filter, pageable
         )
     ).build();
   }
@@ -253,9 +253,9 @@ public Map<String, Serializable> getPageNumber(@PathVariable String projectName,
   @GetMapping(value = "/{logId}")
   @ApiOperation("Get log by ID")
   @Transactional(readOnly = true)
-  public LogResource getLog(@PathVariable String projectName, @PathVariable String logId,
+  public LogResource getLog(@PathVariable String projectKey, @PathVariable String logId,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return getLogHandler.getLog(logId, projectExtractor.extractProjectDetails(user, projectName),
+    return getLogHandler.getLog(logId, projectExtractor.extractProjectDetails(user, projectKey),
         user
     );
   }
@@ -268,9 +268,9 @@ public LogResource getLog(@PathVariable String projectName, @PathVariable String
   @GetMapping(value = "/uuid/{logId}")
   @ApiOperation("Get log by UUID (Will be removed in version 6.0)")
   @Transactional(readOnly = true)
-  public LogResource getLogByUuid(@PathVariable String projectName, @PathVariable String logId,
+  public LogResource getLogByUuid(@PathVariable String projectKey, @PathVariable String logId,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return getLogHandler.getLog(logId, projectExtractor.extractProjectDetails(user, projectName),
+    return getLogHandler.getLog(logId, projectExtractor.extractProjectDetails(user, projectKey),
         user
     );
   }
@@ -278,35 +278,35 @@ public LogResource getLogByUuid(@PathVariable String projectName, @PathVariable
   @GetMapping(value = "/nested/{parentId}")
   @ApiOperation("Get nested steps with logs for the parent Test Item")
   @Transactional(readOnly = true)
-  public Iterable<?> getNestedItems(@PathVariable String projectName, @PathVariable Long parentId,
+  public Iterable<?> getNestedItems(@PathVariable String projectKey, @PathVariable Long parentId,
       @ApiParam(required = false) @RequestParam Map<String, String> params,
       @FilterFor(Log.class) Filter filter, @SortFor(Log.class) Pageable pageable,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLogHandler.getNestedItems(parentId,
-        projectExtractor.extractProjectDetails(user, projectName), params, filter, pageable
+        projectExtractor.extractProjectDetails(user, projectKey), params, filter, pageable
     );
   }
 
   @GetMapping(value = "/locations/{parentId}")
   @ApiOperation("Get next or previous log in test item")
   @Transactional(readOnly = true)
-  public List<PagedLogResource> getErrorPage(@PathVariable String projectName,
+  public List<PagedLogResource> getErrorPage(@PathVariable String projectKey,
       @PathVariable Long parentId, @RequestParam Map<String, String> params,
       @FilterFor(Log.class) Filter filter, @SortFor(Log.class) Pageable pageable,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getLogHandler.getLogsWithLocation(parentId,
-        projectExtractor.extractProjectDetails(user, projectName), params, filter, pageable
+        projectExtractor.extractProjectDetails(user, projectKey), params, filter, pageable
     );
   }
 
   @PostMapping("search/{itemId}")
   @ResponseStatus(OK)
   @ApiOperation("Search test items with similar error logs")
-  public Iterable<SearchLogRs> searchLogs(@PathVariable String projectName,
+  public Iterable<SearchLogRs> searchLogs(@PathVariable String projectKey,
       @RequestBody SearchLogRq request, @PathVariable Long itemId,
       @AuthenticationPrincipal ReportPortalUser user) {
     return searchLogService.search(itemId, request,
-        projectExtractor.extractProjectDetails(user, projectName)
+        projectExtractor.extractProjectDetails(user, projectKey)
     );
   }
 
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/OrganizationController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/OrganizationController.java
new file mode 100644
index 0000000000..b10b447e7e
--- /dev/null
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/OrganizationController.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2024 EPAM Systems
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.epam.ta.reportportal.ws.controller;
+
+import com.epam.ta.reportportal.commons.ReportPortalUser;
+import com.epam.ta.reportportal.core.organization.GetOrganizationHandler;
+import com.epam.ta.reportportal.model.OrganizationResource;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Andrei Piankouski
+ */
+@RestController
+@RequestMapping("/organization")
+public class OrganizationController {
+
+  private final GetOrganizationHandler getOrganizationHandler;
+
+  @Autowired
+  public OrganizationController(GetOrganizationHandler getOrganizationHandler) {
+    this.getOrganizationHandler = getOrganizationHandler;
+  }
+
+  @Transactional
+  @GetMapping("/{organizationId}")
+  @ApiOperation(value = "Get information about organization")
+  public OrganizationResource getOrganization(@PathVariable Long organizationId,
+      @AuthenticationPrincipal ReportPortalUser user) {
+    return getOrganizationHandler.getResource(organizationId, user);
+  }
+
+  @Transactional
+  @GetMapping("/list")
+  @ApiOperation(value = "Get list of all organizations")
+  public List<OrganizationResource> getAllOrganizations(
+      @AuthenticationPrincipal ReportPortalUser user) {
+    return getOrganizationHandler.getAllOrganization();
+  }
+}
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/PluginController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/PluginController.java
index 0ef56e4e81..89d7085fd0 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/PluginController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/PluginController.java
@@ -121,17 +121,18 @@ public OperationCompletionRS deletePlugin(@PathVariable(value = "pluginId") Long
   }
 
   @Transactional
-  @PutMapping(value = "{projectName}/{pluginName}/common/{command}", consumes = {
-      APPLICATION_JSON_VALUE })
+  @PutMapping(
+      value = "{projectKey}/{pluginName}/common/{command}",
+      consumes = {APPLICATION_JSON_VALUE})
   @ResponseStatus(HttpStatus.OK)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
   @ApiOperation("Execute command to the plugin instance")
-  public Object executePluginCommand(@PathVariable String projectName,
+  public Object executePluginCommand(@PathVariable String projectKey,
       @PathVariable("pluginName") String pluginName, @PathVariable("command") String command,
       @RequestBody Map<String, Object> executionParams,
       @AuthenticationPrincipal ReportPortalUser user) {
     return executeIntegrationHandler.executeCommand(
-        projectExtractor.extractProjectDetails(user, projectName), pluginName, command,
+        projectExtractor.extractProjectDetails(user, projectKey), pluginName, command,
         executionParams
     );
   }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/ProjectController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/ProjectController.java
index 0fcea11f41..2948fa57f6 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/ProjectController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/ProjectController.java
@@ -142,25 +142,25 @@ public EntryCreatedRS createProject(@RequestBody @Validated CreateProjectRQ crea
   }
 
   @Transactional
-  @PutMapping("/{projectName}")
+  @PutMapping("/{projectKey}")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER_OR_ADMIN)
   @ApiOperation(value = "Update project")
-  public OperationCompletionRS updateProject(@PathVariable String projectName,
+  public OperationCompletionRS updateProject(@PathVariable String projectKey,
       @RequestBody @Validated UpdateProjectRQ updateProjectRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return updateProjectHandler.updateProject(normalizeId(projectName), updateProjectRQ, user);
+    return updateProjectHandler.updateProject(normalizeId(projectKey), updateProjectRQ, user);
   }
 
   @Transactional
-  @PutMapping("/{projectName}/notification")
+  @PutMapping("/{projectKey}/notification")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation("Update project notifications configuration")
-  public OperationCompletionRS updateProjectNotificationConfig(@PathVariable String projectName,
+  public OperationCompletionRS updateProjectNotificationConfig(@PathVariable String projectKey,
       @RequestBody @Validated ProjectNotificationConfigDTO updateProjectNotificationConfigRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return updateProjectHandler.updateProjectNotificationConfig(normalizeId(projectName), user,
+    return updateProjectHandler.updateProjectNotificationConfig(normalizeId(projectKey), user,
         updateProjectNotificationConfigRQ
     );
   }
@@ -183,135 +183,135 @@ public OperationCompletionRS deleteProject(@PathVariable Long projectId,
     return deleteProjectHandler.deleteProject(projectId, user);
   }
 
-  @DeleteMapping("/{projectName}/index")
+  @DeleteMapping("/{projectKey}/index")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER_OR_ADMIN)
   @ApiOperation("Delete project index from ML")
-  public OperationCompletionRS deleteProjectIndex(@PathVariable String projectName,
+  public OperationCompletionRS deleteProjectIndex(@PathVariable String projectKey,
       Principal principal) {
-    return deleteProjectHandler.deleteProjectIndex(normalizeId(projectName), principal.getName());
+    return deleteProjectHandler.deleteProjectIndex(normalizeId(projectKey), principal.getName());
   }
 
   @Transactional
-  @PutMapping("/{projectName}/index")
+  @PutMapping("/{projectKey}/index")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER_OR_ADMIN)
   @ApiOperation(value = "Starts reindex all project data in ML")
-  public OperationCompletionRS indexProjectData(@PathVariable String projectName,
+  public OperationCompletionRS indexProjectData(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return updateProjectHandler.indexProjectData(normalizeId(projectName), user);
+    return updateProjectHandler.indexProjectData(normalizeId(projectKey), user);
   }
 
   @Transactional(readOnly = true)
-  @GetMapping("/{projectName}/users")
+  @GetMapping("/{projectKey}/users")
   @PreAuthorize(NOT_CUSTOMER)
   @ApiOperation("Get users assigned on current project")
-  public Iterable<UserResource> getProjectUsers(@PathVariable String projectName,
+  public Iterable<UserResource> getProjectUsers(@PathVariable String projectKey,
       @FilterFor(User.class) Filter filter, @SortFor(User.class) Pageable pageable,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return getProjectHandler.getProjectUsers(normalizeId(projectName), filter, pageable);
+    return getProjectHandler.getProjectUsers(normalizeId(projectKey), filter, pageable);
   }
 
   @Transactional(readOnly = true)
-  @GetMapping("/{projectName}")
+  @GetMapping("/{projectKey}")
   @PreAuthorize(ASSIGNED_TO_PROJECT)
   @ApiOperation(value = "Get information about project", notes = "Only for users that are assigned to the project")
-  public ProjectResource getProject(@PathVariable String projectName,
+  public ProjectResource getProject(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return getProjectHandler.getResource(normalizeId(projectName), user);
+    return getProjectHandler.getResource(normalizeId(projectKey), user);
   }
 
   @Transactional
-  @PutMapping("/{projectName}/unassign")
+  @PutMapping("/{projectKey}/unassign")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation("Un assign users")
-  public OperationCompletionRS unassignProjectUsers(@PathVariable String projectName,
+  public OperationCompletionRS unassignProjectUsers(@PathVariable String projectKey,
       @RequestBody @Validated UnassignUsersRQ unassignUsersRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return updateProjectHandler.unassignUsers(normalizeId(projectName), unassignUsersRQ, user);
+    return updateProjectHandler.unassignUsers(normalizeId(projectKey), unassignUsersRQ, user);
   }
 
   @Transactional
-  @PutMapping("/{projectName}/assign")
+  @PutMapping("/{projectKey}/assign")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation("Assign users")
-  public OperationCompletionRS assignProjectUsers(@PathVariable String projectName,
+  public OperationCompletionRS assignProjectUsers(@PathVariable String projectKey,
       @RequestBody @Validated AssignUsersRQ assignUsersRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return updateProjectHandler.assignUsers(projectName, assignUsersRQ, user);
+    return updateProjectHandler.assignUsers(projectKey, assignUsersRQ, user);
   }
 
   @Transactional(readOnly = true)
-  @GetMapping("/{projectName}/assignable")
+  @GetMapping("/{projectKey}/assignable")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation(value = "Load users which can be assigned to specified project", notes = "Only for users with project manager permissions")
   public Iterable<UserResource> getUsersForAssign(@FilterFor(User.class) Filter filter,
-      @SortFor(User.class) Pageable pageable, @PathVariable String projectName,
+      @SortFor(User.class) Pageable pageable, @PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getUserHandler.getUsers(filter, pageable,
-        projectExtractor.extractProjectDetails(user, projectName)
+        projectExtractor.extractProjectDetails(user, projectKey)
     );
   }
 
   @Transactional(readOnly = true)
-  @GetMapping("/{projectName}/usernames")
+  @GetMapping("/{projectKey}/usernames")
   @ResponseStatus(HttpStatus.OK)
   @PreAuthorize(NOT_CUSTOMER)
   @ApiOperation(value = "Load project users by filter", notes = "Only for users that are members of the project")
-  public List<String> getProjectUsers(@PathVariable String projectName,
+  public List<String> getProjectUsers(@PathVariable String projectKey,
       @RequestParam(value = FilterCriteriaResolver.DEFAULT_FILTER_PREFIX + Condition.CNT + "users")
       String value, @AuthenticationPrincipal ReportPortalUser user) {
-    return getProjectHandler.getUserNames(projectExtractor.extractProjectDetails(user, projectName),
+    return getProjectHandler.getUserNames(projectExtractor.extractProjectDetails(user, projectKey),
         normalizeId(value)
     );
   }
 
   @Transactional(readOnly = true)
-  @GetMapping("/{projectName}/usernames/search")
+  @GetMapping("/{projectKey}/usernames/search")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER)
-  public Iterable<SearchUserResource> searchForUser(@PathVariable String projectName,
+  public Iterable<SearchUserResource> searchForUser(@PathVariable String projectKey,
       @RequestParam(value = "term") String term, Pageable pageable,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getProjectHandler.getUserNames(term,
-        projectExtractor.extractProjectDetails(user, projectName), pageable
+        projectExtractor.extractProjectDetails(user, projectKey), pageable
     );
   }
 
   @Transactional
-  @PutMapping("/{projectName}/preference/{login}/{filterId}")
+  @PutMapping("/{projectKey}/preference/{login}/{filterId}")
   @ResponseStatus(HttpStatus.OK)
   @PreAuthorize(ALLOWED_TO_EDIT_USER)
-  public OperationCompletionRS addUserPreference(@PathVariable String projectName,
+  public OperationCompletionRS addUserPreference(@PathVariable String projectKey,
       @PathVariable String login, @PathVariable Long filterId,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return updatePreference.addPreference(projectExtractor.extractProjectDetails(user, projectName),
+    return updatePreference.addPreference(projectExtractor.extractProjectDetails(user, projectKey),
         user, filterId
     );
   }
 
   @Transactional
-  @DeleteMapping("/{projectName}/preference/{login}/{filterId}")
+  @DeleteMapping("/{projectKey}/preference/{login}/{filterId}")
   @ResponseStatus(HttpStatus.OK)
   @PreAuthorize(ALLOWED_TO_EDIT_USER)
-  public OperationCompletionRS removeUserPreference(@PathVariable String projectName,
+  public OperationCompletionRS removeUserPreference(@PathVariable String projectKey,
       @PathVariable String login, @PathVariable Long filterId,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updatePreference.removePreference(
-        projectExtractor.extractProjectDetails(user, projectName), user, filterId);
+        projectExtractor.extractProjectDetails(user, projectKey), user, filterId);
   }
 
   @Transactional(readOnly = true)
-  @GetMapping("/{projectName}/preference/{login}")
+  @GetMapping("/{projectKey}/preference/{login}")
   @ResponseStatus(HttpStatus.OK)
   @PreAuthorize(ALLOWED_TO_EDIT_USER)
   @ApiOperation(value = "Load user preferences", notes = "Only for users that allowed to edit other users")
-  public PreferenceResource getUserPreference(@PathVariable String projectName,
+  public PreferenceResource getUserPreference(@PathVariable String projectKey,
       @PathVariable String login, @AuthenticationPrincipal ReportPortalUser user) {
-    return getPreference.getPreference(projectExtractor.extractProjectDetails(user, projectName),
+    return getPreference.getPreference(projectExtractor.extractProjectDetails(user, projectKey),
         user
     );
   }
@@ -363,22 +363,22 @@ public void exportProjects(@ApiParam(allowableValues = "csv")
 
   @Transactional(readOnly = true)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
-  @GetMapping("/list/{projectName}")
+  @GetMapping("/list/{projectKey}")
   @ResponseStatus(HttpStatus.OK)
-  public ProjectInfoResource getProjectInfo(@PathVariable String projectName,
+  public ProjectInfoResource getProjectInfo(@PathVariable String projectKey,
       @RequestParam(value = "interval", required = false, defaultValue = "3M") String interval,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return projectInfoHandler.getProjectInfo(projectName, interval);
+    return projectInfoHandler.getProjectInfo(projectKey, interval);
   }
 
   @Transactional(readOnly = true)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
-  @GetMapping("/{projectName}/widget/{widgetCode}")
+  @GetMapping("/{projectKey}/widget/{widgetCode}")
   @ResponseStatus(HttpStatus.OK)
-  public Map<String, ?> getProjectWidget(@PathVariable String projectName,
+  public Map<String, ?> getProjectWidget(@PathVariable String projectKey,
       @RequestParam(value = "interval", required = false, defaultValue = "3M") String interval,
       @PathVariable String widgetCode, @AuthenticationPrincipal ReportPortalUser user) {
-    return projectInfoHandler.getProjectInfoWidgetContent(projectName, interval, widgetCode);
+    return projectInfoHandler.getProjectInfoWidgetContent(projectKey, interval, widgetCode);
   }
 
   @Transactional(readOnly = true)
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/ProjectSettingsController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/ProjectSettingsController.java
index b5b50ba943..38835f0fa9 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/ProjectSettingsController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/ProjectSettingsController.java
@@ -66,7 +66,7 @@
  * @author Andrei_Ramanchuk
  */
 @RestController
-@RequestMapping("/v1/{projectName}/settings")
+@RequestMapping("/v1/{projectKey}/settings")
 @PreAuthorize(ASSIGNED_TO_PROJECT)
 public class ProjectSettingsController {
 
@@ -111,48 +111,48 @@ public ProjectSettingsController(CreateProjectSettingsHandler createHandler,
   @ResponseStatus(CREATED)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation("Creation of custom project specific issue sub-type")
-  public IssueSubTypeCreatedRS createProjectIssueSubType(@PathVariable String projectName,
+  public IssueSubTypeCreatedRS createProjectIssueSubType(@PathVariable String projectKey,
       @RequestBody @Validated CreateIssueSubTypeRQ request,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return createHandler.createProjectIssueSubType(normalizeId(projectName), user, request);
+    return createHandler.createProjectIssueSubType(normalizeId(projectKey), user, request);
   }
 
   @PutMapping("/sub-type")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation("Update of custom project specific issue sub-type")
-  public OperationCompletionRS updateProjectIssueSubType(@PathVariable String projectName,
+  public OperationCompletionRS updateProjectIssueSubType(@PathVariable String projectKey,
       @RequestBody @Validated UpdateIssueSubTypeRQ request,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return updateHandler.updateProjectIssueSubType(normalizeId(projectName), user, request);
+    return updateHandler.updateProjectIssueSubType(normalizeId(projectKey), user, request);
   }
 
   @DeleteMapping("/sub-type/{id}")
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation("Delete custom project specific issue sub-type")
-  public OperationCompletionRS deleteProjectIssueSubType(@PathVariable String projectName,
+  public OperationCompletionRS deleteProjectIssueSubType(@PathVariable String projectKey,
       @PathVariable Long id, @AuthenticationPrincipal ReportPortalUser user) {
-    return deleteHandler.deleteProjectIssueSubType(normalizeId(projectName), user, id);
+    return deleteHandler.deleteProjectIssueSubType(normalizeId(projectKey), user, id);
   }
 
   @GetMapping
   @ResponseStatus(OK)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
   @ApiOperation(value = "Get project specific issue sub-types", notes = "Only for users that are assigned to the project")
-  public ProjectSettingsResource getProjectSettings(@PathVariable String projectName,
+  public ProjectSettingsResource getProjectSettings(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return getHandler.getProjectSettings(normalizeId(projectName));
+    return getHandler.getProjectSettings(normalizeId(projectKey));
   }
 
   @PostMapping("/pattern")
   @ResponseStatus(CREATED)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation("Create pattern template for items' log messages pattern analysis")
-  public EntryCreatedRS createPatternTemplate(@PathVariable String projectName,
+  public EntryCreatedRS createPatternTemplate(@PathVariable String projectKey,
       @RequestBody @Validated CreatePatternTemplateRQ createPatternTemplateRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return createHandler.createPatternTemplate(normalizeId(projectName), createPatternTemplateRQ,
+    return createHandler.createPatternTemplate(normalizeId(projectKey), createPatternTemplateRQ,
         user
     );
   }
@@ -161,11 +161,11 @@ public EntryCreatedRS createPatternTemplate(@PathVariable String projectName,
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation("Update pattern template for items' log messages pattern analysis")
-  public OperationCompletionRS updatePatternTemplate(@PathVariable String projectName,
+  public OperationCompletionRS updatePatternTemplate(@PathVariable String projectKey,
       @PathVariable Long id,
       @RequestBody @Validated UpdatePatternTemplateRQ updatePatternTemplateRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return updateHandler.updatePatternTemplate(id, normalizeId(projectName),
+    return updateHandler.updatePatternTemplate(id, normalizeId(projectKey),
         updatePatternTemplateRQ, user
     );
   }
@@ -174,9 +174,9 @@ public OperationCompletionRS updatePatternTemplate(@PathVariable String projectN
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER)
   @ApiOperation("Delete pattern template for items' log messages pattern analysis")
-  public OperationCompletionRS deletePatternTemplate(@PathVariable String projectName,
+  public OperationCompletionRS deletePatternTemplate(@PathVariable String projectKey,
       @PathVariable Long id, @AuthenticationPrincipal ReportPortalUser user) {
-    return deleteHandler.deletePatternTemplate(normalizeId(projectName), user, id);
+    return deleteHandler.deletePatternTemplate(normalizeId(projectKey), user, id);
   }
 
   @Transactional(readOnly = true)
@@ -184,9 +184,9 @@ public OperationCompletionRS deletePatternTemplate(@PathVariable String projectN
   @ResponseStatus(OK)
   @PreAuthorize(ASSIGNED_TO_PROJECT)
   @ApiOperation(value = "Returns notifications config of specified project", notes = "Only for users assigned to specified project")
-  public List<SenderCaseDTO> getNotifications(@PathVariable String projectName) {
+  public List<SenderCaseDTO> getNotifications(@PathVariable String projectKey) {
     return getProjectNotificationsHandler.getProjectNotifications(
-        getProjectHandler.get(normalizeId(projectName)).getId());
+        getProjectHandler.get(normalizeId(projectKey)).getId());
   }
 
   @Transactional
@@ -194,11 +194,11 @@ public List<SenderCaseDTO> getNotifications(@PathVariable String projectName) {
   @ResponseStatus(CREATED)
   @PreAuthorize(PROJECT_MANAGER_OR_ADMIN)
   @ApiOperation(value = "Creates notification for specified project", notes = "Only for users with PROJECT_MANAGER or ADMIN roles")
-  public EntryCreatedRS createNotification(@PathVariable String projectName,
+  public EntryCreatedRS createNotification(@PathVariable String projectKey,
       @RequestBody @Validated SenderCaseDTO createNotificationRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return createProjectNotificationHandler.createNotification(
-        getProjectHandler.get(normalizeId(projectName)), createNotificationRQ, user);
+        getProjectHandler.get(normalizeId(projectKey)), createNotificationRQ, user);
   }
 
   @Transactional
@@ -206,11 +206,11 @@ public EntryCreatedRS createNotification(@PathVariable String projectName,
   @ResponseStatus(CREATED)
   @PreAuthorize(PROJECT_MANAGER_OR_ADMIN)
   @ApiOperation(value = "Updates notification for specified project", notes = "Only for users with PROJECT_MANAGER or ADMIN roles")
-  public OperationCompletionRS updateNotification(@PathVariable String projectName,
+  public OperationCompletionRS updateNotification(@PathVariable String projectKey,
       @RequestBody @Validated SenderCaseDTO updateNotificationRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateProjectNotificationHandler.updateNotification(
-        getProjectHandler.get(normalizeId(projectName)), updateNotificationRQ, user);
+        getProjectHandler.get(normalizeId(projectKey)), updateNotificationRQ, user);
   }
 
   @Transactional
@@ -218,9 +218,9 @@ public OperationCompletionRS updateNotification(@PathVariable String projectName
   @ResponseStatus(OK)
   @PreAuthorize(PROJECT_MANAGER_OR_ADMIN)
   @ApiOperation(value = "Deletes notification for specified project", notes = "Only for users with PROJECT_MANAGER or ADMIN roles")
-  public OperationCompletionRS deleteNotification(@PathVariable String projectName,
+  public OperationCompletionRS deleteNotification(@PathVariable String projectKey,
       @PathVariable Long notificationId, @AuthenticationPrincipal ReportPortalUser user) {
     return deleteNotificationHandler.deleteNotification(
-        getProjectHandler.get(normalizeId(projectName)), notificationId, user);
+        getProjectHandler.get(normalizeId(projectKey)), notificationId, user);
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/TestItemAsyncController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/TestItemAsyncController.java
index 0b234f8aa5..dfe4626c8c 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/TestItemAsyncController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/TestItemAsyncController.java
@@ -74,11 +74,11 @@ public TestItemAsyncController(ProjectExtractor projectExtractor,
   @ResponseStatus(CREATED)
   @ApiOperation("Start a root test item")
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public EntryCreatedAsyncRS startRootItem(@PathVariable String projectName,
+  public EntryCreatedAsyncRS startRootItem(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @RequestBody @Validated StartTestItemRQ startTestItemRQ) {
     return startTestItemHandler.startRootItem(user,
-        projectExtractor.extractProjectDetails(user, projectName), startTestItemRQ);
+        projectExtractor.extractProjectDetails(user, projectKey), startTestItemRQ);
   }
 
   @HttpLogging
@@ -86,11 +86,11 @@ public EntryCreatedAsyncRS startRootItem(@PathVariable String projectName,
   @ResponseStatus(CREATED)
   @ApiOperation("Start a child test item")
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public EntryCreatedAsyncRS startChildItem(@PathVariable String projectName,
+  public EntryCreatedAsyncRS startChildItem(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @PathVariable String parentItem, @RequestBody @Validated StartTestItemRQ startTestItemRQ) {
     return startTestItemHandler.startChildItem(user,
-        projectExtractor.extractProjectDetails(user, projectName), startTestItemRQ, parentItem);
+        projectExtractor.extractProjectDetails(user, projectKey), startTestItemRQ, parentItem);
   }
 
   @HttpLogging
@@ -98,11 +98,11 @@ public EntryCreatedAsyncRS startChildItem(@PathVariable String projectName,
   @ResponseStatus(OK)
   @ApiOperation("Finish test item")
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public OperationCompletionRS finishTestItem(@PathVariable String projectName,
+  public OperationCompletionRS finishTestItem(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @PathVariable String testItemId, @RequestBody @Validated FinishTestItemRQ finishExecutionRQ) {
     return finishTestItemHandler.finishTestItem(user,
-        projectExtractor.extractProjectDetails(user, projectName), testItemId, finishExecutionRQ);
+        projectExtractor.extractProjectDetails(user, projectKey), testItemId, finishExecutionRQ);
   }
 
 }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/TestItemController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/TestItemController.java
index 3a31a568fa..55ed2bb5d2 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/TestItemController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/TestItemController.java
@@ -92,7 +92,7 @@
  * Controller implementation for {@link com.epam.ta.reportportal.entity.item.TestItem} entity
  */
 @RestController
-@RequestMapping("/v1/{projectName}/item")
+@RequestMapping("/v1/{projectKey}/item")
 @PreAuthorize(ASSIGNED_TO_PROJECT)
 public class TestItemController {
 
@@ -135,11 +135,11 @@ public TestItemController(ProjectExtractor projectExtractor,
   @ResponseStatus(CREATED)
   @ApiOperation("Start a root test item")
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public EntryCreatedAsyncRS startRootItem(@PathVariable String projectName,
+  public EntryCreatedAsyncRS startRootItem(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @RequestBody @Validated StartTestItemRQ startTestItemRQ) {
     return startTestItemHandler.startRootItem(user,
-        projectExtractor.extractProjectDetails(user, projectName), startTestItemRQ
+        projectExtractor.extractProjectDetails(user, projectKey), startTestItemRQ
     );
   }
 
@@ -147,11 +147,11 @@ public EntryCreatedAsyncRS startRootItem(@PathVariable String projectName,
   @ResponseStatus(CREATED)
   @ApiOperation("Start a child test item")
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public EntryCreatedAsyncRS startChildItem(@PathVariable String projectName,
+  public EntryCreatedAsyncRS startChildItem(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @PathVariable String parentItem,
       @RequestBody @Validated StartTestItemRQ startTestItemRQ) {
     return startTestItemHandler.startChildItem(user,
-        projectExtractor.extractProjectDetails(user, projectName), startTestItemRQ, parentItem
+        projectExtractor.extractProjectDetails(user, projectKey), startTestItemRQ, parentItem
     );
   }
 
@@ -159,11 +159,11 @@ public EntryCreatedAsyncRS startChildItem(@PathVariable String projectName,
   @ResponseStatus(OK)
   @ApiOperation("Finish test item")
   @PreAuthorize(ALLOWED_TO_REPORT)
-  public OperationCompletionRS finishTestItem(@PathVariable String projectName,
+  public OperationCompletionRS finishTestItem(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @PathVariable String testItemId,
       @RequestBody @Validated FinishTestItemRQ finishExecutionRQ) {
     return finishTestItemHandler.finishTestItem(user,
-        projectExtractor.extractProjectDetails(user, projectName), testItemId, finishExecutionRQ
+        projectExtractor.extractProjectDetails(user, projectKey), testItemId, finishExecutionRQ
     );
   }
 
@@ -174,10 +174,10 @@ public OperationCompletionRS finishTestItem(@PathVariable String projectName,
   @GetMapping("/{itemId}")
   @ResponseStatus(OK)
   @ApiOperation("Find test item by ID")
-  public TestItemResource getTestItem(@PathVariable String projectName,
+  public TestItemResource getTestItem(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @PathVariable String itemId) {
     return getTestItemHandler.getTestItem(itemId,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
 
   }
@@ -186,10 +186,10 @@ public TestItemResource getTestItem(@PathVariable String projectName,
   @GetMapping("/uuid/{itemId}")
   @ResponseStatus(OK)
   @ApiOperation("Find test item by UUID")
-  public TestItemResource getTestItemByUuid(@PathVariable String projectName,
+  public TestItemResource getTestItemByUuid(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @PathVariable String itemId) {
     return getTestItemHandler.getTestItem(itemId,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
 
   }
@@ -198,20 +198,20 @@ public TestItemResource getTestItemByUuid(@PathVariable String projectName,
   @GetMapping("/suggest/{itemId}")
   @ResponseStatus(OK)
   @ApiOperation("Search suggested items in analyzer for provided one")
-  public List<SuggestedItem> getSuggestedItems(@PathVariable String projectName,
+  public List<SuggestedItem> getSuggestedItems(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @PathVariable Long itemId) {
     return suggestItemService.suggestItems(itemId,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 
   @GetMapping("/suggest/cluster/{clusterId}")
   @ResponseStatus(OK)
   @ApiOperation("Search suggested items in analyzer for provided one")
-  public List<SuggestedItem> getSuggestedClusterItems(@PathVariable String projectName,
+  public List<SuggestedItem> getSuggestedClusterItems(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @PathVariable Long clusterId) {
     return suggestItemService.suggestClusterItems(clusterId,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 
@@ -219,10 +219,10 @@ public List<SuggestedItem> getSuggestedClusterItems(@PathVariable String project
   @PutMapping("/suggest/choice")
   @ResponseStatus(OK)
   @ApiOperation("Handle user choice from suggested items")
-  public OperationCompletionRS handleSuggestChoose(@PathVariable String projectName,
+  public OperationCompletionRS handleSuggestChoose(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @RequestBody @Validated List<SuggestInfo> request) {
-    projectExtractor.extractProjectDetails(user, projectName);
+    projectExtractor.extractProjectDetails(user, projectKey);
     return suggestItemService.handleSuggestChoice(request);
   }
 
@@ -231,7 +231,7 @@ public OperationCompletionRS handleSuggestChoose(@PathVariable String projectNam
   @GetMapping
   @ResponseStatus(OK)
   @ApiOperation("Find test items by specified filter")
-  public Iterable<TestItemResource> getTestItems(@PathVariable String projectName,
+  public Iterable<TestItemResource> getTestItems(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @Nullable
   @RequestParam(value = DEFAULT_FILTER_PREFIX + Condition.EQ + CRITERIA_LAUNCH_ID, required = false)
   Long launchId,
@@ -244,7 +244,7 @@ public Iterable<TestItemResource> getTestItems(@PathVariable String projectName,
       @SortFor(TestItem.class) Pageable pageable) {
     return getTestItemHandler.getTestItems(
         new CompositeFilter(Operator.AND, filter, predefinedFilter), pageable,
-        projectExtractor.extractProjectDetails(user, projectName), user, launchId, filterId,
+        projectExtractor.extractProjectDetails(user, projectKey), user, launchId, filterId,
         isLatest, launchesLimit
     );
   }
@@ -253,18 +253,18 @@ public Iterable<TestItemResource> getTestItems(@PathVariable String projectName,
   @GetMapping("/v2")
   @ResponseStatus(OK)
   @ApiOperation("Find test items by specified filter")
-  public Iterable<TestItemResource> getTestItemsV2(@PathVariable String projectName,
+  public Iterable<TestItemResource> getTestItemsV2(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @RequestParam Map<String, String> params,
       @FilterFor(TestItem.class) Filter filter,
       @FilterFor(TestItem.class) Queryable predefinedFilter,
       @SortFor(TestItem.class) Pageable pageable) {
     // tmp return null for project, to fix perf issue
-    if ("libg-140".equalsIgnoreCase(projectName)) {
+    if ("libg-140".equalsIgnoreCase(projectKey)) {
       return null;
     }
     return getTestItemHandler.getTestItemsByProvider(
         new CompositeFilter(Operator.AND, filter, predefinedFilter), pageable,
-        projectExtractor.extractProjectDetails(user, projectName), user, params
+        projectExtractor.extractProjectDetails(user, projectKey), user, params
     );
   }
 
@@ -272,13 +272,13 @@ public Iterable<TestItemResource> getTestItemsV2(@PathVariable String projectNam
   @GetMapping("/statistics")
   @ResponseStatus(OK)
   @ApiOperation("Find accumulated statistics of items by specified filter")
-  public StatisticsResource getTestItems(@PathVariable String projectName,
+  public StatisticsResource getTestItems(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @FilterFor(TestItem.class) Filter filter,
       @FilterFor(TestItem.class) Queryable predefinedFilter,
       @RequestParam Map<String, String> params) {
     return getTestItemHandler.getStatisticsByProvider(
         new CompositeFilter(Operator.AND, filter, predefinedFilter),
-        projectExtractor.extractProjectDetails(user, projectName), user, params
+        projectExtractor.extractProjectDetails(user, projectKey), user, params
     );
   }
 
@@ -286,10 +286,10 @@ public StatisticsResource getTestItems(@PathVariable String projectName,
   @DeleteMapping("/{itemId}")
   @ResponseStatus(OK)
   @ApiOperation("Delete test item")
-  public OperationCompletionRS deleteTestItem(@PathVariable String projectName,
+  public OperationCompletionRS deleteTestItem(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @PathVariable Long itemId) {
     return deleteTestItemHandler.deleteTestItem(itemId,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 
@@ -297,10 +297,10 @@ public OperationCompletionRS deleteTestItem(@PathVariable String projectName,
   @DeleteMapping
   @ResponseStatus(OK)
   @ApiOperation("Delete test items by specified ids")
-  public List<OperationCompletionRS> deleteTestItems(@PathVariable String projectName,
+  public List<OperationCompletionRS> deleteTestItems(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @RequestParam(value = "ids") Set<Long> ids) {
     return deleteTestItemHandler.deleteTestItems(ids,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 
@@ -308,18 +308,18 @@ public List<OperationCompletionRS> deleteTestItems(@PathVariable String projectN
   @PutMapping
   @ResponseStatus(OK)
   @ApiOperation("Update issues of specified test items")
-  public List<Issue> defineTestItemIssueType(@PathVariable String projectName,
+  public List<Issue> defineTestItemIssueType(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @RequestBody @Validated DefineIssueRQ request) {
     return updateTestItemHandler.defineTestItemsIssues(
-        projectExtractor.extractProjectDetails(user, projectName), request, user);
+        projectExtractor.extractProjectDetails(user, projectKey), request, user);
   }
 
   @Transactional(readOnly = true)
   @GetMapping("/history")
   @ResponseStatus(OK)
   @ApiOperation("Load history of test items")
-  public Iterable<TestItemHistoryElement> getItemsHistory(@PathVariable String projectName,
+  public Iterable<TestItemHistoryElement> getItemsHistory(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @FilterFor(TestItem.class) Filter filter,
       @FilterFor(TestItem.class) Queryable predefinedFilter,
       @SortFor(TestItem.class) Pageable pageable, @Nullable
@@ -338,7 +338,7 @@ public Iterable<TestItemHistoryElement> getItemsHistory(@PathVariable String pro
       int historyDepth) {
 
     return testItemsHistoryHandler.getItemsHistory(
-        projectExtractor.extractProjectDetails(user, projectName),
+        projectExtractor.extractProjectDetails(user, projectKey),
         new CompositeFilter(Operator.AND, filter, predefinedFilter), pageable,
         HistoryRequestParams.of(historyDepth, parentId, itemId, launchId, type, filterId,
             launchesLimit, isLatest
@@ -351,7 +351,7 @@ public Iterable<TestItemHistoryElement> getItemsHistory(@PathVariable String pro
   @ResponseStatus(OK)
   @ApiOperation("Get tickets that contains a term as a part inside for specified launch")
   public List<String> getTicketIds(@AuthenticationPrincipal ReportPortalUser user,
-      @PathVariable String projectName, @RequestParam(value = "launch") Long id,
+      @PathVariable String projectKey, @RequestParam(value = "launch") Long id,
       @RequestParam(value = "term") String term) {
     return getTestItemHandler.getTicketIds(id, normalizeId(term));
   }
@@ -361,9 +361,9 @@ public List<String> getTicketIds(@AuthenticationPrincipal ReportPortalUser user,
   @ResponseStatus(OK)
   @ApiOperation("Get tickets that contains a term as a part inside for specified launch")
   public List<String> getTicketIdsForProject(@AuthenticationPrincipal ReportPortalUser user,
-      @PathVariable String projectName, @RequestParam(value = "term") String term) {
+      @PathVariable String projectKey, @RequestParam(value = "term") String term) {
     return getTestItemHandler.getTicketIds(
-        projectExtractor.extractProjectDetails(user, projectName), normalizeId(term));
+        projectExtractor.extractProjectDetails(user, projectKey), normalizeId(term));
   }
 
   //TODO EPMRPP-59414
@@ -371,7 +371,7 @@ public List<String> getTicketIdsForProject(@AuthenticationPrincipal ReportPortal
   @GetMapping("/attribute/keys")
   @ResponseStatus(OK)
   @ApiOperation("Get all unique attribute keys of specified launch")
-  public List<String> getAttributeKeys(@PathVariable String projectName,
+  public List<String> getAttributeKeys(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @RequestParam(value = "launch") Long id,
       @RequestParam(value = DEFAULT_FILTER_PREFIX + Condition.CNT + CRITERIA_ITEM_ATTRIBUTE_KEY)
       String value) {
@@ -383,7 +383,7 @@ public List<String> getAttributeKeys(@PathVariable String projectName,
   @GetMapping("/attribute/keys/all")
   @ResponseStatus(OK)
   @ApiOperation("Get all unique attribute keys of specified launch")
-  public List<String> getAttributeKeysForProject(@PathVariable String projectName,
+  public List<String> getAttributeKeysForProject(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @RequestParam(value = DEFAULT_FILTER_PREFIX + Condition.CNT + CRITERIA_ITEM_ATTRIBUTE_KEY)
       String value, @RequestParam(value = FILTER_ID_REQUEST_PARAM) Long launchFilterId,
@@ -391,7 +391,7 @@ public List<String> getAttributeKeysForProject(@PathVariable String projectName,
       boolean isLatest,
       @RequestParam(value = LAUNCHES_LIMIT_REQUEST_PARAM, defaultValue = "0") int launchesLimit) {
     return getTestItemHandler.getAttributeKeys(launchFilterId, isLatest, launchesLimit,
-        projectExtractor.extractProjectDetails(user, projectName), value
+        projectExtractor.extractProjectDetails(user, projectKey), value
     );
   }
 
@@ -400,7 +400,7 @@ public List<String> getAttributeKeysForProject(@PathVariable String projectName,
   @GetMapping("/attribute/values")
   @ResponseStatus(OK)
   @ApiOperation("Get all unique attribute values of specified launch")
-  public List<String> getAttributeValues(@PathVariable String projectName,
+  public List<String> getAttributeValues(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @RequestParam(value = "launch") Long id,
       @RequestParam(value = DEFAULT_FILTER_PREFIX + Condition.EQ
           + CRITERIA_ITEM_ATTRIBUTE_KEY, required = false) String key,
@@ -413,7 +413,7 @@ public List<String> getAttributeValues(@PathVariable String projectName,
   @GetMapping("/step/attribute/keys")
   @ResponseStatus(OK)
   @ApiOperation("Get all unique attribute keys of step items under specified project")
-  public List<String> getAttributeKeys(@PathVariable String projectName,
+  public List<String> getAttributeKeys(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @RequestParam(value = DEFAULT_FILTER_PREFIX + Condition.EQ + CRITERIA_NAME, required = false)
       String launchName,
@@ -421,7 +421,7 @@ public List<String> getAttributeKeys(@PathVariable String projectName,
       String value) {
     return ofNullable(launchName).filter(StringUtils::isNotBlank).map(
             name -> getTestItemHandler.getAttributeKeys(
-                projectExtractor.extractProjectDetails(user, projectName), name, value))
+                projectExtractor.extractProjectDetails(user, projectKey), name, value))
         .orElseGet(Collections::emptyList);
   }
 
@@ -429,7 +429,7 @@ public List<String> getAttributeKeys(@PathVariable String projectName,
   @GetMapping("/step/attribute/values")
   @ResponseStatus(OK)
   @ApiOperation("Get all unique attribute values of step items under specified project")
-  public List<String> getAttributeValues(@PathVariable String projectName,
+  public List<String> getAttributeValues(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @RequestParam(value = DEFAULT_FILTER_PREFIX + Condition.EQ + CRITERIA_NAME, required = false)
       String launchName, @RequestParam(value = DEFAULT_FILTER_PREFIX + Condition.EQ
@@ -438,7 +438,7 @@ public List<String> getAttributeValues(@PathVariable String projectName,
       String value) {
     return ofNullable(launchName).filter(StringUtils::isNotBlank).map(
             name -> getTestItemHandler.getAttributeValues(
-                projectExtractor.extractProjectDetails(user, projectName), name, key, value))
+                projectExtractor.extractProjectDetails(user, projectKey), name, key, value))
         .orElseGet(Collections::emptyList);
   }
 
@@ -447,11 +447,11 @@ public List<String> getAttributeValues(@PathVariable String projectName,
   @PreAuthorize(PROJECT_MANAGER_OR_ADMIN)
   @ResponseStatus(OK)
   @ApiOperation("Bulk update attributes and description")
-  public OperationCompletionRS bulkUpdate(@PathVariable String projectName,
+  public OperationCompletionRS bulkUpdate(@PathVariable String projectKey,
       @RequestBody @Validated BulkInfoUpdateRQ bulkInfoUpdateRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateTestItemHandler.bulkInfoUpdate(bulkInfoUpdateRQ,
-        projectExtractor.extractProjectDetails(user, projectName)
+        projectExtractor.extractProjectDetails(user, projectKey)
     );
   }
 
@@ -459,22 +459,22 @@ public OperationCompletionRS bulkUpdate(@PathVariable String projectName,
   @PutMapping("/{itemId}/update")
   @ResponseStatus(OK)
   @ApiOperation("Update test item")
-  public OperationCompletionRS updateTestItem(@PathVariable String projectName,
+  public OperationCompletionRS updateTestItem(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @PathVariable Long itemId,
       @RequestBody @Validated UpdateTestItemRQ rq) {
     return updateTestItemHandler.updateTestItem(
-        projectExtractor.extractProjectDetails(user, projectName), itemId, rq, user);
+        projectExtractor.extractProjectDetails(user, projectKey), itemId, rq, user);
   }
 
   @Transactional
   @PutMapping("/issue/link")
   @ResponseStatus(OK)
   @ApiOperation("Attach external issue for specified test items")
-  public List<OperationCompletionRS> linkExternalIssues(@PathVariable String projectName,
+  public List<OperationCompletionRS> linkExternalIssues(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @RequestBody @Validated LinkExternalIssueRQ rq) {
     return updateTestItemHandler.processExternalIssues(rq,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 
@@ -482,11 +482,11 @@ public List<OperationCompletionRS> linkExternalIssues(@PathVariable String proje
   @PutMapping("/issue/unlink")
   @ResponseStatus(OK)
   @ApiOperation("Unlink external issue for specified test items")
-  public List<OperationCompletionRS> unlinkExternalIssues(@PathVariable String projectName,
+  public List<OperationCompletionRS> unlinkExternalIssues(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user,
       @RequestBody @Validated UnlinkExternalIssueRQ rq) {
     return updateTestItemHandler.processExternalIssues(rq,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 
@@ -494,10 +494,10 @@ public List<OperationCompletionRS> unlinkExternalIssues(@PathVariable String pro
   @GetMapping("/items")
   @ResponseStatus(OK)
   @ApiOperation("Get test items by specified ids")
-  public List<TestItemResource> getTestItems(@PathVariable String projectName,
+  public List<TestItemResource> getTestItems(@PathVariable String projectKey,
       @AuthenticationPrincipal ReportPortalUser user, @RequestParam(value = "ids") Long[] ids) {
     return getTestItemHandler.getTestItems(ids,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/UserFilterController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/UserFilterController.java
index f872a88179..efa385a1ab 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/UserFilterController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/UserFilterController.java
@@ -63,7 +63,7 @@
 
 @RestController
 @PreAuthorize(ASSIGNED_TO_PROJECT)
-@RequestMapping("/v1/{projectName}/filter")
+@RequestMapping("/v1/{projectKey}/filter")
 public class UserFilterController {
 
   private final ProjectExtractor projectExtractor;
@@ -85,62 +85,62 @@ public UserFilterController(ProjectExtractor projectExtractor,
   @PostMapping
   @ResponseStatus(HttpStatus.CREATED)
   @ApiOperation("Create user filter")
-  public EntryCreatedRS createFilter(@PathVariable String projectName,
+  public EntryCreatedRS createFilter(@PathVariable String projectKey,
       @RequestBody @Validated UpdateUserFilterRQ createFilterRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return updateUserFilterHandler.createFilter(createFilterRQ, projectName, user);
+    return updateUserFilterHandler.createFilter(createFilterRQ, projectKey, user);
   }
 
   @Transactional(readOnly = true)
   @GetMapping(value = "/{filterId}")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Get specified user filter by id")
-  public UserFilterResource getFilter(@PathVariable String projectName, @PathVariable Long filterId,
+  public UserFilterResource getFilter(@PathVariable String projectKey, @PathVariable Long filterId,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getFilterHandler.getUserFilter(
-        filterId, projectExtractor.extractProjectDetails(user, projectName));
+        filterId, projectExtractor.extractProjectDetails(user, projectKey));
   }
 
   @Transactional(readOnly = true)
   @GetMapping
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Get filters")
-  public Iterable<UserFilterResource> getAllFilters(@PathVariable String projectName,
+  public Iterable<UserFilterResource> getAllFilters(@PathVariable String projectKey,
       @SortFor(UserFilter.class) Pageable pageable, @FilterFor(UserFilter.class) Filter filter,
       @AuthenticationPrincipal ReportPortalUser user) {
-    return getFilterHandler.getUserFilters(projectName, pageable, filter, user);
+    return getFilterHandler.getUserFilters(projectKey, pageable, filter, user);
   }
 
   @Transactional
   @DeleteMapping(value = "/{filterId}")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Delete specified user filter by id")
-  public OperationCompletionRS deleteFilter(@PathVariable String projectName,
+  public OperationCompletionRS deleteFilter(@PathVariable String projectKey,
       @PathVariable Long filterId, @AuthenticationPrincipal ReportPortalUser user) {
     return deleteFilterHandler.deleteFilter(
-        filterId, projectExtractor.extractProjectDetails(user, projectName), user);
+        filterId, projectExtractor.extractProjectDetails(user, projectKey), user);
   }
 
   @Transactional(readOnly = true)
   @GetMapping(value = "/names")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Get available filter names")
-  public Iterable<OwnedEntityResource> getAllFiltersNames(@PathVariable String projectName,
+  public Iterable<OwnedEntityResource> getAllFiltersNames(@PathVariable String projectKey,
       @SortFor(UserFilter.class) Pageable pageable, @FilterFor(UserFilter.class) Filter filter,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getFilterHandler.getFiltersNames(
-        projectExtractor.extractProjectDetails(user, projectName), pageable, filter, user);
+        projectExtractor.extractProjectDetails(user, projectKey), pageable, filter, user);
   }
 
   @Transactional
   @PutMapping(value = "/{filterId}")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Update specified user filter")
-  public OperationCompletionRS updateUserFilter(@PathVariable String projectName,
+  public OperationCompletionRS updateUserFilter(@PathVariable String projectKey,
       @PathVariable Long filterId, @RequestBody @Validated UpdateUserFilterRQ updateRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateUserFilterHandler.updateUserFilter(filterId, updateRQ,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 
@@ -148,10 +148,10 @@ public OperationCompletionRS updateUserFilter(@PathVariable String projectName,
   @GetMapping(value = "/filters")
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Get list of specified user filters")
-  public List<UserFilterResource> getUserFilters(@PathVariable String projectName,
+  public List<UserFilterResource> getUserFilters(@PathVariable String projectKey,
       @RequestParam(value = "ids") Long[] ids, @AuthenticationPrincipal ReportPortalUser user) {
     List<UserFilter> filters = getFilterHandler.getFiltersById(ids,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
     return filters.stream().map(UserFilterConverter.TO_FILTER_RESOURCE)
         .collect(Collectors.toList());
@@ -161,11 +161,11 @@ public List<UserFilterResource> getUserFilters(@PathVariable String projectName,
   @RequestMapping(method = RequestMethod.PUT)
   @ResponseStatus(HttpStatus.OK)
   @ApiOperation("Update list of user filters")
-  public List<OperationCompletionRS> updateUserFilters(@PathVariable String projectName,
+  public List<OperationCompletionRS> updateUserFilters(@PathVariable String projectKey,
       @RequestBody @Validated CollectionsRQ<BulkUpdateFilterRQ> updateRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateUserFilterHandler.updateUserFilter(
-        updateRQ, projectExtractor.extractProjectDetails(user, projectName), user);
+        updateRQ, projectExtractor.extractProjectDetails(user, projectKey), user);
   }
 
 }
diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/WidgetController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/WidgetController.java
index 384c6de639..14cec1c214 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/controller/WidgetController.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/controller/WidgetController.java
@@ -60,7 +60,7 @@
  */
 @RestController
 @PreAuthorize(ASSIGNED_TO_PROJECT)
-@RequestMapping("/v1/{projectName}/widget")
+@RequestMapping("/v1/{projectKey}/widget")
 public class WidgetController {
 
   private final ProjectExtractor projectExtractor;
@@ -83,32 +83,32 @@ public WidgetController(ProjectExtractor projectExtractor,
   @ResponseStatus(CREATED)
   @ApiOperation("Create a new widget")
   public EntryCreatedRS createWidget(@RequestBody @Validated WidgetRQ createWidget,
-      @AuthenticationPrincipal ReportPortalUser user, @PathVariable String projectName) {
+      @AuthenticationPrincipal ReportPortalUser user, @PathVariable String projectKey) {
     return createWidgetHandler.createWidget(
-        createWidget, projectExtractor.extractProjectDetails(user, projectName), user);
+        createWidget, projectExtractor.extractProjectDetails(user, projectKey), user);
   }
 
   @Transactional(readOnly = true)
   @GetMapping(value = "/{widgetId}")
   @ResponseStatus(OK)
   @ApiOperation("Get widget by ID")
-  public WidgetResource getWidget(@PathVariable String projectName, @PathVariable Long widgetId,
+  public WidgetResource getWidget(@PathVariable String projectKey, @PathVariable Long widgetId,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getWidgetHandler.getWidget(
-        widgetId, projectExtractor.extractProjectDetails(user, projectName), user);
+        widgetId, projectExtractor.extractProjectDetails(user, projectKey), user);
   }
 
   @Transactional(readOnly = true)
   @GetMapping(value = "multilevel/{widgetId}")
   @ResponseStatus(OK)
   @ApiOperation("Get multilevel widget by ID")
-  public WidgetResource getWidget(@PathVariable String projectName, @PathVariable Long widgetId,
+  public WidgetResource getWidget(@PathVariable String projectKey, @PathVariable Long widgetId,
       @RequestParam(required = false, name = "attributes") String[] attributes,
       @RequestParam MultiValueMap<String, String> params,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getWidgetHandler.getWidget(
         widgetId, ArrayUtils.nullToEmpty(attributes), params,
-        projectExtractor.extractProjectDetails(user, projectName), user
+        projectExtractor.extractProjectDetails(user, projectKey), user
     );
   }
 
@@ -116,32 +116,32 @@ public WidgetResource getWidget(@PathVariable String projectName, @PathVariable
   @PostMapping(value = "/preview")
   @ResponseStatus(OK)
   @ApiOperation("Get widget preview")
-  public Map<String, ?> getWidgetPreview(@PathVariable String projectName,
+  public Map<String, ?> getWidgetPreview(@PathVariable String projectKey,
       @RequestBody @Validated WidgetPreviewRQ previewRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getWidgetHandler.getWidgetPreview(
-        previewRQ, projectExtractor.extractProjectDetails(user, normalizeId(projectName)), user);
+        previewRQ, projectExtractor.extractProjectDetails(user, normalizeId(projectKey)), user);
   }
 
   @Transactional
   @PutMapping(value = "/{widgetId}")
   @ResponseStatus(OK)
   @ApiOperation("Update specified widget")
-  public OperationCompletionRS updateWidget(@PathVariable String projectName,
+  public OperationCompletionRS updateWidget(@PathVariable String projectKey,
       @PathVariable Long widgetId, @RequestBody @Validated WidgetRQ updateRQ,
       @AuthenticationPrincipal ReportPortalUser user) {
     return updateWidgetHandler.updateWidget(
-        widgetId, updateRQ, projectExtractor.extractProjectDetails(user, projectName), user);
+        widgetId, updateRQ, projectExtractor.extractProjectDetails(user, projectKey), user);
   }
 
   @Transactional(readOnly = true)
   @GetMapping(value = "/names/all")
   @ResponseStatus(OK)
   @ApiOperation("Load all widget names which belong to a user")
-  public Iterable<Object> getWidgetNames(@PathVariable String projectName,
+  public Iterable<Object> getWidgetNames(@PathVariable String projectKey,
       @SortFor(Widget.class) Pageable pageable, @FilterFor(Widget.class) Filter filter,
       @AuthenticationPrincipal ReportPortalUser user) {
     return getWidgetHandler.getOwnNames(
-        projectExtractor.extractProjectDetails(user, projectName), pageable, filter, user);
+        projectExtractor.extractProjectDetails(user, projectKey), pageable, filter, user);
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/epam/ta/reportportal/ws/converter/converters/OrganizationConverter.java b/src/main/java/com/epam/ta/reportportal/ws/converter/converters/OrganizationConverter.java
new file mode 100644
index 0000000000..d9ee4adeed
--- /dev/null
+++ b/src/main/java/com/epam/ta/reportportal/ws/converter/converters/OrganizationConverter.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2024 EPAM Systems
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.epam.ta.reportportal.ws.converter.converters;
+
+import com.epam.ta.reportportal.entity.organization.Organization;
+import com.epam.ta.reportportal.model.OrganizationResource;
+import java.util.function.Function;
+
+/**
+ * @author Andrei Piankouski
+ */
+public class OrganizationConverter {
+
+  private OrganizationConverter() {
+    //static only
+  }
+
+
+  public static final Function<Organization, OrganizationResource> TO_ORGANIZATION_RESOURCE = org -> {
+
+    OrganizationResource orgResource = new OrganizationResource();
+    orgResource.setOrganizationId(org.getId());
+    orgResource.setOrganizationName(org.getName());
+    orgResource.setOrganizationSlug(org.getSlug());
+
+    return orgResource;
+  };
+}
diff --git a/src/main/java/com/epam/ta/reportportal/ws/converter/converters/ProjectConverter.java b/src/main/java/com/epam/ta/reportportal/ws/converter/converters/ProjectConverter.java
index b03929c96c..71de96de3c 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/converter/converters/ProjectConverter.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/converter/converters/ProjectConverter.java
@@ -55,6 +55,11 @@ public final class ProjectConverter {
     ProjectResource projectResource = new ProjectResource();
     projectResource.setProjectId(project.getId());
     projectResource.setProjectName(project.getName());
+    projectResource.setProjectKey(project.getKey());
+    projectResource.setProjectSlug(project.getSlug());
+    projectResource.setOrganization(project.getOrganization().getName());
+    projectResource.setOrganizationSlug(project.getOrganization().getSlug());
+    projectResource.setOrganizationId(project.getOrganization().getId());
     projectResource.setEntryType(project.getProjectType().name());
     projectResource.setCreationDate(project.getCreationDate());
     projectResource.setAllocatedStorage(project.getAllocatedStorage());
diff --git a/src/main/java/com/epam/ta/reportportal/ws/converter/converters/ProjectSettingsConverter.java b/src/main/java/com/epam/ta/reportportal/ws/converter/converters/ProjectSettingsConverter.java
index b3e80010bb..de7bb005bc 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/converter/converters/ProjectSettingsConverter.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/converter/converters/ProjectSettingsConverter.java
@@ -49,10 +49,12 @@ private ProjectSettingsConverter() {
         resource.setLaunchesQuantity(project.getLaunchesQuantity());
         resource.setProjectId(project.getId());
         resource.setProjectName(project.getName());
+        resource.setProjectKey(project.getProjectKey());
+        resource.setProjectSlug(project.getProjectSlug());
         resource.setCreationDate(EntityUtils.TO_DATE.apply(project.getCreationDate()));
         resource.setLastRun(ofNullable(project.getLastRun()).map(EntityUtils.TO_DATE).orElse(null));
         resource.setEntryType(project.getProjectType());
-        resource.setOrganization(project.getOrganization());
+        resource.setOrganization(project.getOrganizationSlug());
         return resource;
       };
 
diff --git a/src/main/java/com/epam/ta/reportportal/ws/converter/converters/UserConverter.java b/src/main/java/com/epam/ta/reportportal/ws/converter/converters/UserConverter.java
index 155a42d2fa..58f886faeb 100644
--- a/src/main/java/com/epam/ta/reportportal/ws/converter/converters/UserConverter.java
+++ b/src/main/java/com/epam/ta/reportportal/ws/converter/converters/UserConverter.java
@@ -17,6 +17,7 @@
 package com.epam.ta.reportportal.ws.converter.converters;
 
 import com.epam.ta.reportportal.commons.MoreCollectors;
+import com.epam.ta.reportportal.entity.organization.OrganizationUser;
 import com.epam.ta.reportportal.entity.user.ProjectUser;
 import com.epam.ta.reportportal.entity.user.User;
 import com.epam.ta.reportportal.entity.user.UserType;
@@ -29,6 +30,8 @@
 import java.util.Map;
 import java.util.function.BiFunction;
 import java.util.function.Function;
+import java.util.stream.Collectors;
+import org.apache.commons.collections.CollectionUtils;
 
 /**
  * Converts user from database to resource
@@ -50,21 +53,41 @@ private UserConverter() {
     resource.setFullName(user.getFullName());
     resource.setAccountType(user.getUserType().toString());
     resource.setUserRole(user.getRole().toString());
-    resource.setIsLoaded(UserType.UPSA != user.getUserType());
+    resource.setLoaded(UserType.UPSA != user.getUserType());
     resource.setMetadata(user.getMetadata().getMetadata());
 
-    if (null != user.getProjects()) {
+    if (CollectionUtils.isNotEmpty(user.getProjects())) {
       List<ProjectUser> projects = Lists.newArrayList(user.getProjects());
       projects.sort(Comparator.comparing(compare -> compare.getProject().getName()));
       Map<String, UserResource.AssignedProject> userProjects = user.getProjects().stream()
-          .collect(MoreCollectors.toLinkedMap(p -> p.getProject().getName(), p -> {
+          .collect(MoreCollectors.toLinkedMap(p -> p.getProject().getKey(), p -> {
             UserResource.AssignedProject assignedProject = new UserResource.AssignedProject();
             assignedProject.setEntryType(p.getProject().getProjectType().name());
             assignedProject.setProjectRole(p.getProjectRole().toString());
+            assignedProject.setProjectKey(p.getProject().getKey());
+            assignedProject.setProjectName(p.getProject().getName());
+            assignedProject.setProjectSlug(p.getProject().getSlug());
+            assignedProject.setOrganizationId(p.getProject().getOrganization().getId());
             return assignedProject;
           }));
       resource.setAssignedProjects(userProjects);
     }
+
+    if (CollectionUtils.isNotEmpty(user.getOrganizationUser())) {
+      List<OrganizationUser> orgUsers = Lists.newArrayList(user.getOrganizationUser());
+      Map<String, UserResource.AssignedOrganization> userOrganization = orgUsers
+          .stream()
+          .collect(Collectors.toMap(orgUser -> orgUser.getOrganization().getSlug(),
+              orgUser -> {
+                UserResource.AssignedOrganization assignedOrganization = new UserResource.AssignedOrganization();
+                assignedOrganization.setOrganizationId(orgUser.getOrganization().getId());
+                assignedOrganization.setOrganizationName(orgUser.getOrganization().getName());
+                assignedOrganization.setOrganizationRole(orgUser.getOrganizationRole().name());
+                return assignedOrganization;
+              }));
+      resource.setAssignedOrganizations(userOrganization);
+    }
+
     return resource;
   };
 
diff --git a/src/main/resources/application-elastic.yaml b/src/main/resources/application-elastic.yaml
index 359c09f7a8..8e7bba8cf1 100644
--- a/src/main/resources/application-elastic.yaml
+++ b/src/main/resources/application-elastic.yaml
@@ -1,5 +1,5 @@
 rp:
-  elasticsearchLogmessage:
+  searchengine:
     host: elasticsearch
     port: 9200
     username:
diff --git a/src/test/java/com/epam/ta/reportportal/OrganizationUtil.java b/src/test/java/com/epam/ta/reportportal/OrganizationUtil.java
new file mode 100644
index 0000000000..5bf78ba624
--- /dev/null
+++ b/src/test/java/com/epam/ta/reportportal/OrganizationUtil.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2024 EPAM Systems
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.epam.ta.reportportal;
+
+import com.epam.ta.reportportal.entity.enums.OrganizationType;
+import com.epam.ta.reportportal.entity.organization.Organization;
+import java.time.LocalDateTime;
+
+/**
+ * @author Siarhei Hrabko
+ */
+public class OrganizationUtil {
+
+  public static final String TEST_ORG_NAME = "Org Name";
+  public static final String TEST_PROJECT_NAME = "project Name";
+
+  public static final Long TEST_ORG_ID = 1L;
+  public static final String TEST_ORG_SLUG = "o-slug";
+  public static final String TEST_PROJECT_SLUG = "project-name";
+  public static final String TEST_PROJECT_KEY = TEST_ORG_SLUG + "-" + TEST_PROJECT_SLUG;
+  public static final Organization TEST_ORG = new Organization(TEST_ORG_ID,
+      LocalDateTime.now(),
+      TEST_ORG_NAME,
+      OrganizationType.INTERNAL,
+      TEST_ORG_SLUG);
+
+  private OrganizationUtil() {
+  }
+
+}
diff --git a/src/test/java/com/epam/ta/reportportal/ReportPortalUserUtil.java b/src/test/java/com/epam/ta/reportportal/ReportPortalUserUtil.java
index 1b72d998e8..ab64677c13 100644
--- a/src/test/java/com/epam/ta/reportportal/ReportPortalUserUtil.java
+++ b/src/test/java/com/epam/ta/reportportal/ReportPortalUserUtil.java
@@ -28,8 +28,6 @@
  */
 public class ReportPortalUserUtil {
 
-  public static final String TEST_PROJECT_NAME = "test_project";
-
   private ReportPortalUserUtil() {
     //static only
   }
@@ -43,9 +41,10 @@ public static ReportPortalUser getRpUser(String login, UserRole userRole, Projec
         .withUserId(1L)
         .withEmail("test@email.com")
         .withUserRole(userRole)
-        .withProjectDetails(Maps.newHashMap("test_project",
-            new ReportPortalUser.ProjectDetails(projectId, TEST_PROJECT_NAME, projectRole)
+        .withProjectDetails(Maps.newHashMap("o-slug-project-name",
+            new ReportPortalUser.ProjectDetails(projectId, "project Name", projectRole,
+                "o-slug-project-name")
         ))
         .build();
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/analyzer/auto/impl/SearchLogServiceImplTest.java b/src/test/java/com/epam/ta/reportportal/core/analyzer/auto/impl/SearchLogServiceImplTest.java
index a5499d564f..0bf5d3dd71 100644
--- a/src/test/java/com/epam/ta/reportportal/core/analyzer/auto/impl/SearchLogServiceImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/analyzer/auto/impl/SearchLogServiceImplTest.java
@@ -89,7 +89,7 @@ class SearchLogServiceImplTest {
   void searchTest() {
 
     ReportPortalUser.ProjectDetails projectDetails =
-        new ReportPortalUser.ProjectDetails(1L, "project", ProjectRole.PROJECT_MANAGER);
+        new ReportPortalUser.ProjectDetails(1L, "project", ProjectRole.PROJECT_MANAGER, "project-key");
 
     when(projectRepository.findById(projectDetails.getProjectId())).thenReturn(
         Optional.of(project));
@@ -146,4 +146,4 @@ void searchTest() {
     Assertions.assertEquals(1, Lists.newArrayList(responses).size());
 
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/analyzer/auto/impl/SuggestItemServiceTest.java b/src/test/java/com/epam/ta/reportportal/core/analyzer/auto/impl/SuggestItemServiceTest.java
index 59919308c1..7d0b2018c7 100644
--- a/src/test/java/com/epam/ta/reportportal/core/analyzer/auto/impl/SuggestItemServiceTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/analyzer/auto/impl/SuggestItemServiceTest.java
@@ -67,7 +67,9 @@ class SuggestItemServiceTest {
   @Test
   void suggestItems() {
     final ReportPortalUser rpUser = getRpUser("owner", UserRole.USER, ProjectRole.MEMBER, 1L);
-    final Project project = new Project(1L, "default");
+    final Project project = new Project();
+    project.setId(1L);
+    project.setKey("default");
 
     TestItem testItem = new TestItem();
     testItem.setItemId(1L);
@@ -109,7 +111,9 @@ void suggestItems() {
   @Test
   void suggestRemovedItems() {
     final ReportPortalUser rpUser = getRpUser("owner", UserRole.USER, ProjectRole.MEMBER, 1L);
-    final Project project = new Project(1L, "default");
+    final Project project = new Project();
+    project.setId(1L);
+    project.setKey("default");
 
     TestItem testItem = new TestItem();
     testItem.setItemId(1L);
@@ -185,7 +189,9 @@ void showThrowExceptionWhenNotFound() {
   @Test
   void suggestClusterItems() {
     final ReportPortalUser rpUser = getRpUser("owner", UserRole.USER, ProjectRole.MEMBER, 1L);
-    final Project project = new Project(1L, "default");
+    final Project project = new Project();
+    project.setId(1L);
+    project.setKey("default");
 
     final Cluster cluster = new Cluster();
     cluster.setId(1L);
@@ -244,4 +250,4 @@ private TestItem getRelevantItem() {
 
     return relevantItem;
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/analyzer/strategy/LaunchAutoAnalysisStrategyTest.java b/src/test/java/com/epam/ta/reportportal/core/analyzer/strategy/LaunchAutoAnalysisStrategyTest.java
index cd41b945f3..823a94660a 100644
--- a/src/test/java/com/epam/ta/reportportal/core/analyzer/strategy/LaunchAutoAnalysisStrategyTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/analyzer/strategy/LaunchAutoAnalysisStrategyTest.java
@@ -71,7 +71,7 @@ void analyzeTest() {
     ReportPortalUser user = getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER, 1L);
 
     ReportPortalUser.ProjectDetails projectDetails =
-        new ReportPortalUser.ProjectDetails(1L, "name", ProjectRole.PROJECT_MANAGER);
+        new ReportPortalUser.ProjectDetails(1L, "name", ProjectRole.PROJECT_MANAGER, "project-key");
     AnalyzeLaunchRQ analyzeLaunchRQ = new AnalyzeLaunchRQ();
     analyzeLaunchRQ.setLaunchId(1L);
     analyzeLaunchRQ.setAnalyzerHistoryMode("ALL");
@@ -88,4 +88,4 @@ void analyzeTest() {
     Assertions.assertEquals(Set.of(AnalyzeItemsMode.TO_INVESTIGATE), config.getAnalyzeItemsModes());
     Assertions.assertEquals(user, config.getUser());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/analyzer/strategy/LaunchPatternAnalysisStrategyTest.java b/src/test/java/com/epam/ta/reportportal/core/analyzer/strategy/LaunchPatternAnalysisStrategyTest.java
index 632cb83968..dc17346ac4 100644
--- a/src/test/java/com/epam/ta/reportportal/core/analyzer/strategy/LaunchPatternAnalysisStrategyTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/analyzer/strategy/LaunchPatternAnalysisStrategyTest.java
@@ -72,7 +72,7 @@ void analyzeTest() {
 
     ReportPortalUser user = getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER, 1L);
     ReportPortalUser.ProjectDetails projectDetails =
-        new ReportPortalUser.ProjectDetails(1L, "name", ProjectRole.PROJECT_MANAGER);
+        new ReportPortalUser.ProjectDetails(1L, "name", ProjectRole.PROJECT_MANAGER, "project-key");
     AnalyzeLaunchRQ analyzeLaunchRQ = new AnalyzeLaunchRQ();
     analyzeLaunchRQ.setLaunchId(1L);
     analyzeLaunchRQ.setAnalyzeItemsModes(Lists.newArrayList("TO_INVESTIGATE"));
@@ -84,4 +84,4 @@ void analyzeTest() {
     );
 
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImplTest.java
index f15009ac20..09a23883aa 100644
--- a/src/test/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.dashboard.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -56,7 +57,7 @@ void createAlreadyExistDashboard() {
     when(dashboardRepository.existsByNameAndOwnerAndProjectId("exist", "owner", 1L)).thenReturn(
         true);
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.createDashboard(extractProjectDetails(rpUser, "test_project"),
+        () -> handler.createDashboard(extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             createDashboardRQ, rpUser
         )
     );
@@ -64,4 +65,4 @@ void createAlreadyExistDashboard() {
         exception.getMessage()
     );
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/events/activity/IntegrationEventsTest.java b/src/test/java/com/epam/ta/reportportal/core/events/activity/IntegrationEventsTest.java
index 3204b433f1..a1d7ea428c 100644
--- a/src/test/java/com/epam/ta/reportportal/core/events/activity/IntegrationEventsTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/events/activity/IntegrationEventsTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.events.activity;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.core.events.activity.ActivityTestHelper.checkActivity;
 import static com.epam.ta.reportportal.core.events.activity.util.ActivityDetailsUtil.NAME;
 
@@ -85,7 +86,7 @@ private static IntegrationActivityResource getIntegration() {
     integration.setName("name");
     integration.setProjectId(3L);
     integration.setTypeName("type");
-    integration.setProjectName("test_project");
+    integration.setProjectName(TEST_PROJECT_KEY);
     return integration;
   }
 
@@ -96,4 +97,4 @@ void updated() {
     final Activity expected = getExpectedActivity(EventAction.UPDATE);
     checkActivity(expected, actual);
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/events/activity/ProjectConfigEventTest.java b/src/test/java/com/epam/ta/reportportal/core/events/activity/ProjectConfigEventTest.java
index 6afd0f1282..f8eedf117f 100644
--- a/src/test/java/com/epam/ta/reportportal/core/events/activity/ProjectConfigEventTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/events/activity/ProjectConfigEventTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.events.activity;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.core.events.activity.ActivityTestHelper.checkActivity;
 
 import com.epam.ta.reportportal.entity.activity.Activity;
@@ -89,7 +90,7 @@ void analyzerConfigUpdate() {
   private static ProjectAttributesActivityResource getProjectAttributes(
       Map<String, String> config) {
     ProjectAttributesActivityResource resource = new ProjectAttributesActivityResource();
-    resource.setProjectName("test_project");
+    resource.setProjectName(TEST_PROJECT_KEY);
     resource.setProjectId(3L);
     resource.setConfig(config);
     return resource;
@@ -130,7 +131,7 @@ void projectConfigUpdate() {
     expected.getDetails()
         .setHistory(getProjectConfigHistory(KEEP_LOGS, KEEP_SCREENSHOTS, INTERRUPT_JOB_TIME));
     expected.setEventName("updateProject");
-    expected.setObjectName("test_project");
+    expected.setObjectName(TEST_PROJECT_KEY);
     checkActivity(expected, actual);
   }
 
diff --git a/src/test/java/com/epam/ta/reportportal/core/events/activity/ProjectIndexEventTest.java b/src/test/java/com/epam/ta/reportportal/core/events/activity/ProjectIndexEventTest.java
index c8e7f4d3a9..899fd9ec44 100644
--- a/src/test/java/com/epam/ta/reportportal/core/events/activity/ProjectIndexEventTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/events/activity/ProjectIndexEventTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.events.activity;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.core.events.activity.ActivityTestHelper.checkActivity;
 
 import com.epam.ta.reportportal.entity.activity.Activity;
@@ -53,7 +54,7 @@ private static Activity getExpectedActivity(EventAction action, boolean indexing
   @Test
   void generate() {
     final boolean indexing = true;
-    final Activity actual = new ProjectIndexEvent(1L, "user", 3L, "test_project",
+    final Activity actual = new ProjectIndexEvent(1L, "user", 3L, TEST_PROJECT_KEY,
         indexing).toActivity();
     final Activity expected = getExpectedActivity(EventAction.GENERATE, indexing);
     checkActivity(expected, actual);
@@ -62,9 +63,9 @@ void generate() {
   @Test
   void delete() {
     final boolean indexing = false;
-    final Activity actual = new ProjectIndexEvent(1L, "user", 3L, "test_project",
+    final Activity actual = new ProjectIndexEvent(1L, "user", 3L, TEST_PROJECT_KEY,
         indexing).toActivity();
     final Activity expected = getExpectedActivity(EventAction.DELETE, indexing);
     checkActivity(expected, actual);
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerTest.java b/src/test/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerTest.java
index 16dabc47b5..7f55a0b962 100644
--- a/src/test/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.filter.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_NAME;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
@@ -82,7 +83,7 @@ void updateUserFilterWithTheSameName() {
 
     UpdateUserFilterRQ updateUserFilterRQ = getUpdateRequest(SAME_NAME);
 
-    ReportPortalUser.ProjectDetails projectDetails = extractProjectDetails(rpUser, "test_project");
+    ReportPortalUser.ProjectDetails projectDetails = extractProjectDetails(rpUser, TEST_PROJECT_KEY);
     when(userFilterRepository.findByIdAndProjectId(1L, projectDetails.getProjectId())).thenReturn(
         Optional.of(userFilter));
 
@@ -110,7 +111,7 @@ void updateUserFilterWithAnotherNamePositive() {
 
     UpdateUserFilterRQ updateUserFilterRQ = getUpdateRequest(ANOTHER_NAME);
 
-    ReportPortalUser.ProjectDetails projectDetails = extractProjectDetails(rpUser, "test_project");
+    ReportPortalUser.ProjectDetails projectDetails = extractProjectDetails(rpUser, TEST_PROJECT_KEY);
     when(userFilterRepository.findByIdAndProjectId(1L, projectDetails.getProjectId())).thenReturn(
         Optional.of(userFilter));
 
@@ -142,7 +143,7 @@ void updateUserFilterWithAnotherNameNegative() {
 
     UpdateUserFilterRQ updateUserFilterRQ = getUpdateRequest(ANOTHER_NAME);
 
-    ReportPortalUser.ProjectDetails projectDetails = extractProjectDetails(rpUser, "test_project");
+    ReportPortalUser.ProjectDetails projectDetails = extractProjectDetails(rpUser, TEST_PROJECT_KEY);
     when(userFilterRepository.findByIdAndProjectId(1L, projectDetails.getProjectId())).thenReturn(
         Optional.of(userFilter));
 
@@ -187,4 +188,4 @@ private UpdateUserFilterRQ getUpdateRequest(String name) {
     return updateUserFilterRQ;
   }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/hierarchy/impl/FinishLaunchHierarchyHandlerTest.java b/src/test/java/com/epam/ta/reportportal/core/hierarchy/impl/FinishLaunchHierarchyHandlerTest.java
index b2b191e199..646fb328dd 100644
--- a/src/test/java/com/epam/ta/reportportal/core/hierarchy/impl/FinishLaunchHierarchyHandlerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/hierarchy/impl/FinishLaunchHierarchyHandlerTest.java
@@ -1,6 +1,6 @@
 package com.epam.ta.reportportal.core.hierarchy.impl;
 
-import static com.epam.ta.reportportal.ReportPortalUserUtil.TEST_PROJECT_NAME;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.core.item.impl.status.ToSkippedStatusChangingStrategy.SKIPPED_ISSUE_KEY;
 import static org.mockito.ArgumentMatchers.any;
@@ -101,7 +101,7 @@ void finishWithPassedStatus() {
         StatusEnum.PASSED,
         endTime,
         rpUser,
-        rpUser.getProjectDetails().get(TEST_PROJECT_NAME)
+        rpUser.getProjectDetails().get(TEST_PROJECT_KEY)
     );
 
     verify(changeStatusHandler, times(2)).changeParentStatus(any(TestItem.class), any(), any());
@@ -148,7 +148,7 @@ void finishWithSkippedStatus() {
         StatusEnum.SKIPPED,
         endTime,
         rpUser,
-        rpUser.getProjectDetails().get(TEST_PROJECT_NAME)
+        rpUser.getProjectDetails().get(TEST_PROJECT_KEY)
     );
 
     verify(changeStatusHandler, times(2)).changeParentStatus(any(TestItem.class), any(), any());
@@ -229,4 +229,4 @@ private List<TestItem> getTestItemsWithoutChildren(Launch launch) {
     return Lists.newArrayList(firstChild, secondChild);
   }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/integration/impl/DeleteIntegrationHandlerTest.java b/src/test/java/com/epam/ta/reportportal/core/integration/impl/DeleteIntegrationHandlerTest.java
index 37bd0e11a9..284b01c30b 100644
--- a/src/test/java/com/epam/ta/reportportal/core/integration/impl/DeleteIntegrationHandlerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/integration/impl/DeleteIntegrationHandlerTest.java
@@ -16,10 +16,21 @@
 
 package com.epam.ta.reportportal.core.integration.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_NAME;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import com.epam.ta.reportportal.ReportPortalUserUtil;
 import com.epam.ta.reportportal.commons.ReportPortalUser;
 import com.epam.ta.reportportal.commons.validation.Suppliers;
-import com.epam.ta.reportportal.core.events.MessageBus;
 import com.epam.ta.reportportal.core.integration.DeleteIntegrationHandler;
 import com.epam.ta.reportportal.core.integration.impl.util.IntegrationTestUtil;
 import com.epam.ta.reportportal.dao.IntegrationRepository;
@@ -30,16 +41,10 @@
 import com.epam.ta.reportportal.entity.user.UserRole;
 import com.epam.ta.reportportal.ws.model.OperationCompletionRS;
 import com.google.common.collect.Lists;
-import org.junit.jupiter.api.Test;
-
 import java.util.Optional;
+import org.junit.jupiter.api.Test;
 import org.springframework.context.ApplicationEventPublisher;
 
-import static com.epam.ta.reportportal.ReportPortalUserUtil.TEST_PROJECT_NAME;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.mockito.Mockito.*;
-
 /**
  * @author <a href="mailto:ivan_budayeu@epam.com">Ivan Budayeu</a>
  */
@@ -114,6 +119,7 @@ void deleteProjectIntegration() {
 		Project project = new Project();
 		project.setId(projectId);
 		project.setName(TEST_PROJECT_NAME);
+		project.setKey(TEST_PROJECT_KEY);
 
 		final ReportPortalUser user = ReportPortalUserUtil.getRpUser("admin",
 				UserRole.ADMINISTRATOR,
@@ -121,7 +127,7 @@ void deleteProjectIntegration() {
 				projectId
 		);
 
-		when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.of(project));
+		when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(project));
 
 		when(integrationRepository.findByIdAndProjectId(emailIntegrationId,
 				projectId
@@ -130,7 +136,7 @@ void deleteProjectIntegration() {
 		doNothing().when(integrationRepository).deleteById(emailIntegrationId);
 
 		OperationCompletionRS operationCompletionRS = deleteIntegrationHandler.deleteProjectIntegration(emailIntegrationId,
-				TEST_PROJECT_NAME,
+        TEST_PROJECT_KEY,
 				user
 		);
 
@@ -149,6 +155,7 @@ void deleteProjectIntegrations() {
 		Project project = new Project();
 		project.setId(projectId);
 		project.setName(TEST_PROJECT_NAME);
+		project.setKey(TEST_PROJECT_KEY);
 
 		final ReportPortalUser user = ReportPortalUserUtil.getRpUser("admin",
 				UserRole.ADMINISTRATOR,
@@ -156,7 +163,7 @@ void deleteProjectIntegrations() {
 				projectId
 		);
 
-		when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.of(project));
+		when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(project));
 
 		when(integrationRepository.findAllByProjectIdOrderByCreationDateDesc(projectId)).thenReturn(Lists.newArrayList(IntegrationTestUtil.getProjectEmailIntegration(emailIntegrationId,
 				projectId
@@ -165,17 +172,17 @@ void deleteProjectIntegrations() {
 		when(integrationTypeRepository.findByName(anyString())).thenReturn(Optional.ofNullable(IntegrationTestUtil.getEmailIntegrationType()));
 
 		OperationCompletionRS operationCompletionRS = deleteIntegrationHandler.deleteProjectIntegrationsByType("EMAIL",
-				TEST_PROJECT_NAME,
+        TEST_PROJECT_KEY,
 				user
 		);
 		verify(integrationRepository, times(1)).deleteAllByProjectIdAndIntegrationTypeId(anyLong(), anyLong());
 
 		assertNotNull(operationCompletionRS);
 		assertEquals(
-				"All integrations with type ='EMAIL' for project with name ='test_project' have been successfully deleted",
+				"All integrations with type ='EMAIL' for project with name ='project Name' have been successfully deleted",
 				operationCompletionRS.getResultMessage()
 		);
 
 	}
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/integration/impl/GetIntegrationHandlerTest.java b/src/test/java/com/epam/ta/reportportal/core/integration/impl/GetIntegrationHandlerTest.java
index 0c7669068f..f51b2937d6 100644
--- a/src/test/java/com/epam/ta/reportportal/core/integration/impl/GetIntegrationHandlerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/integration/impl/GetIntegrationHandlerTest.java
@@ -16,7 +16,8 @@
 
 package com.epam.ta.reportportal.core.integration.impl;
 
-import static com.epam.ta.reportportal.ReportPortalUserUtil.TEST_PROJECT_NAME;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_NAME;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -65,14 +66,15 @@ void getProjectIntegrationById() {
     Project project = new Project();
     project.setId(projectId);
     project.setName(TEST_PROJECT_NAME);
+    project.setKey(TEST_PROJECT_KEY);
 
-    when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.of(project));
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(project));
 
     when(integrationRepository.findByIdAndProjectId(emailIntegrationId, projectId)).thenReturn(
         Optional.of(IntegrationTestUtil.getProjectEmailIntegration(emailIntegrationId, projectId)));
 
     IntegrationResource integrationResource =
-        getIntegrationHandler.getProjectIntegrationById(emailIntegrationId, TEST_PROJECT_NAME);
+        getIntegrationHandler.getProjectIntegrationById(emailIntegrationId, TEST_PROJECT_KEY);
 
     assertNotNull(integrationResource);
     assertEquals(emailIntegrationId, (long) integrationResource.getId());
@@ -101,4 +103,4 @@ void getGlobalIntegrationById() {
     assertNotNull(integrationResource.getIntegrationParams());
     assertNotNull(integrationResource.getIntegrationType());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/item/impl/DeleteTestItemHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/item/impl/DeleteTestItemHandlerImplTest.java
index c5ec0b630e..bcd7b7d147 100644
--- a/src/test/java/com/epam/ta/reportportal/core/item/impl/DeleteTestItemHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/item/impl/DeleteTestItemHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.item.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -93,7 +94,7 @@ void testItemNotFound() {
     when(testItemRepository.findById(1L)).thenReturn(Optional.empty());
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, "test_project"), rpUser)
+        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
     );
     assertEquals("Test Item '1' not found. Did you use correct Test Item ID?",
         exception.getMessage());
@@ -116,7 +117,7 @@ void deleteInProgressItem() {
     )));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, "test_project"), rpUser)
+        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
     );
     assertEquals(
         "Unable to perform operation for non-finished test item. Unable to delete test item ['1'] in progress state",
@@ -138,7 +139,7 @@ void deleteTestItemWithInProgressLaunch() {
         Optional.of(getTestItem(StatusEnum.PASSED, StatusEnum.IN_PROGRESS, 1L, "test")));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, "test_project"), rpUser)
+        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
     );
     assertEquals(
         "Unable to perform operation for non-finished launch. Unable to delete test item ['1'] under launch ['null'] with 'In progress' state",
@@ -160,7 +161,7 @@ void deleteTestItemFromAnotherProject() {
         Optional.of(getTestItem(StatusEnum.PASSED, StatusEnum.FAILED, 2L, "test")));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, "test_project"), rpUser)
+        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
     );
     assertEquals("Forbidden operation. Deleting testItem '1' is not under specified project '1'",
         exception.getMessage());
@@ -181,7 +182,7 @@ void deleteNotOwnTestItem() {
     when(launchRepository.findById(any(Long.class))).thenReturn(Optional.of(launch));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, "test_project"), rpUser)
+        () -> handler.deleteTestItem(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
     );
     assertEquals("You do not have enough permissions. You are not a launch owner.",
         exception.getMessage());
@@ -212,7 +213,7 @@ void deleteTestItemWithParent() {
     when(testItemRepository.hasChildren(parent.getItemId(), parent.getPath())).thenReturn(false);
     when(launchRepository.hasRetries(any())).thenReturn(false);
     when(attachmentRepository.moveForDeletionByItems(any(Collection.class))).thenReturn(1);
-    handler.deleteTestItem(1L, extractProjectDetails(rpUser, "test_project"), rpUser);
+    handler.deleteTestItem(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser);
 
     verify(itemContentRemover, times(1)).remove(anyLong());
     assertFalse(parent.isHasChildren());
@@ -232,7 +233,7 @@ void deleteItemPositive() {
     when(launchRepository.findById(any(Long.class))).thenReturn(Optional.of(launch));
 
     OperationCompletionRS response = handler.deleteTestItem(1L,
-        extractProjectDetails(rpUser, "test_project"), rpUser);
+        extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser);
 
     verify(itemContentRemover, times(1)).remove(anyLong());
     assertEquals("Test Item with ID = '1' has been successfully deleted.",
@@ -258,4 +259,4 @@ private TestItem getTestItem(StatusEnum itemStatus, StatusEnum launchStatus, Lon
     item.setLaunchId(launch.getId());
     return item;
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/item/impl/FinishTestItemHandlerAsyncImplTest.java b/src/test/java/com/epam/ta/reportportal/core/item/impl/FinishTestItemHandlerAsyncImplTest.java
index 33f8e82dc5..666923bc1d 100644
--- a/src/test/java/com/epam/ta/reportportal/core/item/impl/FinishTestItemHandlerAsyncImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/item/impl/FinishTestItemHandlerAsyncImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.item.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -59,7 +60,7 @@ void finishTestItem() {
     ReportPortalUser user = getRpUser("test", UserRole.ADMINISTRATOR, ProjectRole.PROJECT_MANAGER,
         1L);
 
-    finishTestItemHandlerAsync.finishTestItem(user, user.getProjectDetails().get("test_project"),
+    finishTestItemHandlerAsync.finishTestItem(user, user.getProjectDetails().get(TEST_PROJECT_KEY),
         "123", request);
     verify(amqpTemplate).convertAndSend(any(), any(), any(), any());
     verify(reportingQueueService).getReportingQueueKey(any());
@@ -74,11 +75,11 @@ void finishTestItemWithoutLaunchUuid() {
     ReportPortalException exception = assertThrows(
         ReportPortalException.class,
         () -> finishTestItemHandlerAsync.finishTestItem(user,
-            user.getProjectDetails().get("test_project"), "123", request)
+            user.getProjectDetails().get(TEST_PROJECT_KEY), "123", request)
     );
     assertEquals(
         "Error in handled Request. Please, check specified parameters: 'Launch UUID should not be null or empty.'",
         exception.getMessage()
     );
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/item/impl/FinishTestItemHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/item/impl/FinishTestItemHandlerImplTest.java
index 6f7c209483..4f3123fa73 100644
--- a/src/test/java/com/epam/ta/reportportal/core/item/impl/FinishTestItemHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/item/impl/FinishTestItemHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.item.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -95,7 +96,7 @@ void finishNotExistedTestItem() {
     final ReportPortalUser rpUser = getRpUser("test", UserRole.USER, ProjectRole.MEMBER, 1L);
     when(repository.findByUuid("1")).thenReturn(Optional.empty());
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.finishTestItem(rpUser, extractProjectDetails(rpUser, "test_project"), "1",
+        () -> handler.finishTestItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY), "1",
             new FinishTestItemRQ()
         )
     );
@@ -115,7 +116,7 @@ void finishTestItemUnderNotExistedLaunch() {
     when(repository.findByUuid("1")).thenReturn(Optional.of(item));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.finishTestItem(rpUser, extractProjectDetails(rpUser, "test_project"), "1",
+        () -> handler.finishTestItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY), "1",
             new FinishTestItemRQ()
         )
     );
@@ -144,7 +145,7 @@ void finishTestItemByNotLaunchOwner() {
     when(launchRepository.findById(any())).thenReturn(Optional.of(launch));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.finishTestItem(rpUser, extractProjectDetails(rpUser, "test_project"), "1",
+        () -> handler.finishTestItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY), "1",
             new FinishTestItemRQ()
         )
     );
@@ -171,7 +172,7 @@ void finishStepItemWithoutProvidedStatus() {
     when(launchRepository.findById(any())).thenReturn(Optional.of(launch));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.finishTestItem(rpUser, extractProjectDetails(rpUser, "test_project"), "1",
+        () -> handler.finishTestItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY), "1",
             new FinishTestItemRQ()
         )
     );
@@ -219,7 +220,7 @@ void updateFinishedItemTest() {
     finishExecutionRQ.setEndTime(new Date());
 
     OperationCompletionRS operationCompletionRS =
-        handler.finishTestItem(rpUser, extractProjectDetails(rpUser, "test_project"), "1",
+        handler.finishTestItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY), "1",
             finishExecutionRQ
         );
 
@@ -228,4 +229,4 @@ void updateFinishedItemTest() {
     verify(messageBus, times(1)).publishActivity(any());
     verify(eventPublisher, times(1)).publishEvent(any(IssueResolvedEvent.class));
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/item/impl/GetTestItemHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/item/impl/GetTestItemHandlerImplTest.java
index f1348bf95a..b68e67cb0c 100644
--- a/src/test/java/com/epam/ta/reportportal/core/item/impl/GetTestItemHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/item/impl/GetTestItemHandlerImplTest.java
@@ -16,6 +16,15 @@
 
 package com.epam.ta.reportportal.core.item.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
+import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
+import static com.epam.ta.reportportal.commons.querygen.constant.LogCriteriaConstant.CRITERIA_TEST_ITEM_ID;
+import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.when;
+
 import com.epam.ta.reportportal.commons.ReportPortalUser;
 import com.epam.ta.reportportal.commons.querygen.Condition;
 import com.epam.ta.reportportal.commons.querygen.Filter;
@@ -32,6 +41,7 @@
 import com.epam.ta.reportportal.entity.user.UserRole;
 import com.epam.ta.reportportal.exception.ReportPortalException;
 import com.epam.ta.reportportal.ws.model.ErrorType;
+import java.util.Optional;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.function.Executable;
@@ -40,16 +50,6 @@
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.data.domain.PageRequest;
 
-import java.util.Optional;
-
-import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
-import static com.epam.ta.reportportal.commons.querygen.constant.LogCriteriaConstant.CRITERIA_TEST_ITEM_ID;
-import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.when;
-
 /**
  * @author <a href="mailto:ihar_kahadouski@epam.com">Ihar Kahadouski</a>
  */
@@ -77,7 +77,7 @@ void TestItemNotFound() {
 		when(testItemRepository.findById(1L)).thenReturn(Optional.empty());
 
 		final ReportPortalException exception = assertThrows(ReportPortalException.class,
-				() -> handler.getTestItem("1", extractProjectDetails(rpUser, "test_project"), rpUser)
+				() -> handler.getTestItem("1", extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
 		);
 		assertEquals("Test Item '1' not found. Did you use correct Test Item ID?", exception.getMessage());
 	}
@@ -94,10 +94,10 @@ void getTestItemUnderNotExistedLaunch() {
 		when(testItemService.getEffectiveLaunch(item)).thenReturn(launch);
 
 		doThrow(new ReportPortalException("Launch '1' not found. Did you use correct Launch ID?")).when(launchAccessValidator)
-				.validate(launch.getId(), extractProjectDetails(rpUser, "test_project"), rpUser);
+				.validate(launch.getId(), extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser);
 
 		final ReportPortalException exception = assertThrows(ReportPortalException.class,
-				() -> handler.getTestItem("1", extractProjectDetails(rpUser, "test_project"), rpUser)
+				() -> handler.getTestItem("1", extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
 		);
 		assertEquals("Launch '1' not found. Did you use correct Launch ID?", exception.getMessage());
 	}
@@ -116,10 +116,10 @@ void getTestItemFromAnotherProject() {
 
 		doThrow(new ReportPortalException(
 				"Forbidden operation. Specified launch with id '1' not referenced to specified project with id '1'")).when(
-				launchAccessValidator).validate(launch.getId(), extractProjectDetails(rpUser, "test_project"), rpUser);
+				launchAccessValidator).validate(launch.getId(), extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser);
 
 		final ReportPortalException exception = assertThrows(ReportPortalException.class,
-				() -> handler.getTestItem("1", extractProjectDetails(rpUser, "test_project"), rpUser)
+				() -> handler.getTestItem("1", extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
 		);
 		assertEquals("Forbidden operation. Specified launch with id '1' not referenced to specified project with id '1'",
 				exception.getMessage()
@@ -135,7 +135,7 @@ void getTestItemsUnderNotExistedLaunch() {
 		launch.setId(1L);
 		item.setLaunchId(launch.getId());
 		doThrow(new ReportPortalException("Launch '1' not found. Did you use correct Launch ID?")).when(launchAccessValidator)
-				.validate(item.getLaunchId(), extractProjectDetails(rpUser, "test_project"), rpUser);
+				.validate(item.getLaunchId(), extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser);
 		final Executable executable = () -> handler.getTestItems(Filter.builder()
 				.withTarget(TestItem.class)
 				.withCondition(FilterCondition.builder()
@@ -143,7 +143,7 @@ void getTestItemsUnderNotExistedLaunch() {
 						.withValue("100")
 						.withCondition(Condition.EQUALS)
 						.build())
-				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, "test_project"), rpUser, 1L, null, false, 0);
+				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser, 1L, null, false, 0);
 
 		final ReportPortalException exception = assertThrows(ReportPortalException.class, executable);
 		assertEquals("Launch '1' not found. Did you use correct Launch ID?", exception.getMessage());
@@ -160,7 +160,7 @@ public void getTestItemUnderAnotherProject() {
 		item.setLaunchId(launch.getId());
 		doThrow(new ReportPortalException(
 				"Forbidden operation. Specified launch with id '1' not referenced to specified project with id '1'")).when(
-				launchAccessValidator).validate(item.getLaunchId(), extractProjectDetails(rpUser, "test_project"), rpUser);
+				launchAccessValidator).validate(item.getLaunchId(), extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser);
 
 		final Executable executable = () -> handler.getTestItems(Filter.builder()
 				.withTarget(TestItem.class)
@@ -169,7 +169,7 @@ public void getTestItemUnderAnotherProject() {
 						.withValue("100")
 						.withCondition(Condition.EQUALS)
 						.build())
-				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, "test_project"), rpUser, 1L, null, false, 0);
+				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser, 1L, null, false, 0);
 
 		final ReportPortalException exception = assertThrows(ReportPortalException.class, executable);
 		assertEquals("Forbidden operation. Specified launch with id '1' not referenced to specified project with id '1'",
@@ -191,10 +191,10 @@ void getItemByOperator() {
 		when(testItemRepository.findById(1L)).thenReturn(Optional.of(item));
 		when(testItemService.getEffectiveLaunch(item)).thenReturn(launch);
 		doThrow(new ReportPortalException("You do not have enough permissions.")).when(launchAccessValidator)
-				.validate(launch.getId(), extractProjectDetails(operator, "test_project"), operator);
+				.validate(launch.getId(), extractProjectDetails(operator, TEST_PROJECT_KEY), operator);
 
 		ReportPortalException exception = assertThrows(ReportPortalException.class,
-				() -> handler.getTestItem("1", extractProjectDetails(operator, "test_project"), operator)
+				() -> handler.getTestItem("1", extractProjectDetails(operator, TEST_PROJECT_KEY), operator)
 		);
 		assertEquals("You do not have enough permissions.", exception.getMessage());
 	}
@@ -210,8 +210,8 @@ public void getItemsForNonExistingFilter() {
 		item.setLaunchId(launch.getId());
 		when(userFilterRepository.findByIdAndProjectId(
 				1L,
-				extractProjectDetails(rpUser, "test_project").getProjectId()
-		)).thenThrow(new ReportPortalException(ErrorType.USER_FILTER_NOT_FOUND_IN_PROJECT, 1L, "test_project"));
+				extractProjectDetails(rpUser, TEST_PROJECT_KEY).getProjectId()
+		)).thenThrow(new ReportPortalException(ErrorType.USER_FILTER_NOT_FOUND_IN_PROJECT, 1L, TEST_PROJECT_KEY));
 
 		final Executable executable = () -> handler.getTestItems(Filter.builder()
 				.withTarget(TestItem.class)
@@ -220,10 +220,10 @@ public void getItemsForNonExistingFilter() {
 						.withValue("100")
 						.withCondition(Condition.EQUALS)
 						.build())
-				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, "test_project"), rpUser, null, 1L, false, 0);
+				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser, null, 1L, false, 0);
 
 		final ReportPortalException exception = assertThrows(ReportPortalException.class, executable);
-		assertEquals("User filter with ID '1' not found on project 'test_project'. Did you use correct User Filter ID?",
+		assertEquals("User filter with ID '1' not found on project 'o-slug-project-name'. Did you use correct User Filter ID?",
 				exception.getMessage()
 		);
 	}
@@ -239,7 +239,7 @@ public void getItemsForIncorrectTargetClass() {
 		item.setLaunchId(launch.getId());
 		UserFilter filter = new UserFilter();
 		filter.setTargetClass(ObjectType.TestItem);
-		when(userFilterRepository.findByIdAndProjectId(1L, extractProjectDetails(rpUser, "test_project").getProjectId())).thenReturn(
+		when(userFilterRepository.findByIdAndProjectId(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY).getProjectId())).thenReturn(
 				Optional.of(filter));
 
 		final Executable executable = () -> handler.getTestItems(Filter.builder()
@@ -249,7 +249,7 @@ public void getItemsForIncorrectTargetClass() {
 						.withValue("100")
 						.withCondition(Condition.EQUALS)
 						.build())
-				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, "test_project"), rpUser, null, 1L, false, 0);
+				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser, null, 1L, false, 0);
 
 		final ReportPortalException exception = assertThrows(ReportPortalException.class, executable);
 		assertEquals(
@@ -269,7 +269,7 @@ public void getItemsForIncorrectLaunchesLimit() {
 		item.setLaunchId(launch.getId());
 		UserFilter filter = new UserFilter();
 		filter.setTargetClass(ObjectType.Launch);
-		when(userFilterRepository.findByIdAndProjectId(1L, extractProjectDetails(rpUser, "test_project").getProjectId())).thenReturn(
+		when(userFilterRepository.findByIdAndProjectId(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY).getProjectId())).thenReturn(
 				Optional.of(filter));
 
 		final Executable executable = () -> handler.getTestItems(Filter.builder()
@@ -279,11 +279,11 @@ public void getItemsForIncorrectLaunchesLimit() {
 						.withValue("100")
 						.withCondition(Condition.EQUALS)
 						.build())
-				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, "test_project"), rpUser, null, 1L, false, 0);
+				.build(), PageRequest.of(0, 10), extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser, null, 1L, false, 0);
 
 		final ReportPortalException exception = assertThrows(ReportPortalException.class, executable);
 		assertEquals("Error in handled Request. Please, check specified parameters: 'Launches limit should be greater than 0'",
 				exception.getMessage()
 		);
 	}
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/item/impl/LaunchAccessValidatorImplTest.java b/src/test/java/com/epam/ta/reportportal/core/item/impl/LaunchAccessValidatorImplTest.java
index 429b0271d9..001cf60930 100644
--- a/src/test/java/com/epam/ta/reportportal/core/item/impl/LaunchAccessValidatorImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/item/impl/LaunchAccessValidatorImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.item.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -59,7 +60,7 @@ void validateNotExistingLaunch() {
     when(launchRepository.findById(1L)).thenReturn(Optional.empty());
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> launchAccessValidator.validate(1L, extractProjectDetails(rpUser, "test_project"),
+        () -> launchAccessValidator.validate(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             rpUser)
     );
     assertEquals("Launch '1' not found. Did you use correct Launch ID?", exception.getMessage());
@@ -77,7 +78,7 @@ void validateLaunchUnderAnotherProject() {
     when(launchRepository.findById(1L)).thenReturn(Optional.of(launch));
 
     final Executable executable = () -> launchAccessValidator.validate(1L,
-        extractProjectDetails(rpUser, "test_project"), rpUser);
+        extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser);
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class, executable);
     assertEquals(
@@ -98,9 +99,9 @@ void validateLaunchWithOperatorRole() {
     when(launchRepository.findById(1L)).thenReturn(Optional.of(launch));
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> launchAccessValidator.validate(1L, extractProjectDetails(operator, "test_project"),
+        () -> launchAccessValidator.validate(1L, extractProjectDetails(operator, TEST_PROJECT_KEY),
             operator)
     );
     assertEquals("You do not have enough permissions.", exception.getMessage());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/item/impl/StartTestItemHandlerAsyncImplTest.java b/src/test/java/com/epam/ta/reportportal/core/item/impl/StartTestItemHandlerAsyncImplTest.java
index b1264242fb..14e964732d 100644
--- a/src/test/java/com/epam/ta/reportportal/core/item/impl/StartTestItemHandlerAsyncImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/item/impl/StartTestItemHandlerAsyncImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.item.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
@@ -54,7 +55,7 @@ void startRootItem() {
     ReportPortalUser user = getRpUser("test", UserRole.ADMINISTRATOR, ProjectRole.PROJECT_MANAGER,
         1L);
 
-    startTestItemHandlerAsync.startRootItem(user, user.getProjectDetails().get("test_project"),
+    startTestItemHandlerAsync.startRootItem(user, user.getProjectDetails().get(TEST_PROJECT_KEY),
         request);
     verify(amqpTemplate).convertAndSend(any(), any(), any(), any());
     verify(reportingQueueService).getReportingQueueKey(any());
@@ -66,9 +67,9 @@ void startChildItem() {
     ReportPortalUser user = getRpUser("test", UserRole.ADMINISTRATOR, ProjectRole.PROJECT_MANAGER,
         1L);
 
-    startTestItemHandlerAsync.startChildItem(user, user.getProjectDetails().get("test_project"),
+    startTestItemHandlerAsync.startChildItem(user, user.getProjectDetails().get(TEST_PROJECT_KEY),
         request, "123");
     verify(amqpTemplate).convertAndSend(any(), any(), any(), any());
     verify(reportingQueueService).getReportingQueueKey(any());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/item/impl/StartTestItemHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/item/impl/StartTestItemHandlerImplTest.java
index 4db2058cdc..fcd3d1976e 100644
--- a/src/test/java/com/epam/ta/reportportal/core/item/impl/StartTestItemHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/item/impl/StartTestItemHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.item.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -88,7 +89,7 @@ void startRootItemUnderNotExistedLaunch() {
     rq.setLaunchUuid("1");
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.startRootItem(rpUser, extractProjectDetails(rpUser, "test_project"), rq)
+        () -> handler.startRootItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rq)
     );
     assertEquals("Launch '1' not found. Did you use correct Launch ID?", exception.getMessage());
   }
@@ -106,7 +107,7 @@ void startRootItemUnderLaunchFromAnotherProject() {
     when(launchRepository.findByUuid("1")).thenReturn(Optional.of(launch));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.startRootItem(rpUser, extractProjectDetails(rpUser, "test_project"),
+        () -> handler.startRootItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             startTestItemRQ)
     );
     assertEquals("You do not have enough permissions.", exception.getMessage());
@@ -123,7 +124,7 @@ void startRootItemUnderFinishedLaunch() {
         Optional.of(getLaunch(1L, StatusEnum.PASSED)));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.startRootItem(rpUser, extractProjectDetails(rpUser, "test_project"),
+        () -> handler.startRootItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             startTestItemRQ)
     );
     assertEquals("Start test item is not allowed. Launch '1' is not in progress",
@@ -143,7 +144,7 @@ void startRootItemEarlierThanLaunch() {
     when(launchRepository.findByUuid("1")).thenReturn(Optional.of(launch));
 
     assertThrows(ReportPortalException.class,
-        () -> handler.startRootItem(rpUser, extractProjectDetails(rpUser, "test_project"),
+        () -> handler.startRootItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             startTestItemRQ)
     );
   }
@@ -160,7 +161,7 @@ void startChildItemUnderNotExistedParent() {
     when(testItemRepository.findByUuid("1")).thenReturn(Optional.empty());
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.startChildItem(rpUser, extractProjectDetails(rpUser, "test_project"), rq, "1")
+        () -> handler.startChildItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rq, "1")
     );
     assertEquals("Test Item '1' not found. Did you use correct Test Item ID?",
         exception.getMessage());
@@ -184,7 +185,7 @@ void startChildItemEarlierThanParent() {
         .validate(any(StartTestItemRQ.class), any(TestItem.class));
 
     assertThrows(ReportPortalException.class,
-        () -> handler.startChildItem(rpUser, extractProjectDetails(rpUser, "test_project"),
+        () -> handler.startChildItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             startTestItemRQ, "1")
     );
   }
@@ -214,7 +215,7 @@ void startChildItemUnderFinishedParent() {
     )).when(validator).validate(any(StartTestItemRQ.class), any(TestItem.class));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.startChildItem(rpUser, extractProjectDetails(rpUser, "test_project"),
+        () -> handler.startChildItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             startTestItemRQ, "1")
     );
     assertEquals("Error in handled Request. Please, check specified parameters: "
@@ -234,7 +235,7 @@ void startChildItemWithNotExistedLaunch() {
     when(launchRepository.findByUuid("1")).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.startChildItem(rpUser, extractProjectDetails(rpUser, "test_project"),
+        () -> handler.startChildItem(rpUser, extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             startTestItemRQ, "1")
     );
 
@@ -247,4 +248,4 @@ private Launch getLaunch(Long projectId, StatusEnum status) {
     launch.setStatus(status);
     return launch;
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/item/impl/UpdateTestItemHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/item/impl/UpdateTestItemHandlerImplTest.java
index 1615ff7296..04f3a42307 100644
--- a/src/test/java/com/epam/ta/reportportal/core/item/impl/UpdateTestItemHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/item/impl/UpdateTestItemHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.item.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.core.item.impl.UpdateTestItemHandlerImpl.INITIAL_STATUS_ATTRIBUTE_KEY;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
@@ -88,7 +89,7 @@ void updateNotExistedTestItem() {
         getRpUser("test", UserRole.USER, ProjectRole.PROJECT_MANAGER, 1L);
     when(itemRepository.findById(1L)).thenReturn(Optional.empty());
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateTestItem(extractProjectDetails(rpUser, "test_project"), 1L,
+        () -> handler.updateTestItem(extractProjectDetails(rpUser, TEST_PROJECT_KEY), 1L,
             new UpdateTestItemRQ(), rpUser
         )
     );
@@ -109,7 +110,7 @@ void updateTestItemUnderNotExistedLaunch() {
         new ReportPortalException(ErrorType.LAUNCH_NOT_FOUND));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateTestItem(extractProjectDetails(rpUser, "test_project"), 1L,
+        () -> handler.updateTestItem(extractProjectDetails(rpUser, TEST_PROJECT_KEY), 1L,
             new UpdateTestItemRQ(), rpUser
         )
     );
@@ -133,7 +134,7 @@ void updateTestItemUnderNotOwnLaunch() {
     when(itemRepository.findById(1L)).thenReturn(Optional.of(item));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateTestItem(extractProjectDetails(rpUser, "test_project"), 1L,
+        () -> handler.updateTestItem(extractProjectDetails(rpUser, TEST_PROJECT_KEY), 1L,
             new UpdateTestItemRQ(), rpUser
         )
     );
@@ -158,7 +159,7 @@ void updateTestItemFromAnotherProject() {
     when(itemRepository.findById(1L)).thenReturn(Optional.of(item));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateTestItem(extractProjectDetails(rpUser, "test_project"), 1L,
+        () -> handler.updateTestItem(extractProjectDetails(rpUser, TEST_PROJECT_KEY), 1L,
             new UpdateTestItemRQ(), rpUser
         )
     );
@@ -174,7 +175,7 @@ void defineIssuesOnNotExistProject() {
     when(projectRepository.findById(1L)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.defineTestItemsIssues(extractProjectDetails(rpUser, "test_project"),
+        () -> handler.defineTestItemsIssues(extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             new DefineIssueRQ(), rpUser
         )
     );
@@ -208,7 +209,7 @@ void changeNotStepItemStatus() {
     when(itemRepository.findById(itemId)).thenReturn(Optional.of(item));
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateTestItem(extractProjectDetails(user, "test_project"), itemId, rq, user)
+        () -> handler.updateTestItem(extractProjectDetails(user, TEST_PROJECT_KEY), itemId, rq, user)
     );
     assertEquals("Incorrect Request. Unable to change status on test item with children",
         exception.getMessage()
@@ -241,7 +242,7 @@ void shouldCreateInitialStatusAttribute() {
     when(statusChangingStrategyMapping.get(StatusEnum.PASSED)).thenReturn(statusChangingStrategy);
     doNothing().when(statusChangingStrategy).changeStatus(item, StatusEnum.PASSED, user, true);
 
-    handler.updateTestItem(extractProjectDetails(user, "test_project"), itemId, rq, user);
+    handler.updateTestItem(extractProjectDetails(user, TEST_PROJECT_KEY), itemId, rq, user);
     assertTrue(item.getAttributes().stream().anyMatch(
         attribute -> INITIAL_STATUS_ATTRIBUTE_KEY.equalsIgnoreCase(attribute.getKey())
             && StatusEnum.FAILED.getExecutionCounterField().equalsIgnoreCase("failed")));
@@ -275,7 +276,7 @@ void shouldNotCreateInitialStatusAttribute() {
     when(statusChangingStrategyMapping.get(StatusEnum.PASSED)).thenReturn(statusChangingStrategy);
     doNothing().when(statusChangingStrategy).changeStatus(item, StatusEnum.PASSED, user, true);
 
-    handler.updateTestItem(extractProjectDetails(user, "test_project"), itemId, rq, user);
+    handler.updateTestItem(extractProjectDetails(user, TEST_PROJECT_KEY), itemId, rq, user);
     assertTrue(item.getAttributes().stream().anyMatch(
         attribute -> INITIAL_STATUS_ATTRIBUTE_KEY.equalsIgnoreCase(attribute.getKey())
             && StatusEnum.PASSED.getExecutionCounterField().equalsIgnoreCase("passed")));
@@ -306,9 +307,9 @@ void updateItemPositive() {
     when(itemRepository.findById(itemId)).thenReturn(Optional.of(item));
 
     OperationCompletionRS response =
-        handler.updateTestItem(extractProjectDetails(user, "test_project"), itemId, rq, user);
+        handler.updateTestItem(extractProjectDetails(user, TEST_PROJECT_KEY), itemId, rq, user);
 
     assertEquals("TestItem with ID = '1' successfully updated.", response.getResultMessage());
     assertEquals(rq.getDescription(), item.getDescription());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/item/impl/history/TestItemsHistoryHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/item/impl/history/TestItemsHistoryHandlerImplTest.java
index d1d8f8023d..99ac1d6d92 100644
--- a/src/test/java/com/epam/ta/reportportal/core/item/impl/history/TestItemsHistoryHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/item/impl/history/TestItemsHistoryHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.item.impl.history;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_ID;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -55,7 +56,7 @@ void historyDepthLowerThanBoundTest() {
         ProjectRole.MEMBER, 1L);
 
     assertThrows(ReportPortalException.class,
-        () -> handler.getItemsHistory(extractProjectDetails(rpUser, "test_project"),
+        () -> handler.getItemsHistory(extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             Filter.builder()
                 .withTarget(TestItem.class)
                 .withCondition(FilterCondition.builder().eq(CRITERIA_ID, "1").build())
@@ -73,7 +74,7 @@ void historyDepthGreaterThanBoundTest() {
         ProjectRole.MEMBER, 1L);
 
     assertThrows(ReportPortalException.class,
-        () -> handler.getItemsHistory(extractProjectDetails(rpUser, "test_project"),
+        () -> handler.getItemsHistory(extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             Filter.builder()
                 .withTarget(TestItem.class)
                 .withCondition(FilterCondition.builder().eq(CRITERIA_ID, "1").build())
@@ -84,4 +85,4 @@ void historyDepthGreaterThanBoundTest() {
         )
     );
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/launch/impl/DeleteLaunchHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/launch/impl/DeleteLaunchHandlerImplTest.java
index 9d0d6c8172..4eb0e90f61 100644
--- a/src/test/java/com/epam/ta/reportportal/core/launch/impl/DeleteLaunchHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/launch/impl/DeleteLaunchHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.launch.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.core.launch.impl.LaunchTestUtil.getLaunch;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
@@ -60,7 +61,7 @@ void deleteNotOwnLaunch() {
         getLaunch(StatusEnum.PASSED, LaunchModeEnum.DEFAULT));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteLaunch(1L, extractProjectDetails(rpUser, "test_project"), rpUser)
+        () -> handler.deleteLaunch(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
     );
     assertEquals("You do not have enough permissions. You are not launch owner.",
         exception.getMessage());
@@ -73,7 +74,7 @@ void deleteLaunchFromAnotherProject() {
         getLaunch(StatusEnum.PASSED, LaunchModeEnum.DEFAULT));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteLaunch(1L, extractProjectDetails(rpUser, "test_project"), rpUser)
+        () -> handler.deleteLaunch(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser)
     );
     assertEquals("Forbidden operation. Target launch '1' not under specified project '2'",
         exception.getMessage());
@@ -87,7 +88,7 @@ void deleteLaunchInProgressStatus() {
         getLaunch(StatusEnum.IN_PROGRESS, LaunchModeEnum.DEFAULT));
 
     assertThrows(ReportPortalException.class,
-        () -> handler.deleteLaunch(1L, extractProjectDetails(rpUser, "test_project"), rpUser));
+        () -> handler.deleteLaunch(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser));
   }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerAsyncImplTest.java b/src/test/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerAsyncImplTest.java
index 7a76a64e33..17e8cc3d65 100644
--- a/src/test/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerAsyncImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerAsyncImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.launch.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
@@ -55,8 +56,8 @@ void finishLaunch() {
         1L);
 
     finishLaunchHandlerAsync.finishLaunch("0", request,
-        user.getProjectDetails().get("test_project"), user, "http://base");
+        user.getProjectDetails().get(TEST_PROJECT_KEY), user, "http://base");
     verify(amqpTemplate).convertAndSend(any(), any(), any(), any());
     verify(reportingQueueService).getReportingQueueKey(any());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerImplTest.java
index a73235527f..4ab01986b9 100644
--- a/src/test/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/launch/impl/FinishLaunchHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.launch.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.core.launch.impl.LaunchTestUtil.getLaunch;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
@@ -95,7 +96,7 @@ void finishLaunch() {
         getLaunch(StatusEnum.IN_PROGRESS, LaunchModeEnum.DEFAULT));
 
     FinishLaunchRS response =
-        handler.finishLaunch("1", finishExecutionRQ, extractProjectDetails(rpUser, "test_project"),
+        handler.finishLaunch("1", finishExecutionRQ, extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             rpUser, null
         );
 
@@ -117,14 +118,14 @@ void finishLaunchWithLink() {
         getLaunch(StatusEnum.IN_PROGRESS, LaunchModeEnum.DEFAULT));
 
     final FinishLaunchRS finishLaunchRS =
-        handler.finishLaunch("1", finishExecutionRQ, extractProjectDetails(rpUser, "test_project"),
+        handler.finishLaunch("1", finishExecutionRQ, extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             rpUser, "http://example.com"
         );
 
     verify(finishHierarchyHandler, times(1)).finishDescendants(any(), any(), any(), any(), any());
 
     assertNotNull(finishLaunchRS);
-    assertEquals("http://example.com/ui/#test_project/launches/all/1", finishLaunchRS.getLink());
+    assertEquals("http://example.com/ui/#o-slug-project-name/launches/all/1", finishLaunchRS.getLink());
   }
 
   @Test
@@ -140,7 +141,7 @@ void stopLaunch() {
         getLaunch(StatusEnum.IN_PROGRESS, LaunchModeEnum.DEFAULT));
 
     final OperationCompletionRS response = stopLaunchHandler.stopLaunch(1L, finishExecutionRQ,
-        extractProjectDetails(rpUser, "test_project"), rpUser
+        extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser
     );
     assertNotNull(response);
     assertEquals("Launch with ID = '1' successfully stopped.", response.getResultMessage());
@@ -165,7 +166,7 @@ void bulkStopLaunch() {
         getLaunch(StatusEnum.IN_PROGRESS, LaunchModeEnum.DEFAULT));
 
     final List<OperationCompletionRS> response =
-        stopLaunchHandler.stopLaunch(bulkRq, extractProjectDetails(rpUser, "test_project"), rpUser);
+        stopLaunchHandler.stopLaunch(bulkRq, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser);
     assertNotNull(response);
     assertEquals(1, response.size());
   }
@@ -183,7 +184,7 @@ void finishWithIncorrectStatus() {
         getLaunch(StatusEnum.PASSED, LaunchModeEnum.DEFAULT));
 
     assertThrows(ReportPortalException.class, () -> handler.finishLaunch("1", finishExecutionRQ,
-        extractProjectDetails(rpUser, "test_project"), rpUser, null
+        extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser, null
     ));
   }
 
@@ -200,7 +201,7 @@ void finishWithIncorrectEndTime() {
         getLaunch(StatusEnum.IN_PROGRESS, LaunchModeEnum.DEFAULT));
 
     assertThrows(ReportPortalException.class, () -> handler.finishLaunch("1", finishExecutionRQ,
-        extractProjectDetails(rpUser, "test_project"), rpUser, null
+        extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser, null
     ));
   }
 
@@ -218,11 +219,11 @@ void finishNotOwnLaunch() {
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
         () -> handler.finishLaunch("1", finishExecutionRQ,
-            extractProjectDetails(rpUser, "test_project"), rpUser, null
+            extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser, null
         )
     );
     assertEquals("You do not have enough permissions. You are not launch owner.",
         exception.getMessage()
     );
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/launch/impl/GetLaunchHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/launch/impl/GetLaunchHandlerImplTest.java
index 858ae21ae9..1e18e3c67c 100644
--- a/src/test/java/com/epam/ta/reportportal/core/launch/impl/GetLaunchHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/launch/impl/GetLaunchHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.launch.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.commons.querygen.constant.LaunchCriteriaConstant.CRITERIA_LAUNCH_STATUS;
 import static com.epam.ta.reportportal.core.launch.impl.LaunchTestUtil.getLaunch;
@@ -102,7 +103,7 @@ void getLaunchFromOtherProject() {
         getLaunch(StatusEnum.FAILED, LaunchModeEnum.DEFAULT));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getLaunch("1", extractProjectDetails(rpUser, "test_project"))
+        () -> handler.getLaunch("1", extractProjectDetails(rpUser, TEST_PROJECT_KEY))
     );
     assertEquals("You do not have enough permissions.", exception.getMessage());
   }
@@ -114,7 +115,7 @@ void getDebugLaunchWithCustomerRole() {
         getLaunch(StatusEnum.PASSED, LaunchModeEnum.DEBUG));
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getLaunch("1", extractProjectDetails(rpUser, "test_project"))
+        () -> handler.getLaunch("1", extractProjectDetails(rpUser, TEST_PROJECT_KEY))
     );
     assertEquals("You do not have enough permissions.", exception.getMessage());
   }
@@ -124,7 +125,7 @@ void getLaunchNamesIncorrectInput() {
     final ReportPortalUser rpUser = getRpUser("test", UserRole.USER, ProjectRole.MEMBER, 1L);
 
     assertThrows(ReportPortalException.class,
-        () -> handler.getLaunchNames(extractProjectDetails(rpUser, "test_project"),
+        () -> handler.getLaunchNames(extractProjectDetails(rpUser, TEST_PROJECT_KEY),
             RandomStringUtils.random(257)
         )
     );
@@ -138,19 +139,19 @@ void getNotExistLaunch() {
     when(launchRepository.findById(Long.parseLong(launchId))).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getLaunch(launchId, extractProjectDetails(user, "test_project"))
+        () -> handler.getLaunch(launchId, extractProjectDetails(user, TEST_PROJECT_KEY))
     );
     assertEquals("Launch '1' not found. Did you use correct Launch ID?", exception.getMessage());
   }
 
   @Test
   void getLaunchByNotExistProjectName() {
-    String projectName = "not_exist";
+    String projectKey = "not_exist";
 
-    when(projectRepository.findByName(projectName)).thenReturn(Optional.empty());
+    when(projectRepository.findByKey(projectKey)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getLaunchByProjectName(projectName, PageRequest.of(0, 10), getDefaultFilter(),
+        () -> handler.getLaunchByProjectName(projectKey, PageRequest.of(0, 10), getDefaultFilter(),
             "user"
         )
     );
@@ -161,13 +162,13 @@ void getLaunchByNotExistProjectName() {
 
   @Test
   void getLaunchByProjectNameNotFound() {
-    String projectName = "not_exist";
+    String projectKey = "not_exist";
 
-    when(projectRepository.findByName(projectName)).thenReturn(Optional.of(new Project()));
+    when(projectRepository.findByKey(projectKey)).thenReturn(Optional.of(new Project()));
     when(launchRepository.findByFilter(any(), any())).thenReturn(null);
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getLaunchByProjectName(projectName, PageRequest.of(0, 10), getDefaultFilter(),
+        () -> handler.getLaunchByProjectName(projectKey, PageRequest.of(0, 10), getDefaultFilter(),
             "user"
         )
     );
@@ -183,7 +184,7 @@ void getLaunchesByNotExistProject() {
     when(projectRepository.findById(projectId)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getProjectLaunches(extractProjectDetails(user, "test_project"),
+        () -> handler.getProjectLaunches(extractProjectDetails(user, TEST_PROJECT_KEY),
             getDefaultFilter(), PageRequest.of(0, 10), "user"
         )
     );
@@ -201,7 +202,7 @@ void getLatestLaunchesOnNotExistProject() {
     when(projectRepository.findById(projectId)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getLatestLaunches(extractProjectDetails(user, "test_project"),
+        () -> handler.getLatestLaunches(extractProjectDetails(user, TEST_PROJECT_KEY),
             getDefaultFilter(), PageRequest.of(0, 10)
         )
     );
@@ -217,7 +218,7 @@ void getOwnersWrongTerm() {
         getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER, projectId);
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getOwners(extractProjectDetails(user, "test_project"), "qw",
+        () -> handler.getOwners(extractProjectDetails(user, TEST_PROJECT_KEY), "qw",
             LaunchModeEnum.DEFAULT.name()
         )
     );
@@ -234,7 +235,7 @@ void getOwnersWrongMode() {
         getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER, projectId);
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getOwners(extractProjectDetails(user, "test_project"), "qwe", "incorrectMode")
+        () -> handler.getOwners(extractProjectDetails(user, TEST_PROJECT_KEY), "qwe", "incorrectMode")
     );
     assertEquals("Incorrect filtering parameters. Mode - incorrectMode doesn't exist.",
         exception.getMessage()
@@ -282,7 +283,7 @@ void getLaunchInDebugModeByCustomer() {
     when(launchRepository.findById(Long.parseLong(launchId))).thenReturn(Optional.of(launch));
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getLaunch(launchId, extractProjectDetails(user, "test_project"))
+        () -> handler.getLaunch(launchId, extractProjectDetails(user, TEST_PROJECT_KEY))
     );
     assertEquals("You do not have enough permissions.", exception.getMessage());
   }
@@ -306,7 +307,7 @@ void getClusterInfo() {
     when(getClusterHandler.getResources(launch, pageable)).thenReturn(expected);
 
     final Iterable<ClusterInfoResource> result =
-        handler.getClusters(launchId, extractProjectDetails(user, "test_project"), pageable);
+        handler.getClusters(launchId, extractProjectDetails(user, TEST_PROJECT_KEY), pageable);
 
     final Page<ClusterInfoResource> castedResult = (Page<ClusterInfoResource>) result;
 
@@ -326,4 +327,4 @@ private Filter getDefaultFilter() {
         .withCondition(FilterCondition.builder().eq(CRITERIA_LAUNCH_STATUS, "PASSED").build())
         .build();
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/launch/impl/StartLaunchHandlerAsyncImplTest.java b/src/test/java/com/epam/ta/reportportal/core/launch/impl/StartLaunchHandlerAsyncImplTest.java
index ca463f709d..696e8f1bb0 100644
--- a/src/test/java/com/epam/ta/reportportal/core/launch/impl/StartLaunchHandlerAsyncImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/launch/impl/StartLaunchHandlerAsyncImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.launch.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
@@ -54,9 +55,9 @@ void starLaunch() {
     ReportPortalUser user = getRpUser("test", UserRole.ADMINISTRATOR, ProjectRole.PROJECT_MANAGER,
         1L);
 
-    startLaunchHandlerAsync.startLaunch(user, user.getProjectDetails().get("test_project"),
+    startLaunchHandlerAsync.startLaunch(user, user.getProjectDetails().get(TEST_PROJECT_KEY),
         request);
     verify(amqpTemplate).convertAndSend(any(), any(), any(), any());
     verify(reportingQueueService).getReportingQueueKey(any());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/launch/impl/StartLaunchHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/launch/impl/StartLaunchHandlerImplTest.java
index 8d074cf6cb..cf288debbe 100644
--- a/src/test/java/com/epam/ta/reportportal/core/launch/impl/StartLaunchHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/launch/impl/StartLaunchHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.launch.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -89,7 +90,7 @@ void startLaunch() {
     }).thenReturn(launch);
 
     final StartLaunchRS startLaunchRS = startLaunchHandlerImpl.startLaunch(rpUser,
-        extractProjectDetails(rpUser, "test_project"),
+        extractProjectDetails(rpUser, TEST_PROJECT_KEY),
         startLaunchRQ
     );
 
@@ -108,8 +109,8 @@ void accessDeniedForCustomerRoleAndDebugMode() {
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
         () -> startLaunchHandlerImpl.startLaunch(rpUser,
-            extractProjectDetails(rpUser, "test_project"), startLaunchRQ)
+            extractProjectDetails(rpUser, TEST_PROJECT_KEY), startLaunchRQ)
     );
     assertEquals("Forbidden operation.", exception.getMessage());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/launch/impl/UpdateLaunchHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/launch/impl/UpdateLaunchHandlerImplTest.java
index 2b0fe871d4..1729f22d83 100644
--- a/src/test/java/com/epam/ta/reportportal/core/launch/impl/UpdateLaunchHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/launch/impl/UpdateLaunchHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.launch.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.core.launch.impl.LaunchTestUtil.getLaunch;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
@@ -91,7 +92,7 @@ void updateNotOwnLaunch() {
     when(launchRepository.findById(1L)).thenReturn(
         getLaunch(StatusEnum.PASSED, LaunchModeEnum.DEFAULT));
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateLaunch(1L, extractProjectDetails(rpUser, "test_project"), rpUser,
+        () -> handler.updateLaunch(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser,
             new UpdateLaunchRQ()
         )
     );
@@ -110,7 +111,7 @@ void updateDebugLaunchByCustomer() {
     updateLaunchRQ.setMode(Mode.DEBUG);
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateLaunch(1L, extractProjectDetails(rpUser, "test_project"), rpUser,
+        () -> handler.updateLaunch(1L, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser,
             updateLaunchRQ
         )
     );
@@ -130,7 +131,7 @@ void createClustersLaunchInProgress() {
 
     final ReportPortalException exception = assertThrows(ReportPortalException.class,
         () -> handler.createClusters(createClustersRQ,
-            extractProjectDetails(rpUser, "test_project"), rpUser
+            extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser
         )
     );
     assertEquals("Incorrect Request. Cannot analyze launch in progress.", exception.getMessage());
@@ -157,7 +158,7 @@ void createClusters() {
         ProjectAttributeEnum.UNIQUE_ERROR_ANALYZER_REMOVE_NUMBERS.getDefaultValue());
     createClustersRQ.setRemoveNumbers(!defaultRemoveNumbers);
 
-    handler.createClusters(createClustersRQ, extractProjectDetails(rpUser, "test_project"), rpUser);
+    handler.createClusters(createClustersRQ, extractProjectDetails(rpUser, TEST_PROJECT_KEY), rpUser);
 
     verify(launchAccessValidator, times(1)).validate(any(Launch.class),
         any(ReportPortalUser.ProjectDetails.class), eq(rpUser)
@@ -180,4 +181,4 @@ void createClusters() {
     assertNotEquals(providedRemoveNumbers, defaultRemoveNumbers);
     assertEquals(createClustersRQ.isRemoveNumbers(), providedRemoveNumbers);
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerAsyncImplTest.java b/src/test/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerAsyncImplTest.java
index bcf4eb3512..e144d71c1b 100644
--- a/src/test/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerAsyncImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerAsyncImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.log.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
@@ -80,13 +81,13 @@ void createLog() {
     when(saveLogBinaryDataTask.withProjectId(any())).thenReturn(saveLogBinaryDataTask);
 
     createLogHandlerAsync.createLog(request, multipartFile,
-        user.getProjectDetails().get("test_project"));
+        user.getProjectDetails().get(TEST_PROJECT_KEY));
 
     verify(provider).get();
     verify(saveLogBinaryDataTask).withRequest(request);
     verify(saveLogBinaryDataTask).withFile(multipartFile);
     verify(saveLogBinaryDataTask).withProjectId(
-        user.getProjectDetails().get("test_project").getProjectId());
+        user.getProjectDetails().get(TEST_PROJECT_KEY).getProjectId());
   }
 
   @Test
@@ -98,4 +99,4 @@ void sendMessage() {
     verify(reportingQueueService).getReportingQueueKey(any());
   }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/log/impl/DeleteLogHandlerTest.java b/src/test/java/com/epam/ta/reportportal/core/log/impl/DeleteLogHandlerTest.java
index 61018dfb9f..4ff036ed1b 100644
--- a/src/test/java/com/epam/ta/reportportal/core/log/impl/DeleteLogHandlerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/log/impl/DeleteLogHandlerTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.log.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -88,7 +89,7 @@ void deleteLogOnNotExistProject() {
     when(projectRepository.existsById(projectId)).thenReturn(false);
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteLog(1L, extractProjectDetails(user, "test_project"), user)
+        () -> handler.deleteLog(1L, extractProjectDetails(user, TEST_PROJECT_KEY), user)
     );
     assertEquals("Project '1' not found. Did you use correct project name?",
         exception.getMessage());
@@ -105,7 +106,7 @@ void deleteNotExistLog() {
     when(logRepository.findById(logId)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteLog(logId, extractProjectDetails(user, "test_project"), user)
+        () -> handler.deleteLog(logId, extractProjectDetails(user, TEST_PROJECT_KEY), user)
     );
     assertEquals("Log '2' not found. Did you use correct Log ID?", exception.getMessage());
   }
@@ -136,7 +137,7 @@ void deleteLogByNotOwner() {
     when(logRepository.findById(logId)).thenReturn(Optional.of(log));
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteLog(logId, extractProjectDetails(user, "test_project"), user)
+        () -> handler.deleteLog(logId, extractProjectDetails(user, TEST_PROJECT_KEY), user)
     );
     assertEquals("You do not have enough permissions.", exception.getMessage());
   }
@@ -172,7 +173,7 @@ void cleanUpLogDataTest() {
     when(projectRepository.existsById(projectId)).thenReturn(true);
     when(logRepository.findById(logId)).thenReturn(Optional.of(log));
 
-    handler.deleteLog(logId, extractProjectDetails(user, "test_project"), user);
+    handler.deleteLog(logId, extractProjectDetails(user, TEST_PROJECT_KEY), user);
 
     verify(logRepository, times(1)).delete(log);
     verify(logIndexer, times(1)).cleanIndex(projectId, Collections.singletonList(logId));
@@ -210,8 +211,8 @@ void cleanUpLogDataNegative() {
     doThrow(IllegalArgumentException.class).when(logRepository).delete(log);
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteLog(logId, extractProjectDetails(user, "test_project"), user)
+        () -> handler.deleteLog(logId, extractProjectDetails(user, TEST_PROJECT_KEY), user)
     );
     assertEquals("Error while Log instance deleting.", exception.getMessage());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/log/impl/GetLogHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/log/impl/GetLogHandlerImplTest.java
index 22994eb417..6875babe02 100644
--- a/src/test/java/com/epam/ta/reportportal/core/log/impl/GetLogHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/log/impl/GetLogHandlerImplTest.java
@@ -1,5 +1,6 @@
 package com.epam.ta.reportportal.core.log.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.commons.querygen.constant.LogCriteriaConstant.CRITERIA_ITEM_LAUNCH_ID;
 import static com.epam.ta.reportportal.commons.querygen.constant.TestItemCriteriaConstant.CRITERIA_PATH;
@@ -84,7 +85,7 @@ void getLogs() {
         logService.findByFilter(queryableArgumentCaptor.capture(), any(Pageable.class))).thenReturn(
         Page.empty(pageable));
 
-    getLogHandler.getLogs(correctPath, extractProjectDetails(user, "test_project"), idFilter,
+    getLogHandler.getLogs(correctPath, extractProjectDetails(user, TEST_PROJECT_KEY), idFilter,
         pageable);
 
     Queryable updatedFilter = queryableArgumentCaptor.getValue();
@@ -109,4 +110,4 @@ void getLogs() {
     Assertions.assertNotEquals(wrongPath, underPathCondition.get().getValue());
     Assertions.assertEquals(correctPath, underPathCondition.get().getValue());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/project/impl/CreateProjectHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/project/impl/CreateProjectHandlerImplTest.java
index 097ad52f90..4dce106104 100644
--- a/src/test/java/com/epam/ta/reportportal/core/project/impl/CreateProjectHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/project/impl/CreateProjectHandlerImplTest.java
@@ -16,6 +16,10 @@
 
 package com.epam.ta.reportportal.core.project.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_ORG;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_ORG_ID;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_NAME;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -24,6 +28,7 @@
 import com.epam.ta.reportportal.commons.ReportPortalUser;
 import com.epam.ta.reportportal.dao.ProjectRepository;
 import com.epam.ta.reportportal.dao.UserRepository;
+import com.epam.ta.reportportal.dao.organization.OrganizationRepository;
 import com.epam.ta.reportportal.entity.project.ProjectRole;
 import com.epam.ta.reportportal.entity.user.UserRole;
 import com.epam.ta.reportportal.exception.ReportPortalException;
@@ -47,6 +52,9 @@ class CreateProjectHandlerImplTest {
   @Mock
   private UserRepository userRepository;
 
+  @Mock
+  OrganizationRepository organizationRepository;
+
   @InjectMocks
   private CreateProjectHandlerImpl handler;
 
@@ -56,11 +64,12 @@ void createProjectWithWrongType() {
         getRpUser("user", UserRole.ADMINISTRATOR, ProjectRole.PROJECT_MANAGER, 1L);
 
     CreateProjectRQ createProjectRQ = new CreateProjectRQ();
-    String projectName = "projectName";
-    createProjectRQ.setProjectName(projectName);
+    createProjectRQ.setProjectName(TEST_PROJECT_NAME);
+    createProjectRQ.setOrganizationId(TEST_ORG_ID);
     createProjectRQ.setEntryType("wrongType");
 
-    when(projectRepository.findByName(projectName.toLowerCase().trim())).thenReturn(
+    when(organizationRepository.findById(TEST_ORG_ID)).thenReturn(Optional.of(TEST_ORG));
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(
         Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
@@ -78,12 +87,12 @@ void createProjectByNotExistUser() {
         getRpUser("user", UserRole.ADMINISTRATOR, ProjectRole.PROJECT_MANAGER, 1L);
 
     CreateProjectRQ createProjectRQ = new CreateProjectRQ();
-    String projectName = "projectName";
-    createProjectRQ.setProjectName(projectName);
+    createProjectRQ.setProjectName(TEST_PROJECT_NAME);
+    createProjectRQ.setOrganizationId(TEST_ORG_ID);
     createProjectRQ.setEntryType("internal");
 
-    when(projectRepository.findByName(projectName.toLowerCase().trim())).thenReturn(
-        Optional.empty());
+    when(organizationRepository.findById(TEST_ORG_ID)).thenReturn(Optional.of(TEST_ORG));
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.empty());
     when(userRepository.findRawById(rpUser.getUserId())).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
@@ -92,4 +101,4 @@ void createProjectByNotExistUser() {
 
     assertEquals("User 'user' not found.", exception.getMessage());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/project/impl/DeleteProjectHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/project/impl/DeleteProjectHandlerImplTest.java
index 54ed8ef79c..f6e75c4d07 100644
--- a/src/test/java/com/epam/ta/reportportal/core/project/impl/DeleteProjectHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/project/impl/DeleteProjectHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.project.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -32,7 +33,6 @@
 import com.epam.ta.reportportal.core.events.MessageBus;
 import com.epam.ta.reportportal.core.events.activity.ProjectIndexEvent;
 import com.epam.ta.reportportal.core.remover.ContentRemover;
-import com.epam.ta.reportportal.dao.AttachmentRepository;
 import com.epam.ta.reportportal.dao.IssueTypeRepository;
 import com.epam.ta.reportportal.dao.LogRepository;
 import com.epam.ta.reportportal.dao.ProjectRepository;
@@ -111,62 +111,61 @@ void deleteNotExistProject() {
 
 	@Test
 	void deleteIndexOnNotExistProject() {
-		String projectName = "notExist";
+		String projectKey = "notExist";
 		when(analyzerServiceClient.hasClients()).thenReturn(true);
-		when(projectRepository.findByName(projectName)).thenReturn(Optional.empty());
+		when(projectRepository.findByKey(projectKey)).thenReturn(Optional.empty());
 
-		ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.deleteProjectIndex(projectName, "user"));
+		ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.deleteProjectIndex(projectKey, "user"));
 
 		assertEquals("Project 'notExist' not found. Did you use correct project name?", exception.getMessage());
 	}
 
 	@Test
 	void deleteProjectIndexByNotExistUser() {
-		String projectName = "notExist";
+		String projectKey = "notExist";
 		String userName = "user";
 		when(analyzerServiceClient.hasClients()).thenReturn(true);
-		when(projectRepository.findByName(projectName)).thenReturn(Optional.of(new Project()));
+		when(projectRepository.findByKey(projectKey)).thenReturn(Optional.of(new Project()));
 		when(userRepository.findByLogin(userName)).thenReturn(Optional.empty());
 
-		ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.deleteProjectIndex(projectName, "user"));
+		ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.deleteProjectIndex(projectKey, "user"));
 
 		assertEquals("User 'user' not found.", exception.getMessage());
 	}
 
 	@Test
 	void deleteIndexWhenIndexingRunning() {
-		String projectName = "test_project";
 		String userName = "user";
 		Long projectId = 1L;
 		when(analyzerServiceClient.hasClients()).thenReturn(true);
-		when(projectRepository.findByName(projectName)).thenReturn(Optional.of(getProjectWithAnalyzerAttributes(projectId, true)));
+		when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(getProjectWithAnalyzerAttributes(projectId, true)));
 		when(userRepository.findByLogin(userName)).thenReturn(Optional.of(new User()));
 
-		ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.deleteProjectIndex(projectName, "user"));
+		ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.deleteProjectIndex(TEST_PROJECT_KEY, "user"));
 
 		assertEquals("Forbidden operation. Index can not be removed until index generation proceeds.", exception.getMessage());
 	}
 
 	@Test
 	void deleteIndexWhenIndexingCacheNotInvalidated() {
-		String projectName = "test_project";
+		String projectKey = TEST_PROJECT_KEY;
 		String userName = "user";
 		Long projectId = 1L;
 		when(analyzerServiceClient.hasClients()).thenReturn(true);
-		when(projectRepository.findByName(projectName)).thenReturn(Optional.of(getProjectWithAnalyzerAttributes(projectId, false)));
+		when(projectRepository.findByKey(projectKey)).thenReturn(Optional.of(getProjectWithAnalyzerAttributes(projectId, false)));
 		when(userRepository.findByLogin(userName)).thenReturn(Optional.of(new User()));
 		Cache<Long, Long> cache = CacheBuilder.newBuilder().build();
 		cache.put(2L, projectId);
 		when(analyzerStatusCache.getAnalyzeStatus(AnalyzerStatusCache.AUTO_ANALYZER_KEY)).thenReturn(Optional.of(cache));
 
-		ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.deleteProjectIndex(projectName, "user"));
+		ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.deleteProjectIndex(projectKey, "user"));
 
 		assertEquals("Forbidden operation. Index can not be removed until index generation proceeds.", exception.getMessage());
 	}
 
 	@Test
 	void deleteIndexWhenThereAreNoAnalyzers() {
-		String projectName = "test_project";
+		String projectName = TEST_PROJECT_KEY;
 		when(analyzerServiceClient.hasClients()).thenReturn(false);
 
 		ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.deleteProjectIndex(projectName, "user"));
@@ -176,29 +175,28 @@ void deleteIndexWhenThereAreNoAnalyzers() {
 
 	@Test
 	void happyDeleteIndex() {
-		String projectName = "test_project";
 		String userName = "user";
 		Long projectId = 1L;
 		Project project = getProjectWithAnalyzerAttributes(projectId, false);
-		project.setName(projectName);
-		when(projectRepository.findByName(projectName)).thenReturn(Optional.of(project));
+		project.setName(TEST_PROJECT_KEY);
+		when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(project));
 		when(userRepository.findByLogin(userName)).thenReturn(Optional.of(new User()));
 		when(analyzerStatusCache.getAnalyzeStatus(AnalyzerStatusCache.AUTO_ANALYZER_KEY)).thenReturn(Optional.of(CacheBuilder.newBuilder()
 				.build()));
 		when(analyzerServiceClient.hasClients()).thenReturn(true);
 
-		OperationCompletionRS response = handler.deleteProjectIndex(projectName, "user");
+		OperationCompletionRS response = handler.deleteProjectIndex(TEST_PROJECT_KEY, "user");
 
 		verify(logIndexer, times(1)).deleteIndex(projectId);
 		verify(messageBus, times(1)).publishActivity(any(ProjectIndexEvent.class));
 
-		assertEquals(response.getResultMessage(), "Project index with name = '" + projectName + "' is successfully deleted.");
+		assertEquals(response.getResultMessage(), "Project index with key = '" + TEST_PROJECT_KEY + "' is successfully deleted.");
 
 	}
 
 	@Test
 	void deleteProjectTest() {
-		String projectName = "test_project";
+		String projectName = TEST_PROJECT_KEY;
 		Long projectId = 1L;
 		Project project = getProjectWithAnalyzerAttributes(projectId, false);
 		project.setName(projectName);
@@ -243,4 +241,4 @@ private Attribute getAttribute(String name) {
 		attribute.setName(name);
 		return attribute;
 	}
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/project/impl/GetProjectHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/project/impl/GetProjectHandlerImplTest.java
index 254b719e85..877ec3c1c7 100644
--- a/src/test/java/com/epam/ta/reportportal/core/project/impl/GetProjectHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/project/impl/GetProjectHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.project.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.commons.querygen.constant.UserCriteriaConstant.CRITERIA_ROLE;
 import static com.epam.ta.reportportal.util.TestProjectExtractor.extractProjectDetails;
@@ -58,18 +59,18 @@ class GetProjectHandlerImplTest {
   void getUsersOnNotExistProject() {
     long projectId = 1L;
 
-    String projectName = "test_project";
-    when(projectRepository.findByName(projectName)).thenReturn(Optional.empty());
+    String projectKey = TEST_PROJECT_KEY;
+    when(projectRepository.findByKey(projectKey)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class, () -> {
-      handler.getProjectUsers(projectName, Filter.builder().withTarget(User.class).withCondition(
+      handler.getProjectUsers(projectKey, Filter.builder().withTarget(User.class).withCondition(
               FilterCondition.builder().eq(CRITERIA_ROLE, UserRole.USER.name()).build()).build(),
           PageRequest.of(0, 10)
       );
     });
 
     assertEquals(
-        "Project 'test_project' not found. Did you use correct project name?",
+        "Project 'o-slug-project-name' not found. Did you use correct project name?",
         exception.getMessage()
     );
   }
@@ -78,11 +79,11 @@ void getUsersOnNotExistProject() {
   void getEmptyUserList() {
     long projectId = 1L;
 
-    String projectName = "test_project";
-    when(projectRepository.findByName(projectName)).thenReturn(Optional.of(new Project()));
+    String projectKey = TEST_PROJECT_KEY;
+    when(projectRepository.findByKey(projectKey)).thenReturn(Optional.of(new Project()));
 
     Iterable<UserResource> users =
-        handler.getProjectUsers(projectName, Filter.builder().withTarget(User.class).withCondition(
+        handler.getProjectUsers(projectKey, Filter.builder().withTarget(User.class).withCondition(
                 FilterCondition.builder().eq(CRITERIA_ROLE, UserRole.USER.name()).build()).build(),
             PageRequest.of(0, 10)
         );
@@ -92,18 +93,18 @@ void getEmptyUserList() {
 
   @Test
   void getNotExistProject() {
-    String projectName = "not_exist";
+    String projectKey = "not_exist";
     long projectId = 1L;
     ReportPortalUser user =
         getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER, projectId);
 
-    when(projectRepository.findByName(projectName)).thenReturn(Optional.empty());
+    when(projectRepository.findByKey(projectKey)).thenReturn(Optional.empty());
 
     ReportPortalException exception =
-        assertThrows(ReportPortalException.class, () -> handler.getResource(projectName, user));
+        assertThrows(ReportPortalException.class, () -> handler.getResource(projectKey, user));
 
     assertEquals(
-        "Project '" + projectName + "' not found. Did you use correct project name?",
+        "Project '" + projectKey + "' not found. Did you use correct project name?",
         exception.getMessage()
     );
   }
@@ -115,7 +116,7 @@ void getUserNamesByIncorrectTerm() {
         getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER, projectId);
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getUserNames(extractProjectDetails(user, "test_project"), "")
+        () -> handler.getUserNames(extractProjectDetails(user, TEST_PROJECT_KEY), "")
     );
 
     assertEquals(
@@ -128,8 +129,7 @@ void getUserNamesByIncorrectTerm() {
   void getUserNamesNegative() {
     ReportPortalException exception = assertThrows(
         ReportPortalException.class, () -> handler.getUserNames("",
-            new ReportPortalUser.ProjectDetails(1L, "superadmin_personal",
-                ProjectRole.PROJECT_MANAGER
+            new ReportPortalUser.ProjectDetails(1L, "superadmin_personal", ProjectRole.PROJECT_MANAGER, "project-key"
             ), PageRequest.of(0, 10)
         ));
     assertEquals(
@@ -137,4 +137,4 @@ void getUserNamesNegative() {
         exception.getMessage()
     );
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/CreateProjectSettingsHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/CreateProjectSettingsHandlerImplTest.java
index 3cd1ed4db7..41961054c6 100644
--- a/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/CreateProjectSettingsHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/CreateProjectSettingsHandlerImplTest.java
@@ -16,7 +16,7 @@
 
 package com.epam.ta.reportportal.core.project.settings.impl;
 
-import static com.epam.ta.reportportal.ReportPortalUserUtil.TEST_PROJECT_NAME;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -61,13 +61,14 @@ void createSubtypeOnNotExistProject() {
     ReportPortalUser user =
         getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER, projectId);
 
-    when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.empty());
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.createProjectIssueSubType(TEST_PROJECT_NAME, user, new CreateIssueSubTypeRQ())
+        () -> handler.createProjectIssueSubType(TEST_PROJECT_KEY, user, new CreateIssueSubTypeRQ())
     );
 
-    assertEquals("Project 'test_project' not found. Did you use correct project name?",
+    assertEquals(
+        String.format("Project '%s' not found. Did you use correct project name?", TEST_PROJECT_KEY),
         exception.getMessage()
     );
   }
@@ -78,13 +79,13 @@ void createSubtypeWithWrongGroup() {
     ReportPortalUser user =
         getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER, projectId);
 
-    when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.of(new Project()));
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(new Project()));
 
     CreateIssueSubTypeRQ createIssueSubTypeRQ = new CreateIssueSubTypeRQ();
     createIssueSubTypeRQ.setTypeRef("wrongType");
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.createProjectIssueSubType(TEST_PROJECT_NAME, user, createIssueSubTypeRQ)
+        () -> handler.createProjectIssueSubType(TEST_PROJECT_KEY, user, createIssueSubTypeRQ)
     );
 
     assertEquals("Error in handled Request. Please, check specified parameters: 'wrongType'",
@@ -101,13 +102,13 @@ void maxSubtypesCount() {
     ReportPortalUser user =
         getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER, projectId);
 
-    when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.of(project));
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(project));
 
     CreateIssueSubTypeRQ createIssueSubTypeRQ = new CreateIssueSubTypeRQ();
     createIssueSubTypeRQ.setTypeRef("product_bug");
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.createProjectIssueSubType(TEST_PROJECT_NAME, user, createIssueSubTypeRQ)
+        () -> handler.createProjectIssueSubType(TEST_PROJECT_KEY, user, createIssueSubTypeRQ)
     );
 
     assertEquals("Incorrect Request. Sub Issues count is bound of size limit",
@@ -127,4 +128,4 @@ private Set<ProjectIssueType> getSubTypes() {
     }
     return subTypes;
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/DeleteProjectSettingsHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/DeleteProjectSettingsHandlerImplTest.java
index 1a1b02a4bc..0503a6594b 100644
--- a/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/DeleteProjectSettingsHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/DeleteProjectSettingsHandlerImplTest.java
@@ -16,7 +16,7 @@
 
 package com.epam.ta.reportportal.core.project.settings.impl;
 
-import static com.epam.ta.reportportal.ReportPortalUserUtil.TEST_PROJECT_NAME;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -53,13 +53,14 @@ void deleteSubtypeOnNotExistProject() {
     ReportPortalUser user = getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER,
         projectId);
 
-    when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.empty());
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteProjectIssueSubType(TEST_PROJECT_NAME, user, 1L)
+        () -> handler.deleteProjectIssueSubType(TEST_PROJECT_KEY, user, 1L)
     );
 
-    assertEquals("Project 'test_project' not found. Did you use correct project name?",
+    assertEquals(
+        String.format("Project '%s' not found. Did you use correct project name?", TEST_PROJECT_KEY),
         exception.getMessage());
   }
 
@@ -69,13 +70,13 @@ void deleteNotExistSubtype() {
     ReportPortalUser user = getRpUser("user", UserRole.USER, ProjectRole.PROJECT_MANAGER,
         projectId);
 
-    when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.of(new Project()));
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(new Project()));
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.deleteProjectIssueSubType(TEST_PROJECT_NAME, user, 1L)
+        () -> handler.deleteProjectIssueSubType(TEST_PROJECT_KEY, user, 1L)
     );
 
     assertEquals("Issue Type '1' not found.", exception.getMessage());
   }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/GetProjectSettingsHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/GetProjectSettingsHandlerImplTest.java
index 8ad3cb5261..137c0b58ef 100644
--- a/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/GetProjectSettingsHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/GetProjectSettingsHandlerImplTest.java
@@ -16,7 +16,7 @@
 
 package com.epam.ta.reportportal.core.project.settings.impl;
 
-import static com.epam.ta.reportportal.ReportPortalUserUtil.TEST_PROJECT_NAME;
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.when;
@@ -45,12 +45,12 @@ class GetProjectSettingsHandlerImplTest {
   @Test
   void getProjectSettingOnNotExistProject() {
 
-    when(repository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.empty());
+    when(repository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.getProjectSettings(TEST_PROJECT_NAME));
+        () -> handler.getProjectSettings(TEST_PROJECT_KEY));
 
-    assertEquals("Project 'test_project' not found. Did you use correct project name?",
+    assertEquals("Project 'o-slug-project-name' not found. Did you use correct project name?",
         exception.getMessage());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/UpdateProjectSettingsHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/UpdateProjectSettingsHandlerImplTest.java
index 08588f7001..78da3fe0e1 100644
--- a/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/UpdateProjectSettingsHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/project/settings/impl/UpdateProjectSettingsHandlerImplTest.java
@@ -16,7 +16,8 @@
 
 package com.epam.ta.reportportal.core.project.settings.impl;
 
-import static com.epam.ta.reportportal.ReportPortalUserUtil.TEST_PROJECT_NAME;
+
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -58,7 +59,7 @@ void emptyRequest() {
     updateIssueSubTypeRQ.setIds(Collections.emptyList());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateProjectIssueSubType("test_project", user, updateIssueSubTypeRQ)
+        () -> handler.updateProjectIssueSubType(TEST_PROJECT_KEY, user, updateIssueSubTypeRQ)
     );
     assertEquals("Forbidden operation. Please specify at least one item data for update.",
         exception.getMessage()
@@ -74,12 +75,12 @@ void updateSubtypeOnNotExistProject() {
     UpdateIssueSubTypeRQ updateIssueSubTypeRQ = new UpdateIssueSubTypeRQ();
     updateIssueSubTypeRQ.setIds(Collections.singletonList(new UpdateOneIssueSubTypeRQ()));
 
-    when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.empty());
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.empty());
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateProjectIssueSubType(TEST_PROJECT_NAME, user, updateIssueSubTypeRQ)
+        () -> handler.updateProjectIssueSubType(TEST_PROJECT_KEY, user, updateIssueSubTypeRQ)
     );
-    assertEquals("Project 'test_project' not found. Did you use correct project name?",
+    assertEquals("Project 'o-slug-project-name' not found. Did you use correct project name?",
         exception.getMessage()
     );
   }
@@ -95,10 +96,10 @@ void updateSubtypeWithIncorrectGroup() {
     oneIssueSubTypeRQ.setTypeRef("wrongType");
     updateIssueSubTypeRQ.setIds(Collections.singletonList(oneIssueSubTypeRQ));
 
-    when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.of(new Project()));
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(new Project()));
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateProjectIssueSubType(TEST_PROJECT_NAME, user, updateIssueSubTypeRQ)
+        () -> handler.updateProjectIssueSubType(TEST_PROJECT_KEY, user, updateIssueSubTypeRQ)
     );
     assertEquals("Issue Type 'wrongType' not found.", exception.getMessage());
   }
@@ -115,11 +116,11 @@ void updateNotExistSubtype() {
     oneIssueSubTypeRQ.setLocator("locator");
     updateIssueSubTypeRQ.setIds(Collections.singletonList(oneIssueSubTypeRQ));
 
-    when(projectRepository.findByName(TEST_PROJECT_NAME)).thenReturn(Optional.of(new Project()));
+    when(projectRepository.findByKey(TEST_PROJECT_KEY)).thenReturn(Optional.of(new Project()));
 
     ReportPortalException exception = assertThrows(ReportPortalException.class,
-        () -> handler.updateProjectIssueSubType(TEST_PROJECT_NAME, user, updateIssueSubTypeRQ)
+        () -> handler.updateProjectIssueSubType(TEST_PROJECT_KEY, user, updateIssueSubTypeRQ)
     );
     assertEquals("Issue Type 'locator' not found.", exception.getMessage());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/core/user/impl/CreateUserHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/user/impl/CreateUserHandlerImplTest.java
index 848fa55dca..06ec6f34b7 100644
--- a/src/test/java/com/epam/ta/reportportal/core/user/impl/CreateUserHandlerImplTest.java
+++ b/src/test/java/com/epam/ta/reportportal/core/user/impl/CreateUserHandlerImplTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.core.user.impl;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static com.epam.ta.reportportal.core.user.impl.CreateUserHandlerImpl.BID_TYPE;
 import static com.epam.ta.reportportal.core.user.impl.CreateUserHandlerImpl.INTERNAL_BID_TYPE;
@@ -223,7 +224,7 @@ void createByAdminWithExistedEmailUppercase() {
   void createUserBid() {
     final ReportPortalUser rpUser =
         getRpUser("admin", UserRole.ADMINISTRATOR, ProjectRole.MEMBER, 1L);
-    final String projectName = "test_project";
+    final String projectName = TEST_PROJECT_KEY;
     final String email = "email@mail.com";
     final String role = ProjectRole.MEMBER.name();
 
@@ -329,7 +330,7 @@ public void createUserWithIncorrectLogin() {
   @Test
   void createUserWithIncorrectEmail() {
     final UserCreationBid bid = new UserCreationBid();
-    bid.setProjectName("test_project");
+    bid.setProjectName(TEST_PROJECT_KEY);
     when(userCreationBidRepository.findByUuidAndType("uuid", INTERNAL_BID_TYPE)).thenReturn(
         Optional.of(bid));
     when(userRepository.findByLogin("test")).thenReturn(Optional.empty());
@@ -348,7 +349,7 @@ void createUserWithIncorrectEmail() {
   @Test
   void createUserWithExistedEmail() {
     final UserCreationBid bid = new UserCreationBid();
-    bid.setProjectName("test_project");
+    bid.setProjectName(TEST_PROJECT_KEY);
     when(userCreationBidRepository.findByUuidAndType("uuid", INTERNAL_BID_TYPE)).thenReturn(
         Optional.of(bid));
     when(userRepository.findByLogin("test")).thenReturn(Optional.empty());
@@ -364,4 +365,4 @@ void createUserWithExistedEmail() {
         exception.getMessage()
     );
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/util/TestProjectExtractor.java b/src/test/java/com/epam/ta/reportportal/util/TestProjectExtractor.java
index 25e803fdd6..206cf65e37 100644
--- a/src/test/java/com/epam/ta/reportportal/util/TestProjectExtractor.java
+++ b/src/test/java/com/epam/ta/reportportal/util/TestProjectExtractor.java
@@ -10,8 +10,8 @@
 public class TestProjectExtractor {
 
   public static ReportPortalUser.ProjectDetails extractProjectDetails(ReportPortalUser user,
-      String projectName) {
-    final String normalizedProjectName = normalizeId(projectName);
+      String projectKey) {
+    final String normalizedProjectName = normalizeId(projectKey);
     return Optional.ofNullable(user.getProjectDetails().get(normalizedProjectName))
         .orElseThrow(() -> new ReportPortalException(ErrorType.ACCESS_DENIED,
             "Please check the list of your available projects."
diff --git a/src/test/java/com/epam/ta/reportportal/ws/controller/FileStorageControllerTest.java b/src/test/java/com/epam/ta/reportportal/ws/controller/FileStorageControllerTest.java
index b7fcbbda08..4df75da52b 100644
--- a/src/test/java/com/epam/ta/reportportal/ws/controller/FileStorageControllerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/ws/controller/FileStorageControllerTest.java
@@ -16,12 +16,21 @@
 
 package com.epam.ta.reportportal.ws.controller;
 
+import static com.epam.ta.reportportal.util.MultipartFileUtils.getMultipartFile;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
 import com.epam.ta.reportportal.binary.AttachmentBinaryDataService;
 import com.epam.ta.reportportal.commons.BinaryDataMetaInfo;
 import com.epam.ta.reportportal.dao.AttachmentRepository;
 import com.epam.ta.reportportal.entity.attachment.Attachment;
 import com.epam.ta.reportportal.entity.attachment.AttachmentMetaInfo;
 import com.epam.ta.reportportal.ws.BaseMvcTest;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.util.Optional;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
@@ -31,16 +40,6 @@
 import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
 
-import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
-import java.util.Optional;
-
-import static com.epam.ta.reportportal.util.MultipartFileUtils.getMultipartFile;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
 /**
  * @author <a href="mailto:ihar_kahadouski@epam.com">Ihar Kahadouski</a>
  */
@@ -152,4 +151,4 @@ void getNotExistUserPhoto() throws Exception {
 		mockMvc.perform(get("/v1/data/userphoto?id=not_exist").with(token(oAuthHelper.getSuperadminToken())))
 				.andExpect(status().isNotFound());
 	}
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/ws/controller/IntegrationControllerTest.java b/src/test/java/com/epam/ta/reportportal/ws/controller/IntegrationControllerTest.java
index 2227dfdf60..92730e3f41 100644
--- a/src/test/java/com/epam/ta/reportportal/ws/controller/IntegrationControllerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/ws/controller/IntegrationControllerTest.java
@@ -23,8 +23,8 @@
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
-import com.epam.ta.reportportal.ws.BaseMvcTest;
 import com.epam.ta.reportportal.model.integration.IntegrationRQ;
+import com.epam.ta.reportportal.ws.BaseMvcTest;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.util.HashMap;
 import java.util.Map;
@@ -277,4 +277,4 @@ void deleteAllProjectIntegrations() throws Exception {
             token(oAuthHelper.getDefaultToken())))
         .andExpect(status().isOk());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/ws/controller/LaunchAsyncControllerTest.java b/src/test/java/com/epam/ta/reportportal/ws/controller/LaunchAsyncControllerTest.java
index 1f80859eec..21d73ae7a6 100644
--- a/src/test/java/com/epam/ta/reportportal/ws/controller/LaunchAsyncControllerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/ws/controller/LaunchAsyncControllerTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.ws.controller;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -84,14 +85,14 @@ void startLaunch() {
 
     when(projectExtractor.extractProjectDetails(any(ReportPortalUser.class),
         anyString()
-    )).thenReturn(user.getProjectDetails().get("test_project"));
+    )).thenReturn(user.getProjectDetails().get(TEST_PROJECT_KEY));
 
-    launchAsyncController.startLaunch("test_project", startLaunchRQ, user);
+    launchAsyncController.startLaunch(TEST_PROJECT_KEY, startLaunchRQ, user);
     verify(startLaunchHandler).startLaunch(userArgumentCaptor.capture(),
         projectDetailsArgumentCaptor.capture(), requestArgumentCaptor.capture()
     );
     assertEquals(user, userArgumentCaptor.getValue());
-    assertEquals(user.getProjectDetails().get("test_project"),
+    assertEquals(user.getProjectDetails().get(TEST_PROJECT_KEY),
         projectDetailsArgumentCaptor.getValue()
     );
     assertEquals(startLaunchRQ, requestArgumentCaptor.getValue());
@@ -117,11 +118,11 @@ void finishLaunch() {
 
     when(projectExtractor.extractProjectDetails(any(ReportPortalUser.class),
         anyString()
-    )).thenReturn(user.getProjectDetails().get("test_project"));
+    )).thenReturn(user.getProjectDetails().get(TEST_PROJECT_KEY));
 
     when(httpServletRequest.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080"));
     when(httpServletRequest.getHeaderNames()).thenReturn(new Enumerator<>(Lists.newArrayList()));
-    launchAsyncController.finishLaunch("test_project", launchId, finishExecutionRQ, user,
+    launchAsyncController.finishLaunch(TEST_PROJECT_KEY, launchId, finishExecutionRQ, user,
         httpServletRequest
     );
     verify(finishLaunchHandler).finishLaunch(launchIdArgumentCaptor.capture(),
@@ -129,7 +130,7 @@ void finishLaunch() {
         userArgumentCaptor.capture(), urlArgumentCaptor.capture()
     );
     assertEquals(user, userArgumentCaptor.getValue());
-    assertEquals(user.getProjectDetails().get("test_project"),
+    assertEquals(user.getProjectDetails().get(TEST_PROJECT_KEY),
         projectDetailsArgumentCaptor.getValue()
     );
     assertEquals(finishExecutionRQ, requestArgumentCaptor.getValue());
@@ -151,16 +152,16 @@ void mergeLaunch() {
 
     when(projectExtractor.extractProjectDetails(any(ReportPortalUser.class),
         anyString()
-    )).thenReturn(user.getProjectDetails().get("test_project"));
+    )).thenReturn(user.getProjectDetails().get(TEST_PROJECT_KEY));
 
-    launchAsyncController.mergeLaunches("test_project", mergeLaunchesRQ, user);
+    launchAsyncController.mergeLaunches(TEST_PROJECT_KEY, mergeLaunchesRQ, user);
     verify(mergeLaunchHandler).mergeLaunches(projectDetailsArgumentCaptor.capture(),
         userArgumentCaptor.capture(), requestArgumentCaptor.capture()
     );
     assertEquals(user, userArgumentCaptor.getValue());
-    assertEquals(user.getProjectDetails().get("test_project"),
+    assertEquals(user.getProjectDetails().get(TEST_PROJECT_KEY),
         projectDetailsArgumentCaptor.getValue()
     );
     assertEquals(mergeLaunchesRQ, requestArgumentCaptor.getValue());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/ws/controller/LogAsyncControllerTest.java b/src/test/java/com/epam/ta/reportportal/ws/controller/LogAsyncControllerTest.java
index 4edba9ed06..46a9c81829 100644
--- a/src/test/java/com/epam/ta/reportportal/ws/controller/LogAsyncControllerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/ws/controller/LogAsyncControllerTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.ws.controller;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -75,16 +76,16 @@ void createLog() {
 
     when(projectExtractor.extractProjectDetails(any(ReportPortalUser.class),
         anyString())).thenReturn(user.getProjectDetails()
-        .get("test_project"));
+        .get(TEST_PROJECT_KEY));
 
-    logAsyncController.createLog("test_project", saveLogRQ, user);
+    logAsyncController.createLog(TEST_PROJECT_KEY, saveLogRQ, user);
     verify(createLogHandler).createLog(requestArgumentCaptor.capture(),
         fileArgumentCaptor.capture(), projectDetailsArgumentCaptor.capture());
     verify(validator).validate(requestArgumentCaptor.capture());
 
     requestArgumentCaptor.getAllValues().forEach(rq -> assertEquals(saveLogRQ, rq));
     assertEquals(null, fileArgumentCaptor.getValue());
-    assertEquals(user.getProjectDetails().get("test_project"),
+    assertEquals(user.getProjectDetails().get(TEST_PROJECT_KEY),
         projectDetailsArgumentCaptor.getValue());
   }
 
@@ -102,16 +103,16 @@ void createLogEntry() {
 
     when(projectExtractor.extractProjectDetails(any(ReportPortalUser.class),
         anyString())).thenReturn(user.getProjectDetails()
-        .get("test_project"));
+        .get(TEST_PROJECT_KEY));
 
-    logAsyncController.createLogEntry("test_project", saveLogRQ, user);
+    logAsyncController.createLogEntry(TEST_PROJECT_KEY, saveLogRQ, user);
     verify(createLogHandler).createLog(requestArgumentCaptor.capture(),
         fileArgumentCaptor.capture(), projectDetailsArgumentCaptor.capture());
     verify(validator).validate(requestArgumentCaptor.capture());
 
     requestArgumentCaptor.getAllValues().forEach(rq -> assertEquals(saveLogRQ, rq));
     assertEquals(null, fileArgumentCaptor.getValue());
-    assertEquals(user.getProjectDetails().get("test_project"),
+    assertEquals(user.getProjectDetails().get(TEST_PROJECT_KEY),
         projectDetailsArgumentCaptor.getValue());
   }
 
@@ -130,9 +131,9 @@ void createLogs() {
 
     when(projectExtractor.extractProjectDetails(any(ReportPortalUser.class),
         anyString())).thenReturn(user.getProjectDetails()
-        .get("test_project"));
+        .get(TEST_PROJECT_KEY));
 
-    logAsyncController.createLog("test_project", saveLogRQs, httpServletRequest, user);
+    logAsyncController.createLog(TEST_PROJECT_KEY, saveLogRQs, httpServletRequest, user);
     verify(validator, times(4)).validate(requestArgumentCaptor.capture());
     verify(createLogHandler, times(2)).createLog(requestArgumentCaptor.capture(),
         fileArgumentCaptor.capture(), projectDetailsArgumentCaptor.capture());
@@ -144,6 +145,6 @@ void createLogs() {
     requestArgumentCaptor.getAllValues().forEach(arg -> assertEquals(saveLogRQ, arg));
     fileArgumentCaptor.getAllValues().forEach(arg -> assertEquals(null, arg));
     projectDetailsArgumentCaptor.getAllValues()
-        .forEach(arg -> assertEquals(user.getProjectDetails().get("test_project"), arg));
+        .forEach(arg -> assertEquals(user.getProjectDetails().get(TEST_PROJECT_KEY), arg));
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/ws/controller/OrganizationControllerTest.java b/src/test/java/com/epam/ta/reportportal/ws/controller/OrganizationControllerTest.java
new file mode 100644
index 0000000000..22ea6371c3
--- /dev/null
+++ b/src/test/java/com/epam/ta/reportportal/ws/controller/OrganizationControllerTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2024 EPAM Systems
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.epam.ta.reportportal.ws.controller;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import com.epam.ta.reportportal.ws.BaseMvcTest;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Andrei Piankouski
+ */
+public class OrganizationControllerTest extends BaseMvcTest {
+
+  @Test
+  void getOrganization() throws Exception {
+    mockMvc.perform(get("/organization/1").with(token(oAuthHelper.getSuperadminToken())))
+        .andExpect(status().isOk());
+  }
+
+  @Test
+  void getAllOrganizations() throws Exception {
+    mockMvc.perform(get("/organization/list").with(token(oAuthHelper.getSuperadminToken())))
+        .andExpect(status().isOk());
+  }
+}
diff --git a/src/test/java/com/epam/ta/reportportal/ws/controller/ProjectControllerTest.java b/src/test/java/com/epam/ta/reportportal/ws/controller/ProjectControllerTest.java
index 4ddfa28f0d..bb6ee31f0a 100644
--- a/src/test/java/com/epam/ta/reportportal/ws/controller/ProjectControllerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/ws/controller/ProjectControllerTest.java
@@ -16,14 +16,30 @@
 
 package com.epam.ta.reportportal.ws.controller;
 
+import static java.util.Collections.singletonList;
+import static org.hamcrest.Matchers.hasSize;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.springframework.http.MediaType.APPLICATION_JSON;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
 import com.epam.ta.reportportal.core.events.activity.ProjectIndexEvent;
 import com.epam.ta.reportportal.dao.ProjectRepository;
 import com.epam.ta.reportportal.entity.enums.LogicalOperator;
 import com.epam.ta.reportportal.entity.project.Project;
 import com.epam.ta.reportportal.entity.project.ProjectAttribute;
-import com.epam.ta.reportportal.ws.BaseMvcTest;
 import com.epam.ta.reportportal.model.DeleteBulkRQ;
-import com.epam.ta.reportportal.ws.model.attribute.ItemAttributeResource;
 import com.epam.ta.reportportal.model.project.AssignUsersRQ;
 import com.epam.ta.reportportal.model.project.CreateProjectRQ;
 import com.epam.ta.reportportal.model.project.UnassignUsersRQ;
@@ -31,12 +47,20 @@
 import com.epam.ta.reportportal.model.project.config.ProjectConfigurationUpdate;
 import com.epam.ta.reportportal.model.project.email.ProjectNotificationConfigDTO;
 import com.epam.ta.reportportal.model.project.email.SenderCaseDTO;
+import com.epam.ta.reportportal.ws.BaseMvcTest;
+import com.epam.ta.reportportal.ws.model.attribute.ItemAttributeResource;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.rabbitmq.http.client.Client;
 import com.rabbitmq.http.client.domain.ExchangeInfo;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
@@ -48,18 +72,6 @@
 import org.springframework.test.context.jdbc.Sql;
 import org.springframework.test.web.servlet.ResultActions;
 
-import java.util.*;
-
-import static java.util.Collections.singletonList;
-import static org.hamcrest.Matchers.hasSize;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.*;
-import static org.springframework.http.MediaType.APPLICATION_JSON;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
 /**
  * @author <a href="mailto:ihar_kahadouski@epam.com">Ihar Kahadouski</a>
  */
@@ -90,6 +102,8 @@ void createProjectPositive() throws Exception {
 		CreateProjectRQ rq = new CreateProjectRQ();
 		rq.setProjectName("TestProject");
 		rq.setEntryType("INTERNAL");
+    rq.setOrganizationId(1L);
+
 		mockMvc.perform(post("/v1/project").content(objectMapper.writeValueAsBytes(rq))
 				.contentType(APPLICATION_JSON)
 				.with(token(oAuthHelper.getSuperadminToken()))).andExpect(status().isCreated());
@@ -140,7 +154,7 @@ void updateProjectPositive() throws Exception {
 				.contentType(APPLICATION_JSON)
 				.with(token(oAuthHelper.getSuperadminToken()))).andExpect(status().isOk());
 
-		Project project = projectRepository.findByName("test_project").get();
+		Project project = projectRepository.findByKey("test_project").get();
 		projectAttributes.forEach((key, value) -> {
 			Optional<ProjectAttribute> pa = project.getProjectAttributes()
 					.stream()
diff --git a/src/test/java/com/epam/ta/reportportal/ws/controller/TestItemAsyncControllerTest.java b/src/test/java/com/epam/ta/reportportal/ws/controller/TestItemAsyncControllerTest.java
index d0618eabc4..a8f92d3975 100644
--- a/src/test/java/com/epam/ta/reportportal/ws/controller/TestItemAsyncControllerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/ws/controller/TestItemAsyncControllerTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.ws.controller;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_PROJECT_KEY;
 import static com.epam.ta.reportportal.ReportPortalUserUtil.getRpUser;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -73,15 +74,15 @@ void startRootItem() {
 
     when(projectExtractor.extractProjectDetails(any(ReportPortalUser.class),
         anyString())).thenReturn(user.getProjectDetails()
-        .get("test_project"));
+        .get(TEST_PROJECT_KEY));
 
-    testItemAsyncController.startRootItem("test_project", user, startTestItemRQ);
+    testItemAsyncController.startRootItem(TEST_PROJECT_KEY, user, startTestItemRQ);
     verify(startTestItemHandler).startRootItem(userArgumentCaptor.capture(),
         projectDetailsArgumentCaptor.capture(),
         requestArgumentCaptor.capture()
     );
     assertEquals(user, userArgumentCaptor.getValue());
-    assertEquals(user.getProjectDetails().get("test_project"),
+    assertEquals(user.getProjectDetails().get(TEST_PROJECT_KEY),
         projectDetailsArgumentCaptor.getValue());
     assertEquals(startTestItemRQ, requestArgumentCaptor.getValue());
   }
@@ -104,16 +105,16 @@ void startChildItem() {
 
     when(projectExtractor.extractProjectDetails(any(ReportPortalUser.class),
         anyString())).thenReturn(user.getProjectDetails()
-        .get("test_project"));
+        .get(TEST_PROJECT_KEY));
 
-    testItemAsyncController.startChildItem("test_project", user, parentItem, startTestItemRQ);
+    testItemAsyncController.startChildItem(TEST_PROJECT_KEY, user, parentItem, startTestItemRQ);
     verify(startTestItemHandler).startChildItem(userArgumentCaptor.capture(),
         projectDetailsArgumentCaptor.capture(),
         requestArgumentCaptor.capture(),
         parentArgumentCaptor.capture()
     );
     assertEquals(user, userArgumentCaptor.getValue());
-    assertEquals(user.getProjectDetails().get("test_project"),
+    assertEquals(user.getProjectDetails().get(TEST_PROJECT_KEY),
         projectDetailsArgumentCaptor.getValue());
     assertEquals(startTestItemRQ, requestArgumentCaptor.getValue());
   }
@@ -137,17 +138,17 @@ void finishTestItem() {
 
     when(projectExtractor.extractProjectDetails(any(ReportPortalUser.class),
         anyString())).thenReturn(user.getProjectDetails()
-        .get("test_project"));
+        .get(TEST_PROJECT_KEY));
 
-    testItemAsyncController.finishTestItem("test_project", user, testItemId, finishTestItemRQ);
+    testItemAsyncController.finishTestItem(TEST_PROJECT_KEY, user, testItemId, finishTestItemRQ);
     verify(finishTestItemHandler).finishTestItem(userArgumentCaptor.capture(),
         projectDetailsArgumentCaptor.capture(),
         testItemCaptor.capture(),
         requestArgumentCaptor.capture()
     );
     assertEquals(user, userArgumentCaptor.getValue());
-    assertEquals(user.getProjectDetails().get("test_project"),
+    assertEquals(user.getProjectDetails().get(TEST_PROJECT_KEY),
         projectDetailsArgumentCaptor.getValue());
     assertEquals(finishTestItemRQ, requestArgumentCaptor.getValue());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/ws/controller/UserControllerTest.java b/src/test/java/com/epam/ta/reportportal/ws/controller/UserControllerTest.java
index 7807873e40..64cf3a1199 100644
--- a/src/test/java/com/epam/ta/reportportal/ws/controller/UserControllerTest.java
+++ b/src/test/java/com/epam/ta/reportportal/ws/controller/UserControllerTest.java
@@ -16,6 +16,20 @@
 
 package com.epam.ta.reportportal.ws.controller;
 
+import static com.epam.ta.reportportal.commons.EntityUtils.normalizeId;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.when;
+import static org.springframework.http.MediaType.APPLICATION_JSON;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
 import com.epam.ta.reportportal.dao.IssueTypeRepository;
 import com.epam.ta.reportportal.dao.ProjectRepository;
 import com.epam.ta.reportportal.dao.UserRepository;
@@ -24,13 +38,24 @@
 import com.epam.ta.reportportal.entity.item.issue.IssueType;
 import com.epam.ta.reportportal.entity.project.Project;
 import com.epam.ta.reportportal.entity.project.ProjectIssueType;
-import com.epam.ta.reportportal.ws.BaseMvcTest;
 import com.epam.ta.reportportal.model.DeleteBulkRQ;
 import com.epam.ta.reportportal.model.Page;
+import com.epam.ta.reportportal.model.user.ChangePasswordRQ;
+import com.epam.ta.reportportal.model.user.CreateUserBidRS;
+import com.epam.ta.reportportal.model.user.CreateUserRQ;
+import com.epam.ta.reportportal.model.user.CreateUserRQConfirm;
+import com.epam.ta.reportportal.model.user.CreateUserRQFull;
+import com.epam.ta.reportportal.model.user.CreateUserRS;
+import com.epam.ta.reportportal.model.user.EditUserRQ;
+import com.epam.ta.reportportal.model.user.ResetPasswordRQ;
+import com.epam.ta.reportportal.model.user.RestorePasswordRQ;
+import com.epam.ta.reportportal.ws.BaseMvcTest;
 import com.epam.ta.reportportal.ws.model.ValidationConstraints;
-import com.epam.ta.reportportal.model.user.*;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Disabled;
@@ -39,19 +64,6 @@
 import org.springframework.test.context.jdbc.Sql;
 import org.springframework.test.web.servlet.MvcResult;
 
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import static com.epam.ta.reportportal.commons.EntityUtils.normalizeId;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.when;
-import static org.springframework.http.MediaType.APPLICATION_JSON;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
 /**
  * @author <a href="mailto:ihar_kahadouski@epam.com">Ihar Kahadouski</a>
  */
@@ -376,4 +388,4 @@ void exportUsers() throws Exception {
     mockMvc.perform(get("/v1/user/export").with(token(oAuthHelper.getSuperadminToken())))
         .andExpect(status().isOk());
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/epam/ta/reportportal/ws/converter/converters/OrganizationConverterTest.java b/src/test/java/com/epam/ta/reportportal/ws/converter/converters/OrganizationConverterTest.java
new file mode 100644
index 0000000000..a71a58320b
--- /dev/null
+++ b/src/test/java/com/epam/ta/reportportal/ws/converter/converters/OrganizationConverterTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2024 EPAM Systems
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.epam.ta.reportportal.ws.converter.converters;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import com.epam.ta.reportportal.entity.enums.OrganizationType;
+import com.epam.ta.reportportal.entity.organization.Organization;
+import com.epam.ta.reportportal.model.OrganizationResource;
+import java.time.LocalDateTime;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Andrei Piankouski
+ */
+class OrganizationConverterTest {
+
+  @Test
+  void testNull() {
+    assertThrows(NullPointerException.class,
+        () -> OrganizationConverter.TO_ORGANIZATION_RESOURCE.apply(null));
+  }
+
+  @Test
+  void testConvert() {
+    final Organization org = new Organization(1L,
+        LocalDateTime.now(),
+        "my-org-name",
+        OrganizationType.INTERNAL,
+        "my-org-slug");
+
+    final OrganizationResource organizationResource = OrganizationConverter.TO_ORGANIZATION_RESOURCE.apply(org);
+
+    assertEquals(organizationResource.getOrganizationId(), org.getId());
+    assertEquals(organizationResource.getOrganizationName(), org.getName());
+    assertEquals(organizationResource.getOrganizationSlug(), org.getSlug());
+  }
+}
diff --git a/src/test/java/com/epam/ta/reportportal/ws/converter/converters/UserConverterTest.java b/src/test/java/com/epam/ta/reportportal/ws/converter/converters/UserConverterTest.java
index 9cc250ff48..1ed79706d0 100644
--- a/src/test/java/com/epam/ta/reportportal/ws/converter/converters/UserConverterTest.java
+++ b/src/test/java/com/epam/ta/reportportal/ws/converter/converters/UserConverterTest.java
@@ -16,6 +16,7 @@
 
 package com.epam.ta.reportportal.ws.converter.converters;
 
+import static com.epam.ta.reportportal.OrganizationUtil.TEST_ORG;
 import static org.assertj.core.api.Java6Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -49,8 +50,7 @@ void toResource() {
     assertEquals(resource.getUserRole(), user.getRole().name());
     assertEquals(resource.getAccountType(), user.getUserType().name());
     assertEquals(resource.getPhotoId(), user.getAttachment());
-    assertThat((HashMap<String, Object>) resource.getMetadata()).containsAllEntriesOf(
-        getMetadata());
+    assertThat((HashMap<String, Object>) resource.getMetadata()).containsAllEntriesOf(getMetadata());
     assertThat(resource.getAssignedProjects()).containsKeys("project1", "project2");
   }
 
@@ -78,17 +78,24 @@ private static User getUser() {
     user.setExpired(false);
     final HashMap<String, Object> metadata = getMetadata();
     user.setMetadata(new Metadata(metadata));
+
     final Project project1 = new Project();
     project1.setName("project1");
+    project1.setKey("project1");
     project1.setProjectType(ProjectType.INTERNAL);
+    project1.setOrganization(TEST_ORG);
     final ProjectUser projectUser1 =
         new ProjectUser().withProject(project1).withProjectRole(ProjectRole.MEMBER).withUser(user);
+
     final Project project2 = new Project();
     project2.setName("project2");
+    project2.setKey("project2");
     project2.setProjectType(ProjectType.INTERNAL);
+    project2.setOrganization(TEST_ORG);
     final ProjectUser projectUser2 =
         new ProjectUser().withProject(project2).withProjectRole(ProjectRole.PROJECT_MANAGER)
             .withUser(user);
+
     user.setProjects(Sets.newHashSet(projectUser1, projectUser2));
     return user;
   }
@@ -99,4 +106,4 @@ private static HashMap<String, Object> getMetadata() {
     metadata.put("key2", "value2");
     return metadata;
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/resources/db/migration/V001004__add_organizations.sql b/src/test/resources/db/migration/V001004__add_organizations.sql
new file mode 100644
index 0000000000..507a0cca0a
--- /dev/null
+++ b/src/test/resources/db/migration/V001004__add_organizations.sql
@@ -0,0 +1,24 @@
+-- Update 'project' table
+INSERT INTO public.organization (name, slug, organization_type)
+  VALUES ('My org', 'my-org', 'INTERNAL');
+
+UPDATE public.project AS prj SET
+  "organization_id" = 1,
+  "key" = slugify(name),
+  "slug" = slugify(name);
+
+INSERT INTO organization_user (user_id, organization_id, organization_role)
+(SELECT pu.user_id, (SELECT o.id FROM organization o LIMIT 1), (SELECT 'MEMBER'::public."organization_role_enum")
+FROM project_user pu
+WHERE pu."project_role" IN
+  ('OPERATOR'::public."project_role_enum",
+   'CUSTOMER'::public."project_role_enum",
+   'MEMBER'::public."project_role_enum"
+   )
+);
+
+
+INSERT INTO organization_user (user_id, organization_id, organization_role )
+(SELECT pu.user_id, (SELECT o.id FROM organization o LIMIT 1), (SELECT 'MANAGER'::public."organization_role_enum")
+FROM project_user pu
+WHERE pu.project_role = 'PROJECT_MANAGER'::public."project_role_enum");
diff --git a/src/test/resources/db/project/project-fill.sql b/src/test/resources/db/project/project-fill.sql
index 576a09817f..d3b4b75224 100644
--- a/src/test/resources/db/project/project-fill.sql
+++ b/src/test/resources/db/project/project-fill.sql
@@ -1,5 +1,8 @@
-insert into project (id, name, project_type, organization, creation_date)
-values (3, 'test_project', 'INTERNAL', 'org', now());
+INSERT INTO public.organization (id, name, slug, organization_type)
+  VALUES (101, 'test Org', 'org', 'INTERNAL');
+
+insert into project (id, name, project_type, organization, organization_id, key, slug, creation_date)
+values (3, 'test_project', 'INTERNAL', 'org', 101, 'test_project', 'test_project', now());
 
 INSERT INTO project_attribute (attribute_id, value, project_id)
 VALUES (1, '1 day', 3),
@@ -164,4 +167,4 @@ insert into launch(id, uuid, project_id, user_id, name, description, start_time,
 values (3, 'uuid3', 1, 1, 'empty launch', 'desc', now(), null, 2, now(), 'DEFAULT', 'FAILED', false);
 
 alter sequence project_id_seq restart with 4;
-alter sequence users_id_seq restart with 4;
\ No newline at end of file
+alter sequence users_id_seq restart with 4;