logger.trace("Keystone Version: {} ", keystoneVersion);
         this.osClient = new MsoCloudClientFactoryImpl(new OpenstackClientFactoryImpl()).getOpenstackClient(
                 cloudIdentity.getIdentityUrl(), cloudIdentity.getMsoId(), cloudIdentity.getMsoPass(), regionId,
-                tenantId, keystoneVersion);
+                tenantId, keystoneVersion, cloudIdentity.getUserDomainName(), cloudIdentity.getProjectDomainName());
         logger.trace("Successfully authenticated with keystone for tenant: {} and region: {}", tenantId, regionId);
         return osClient;
     }
 
 
 
     OpenstackClient getOpenstackClient(String url, String msoId, String msoPass, String regionId, String tenantId,
-            String keystoneVersion) throws HeatBridgeException;
+            String keystoneVersion, String userDomainName, String projectDomainName) throws HeatBridgeException;
 }
 
 
     @Override
     public OpenstackClient getOpenstackClient(@Nonnull String url, @Nonnull String msoId, @Nonnull String msoPass,
-            @Nonnull String regionId, @Nonnull String tenantId, @Nonnull String keystoneVersion)
-            throws HeatBridgeException {
+            @Nonnull String regionId, @Nonnull String tenantId, @Nonnull String keystoneVersion, String userDomainName,
+            String projectDomainName) throws HeatBridgeException {
         Objects.requireNonNull(url, "Null openstack url!");
         Objects.requireNonNull(msoId, "Null openstack user id!");
         Objects.requireNonNull(msoPass, "Null openstack password!");
         Objects.requireNonNull(regionId, "Null regionId ID!");
         Objects.requireNonNull(tenantId, "Null tenant ID!");
-        Objects.requireNonNull(tenantId, "Null keystone version");
+        Objects.requireNonNull(keystoneVersion, "Null keystone version");
+        if (userDomainName == null) {
+            userDomainName = HeatBridgeConstants.OS_DEFAULT_DOMAIN_NAME;
+        }
+        if (projectDomainName == null) {
+            projectDomainName = HeatBridgeConstants.OS_DEFAULT_DOMAIN_NAME;
+        }
         try {
             final OpenstackAccess osAccess = new OpenstackAccessBuilder().setBaseUrl(url) // keystone URL
                     .setUser(msoId) // keystone username
                     .setPassword(CryptoUtils.decryptCloudConfigPassword(msoPass)) // keystone decrypted password
                     .setRegion(regionId) // openstack region
-                    .setDomainName(HeatBridgeConstants.OS_DEFAULT_DOMAIN_NAME) // hardcode to "default"
-                    .setTenantId(tenantId) // tenantId
+                    .setDomainName(userDomainName).setProjectName(projectDomainName).setTenantId(tenantId) // tenantId
                     .build();
 
             // Identify the Keystone version
 
         return projectName;
     }
 
+    public Identifier getProjectNameIdentifier() {
+        return Identifier.byName(projectName);
+    }
+
     public static class OpenstackAccessBuilder {
 
         private String baseUrl;
 
         try {
             client = OSFactory.builderV3().endpoint(osAccess.getUrl())
                     .credentials(osAccess.getUser(), osAccess.getPassword(), osAccess.getDomainNameIdentifier())
-                    .scopeToProject(Identifier.byId(osAccess.getTenantId())).authenticate()
-                    .useRegion(osAccess.getRegion());
+                    .scopeToProject(Identifier.byId(osAccess.getTenantId()), osAccess.getProjectNameIdentifier())
+                    .authenticate().useRegion(osAccess.getRegion());
             return new OpenstackV3ClientImpl(client);
         } catch (AuthenticationException exception) {
             throw new OpenstackClientException("Failed to authenticate with Keystone-v3: " + osAccess.getUrl(),
 
     private static final String ENCRYPTED_PASSWORD = CryptoUtils.encryptCloudConfigPassword("testPassword");
     private static final String REGION_ID = "testCloudRegionId";
     private static final String TENANT_ID = "testTenantId";
+    private static final String USER_DOMAIN_NAME = "userDomainName";
+    private static final String PROJECT_DOMAIN_NAME = "projectDomainName";
 
     private MsoCloudClientFactoryImpl testedObject;
     private OpenstackClientFactory openstackClientFactoryMock;
 
     @Test
     public void getOpenstackClientWithVersion2() throws Exception {
-        testedObject.getOpenstackClient(URL_V2, MSO_ID, ENCRYPTED_PASSWORD, REGION_ID, TENANT_ID, "v2.0");
+        testedObject.getOpenstackClient(URL_V2, MSO_ID, ENCRYPTED_PASSWORD, REGION_ID, TENANT_ID, "v2.0", null, null);
         verify(openstackClientFactoryMock).createOpenstackV2Client(any(OpenstackAccess.class));
     }
 
     @Test
     public void getOpenstackClientWithVersion3() throws Exception {
-        testedObject.getOpenstackClient(URL_V3, MSO_ID, ENCRYPTED_PASSWORD, REGION_ID, TENANT_ID, "v3");
+        testedObject.getOpenstackClient(URL_V3, MSO_ID, ENCRYPTED_PASSWORD, REGION_ID, TENANT_ID, "v3",
+                USER_DOMAIN_NAME, PROJECT_DOMAIN_NAME);
         verify(openstackClientFactoryMock).createOpenstackV3Client(any(OpenstackAccess.class));
     }
 
     @Test(expected = HeatBridgeException.class)
     public void getOpenstackClient_unsupportedVersion() throws Exception {
         testedObject.getOpenstackClient(URL_WITH_UNSUPPORTED_VERSION, MSO_ID, ENCRYPTED_PASSWORD, REGION_ID, TENANT_ID,
-                "UNKNOWN");
+                "UNKNOWN", USER_DOMAIN_NAME, PROJECT_DOMAIN_NAME);
     }
 
 }