Merge pull request #261 from isururanawaka/airavata-custos-integration

 Custos integration related changes
diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 0000000..0fabe21
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,13 @@
+github:
+  description: "A general purpose Distributed Systems Framework"
+  homepage: https://airavata.apache.org/
+  labels:
+    - airavata
+    - sciencegateways
+    - gateways
+    - cloudnative
+    - microservices
+    - java
+    - workfloworchestrator
+    - workflow
+    - bigdata
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index f2d127f..459c9a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,3 +35,8 @@
 .settings
 .classpath
 .factorypath
+
+venv
+airavata_custos.egg-info
+*.pyc
+.tox
diff --git a/.travis.yml b/.travis.yml
index d87053a..21894a5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -28,7 +28,7 @@
     on_failure: always
 
 jdk:
-  - oraclejdk8
+  - oraclejdk11
 
 script: mvn clean install
 
diff --git a/README.md b/README.md
index c64cbc9..4eb1bd0 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,7 @@
-[![Build Status](https://travis-ci.org/apache/airavata.svg?branch=master)](https://travis-ci.org/apache/airavata)
-
+[![License](http://img.shields.io/badge/license-Apache--2-blue.svg?style=flat)](https://apache.org/licenses/LICENSE-2.0)
+[![Build Status](https://travis-ci.org/apache/airavata.png?branch=develop)](https://travis-ci.org/github/apache/airavata)
 
 Apache Airavata Source - README.txt
-Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0
 --------------------------------------------------------------------------------
 
 About
diff --git a/airavata-api/airavata-api-server/pom.xml b/airavata-api/airavata-api-server/pom.xml
index 2422c21..12c03f5 100644
--- a/airavata-api/airavata-api-server/pom.xml
+++ b/airavata-api/airavata-api-server/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-api</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -143,10 +143,18 @@
             <artifactId>profile-service-stubs</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <!--  Custos Services  -->
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>custos-java-sdk</artifactId>
+            <version>${org.apache.custos.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.jmockit</groupId>
             <artifactId>jmockit</artifactId>
-            <version>1.39</version>
+            <version>${jmockit.version}</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/AiravataAPIServer.java b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/AiravataAPIServer.java
index 277ab08..b666261 100644
--- a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/AiravataAPIServer.java
+++ b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/AiravataAPIServer.java
@@ -182,7 +182,8 @@
 	@Override
 	public void start() throws Exception {
 		setStatus(ServerStatus.STARTING);
-        //Obtain a AiravataServerHandler object from Guice which is wrapped with interception logic.
+        //Obtain a AiravataServerHandl
+		// er object from Guice which is wrapped with interception logic.
         Injector injector = Guice.createInjector(new SecurityModule());
         Airavata.Processor<Airavata.Iface> airavataAPIServer =
                 new Airavata.Processor<Airavata.Iface>(injector.getInstance(AiravataServerHandler.class));
diff --git a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
index 6e091a5..cb506fa 100644
--- a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
+++ b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
@@ -1,5 +1,4 @@
 /**
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -7,9 +6,9 @@
  * to you 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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
@@ -25,15 +24,9 @@
 import org.apache.airavata.accountprovisioning.SSHAccountProvisionerProvider;
 import org.apache.airavata.api.Airavata;
 import org.apache.airavata.api.airavata_apiConstants;
-import org.apache.airavata.model.appcatalog.parser.Parser;
-import org.apache.airavata.model.appcatalog.parser.ParsingTemplate;
-import org.apache.airavata.service.security.GatewayGroupsInitializer;
 import org.apache.airavata.common.exception.AiravataException;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.utils.AiravataUtils;
-import org.apache.airavata.common.utils.Constants;
-import org.apache.airavata.common.utils.ServerSettings;
-import org.apache.airavata.common.utils.ThriftClientPool;
+import org.apache.airavata.common.utils.*;
 import org.apache.airavata.credential.store.cpi.CredentialStoreService;
 import org.apache.airavata.messaging.core.MessageContext;
 import org.apache.airavata.messaging.core.MessagingFactory;
@@ -54,6 +47,8 @@
 import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
+import org.apache.airavata.model.appcatalog.parser.Parser;
+import org.apache.airavata.model.appcatalog.parser.ParsingTemplate;
 import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
 import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
 import org.apache.airavata.model.appcatalog.userresourceprofile.UserResourceProfile;
@@ -61,7 +56,8 @@
 import org.apache.airavata.model.application.io.InputDataObjectType;
 import org.apache.airavata.model.application.io.OutputDataObjectType;
 import org.apache.airavata.model.commons.airavata_commonsConstants;
-import org.apache.airavata.model.credential.store.*;
+import org.apache.airavata.model.credential.store.CredentialSummary;
+import org.apache.airavata.model.credential.store.SummaryType;
 import org.apache.airavata.model.data.movement.DMType;
 import org.apache.airavata.model.data.movement.*;
 import org.apache.airavata.model.data.replica.DataProductModel;
@@ -85,14 +81,22 @@
 import org.apache.airavata.model.workspace.Project;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
+import org.apache.airavata.service.security.GatewayGroupsInitializer;
 import org.apache.airavata.service.security.interceptor.SecurityCheck;
-import org.apache.airavata.sharing.registry.models.*;
+import org.apache.airavata.sharing.registry.models.User;
+import org.apache.airavata.sharing.registry.models.UserGroup;
 import org.apache.airavata.sharing.registry.service.cpi.SharingRegistryService;
-import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.apache.custos.resource.secret.management.client.ResourceSecretManagementClient;
+import org.apache.custos.resource.secret.service.*;
+import org.apache.custos.sharing.management.client.SharingManagementClient;
+import org.apache.custos.sharing.service.*;
+import org.apache.custos.user.management.client.UserManagementClient;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.util.*;
 import java.util.function.BiFunction;
 import java.util.stream.Collectors;
@@ -106,29 +110,26 @@
     private ThriftClientPool<RegistryService.Client> registryClientPool;
     private ThriftClientPool<CredentialStoreService.Client> csClientPool;
 
+    private SharingManagementClient sharingManagementClient;
+    private UserManagementClient userManagementClient;
+    private ResourceSecretManagementClient resourceSecretClient;
+
+
     public AiravataServerHandler() {
         try {
             statusPublisher = MessagingFactory.getPublisher(Type.STATUS);
             experimentPublisher = MessagingFactory.getPublisher(Type.EXPERIMENT_LAUNCH);
 
-            GenericObjectPool.Config poolConfig = new GenericObjectPool.Config();
-            poolConfig.maxActive = 100;
-            poolConfig.minIdle = 5;
-            poolConfig.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
-            poolConfig.testOnBorrow = true;
-            poolConfig.testWhileIdle = true;
-            poolConfig.numTestsPerEvictionRun = 10;
-            poolConfig.maxWait = 3000;
-
-            sharingClientPool = new ThriftClientPool<>(
-                    tProtocol -> new SharingRegistryService.Client(tProtocol), poolConfig, ServerSettings.getSharingRegistryHost(),
-                    Integer.parseInt(ServerSettings.getSharingRegistryPort()));
             registryClientPool = new ThriftClientPool<>(
-                    tProtocol -> new RegistryService.Client(tProtocol), poolConfig, ServerSettings.getRegistryServerHost(),
+                    tProtocol -> new RegistryService.Client(tProtocol),
+                    this.<RegistryService.Client>createGenericObjectPoolConfig(),
+                    ServerSettings.getRegistryServerHost(),
                     Integer.parseInt(ServerSettings.getRegistryServerPort()));
-            csClientPool = new ThriftClientPool<>(
-                    tProtocol -> new CredentialStoreService.Client(tProtocol), poolConfig, ServerSettings.getCredentialStoreServerHost(),
-                    Integer.parseInt(ServerSettings.getCredentialStoreServerPort()));
+
+            sharingManagementClient = CustosUtils.getCustosClientProvider().getSharingManagementClient();
+            userManagementClient = CustosUtils.getCustosClientProvider().getUserManagementClient();
+            resourceSecretClient = CustosUtils.getCustosClientProvider().getResourceSecretManagementClient();
+
 
             initSharingRegistry();
             postInitDefaultGateway();
@@ -138,9 +139,26 @@
             logger.error("Error occured while reading airavata-server properties..", e);
         } catch (TException e) {
             logger.error("Error occured while reading airavata-server properties..", e);
+        } catch (IOException e) {
+            logger.error("Error occured while initializing custos clients..", e);
         }
     }
 
+    private <T> GenericObjectPoolConfig<T> createGenericObjectPoolConfig() {
+
+        GenericObjectPoolConfig<T> poolConfig = new GenericObjectPoolConfig<T>();
+        poolConfig.setMaxTotal(100);
+        poolConfig.setMinIdle(5);
+        poolConfig.setBlockWhenExhausted(true);
+        poolConfig.setTestOnBorrow(true);
+        poolConfig.setTestWhileIdle(true);
+        // must set timeBetweenEvictionRunsMillis since eviction doesn't run unless that is positive
+        poolConfig.setTimeBetweenEvictionRunsMillis(5L * 60L * 1000L);
+        poolConfig.setNumTestsPerEvictionRun(10);
+        poolConfig.setMaxWaitMillis(3000);
+        return poolConfig;
+    }
+
     /**
      * This method creates a password token for the default gateway profile. Default gateway is originally initialized
      * at the registry server but we can not add the password token at that step as the credential store is not initialized
@@ -150,6 +168,7 @@
 
         RegistryService.Client registryClient = registryClientPool.getResource();
         try {
+            String custosId = ServerSettings.getDefaultGatewayCustosClientId();
 
             GatewayResourceProfile gatewayResourceProfile = registryClient.getGatewayResourceProfile(ServerSettings.getDefaultUserGateway());
             if (gatewayResourceProfile != null && gatewayResourceProfile.getIdentityServerPwdCredToken() == null) {
@@ -157,36 +176,21 @@
                 logger.debug("Starting to add the password credential for default gateway : " +
                         ServerSettings.getDefaultUserGateway());
 
-                PasswordCredential passwordCredential = new PasswordCredential();
-                passwordCredential.setPortalUserName(ServerSettings.getDefaultUser());
-                passwordCredential.setGatewayId(ServerSettings.getDefaultUserGateway());
-                passwordCredential.setLoginUserName(ServerSettings.getDefaultUser());
-                passwordCredential.setPassword(ServerSettings.getDefaultUserPassword());
-                passwordCredential.setDescription("Credentials for default gateway");
+                AddResourceCredentialResponse response = resourceSecretClient.addPasswordCredential(custosId,
+                        "Credentials for default gateway",
+                        ServerSettings.getDefaultUser(),
+                        ServerSettings.getDefaultUserPassword());
 
-                CredentialStoreService.Client csClient = csClientPool.getResource();
-                String token = null;
-                try {
-                    logger.info("Creating password credential for default gateway");
-                    token = csClient.addPasswordCredential(passwordCredential);
-                    csClientPool.returnResource(csClient);
-                } catch (Exception ex) {
-                    logger.error("Failed to create the password credential for the default gateway : " +
-                            ServerSettings.getDefaultUserGateway(), ex);
-                    if (csClient != null) {
-                        csClientPool.returnBrokenResource(csClient);
-                    }
-                }
-
-                if (token != null) {
-                    logger.debug("Adding password credential token " + token +" to the default gateway : " + ServerSettings.getDefaultUserGateway());
-                    gatewayResourceProfile.setIdentityServerPwdCredToken(token);
+                if (response != null && response.getToken() != null && !response.getToken().trim().equals("")) {
+                    logger.debug("Adding password credential token " + response.getToken() + " to the default gateway : "
+                            + ServerSettings.getDefaultUserGateway());
+                    gatewayResourceProfile.setIdentityServerPwdCredToken(response.getToken());
                     gatewayResourceProfile.setIdentityServerTenant(ServerSettings.getDefaultUserGateway());
                     registryClient.updateGatewayResourceProfile(ServerSettings.getDefaultUserGateway(), gatewayResourceProfile);
                 }
 
-                registryClientPool.returnResource(registryClient);
             }
+            registryClientPool.returnResource(registryClient);
         } catch (Exception e) {
             logger.error("Failed to add the password credentials for the default gateway", e);
 
@@ -197,89 +201,106 @@
     }
 
     private void initSharingRegistry() throws ApplicationSettingsException, TException {
-        SharingRegistryService.Client client = sharingClientPool.getResource();
+        String custosId = ServerSettings.getDefaultGatewayCustosClientId();
+
         try {
-            if (!client.isDomainExists(ServerSettings.getDefaultUserGateway())) {
-                Domain domain = new Domain();
-                domain.setDomainId(ServerSettings.getDefaultUserGateway());
-                domain.setName(ServerSettings.getDefaultUserGateway());
-                domain.setDescription("Domain entry for " + domain.getName());
-                client.createDomain(domain);
+            SearchRequest request = SearchRequest.newBuilder().build();
+            EntityTypes entityTypes = sharingManagementClient.getEntityTypes(custosId, request);
+            List<EntityType> entityTypeList = entityTypes.getTypesList();
 
-                User user = new User();
-                user.setDomainId(domain.getDomainId());
-                user.setUserId(ServerSettings.getDefaultUser() + "@" + ServerSettings.getDefaultUserGateway());
-                user.setUserName(ServerSettings.getDefaultUser());
-                client.createUser(user);
+            if (entityTypeList == null || entityTypeList.isEmpty()) {
 
-                //Creating Entity Types for each domain
-                EntityType entityType = new EntityType();
-                entityType.setEntityTypeId(domain.getDomainId() + ":PROJECT");
-                entityType.setDomainId(domain.getDomainId());
-                entityType.setName("PROJECT");
-                entityType.setDescription("Project entity type");
-                client.createEntityType(entityType);
+                EntityType projectEntityType = EntityType.newBuilder()
+                        .setName("PROJECT")
+                        .setDescription("Project entity type")
+                        .setId("PROJECT")
+                        .build();
 
-                entityType = new EntityType();
-                entityType.setEntityTypeId(domain.getDomainId() + ":EXPERIMENT");
-                entityType.setDomainId(domain.getDomainId());
-                entityType.setName("EXPERIMENT");
-                entityType.setDescription("Experiment entity type");
-                client.createEntityType(entityType);
+                sharingManagementClient.createEntityType(custosId, projectEntityType);
 
-                entityType = new EntityType();
-                entityType.setEntityTypeId(domain.getDomainId() + ":FILE");
-                entityType.setDomainId(domain.getDomainId());
-                entityType.setName("FILE");
-                entityType.setDescription("File entity type");
-                client.createEntityType(entityType);
+                EntityType experimentEntityType = EntityType.newBuilder()
+                        .setName("EXPERIMENT")
+                        .setDescription("Experiment entity type")
+                        .setId("EXPERIMENT")
+                        .build();
 
-                entityType = new EntityType();
-                entityType.setEntityTypeId(domain.getDomainId()+":"+ResourceType.APPLICATION_DEPLOYMENT.name());
-                entityType.setDomainId(domain.getDomainId());
-                entityType.setName("APPLICATION-DEPLOYMENT");
-                entityType.setDescription("Application Deployment entity type");
-                client.createEntityType(entityType);
+                sharingManagementClient.createEntityType(custosId, experimentEntityType);
 
-                entityType = new EntityType();
-                entityType.setEntityTypeId(domain.getDomainId()+":"+ResourceType.GROUP_RESOURCE_PROFILE.name());
-                entityType.setDomainId(domain.getDomainId());
-                entityType.setName(ResourceType.GROUP_RESOURCE_PROFILE.name());
-                entityType.setDescription("Group Resource Profile entity type");
-                client.createEntityType(entityType);
+                EntityType fileEntityType = EntityType.newBuilder()
+                        .setName("FILE")
+                        .setDescription("File entity type")
+                        .setId("FILE")
+                        .build();
 
-                entityType = new EntityType();
-                entityType.setEntityTypeId(domain.getDomainId()+":"+ResourceType.CREDENTIAL_TOKEN.name());
-                entityType.setDomainId(domain.getDomainId());
-                entityType.setName(ResourceType.CREDENTIAL_TOKEN.name());
-                entityType.setDescription("Credential Store Token entity type");
-                client.createEntityType(entityType);
+                sharingManagementClient.createEntityType(custosId, fileEntityType);
+
+                EntityType applicationEntityType = EntityType.newBuilder()
+                        .setName(ResourceType.APPLICATION_DEPLOYMENT.name())
+                        .setDescription("Application Deployment entity type")
+                        .setId(ResourceType.APPLICATION_DEPLOYMENT.name())
+                        .build();
+
+                sharingManagementClient.createEntityType(custosId, applicationEntityType);
+
+                EntityType groupResourceProfileEntityType = EntityType.newBuilder()
+                        .setName(ResourceType.GROUP_RESOURCE_PROFILE.name())
+                        .setDescription("Group Resource Profile entity type")
+                        .setId(ResourceType.GROUP_RESOURCE_PROFILE.name())
+                        .build();
+
+                sharingManagementClient.createEntityType(custosId, groupResourceProfileEntityType);
+
+
+                EntityType credentialEntityType = EntityType.newBuilder()
+                        .setName(ResourceType.CREDENTIAL_TOKEN.name())
+                        .setDescription("Credential Store Token entity type")
+                        .setId(ResourceType.CREDENTIAL_TOKEN.name())
+                        .build();
+
+                sharingManagementClient.createEntityType(custosId, credentialEntityType);
 
                 //Creating Permission Types for each domain
-                PermissionType permissionType = new PermissionType();
-                permissionType.setPermissionTypeId(domain.getDomainId() + ":READ");
-                permissionType.setDomainId(domain.getDomainId());
-                permissionType.setName("READ");
-                permissionType.setDescription("Read permission type");
-                client.createPermissionType(permissionType);
 
-                permissionType = new PermissionType();
-                permissionType.setPermissionTypeId(domain.getDomainId() + ":WRITE");
-                permissionType.setDomainId(domain.getDomainId());
-                permissionType.setName("WRITE");
-                permissionType.setDescription("Write permission type");
-                client.createPermissionType(permissionType);
+                PermissionType readPermissionType = PermissionType
+                        .newBuilder()
+                        .setName("READ")
+                        .setId("READ")
+                        .setDescription("Read permission type")
+                        .build();
 
-                permissionType = new PermissionType();
-                permissionType.setPermissionTypeId(domain.getDomainId() + ":MANAGE_SHARING");
-                permissionType.setDomainId(domain.getDomainId());
-                permissionType.setName("MANAGE_SHARING");
-                permissionType.setDescription("Sharing permission type");
-                client.createPermissionType(permissionType);
+                sharingManagementClient.createPermissionType(custosId, readPermissionType);
+
+                PermissionType writePermissionType = PermissionType
+                        .newBuilder()
+                        .setName("WRITE")
+                        .setId("WRITE")
+                        .setDescription("Write permission type")
+                        .build();
+
+                sharingManagementClient.createPermissionType(custosId, writePermissionType);
+
+                PermissionType sharingPermissionType = PermissionType
+                        .newBuilder()
+                        .setName("MANAGE_SHARING")
+                        .setId("MANAGE_SHARING")
+                        .setDescription("Sharing permission type")
+                        .build();
+
+                sharingManagementClient.createPermissionType(custosId, sharingPermissionType);
+
+                PermissionType ownerPermissionType = PermissionType
+                        .newBuilder()
+                        .setName("OWNER")
+                        .setId("OWNER")
+                        .setDescription("Owner permission type")
+                        .build();
+
+                sharingManagementClient.createPermissionType(custosId, ownerPermissionType);
+
             }
-            sharingClientPool.returnResource(client);
+
         } catch (Exception ex) {
-            sharingClientPool.returnBrokenResource(client);
+            logger.error("Error while initializing custos sharing registry for default gateway ", ex);
             throw ex;
         }
     }
@@ -301,6 +322,7 @@
      * @return true/false
      */
     @Override
+    @SecurityCheck
     public boolean isUserExists(AuthzToken authzToken, String gatewayId, String userName) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client client = registryClientPool.getResource();
@@ -309,7 +331,7 @@
             registryClientPool.returnResource(client);
             return isExists;
         } catch (Exception e) {
-            logger.error("Error while verifying user", e);
+            logger.error("Error while verifying user"+ userName+" for gatewayId "+ gatewayId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while verifying user. More info : " + e.getMessage());
@@ -322,84 +344,107 @@
     @SecurityCheck
     public String addGateway(AuthzToken authzToken, Gateway gateway) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         RegistryService.Client registryClient = registryClientPool.getResource();
+
         try {
             String gatewayId = registryClient.addGateway(gateway);
-            Domain domain = new Domain();
-            domain.setDomainId(gateway.getGatewayId());
-            domain.setName(gateway.getGatewayName());
-            domain.setDescription("Domain entry for " + domain.getName());
-            sharingClient.createDomain(domain);
+            String custosId = gateway.getOauthClientId();
 
-            //Creating Entity Types for each domain
-            EntityType entityType = new EntityType();
-            entityType.setEntityTypeId(domain.getDomainId()+":PROJECT");
-            entityType.setDomainId(domain.getDomainId());
-            entityType.setName("PROJECT");
-            entityType.setDescription("Project entity type");
-            sharingClient.createEntityType(entityType);
+            EntityType projectEntityType = EntityType.newBuilder()
+                    .setName("PROJECT")
+                    .setDescription("Project entity type")
+                    .setId("PROJECT")
+                    .build();
 
-            entityType = new EntityType();
-            entityType.setEntityTypeId(domain.getDomainId()+":EXPERIMENT");
-            entityType.setDomainId(domain.getDomainId());
-            entityType.setName("EXPERIMENT");
-            entityType.setDescription("Experiment entity type");
-            sharingClient.createEntityType(entityType);
+            sharingManagementClient.createEntityType(custosId, projectEntityType);
 
-            entityType = new EntityType();
-            entityType.setEntityTypeId(domain.getDomainId()+":FILE");
-            entityType.setDomainId(domain.getDomainId());
-            entityType.setName("FILE");
-            entityType.setDescription("File entity type");
-            sharingClient.createEntityType(entityType);
+            EntityType experimentEntityType = EntityType.newBuilder()
+                    .setName("EXPERIMENT")
+                    .setDescription("Experiment entity type")
+                    .setId("EXPERIMENT")
+                    .build();
 
-            entityType = new EntityType();
-            entityType.setEntityTypeId(domain.getDomainId()+":"+ResourceType.APPLICATION_DEPLOYMENT.name());
-            entityType.setDomainId(domain.getDomainId());
-            entityType.setName("APPLICATION-DEPLOYMENT");
-            entityType.setDescription("Application Deployment entity type");
-            sharingClient.createEntityType(entityType);
+            sharingManagementClient.createEntityType(custosId, experimentEntityType);
 
-            entityType = new EntityType();
-            entityType.setEntityTypeId(domain.getDomainId()+":"+ResourceType.GROUP_RESOURCE_PROFILE.name());
-            entityType.setDomainId(domain.getDomainId());
-            entityType.setName(ResourceType.GROUP_RESOURCE_PROFILE.name());
-            entityType.setDescription("Group Resource Profile entity type");
-            sharingClient.createEntityType(entityType);
+            EntityType fileEntityType = EntityType.newBuilder()
+                    .setName("FILE")
+                    .setDescription("File entity type")
+                    .setId("FILE")
+                    .build();
+
+            sharingManagementClient.createEntityType(custosId, fileEntityType);
+
+            EntityType applicationEntityType = EntityType.newBuilder()
+                    .setName(ResourceType.APPLICATION_DEPLOYMENT.name())
+                    .setDescription("Application Deployment entity type")
+                    .setId(ResourceType.APPLICATION_DEPLOYMENT.name())
+                    .build();
+
+            sharingManagementClient.createEntityType(custosId, applicationEntityType);
+
+            EntityType groupResourceProfileEntityType = EntityType.newBuilder()
+                    .setName(ResourceType.GROUP_RESOURCE_PROFILE.name())
+                    .setDescription("Group Resource Profile entity type")
+                    .setId(ResourceType.GROUP_RESOURCE_PROFILE.name())
+                    .build();
+
+            sharingManagementClient.createEntityType(custosId, groupResourceProfileEntityType);
+
+
+            EntityType credentialEntityType = EntityType.newBuilder()
+                    .setName(ResourceType.CREDENTIAL_TOKEN.name())
+                    .setDescription("Credential Store Token entity type")
+                    .setId(ResourceType.CREDENTIAL_TOKEN.name())
+                    .build();
+
+            sharingManagementClient.createEntityType(custosId, credentialEntityType);
 
             //Creating Permission Types for each domain
-            PermissionType permissionType = new PermissionType();
-            permissionType.setPermissionTypeId(domain.getDomainId()+":READ");
-            permissionType.setDomainId(domain.getDomainId());
-            permissionType.setName("READ");
-            permissionType.setDescription("Read permission type");
-            sharingClient.createPermissionType(permissionType);
 
-            permissionType = new PermissionType();
-            permissionType.setPermissionTypeId(domain.getDomainId()+":WRITE");
-            permissionType.setDomainId(domain.getDomainId());
-            permissionType.setName("WRITE");
-            permissionType.setDescription("Write permission type");
-            sharingClient.createPermissionType(permissionType);
+            PermissionType readPermissionType = PermissionType
+                    .newBuilder()
+                    .setName("READ")
+                    .setId("READ")
+                    .setDescription("Read permission type")
+                    .build();
 
-            permissionType = new PermissionType();
-            permissionType.setPermissionTypeId(domain.getDomainId()+":MANAGE_SHARING");
-            permissionType.setDomainId(domain.getDomainId());
-            permissionType.setName("MANAGE_SHARING");
-            permissionType.setDescription("Sharing permission type");
-            sharingClient.createPermissionType(permissionType);
+            sharingManagementClient.createPermissionType(custosId, readPermissionType);
+
+            PermissionType writePermissionType = PermissionType
+                    .newBuilder()
+                    .setName("WRITE")
+                    .setId("WRITE")
+                    .setDescription("Write permission type")
+                    .build();
+
+            sharingManagementClient.createPermissionType(custosId, writePermissionType);
+
+            PermissionType sharingPermissionType = PermissionType
+                    .newBuilder()
+                    .setName("MANAGE_SHARING")
+                    .setId("MANAGE_SHARING")
+                    .setDescription("Sharing permission type")
+                    .build();
+
+            sharingManagementClient.createPermissionType(custosId, sharingPermissionType);
+
+            PermissionType ownerPermissionType = PermissionType
+                    .newBuilder()
+                    .setName("OWNER")
+                    .setId("OWNER")
+                    .setDescription("Owner permission type")
+                    .build();
+
+            sharingManagementClient.createPermissionType(custosId, ownerPermissionType);
 
             registryClientPool.returnResource(registryClient);
-            sharingClientPool.returnResource(sharingClient);
 
             return gatewayId;
         } catch (Exception e) {
-            logger.error("Error while adding gateway", e);
+            logger.error("Error while adding gateway "+ gateway.getGatewayId(), e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while adding gateway. More info : " + e.getMessage());
-            sharingClientPool.returnBrokenResource(sharingClient);
             registryClientPool.returnBrokenResource(registryClient);
             throw exception;
         }
@@ -414,15 +459,17 @@
      * list of usernames of the users in the gateway
      */
     @Override
+    @SecurityCheck
     public List<String> getAllUsersInGateway(AuthzToken authzToken, String gatewayId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<String> result = regClient.getAllUsersInGateway(gatewayId);
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            logger.error("Error while retrieving users", e);
+            logger.error("Error while retrieving users in gateway"+ gatewayId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving users. More info : " + e.getMessage());
@@ -437,12 +484,13 @@
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
 
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateGateway(gatewayId, updatedGateway);
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            logger.error("Error while updating the gateway", e);
+            logger.error("Error while updating the gateway "+ gatewayId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while updating the gateway. More info : " + e.getMessage());
@@ -462,7 +510,7 @@
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            logger.error("Error while getting the gateway", e);
+            logger.error("Error while getting the gateway "+ gatewayId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while getting the gateway. More info : " + e.getMessage());
@@ -476,12 +524,13 @@
     public boolean deleteGateway(AuthzToken authzToken, String gatewayId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteGateway(gatewayId);
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            logger.error("Error while deleting the gateway", e);
+            logger.error("Error while deleting the gateway "+ gatewayId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while deleting the gateway. More info : " + e.getMessage());
@@ -495,12 +544,13 @@
     public List<Gateway> getAllGateways(AuthzToken authzToken) throws InvalidRequestException, AiravataClientException,
             AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<Gateway> result = regClient.getAllGateways();
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            logger.error("Error while getting all the gateways", e);
+            logger.error("Error while getting all the gateways ", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while getting all the gateways. More info : " + e.getMessage());
@@ -519,10 +569,11 @@
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            logger.error("Error while getting gateway", e);
+            logger.error("Error while checking is  gateway "+ gatewayId + " is exist", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage("Error while getting gateway. More info : " + e.getMessage());
+            exception.setMessage("Error while checking is  gateway "+ gatewayId + " " +
+                    "is exist. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -633,47 +684,51 @@
     @Override
     @SecurityCheck
     public String generateAndRegisterSSHKeys(AuthzToken authzToken, String description) throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
+
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
-        CredentialStoreService.Client csClient = csClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
-        RegistryService.Client regClient = registryClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+
         try {
-            SSHCredential sshCredential = new SSHCredential();
-            sshCredential.setUsername(userName);
-            sshCredential.setGatewayId(gatewayId);
-            sshCredential.setDescription(description);
-            String key = csClient.addSSHCredential(sshCredential);
+
+            AddResourceCredentialResponse response =
+                    resourceSecretClient.generateSSHCredential(custosId, description, userName);
+
+            if (response.getToken() == null || response.getToken().trim().equals("")) {
+                String msg = "SSH credential token is empty for gateway with custos Id "
+                        + custosId + " for user"+ userName;
+                logger.error(msg);
+                AiravataSystemException exception = new AiravataSystemException();
+                exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
+                exception.setMessage(msg);
+                throw exception;
+            }
+
             try {
-                Entity entity = new Entity();
-                entity.setEntityId(key);
-                entity.setDomainId(gatewayId);
-                entity.setEntityTypeId(gatewayId + ":" + ResourceType.CREDENTIAL_TOKEN);
-                entity.setOwnerId(userName + "@" + gatewayId);
-                entity.setName(key);
-                entity.setDescription(description);
-                sharingClient.createEntity(entity);
+                Entity entity = Entity.newBuilder()
+                        .setOwnerId(userName)
+                        .setName(response.getToken())
+                        .setId(response.getToken())
+                        .setDescription(description != null ?description:"")
+                        .setType(ResourceType.CREDENTIAL_TOKEN.name()).build();
+                sharingManagementClient.createEntity(custosId, entity);
+
             } catch (Exception ex) {
                 logger.error(ex.getMessage(), ex);
                 logger.error("Rolling back ssh key creation for user " + userName + " and description [" + description + "]");
-                csClient.deleteSSHCredential(key, gatewayId);
+                resourceSecretClient.deleteSSHCredential(custosId, response.getToken());
                 AiravataSystemException ase = new AiravataSystemException();
                 ase.setMessage("Failed to create sharing registry record");
                 throw ase;
             }
             logger.debug("Airavata generated SSH keys for gateway : " + gatewayId + " and for user : " + userName);
-            csClientPool.returnResource(csClient);
-            sharingClientPool.returnResource(sharingClient);
-            registryClientPool.returnResource(regClient);
-            return key;
-        }catch (Exception e){
+            return response.getToken();
+        } catch (Exception e) {
             logger.error("Error occurred while registering SSH Credential", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error occurred while registering SSH Credential. More info : " + e.getMessage());
-            csClientPool.returnBrokenResource(csClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
-            registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
     }
@@ -690,47 +745,48 @@
     @Override
     @SecurityCheck
     public String registerPwdCredential(AuthzToken authzToken, String loginUserName, String password, String description) throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
+
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
-        CredentialStoreService.Client csClient = csClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
-        RegistryService.Client regClient = registryClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            PasswordCredential pwdCredential = new PasswordCredential();
-            pwdCredential.setPortalUserName(userName);
-            pwdCredential.setLoginUserName(loginUserName);
-            pwdCredential.setPassword(password);
-            pwdCredential.setDescription(description);
-            pwdCredential.setGatewayId(gatewayId);
-            String key = csClient.addPasswordCredential(pwdCredential);
+
+            AddResourceCredentialResponse response =
+                    resourceSecretClient.addPasswordCredential(custosId, description, loginUserName, password);
+
+            if (response.getToken() == null || response.getToken().trim().equals("")) {
+                String msg = "Password token is empty for gateway with custos Id "+ custosId + " for user "+loginUserName;
+                logger.error(msg);
+                AiravataSystemException exception = new AiravataSystemException();
+                exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
+                exception.setMessage(msg);
+                throw exception;
+            }
+
             try {
-                Entity entity = new Entity();
-                entity.setEntityId(key);
-                entity.setDomainId(gatewayId);
-                entity.setEntityTypeId(gatewayId + ":" + ResourceType.CREDENTIAL_TOKEN);
-                entity.setOwnerId(userName + "@" + gatewayId);
-                entity.setName(key);
-                entity.setDescription(description);
-                sharingClient.createEntity(entity);
+                Entity entity = Entity.newBuilder()
+                        .setOwnerId(loginUserName)
+                        .setName(response.getToken())
+                        .setId(response.getToken())
+                        .setDescription(description != null ? description:"")
+                        .setType(ResourceType.CREDENTIAL_TOKEN.name()).build();
+                sharingManagementClient.createEntity(custosId, entity);
             } catch (Exception ex) {
                 logger.error(ex.getMessage(), ex);
                 logger.error("Rolling back password registration for user " + userName + " and description [" + description + "]");
-                csClient.deletePWDCredential(key, gatewayId);
+                resourceSecretClient.deleteSSHCredential(custosId, response.getToken());
                 AiravataSystemException ase = new AiravataSystemException();
                 ase.setMessage("Failed to create sharing registry record");
                 throw ase;
             }
             logger.debug("Airavata generated PWD credential for gateway : " + gatewayId + " and for user : " + loginUserName);
-            csClientPool.returnResource(csClient);
-            sharingClientPool.returnResource(sharingClient);
-            registryClientPool.returnResource(regClient);
-            return key;
-        }catch (Exception e){
+            return response.getToken();
+        } catch (Exception e) {
             logger.error("Error occurred while registering PWD Credential", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error occurred while registering PWD Credential. More info : " + e.getMessage());
-            csClientPool.returnBrokenResource(csClient);
             throw exception;
         }
     }
@@ -738,30 +794,46 @@
     @Override
     @SecurityCheck
     public CredentialSummary getCredentialSummary(AuthzToken authzToken, String tokenId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
-        CredentialStoreService.Client csClient = csClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+
         try {
-            if (!userHasAccessInternal(sharingClient, authzToken, tokenId, ResourcePermissionType.READ)) {
-                throw new AuthorizationException("User does not have permission to access this resource");
+            Entity sharedEntity = Entity.newBuilder().setId(tokenId).build();
+            PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+            SharingRequest sharingRequest = SharingRequest
+                    .newBuilder()
+                    .setEntity(sharedEntity)
+                    .setPermissionType(permissionType)
+                    .addOwnerId(userName)
+                    .build();
+            Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+            if (!status.getStatus()) {
+                throw new AuthorizationException("User "+ userName+ " does not have permission to access the resource with Id "
+                        + tokenId);
             }
-            CredentialSummary credentialSummary = csClient.getCredentialSummary(tokenId, gatewayId);
-            csClientPool.returnResource(csClient);
-            sharingClientPool.returnResource(sharingClient);
-            return credentialSummary;
+
+            SecretMetadata secretMetadata = resourceSecretClient.getResourceCredentialSummary(custosId, tokenId);
+
+            CredentialSummary summary =  CustosToAiravataDataModelMapper.transform(secretMetadata, gatewayId);
+
+            if (secretMetadata.getType().equals(ResourceSecretType.SSH)) {
+               SSHCredential sshCredential =  resourceSecretClient.getSSHCredential(custosId,tokenId, false);
+               summary.setPublicKey(sshCredential.getPublicKey());
+            }
+
+            return summary;
         } catch (AuthorizationException ae) {
-            String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
             logger.info("User " + userName + " not allowed to access credential store token " + tokenId);
-            csClientPool.returnResource(csClient);
-            sharingClientPool.returnResource(sharingClient);
             throw ae;
         } catch (Exception e) {
-            String msg = "Error retrieving credential summary for token " + tokenId + ". GatewayId: "+ gatewayId;
+            String msg = "Error retrieving credential summary for token " + tokenId + ". GatewayId: " + gatewayId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
-            csClientPool.returnBrokenResource(csClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
+            exception.setMessage(msg + " More info : " + e.getMessage());
+
             throw exception;
         }
     }
@@ -769,32 +841,55 @@
     @Override
     @SecurityCheck
     public List<CredentialSummary> getAllCredentialSummaries(AuthzToken authzToken, SummaryType type) throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
-        CredentialStoreService.Client csClient = csClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            List<SearchCriteria> filters = new ArrayList<>();
-            SearchCriteria searchCriteria = new SearchCriteria();
-            searchCriteria.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
-            searchCriteria.setSearchCondition(SearchCondition.EQUAL);
-            searchCriteria.setValue(gatewayId + ":" + ResourceType.CREDENTIAL_TOKEN.name());
-            filters.add(searchCriteria);
-            List<String> accessibleTokenIds = sharingClient.searchEntities(gatewayId, userName + "@" + gatewayId, filters, 0, -1)
-                    .stream()
-                    .map(p -> p.getEntityId())
-                    .collect(Collectors.toList());
-            List<CredentialSummary> credentialSummaries = csClient.getAllCredentialSummaries(type, accessibleTokenIds, gatewayId);
-            csClientPool.returnResource(csClient);
-            sharingClientPool.returnResource(sharingClient);
+            SearchCriteria searchCriteria = SearchCriteria.newBuilder()
+                    .setSearchField(EntitySearchField.ENTITY_TYPE_ID)
+                    .setCondition(SearchCondition.EQUAL)
+                    .setValue(ResourceType.CREDENTIAL_TOKEN.name()).build();
+
+            SearchRequest searchRequest = SearchRequest.newBuilder()
+                    .addSearchCriteria(searchCriteria)
+                    .setOwnerId(userName)
+                    .build();
+            Entities entities = sharingManagementClient.searchEntities(custosId, searchRequest);
+
+
+            List<String> accessibleTokenIds = new ArrayList<>();
+            for (Entity ent : entities.getEntityArrayList()) {
+
+                accessibleTokenIds.add(ent.getId());
+            }
+
+            ResourceCredentialSummaries resourceCredentialSummaries = resourceSecretClient
+                    .getAllResourceCredentialSummaries(custosId, accessibleTokenIds);
+
+
+            List<SecretMetadata> metadataList = resourceCredentialSummaries.getMetadataList();
+            List<CredentialSummary> credentialSummaries = new ArrayList<>();
+
+            for (SecretMetadata metadata : metadataList) {
+
+                if (metadata.getType().name().equals(type.name())) {
+                    CredentialSummary summary = CustosToAiravataDataModelMapper.transform(metadata, gatewayId);
+                    if (metadata.getType().equals(ResourceSecretType.SSH)) {
+                        SSHCredential sshCredential = resourceSecretClient.getSSHCredential(custosId, metadata.getToken(), false);
+                        summary.setPublicKey(sshCredential.getPublicKey());
+                    }
+                    credentialSummaries.add(summary);
+                }
+
+            }
+
             return credentialSummaries;
         } catch (Exception e) {
-            String msg = "Error retrieving credential summaries of type " + type + ". GatewayId: "+ gatewayId;
+            String msg = "Error retrieving credential summaries of type " + type + ". GatewayId: " + gatewayId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
-            csClientPool.returnBrokenResource(csClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
+            exception.setMessage(msg + " More info : " + e.getMessage());
             throw exception;
         }
     }
@@ -802,31 +897,42 @@
     @Override
     @SecurityCheck
     public boolean deleteSSHPubKey(AuthzToken authzToken, String airavataCredStoreToken) throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
-        CredentialStoreService.Client csClient = csClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            if (!userHasAccessInternal(sharingClient, authzToken, airavataCredStoreToken, ResourcePermissionType.WRITE)) {
-                throw new AuthorizationException("User does not have permission to delete this resource.");
+
+            Entity sharedEntity = Entity.newBuilder().setId(airavataCredStoreToken).build();
+            PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+            SharingRequest sharingRequest = SharingRequest
+                    .newBuilder()
+                    .setEntity(sharedEntity)
+                    .setPermissionType(permissionType)
+                    .addOwnerId(userName)
+                    .build();
+            Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+            if (!status.getStatus()) {
+                throw new AuthorizationException("User" + userName+ " does not have permission to delete this resource. "
+                        + airavataCredStoreToken);
             }
+
             logger.debug("Airavata deleted SSH pub key for gateway Id : " + gatewayId + " and with token id : " + airavataCredStoreToken);
-            boolean result = csClient.deleteSSHCredential(airavataCredStoreToken, gatewayId);
-            csClientPool.returnResource(csClient);
-            sharingClientPool.returnResource(sharingClient);
-            return result;
+            ResourceCredentialOperationStatus operationStatus = resourceSecretClient.deleteSSHCredential(custosId, airavataCredStoreToken);
+            if (operationStatus.getStatus()) {
+                sharingManagementClient.deleteEntity(custosId, sharedEntity);
+            }
+            return operationStatus.getStatus();
+
         } catch (AuthorizationException ae) {
-            String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
             logger.info("User " + userName + " not allowed to delete (no WRITE permission) credential store token " + airavataCredStoreToken);
-            csClientPool.returnResource(csClient);
-            sharingClientPool.returnResource(sharingClient);
             throw ae;
-        } catch (Exception e){
+        } catch (Exception e) {
             logger.error("Error occurred while deleting SSH credential", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error occurred while deleting SSH credential. More info : " + e.getMessage());
-            csClientPool.returnBrokenResource(csClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -834,31 +940,39 @@
     @Override
     @SecurityCheck
     public boolean deletePWDCredential(AuthzToken authzToken, String airavataCredStoreToken) throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
-        CredentialStoreService.Client csClient = csClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            if (!userHasAccessInternal(sharingClient, authzToken, airavataCredStoreToken, ResourcePermissionType.WRITE)) {
-                throw new AuthorizationException("User does not have permission to delete this resource.");
+            Entity sharedEntity = Entity.newBuilder().setId(airavataCredStoreToken).build();
+            PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+            SharingRequest sharingRequest = SharingRequest
+                    .newBuilder()
+                    .setEntity(sharedEntity)
+                    .setPermissionType(permissionType)
+                    .addOwnerId(userName)
+                    .build();
+            Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+            if (!status.getStatus()) {
+                throw new AuthorizationException("User" + userName+ "does not have permission to delete this resource. "
+                        +airavataCredStoreToken);
             }
             logger.debug("Airavata deleted PWD credential for gateway Id : " + gatewayId + " and with token id : " + airavataCredStoreToken);
-            boolean result = csClient.deletePWDCredential(airavataCredStoreToken, gatewayId);
-            csClientPool.returnResource(csClient);
-            sharingClientPool.returnResource(sharingClient);
-            return result;
+            ResourceCredentialOperationStatus operationStatus = resourceSecretClient.deletePWDCredential(custosId, airavataCredStoreToken);
+            if (operationStatus.getStatus()) {
+                sharingManagementClient.deleteEntity(custosId, sharedEntity);
+            }
+            return operationStatus.getStatus();
         } catch (AuthorizationException ae) {
-            String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
             logger.info("User " + userName + " not allowed to delete (no WRITE permission) credential store token " + airavataCredStoreToken);
-            csClientPool.returnResource(csClient);
-            sharingClientPool.returnResource(sharingClient);
             throw ae;
-        }catch (Exception e){
+        } catch (Exception e) {
             logger.error("Error occurred while deleting PWD credential", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error occurred while deleting PWD credential. More info : " + e.getMessage());
-            csClientPool.returnBrokenResource(csClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -874,20 +988,22 @@
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         // TODO: verify that gatewayId and project.gatewayId match authzToken
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
             String projectId = regClient.createProject(gatewayId, project);
-            if(ServerSettings.isEnableSharing()){
+            if (ServerSettings.isEnableSharing()) {
                 try {
-                    Entity entity = new Entity();
-                    entity.setEntityId(projectId);
-                    final String domainId = project.getGatewayId();
-                    entity.setDomainId(domainId);
-                    entity.setEntityTypeId(domainId + ":" + "PROJECT");
-                    entity.setOwnerId(project.getOwner() + "@" + domainId);
-                    entity.setName(project.getName());
-                    entity.setDescription(project.getDescription());
-                    sharingClient.createEntity(entity);
+
+                    Entity entity = Entity.newBuilder()
+                            .setOwnerId(project.getOwner())
+                            .setName(project.getName())
+                            .setId(projectId)
+                            .setDescription(project.getDescription() != null ? project.getDescription():"")
+                            .setType(ResourceType.PROJECT.name()).build();
+                    sharingManagementClient.createEntity(custosId, entity);
+
                 } catch (Exception ex) {
                     logger.error(ex.getMessage(), ex);
                     logger.error("Rolling back project creation Proj ID : " + projectId);
@@ -899,7 +1015,6 @@
             }
             logger.debug("Airavata created project with project Id : " + projectId + " for gateway Id : " + gatewayId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return projectId;
         } catch (Exception e) {
             logger.error("Error while creating the project", e);
@@ -907,7 +1022,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while creating the project. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -917,39 +1031,47 @@
     public void updateProject(AuthzToken authzToken, String projectId, Project updatedProject) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, ProjectNotFoundException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
             Project existingProject = regClient.getProject(projectId);
-            if(ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(existingProject.getOwner())
-                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(existingProject.getGatewayId())){
+            if (ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(existingProject.getOwner())
+                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(existingProject.getGatewayId())) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            projectId, gatewayId + ":WRITE")){
-                        throw new AuthorizationException("User does not have permission to access this resource");
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(projectId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
+                        throw new AuthorizationException("User does not have permission to access this resource.");
                     }
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to access this resource");
                 }
             }
-            if(!updatedProject.getOwner().equals(existingProject.getOwner())){
+            if (!updatedProject.getOwner().equals(existingProject.getOwner())) {
                 throw new InvalidRequestException("Owner of a project cannot be changed");
             }
-            if(!updatedProject.getGatewayId().equals(existingProject.getGatewayId())){
+            if (!updatedProject.getGatewayId().equals(existingProject.getGatewayId())) {
                 throw new InvalidRequestException("Gateway ID of a project cannot be changed");
             }
             regClient.updateProject(projectId, updatedProject);
-            logger.debug("Airavata updated project with project Id : " + projectId );
+            logger.debug("Airavata updated project with project Id : " + projectId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
         } catch (Exception e) {
             logger.error("Error while updating the project", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while updating the project. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -959,40 +1081,53 @@
     public boolean deleteProject(AuthzToken authzToken, String projectId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, ProjectNotFoundException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
             Project existingProject = regClient.getProject(projectId);
-            if(ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(existingProject.getOwner())
-                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(existingProject.getGatewayId())){
+            if (ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(existingProject.getOwner())
+                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(existingProject.getGatewayId())) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            projectId, gatewayId + ":WRITE")){
-                        throw new AuthorizationException("User does not have permission to access this resource");
+
+                    Entity sharedEntity = Entity.newBuilder().setId(projectId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
+                        throw new AuthorizationException("User does not have permission to access this resource.");
                     }
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to access this resource");
                 }
             }
             boolean ret = regClient.deleteProject(projectId);
-            logger.debug("Airavata deleted project with project Id : " + projectId );
+            Entity sharedEntity = Entity.newBuilder().setId(projectId).build();
+            if (ret) {
+                sharingManagementClient.deleteEntity(custosId, sharedEntity);
+            }
+            logger.debug("Airavata deleted project with project Id : " + projectId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return ret;
         } catch (Exception e) {
             logger.error("Error while removing the project", e);
             ProjectNotFoundException exception = new ProjectNotFoundException();
             exception.setMessage("Error while removing the project. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
 
-    private boolean validateString(String name){
+    private boolean validateString(String name) {
         boolean valid = true;
-        if (name == null || name.equals("") || name.trim().length() == 0){
+        if (name == null || name.equals("") || name.trim().length() == 0) {
             valid = false;
         }
         return valid;
@@ -1008,31 +1143,39 @@
     public Project getProject(AuthzToken authzToken, String projectId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, ProjectNotFoundException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
             Project project = regClient.getProject(projectId);
-            if(authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(project.getOwner())
-                    && authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(project.getGatewayId())){
+            if (authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(project.getOwner())
+                    && authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(project.getGatewayId())) {
                 registryClientPool.returnResource(regClient);
-                sharingClientPool.returnResource(sharingClient);
                 return project;
-            }else if (ServerSettings.isEnableSharing()){
+            } else if (ServerSettings.isEnableSharing()) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            projectId, gatewayId + ":READ")){
-                        throw new AuthorizationException("User does not have permission to access this resource");
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(projectId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
+                        throw new AuthorizationException("User" + userId+" does not have permission to access this resource.");
                     }
                     registryClientPool.returnResource(regClient);
-                    sharingClientPool.returnResource(sharingClient);
                     return project;
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to access this resource");
                 }
             } else {
                 registryClientPool.returnResource(regClient);
-                sharingClientPool.returnResource(sharingClient);
                 return null;
             }
         } catch (Exception e) {
@@ -1040,7 +1183,6 @@
             ProjectNotFoundException exception = new ProjectNotFoundException();
             exception.setMessage("Error while retrieving the project. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1050,14 +1192,10 @@
      * Get all Project by user with pagination. Results will be ordered based
      * on creation time DESC
      *
-     * @param gatewayId
-     *    The identifier for the requested gateway.
-     * @param userName
-     *    The identifier of the user
-     * @param limit
-     *    The amount results to be fetched
-     * @param offset
-     *    The starting point of the results to be fetched
+     * @param gatewayId The identifier for the requested gateway.
+     * @param userName  The identifier of the user
+     * @param limit     The amount results to be fetched
+     * @param offset    The starting point of the results to be fetched
      **/
     @Override
     @SecurityCheck
@@ -1065,20 +1203,33 @@
                                          int limit, int offset)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            if (ServerSettings.isEnableSharing()){
+            if (ServerSettings.isEnableSharing()) {
                 // user projects + user accessible projects
                 List<String> accessibleProjectIds = new ArrayList<>();
-                List<SearchCriteria> filters = new ArrayList<>();
-                SearchCriteria searchCriteria = new SearchCriteria();
-                searchCriteria.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
-                searchCriteria.setSearchCondition(SearchCondition.EQUAL);
-                searchCriteria.setValue(gatewayId + ":PROJECT");
-                filters.add(searchCriteria);
-                sharingClient.searchEntities(authzToken.getClaimsMap().get(Constants.GATEWAY_ID),
-                        userName + "@" + gatewayId, filters, 0, -1).stream().forEach(p -> accessibleProjectIds
-                        .add(p.getEntityId()));
+
+                SearchCriteria searchCriteria = SearchCriteria
+                        .newBuilder()
+                        .setSearchField(EntitySearchField.ENTITY_TYPE_ID)
+                        .setCondition(SearchCondition.EQUAL)
+                        .setValue("PROJECT")
+                        .build();
+
+
+                SearchRequest searchRequest = SearchRequest.newBuilder()
+                        .addSearchCriteria(searchCriteria)
+                        .setOwnerId(userName)
+                        .build();
+
+                Entities entities = sharingManagementClient.searchEntities(custosId, searchRequest);
+
+                for (Entity entity : entities.getEntityArrayList()) {
+
+                    accessibleProjectIds.add(entity.getId());
+                }
+
                 List<Project> result;
                 if (accessibleProjectIds.isEmpty()) {
                     result = Collections.emptyList();
@@ -1086,66 +1237,63 @@
                     result = regClient.searchProjects(gatewayId, userName, accessibleProjectIds, new HashMap<>(), limit, offset);
                 }
                 registryClientPool.returnResource(regClient);
-                sharingClientPool.returnResource(sharingClient);
                 return result;
-            }else{
+            } else {
                 List<Project> result = regClient.getUserProjects(gatewayId, userName, limit, offset);
                 registryClientPool.returnResource(regClient);
-                sharingClientPool.returnResource(sharingClient);
                 return result;
             }
 
         } catch (Exception e) {
-            logger.error("Error while retrieving projects", e);
+            logger.error("Error while retrieving projects for gateway "+ gatewayId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving projects. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
 
     /**
+     * Search User Projects
+     * Search and get all Projects for user by project description or/and project name  with pagination.
+     * Results will be ordered based on creation time DESC.
      *
-     *  Search User Projects
-     *  Search and get all Projects for user by project description or/and project name  with pagination.
-     *  Results will be ordered based on creation time DESC.
-     *
-     *  @param gatewayId
-     *     The unique identifier of the gateway making the request.
-     *
-     *  @param userName
-     *     The identifier of the user.
-     *
-     *  @param filters
-     *     Map of multiple filter criteria. Currenlt search filters includes Project Name and Project Description
-     *
-     *  @param limit
-     *     The amount results to be fetched.
-     *
-     *  @param offset
-     *     The starting point of the results to be fetched.
-     *
+     * @param gatewayId The unique identifier of the gateway making the request.
+     * @param userName  The identifier of the user.
+     * @param filters   Map of multiple filter criteria. Currenlt search filters includes Project Name and Project Description
+     * @param limit     The amount results to be fetched.
+     * @param offset    The starting point of the results to be fetched.
      */
     @Override
+    @SecurityCheck
     public List<Project> searchProjects(AuthzToken authzToken, String gatewayId, String userName, Map<ProjectSearchFields,
             String> filters, int limit, int offset) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            List<String> accessibleProjIds  = new ArrayList<>();
+            List<String> accessibleProjIds = new ArrayList<>();
 
             List<Project> result;
             if (ServerSettings.isEnableSharing()) {
-                List<SearchCriteria> sharingFilters = new ArrayList<>();
-                SearchCriteria searchCriteria = new SearchCriteria();
-                searchCriteria.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
-                searchCriteria.setSearchCondition(SearchCondition.EQUAL);
-                searchCriteria.setValue(gatewayId + ":PROJECT");
-                sharingFilters.add(searchCriteria);
-                sharingClient.searchEntities(authzToken.getClaimsMap().get(Constants.GATEWAY_ID),
-                        userName + "@" + gatewayId, sharingFilters, 0, -1).stream().forEach(e -> accessibleProjIds.add(e.getEntityId()));
+                SearchCriteria searchCriteria = SearchCriteria
+                        .newBuilder()
+                        .setSearchField(EntitySearchField.ENTITY_TYPE_ID)
+                        .setCondition(SearchCondition.EQUAL)
+                        .setValue("PROJECT")
+                        .build();
+
+                SearchRequest searchRequest = SearchRequest.newBuilder()
+                        .addSearchCriteria(searchCriteria)
+                        .setOwnerId(userName)
+                        .build();
+
+                Entities entities = sharingManagementClient.searchEntities(custosId, searchRequest);
+
+                for (Entity entity : entities.getEntityArrayList()) {
+                    accessibleProjIds.add(entity.getId());
+                }
                 if (accessibleProjIds.isEmpty()) {
                     result = Collections.emptyList();
                 } else {
@@ -1155,15 +1303,13 @@
                 result = regClient.searchProjects(gatewayId, userName, accessibleProjIds, filters, limit, offset);
             }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
-        }catch (Exception e) {
-            logger.error("Error while retrieving projects", e);
+        } catch (Exception e) {
+            logger.error("Error while retrieving projects "+ gatewayId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving projects. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1173,16 +1319,11 @@
      * Search Experiments by using multiple filter criteria with pagination. Results will be sorted
      * based on creation time DESC
      *
-     * @param gatewayId
-     *       Identifier of the requested gateway
-     * @param userName
-     *       Username of the requested user
-     * @param filters
-     *       map of multiple filter criteria.
-     * @param limit
-     *       Amount of results to be fetched
-     * @param offset
-     *       The starting point of the results to be fetched
+     * @param gatewayId Identifier of the requested gateway
+     * @param userName  Username of the requested user
+     * @param filters   map of multiple filter criteria.
+     * @param limit     Amount of results to be fetched
+     * @param offset    The starting point of the results to be fetched
      */
     @Override
     @SecurityCheck
@@ -1190,30 +1331,43 @@
             String> filters, int limit, int offset)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
             List<String> accessibleExpIds = new ArrayList<>();
             if (ServerSettings.isEnableSharing()) {
-                List<SearchCriteria> sharingFilters = new ArrayList<>();
-                SearchCriteria searchCriteria = new SearchCriteria();
-                searchCriteria.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
-                searchCriteria.setSearchCondition(SearchCondition.EQUAL);
-                searchCriteria.setValue(gatewayId + ":EXPERIMENT");
-                sharingFilters.add(searchCriteria);
-                sharingClient.searchEntities(authzToken.getClaimsMap().get(Constants.GATEWAY_ID),
-                        userName + "@" + gatewayId, sharingFilters, 0, -1).forEach(e -> accessibleExpIds.add(e.getEntityId()));
+
+
+                SearchCriteria searchCriteria = SearchCriteria
+                        .newBuilder()
+                        .setSearchField(EntitySearchField.ENTITY_TYPE_ID)
+                        .setCondition(SearchCondition.EQUAL)
+                        .setValue("EXPERIMENT")
+                        .build();
+
+
+
+                SearchRequest searchRequest = SearchRequest.newBuilder()
+                        .addSearchCriteria(searchCriteria)
+                        .setOwnerId(userName)
+                        .build();
+
+                Entities entities = sharingManagementClient.searchEntities(custosId, searchRequest);
+
+                for (Entity entity : entities.getEntityArrayList()) {
+                    accessibleExpIds.add(entity.getId());
+                }
             }
+
             List<ExperimentSummaryModel> result = regClient.searchExperiments(gatewayId, userName, accessibleExpIds, filters, limit, offset);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
-        }catch (Exception e) {
-            logger.error("Error while retrieving experiments", e);
+        } catch (Exception e) {
+            logger.error("Error while retrieving experiments "+gatewayId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving experiments. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1222,6 +1376,7 @@
      * Get Experiment execution statisitics by sending the gateway id and the time period interested in.
      * This method will retrun an ExperimentStatistics object which contains the number of successfully
      * completed experiments, failed experiments etc.
+     *
      * @param gatewayId
      * @param fromTime
      * @param toTime
@@ -1237,40 +1392,44 @@
                                                         String userName, String applicationName, String resourceHostName)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        // SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
+            // FIXME: re-enable experiment statistics for non-admin users
             // Find accessible experiments in date range
-            List<String> accessibleExpIds = new ArrayList<>();
-            List<SearchCriteria> sharingFilters = new ArrayList<>();
-            SearchCriteria entityTypeCriteria = new SearchCriteria();
-            entityTypeCriteria.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
-            entityTypeCriteria.setSearchCondition(SearchCondition.EQUAL);
-            entityTypeCriteria.setValue(gatewayId + ":EXPERIMENT");
-            sharingFilters.add(entityTypeCriteria);
-            SearchCriteria fromCreatedTimeCriteria = new SearchCriteria();
-            fromCreatedTimeCriteria.setSearchField(EntitySearchField.CREATED_TIME);
-            fromCreatedTimeCriteria.setSearchCondition(SearchCondition.GTE);
-            fromCreatedTimeCriteria.setValue(Long.toString(fromTime));
-            sharingFilters.add(fromCreatedTimeCriteria);
-            SearchCriteria toCreatedTimeCriteria = new SearchCriteria();
-            toCreatedTimeCriteria.setSearchField(EntitySearchField.CREATED_TIME);
-            toCreatedTimeCriteria.setSearchCondition(SearchCondition.LTE);
-            toCreatedTimeCriteria.setValue(Long.toString(toTime));
-            sharingFilters.add(toCreatedTimeCriteria);
-            sharingClient.searchEntities(authzToken.getClaimsMap().get(Constants.GATEWAY_ID),
-                    userName + "@" + gatewayId, sharingFilters, 0, -1).forEach(e -> accessibleExpIds.add(e.getEntityId()));
+            // List<String> accessibleExpIds = new ArrayList<>();
+            // List<SearchCriteria> sharingFilters = new ArrayList<>();
+            // SearchCriteria entityTypeCriteria = new SearchCriteria();
+            // entityTypeCriteria.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
+            // entityTypeCriteria.setSearchCondition(SearchCondition.EQUAL);
+            // entityTypeCriteria.setValue(gatewayId + ":EXPERIMENT");
+            // sharingFilters.add(entityTypeCriteria);
+            // SearchCriteria fromCreatedTimeCriteria = new SearchCriteria();
+            // fromCreatedTimeCriteria.setSearchField(EntitySearchField.CREATED_TIME);
+            // fromCreatedTimeCriteria.setSearchCondition(SearchCondition.GTE);
+            // fromCreatedTimeCriteria.setValue(Long.toString(fromTime));
+            // sharingFilters.add(fromCreatedTimeCriteria);
+            // SearchCriteria toCreatedTimeCriteria = new SearchCriteria();
+            // toCreatedTimeCriteria.setSearchField(EntitySearchField.CREATED_TIME);
+            // toCreatedTimeCriteria.setSearchCondition(SearchCondition.LTE);
+            // toCreatedTimeCriteria.setValue(Long.toString(toTime));
+            // sharingFilters.add(toCreatedTimeCriteria);
+            // String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
+            // sharingClient.searchEntities(authzToken.getClaimsMap().get(Constants.GATEWAY_ID),
+            //         userId + "@" + gatewayId, sharingFilters, 0, Integer.MAX_VALUE).forEach(e -> accessibleExpIds.add(e.getEntityId()));
+            List<String> accessibleExpIds = null;
 
             ExperimentStatistics result = regClient.getExperimentStatistics(gatewayId, fromTime, toTime, userName, applicationName, resourceHostName, accessibleExpIds);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
+            // sharingClientPool.returnResource(sharingClient);
             return result;
-        }catch (Exception e) {
-            logger.error("Error while retrieving experiments", e);
+        } catch (Exception e) {
+            logger.error("Error while retrieving experiments "+gatewayId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving experiments. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
+            // sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1279,12 +1438,9 @@
      * Get Experiments within project with pagination. Results will be sorted
      * based on creation time DESC
      *
-     * @param projectId
-     *       Identifier of the project
-     * @param limit
-     *       Amount of results to be fetched
-     * @param offset
-     *       The starting point of the results to be fetched
+     * @param projectId Identifier of the project
+     * @param limit     Amount of results to be fetched
+     * @param offset    The starting point of the results to be fetched
      */
     @Override
     @SecurityCheck
@@ -1292,26 +1448,36 @@
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, ProjectNotFoundException,
             AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
             Project project = regClient.getProject(projectId);
 
             String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-            if(ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(project.getOwner())
-                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(project.getGatewayId())){
+            if (ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(project.getOwner())
+                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(project.getGatewayId())) {
                 try {
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            projectId, gatewayId + ":READ")){
-                        throw new AuthorizationException("User does not have permission to access this resource");
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(projectId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
+                        throw new AuthorizationException("User"+ userId+ "does not have permission to access this resource. "+ projectId);
                     }
                 } catch (Exception e) {
-                    throw new AuthorizationException("User does not have permission to access this resource");
+                    throw new AuthorizationException("User does not have permission to access this resource" + projectId);
                 }
             }
             List<ExperimentModel> result = regClient.getExperimentsInProject(gatewayId, projectId, limit, offset);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
             logger.error("Error while retrieving the experiments", e);
@@ -1319,7 +1485,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving the experiments. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1328,14 +1493,10 @@
      * Get Experiments by user pagination. Results will be sorted
      * based on creation time DESC
      *
-     * @param gatewayId
-     *       Identifier of the requesting gateway
-     * @param userName
-     *       Username of the requested user
-     * @param limit
-     *       Amount of results to be fetched
-     * @param offset
-     *       The starting point of the results to be fetched
+     * @param gatewayId Identifier of the requesting gateway
+     * @param userName  Username of the requested user
+     * @param limit     Amount of results to be fetched
+     * @param offset    The starting point of the results to be fetched
      */
     @Override
     @SecurityCheck
@@ -1343,11 +1504,10 @@
                                                     int offset) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
             List<ExperimentModel> result = regClient.getUserExperiments(gatewayId, userName, limit, offset);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
             logger.error("Error while retrieving the experiments", e);
@@ -1355,7 +1515,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving the experiments. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1369,18 +1528,18 @@
      * @param experiment@return The server-side generated.airavata.registry.core.experiment.globally unique identifier.
      * @throws org.apache.airavata.model.error.InvalidRequestException For any incorrect forming of the request itself.
      * @throws org.apache.airavata.model.error.AiravataClientException The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
-     *                                                               <p/>
-     *                                                               UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
-     *                                                               step, then Airavata Registry will not have a provenance area setup. The client has to follow
-     *                                                               gateway registration steps and retry this request.
-     *                                                               <p/>
-     *                                                               AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
-     *                                                               For now this is a place holder.
-     *                                                               <p/>
-     *                                                               INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
-     *                                                               is implemented, the authorization will be more substantial.
+     *                                                                 <p/>
+     *                                                                 UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+     *                                                                 step, then Airavata Registry will not have a provenance area setup. The client has to follow
+     *                                                                 gateway registration steps and retry this request.
+     *                                                                 <p/>
+     *                                                                 AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+     *                                                                 For now this is a place holder.
+     *                                                                 <p/>
+     *                                                                 INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+     *                                                                 is implemented, the authorization will be more substantial.
      * @throws org.apache.airavata.model.error.AiravataSystemException This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
-     *                                                               rather an Airavata Administrator will be notified to take corrective action.
+     *                                                                 rather an Airavata Administrator will be notified to take corrective action.
      */
     @Override
     @SecurityCheck
@@ -1389,24 +1548,25 @@
         // TODO: verify that gatewayId and experiment.gatewayId match authzToken
         logger.info("Api server accepted experiment creation with name {}", experiment.getExperimentName());
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
             String experimentId = regClient.createExperiment(gatewayId, experiment);
 
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
-                    Entity entity = new Entity();
-                    entity.setEntityId(experimentId);
-                    final String domainId = experiment.getGatewayId();
-                    entity.setDomainId(domainId);
-                    entity.setEntityTypeId(domainId + ":" + "EXPERIMENT");
-                    entity.setOwnerId(experiment.getUserName() + "@" + domainId);
-                    entity.setName(experiment.getExperimentName());
-                    entity.setDescription(experiment.getDescription());
-                    entity.setParentEntityId(experiment.getProjectId());
 
-                    sharingClient.createEntity(entity);
-                    shareEntityWithAdminGatewayGroups(regClient, sharingClient, entity);
+                    Entity entity = Entity.newBuilder()
+                            .setOwnerId(experiment.getUserName())
+                            .setName(experiment.getExperimentName())
+                            .setId(experimentId)
+                            .setDescription(experiment.getDescription() != null ? experiment.getDescription() :"")
+                            .setType(ResourceType.EXPERIMENT.name())
+                            .setParentId(experiment.getProjectId())
+                            .build();
+                    sharingManagementClient.createEntity(custosId, entity);
+
+                    shareEntityWithAdminGatewayGroups(regClient, custosId, experiment.getGatewayId(), entity);
                 } catch (Exception ex) {
                     logger.error(ex.getMessage(), ex);
                     logger.error("Rolling back experiment creation Exp ID : " + experimentId);
@@ -1423,13 +1583,12 @@
             String messageId = AiravataUtils.getId("EXPERIMENT");
             MessageContext messageContext = new MessageContext(event, MessageType.EXPERIMENT, messageId, gatewayId);
             messageContext.setUpdatedTime(AiravataUtils.getCurrentTimestamp());
-            if(statusPublisher !=null) {
+            if (statusPublisher != null) {
                 statusPublisher.publish(messageContext);
             }
             //logger.debug(experimentId, "Created new experiment with experiment name {}", experiment.getExperimentName());
             logger.info(experimentId, "Created new experiment with experiment name {} and id ", experiment.getExperimentName(), experimentId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return experimentId;
         } catch (Exception e) {
             logger.error("Error while creating the experiment with experiment name {}", experiment.getExperimentName());
@@ -1437,13 +1596,13 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while creating the experiment. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
 
     /**
      * If the experiment is not already launched experiment can be deleted.
+     *
      * @param authzToken
      * @param experimentId
      * @return
@@ -1457,31 +1616,45 @@
     @SecurityCheck
     public boolean deleteExperiment(AuthzToken authzToken, String experimentId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+        Entity sharedEntity = Entity.newBuilder().setId(experimentId).build();
+
         try {
             ExperimentModel experimentModel = regClient.getExperiment(experimentId);
 
-            if(ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(experimentModel.getUserName())
-                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(experimentModel.getGatewayId())){
+            if (ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(experimentModel.getUserName())
+                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(experimentModel.getGatewayId())) {
                 try {
-                    String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            experimentId, gatewayId + ":WRITE")){
-                        throw new AuthorizationException("User does not have permission to access this resource");
+
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
+                        throw new AuthorizationException("User" +userId + "does not have permission to access this resource.");
                     }
                 } catch (Exception e) {
-                    throw new AuthorizationException("User does not have permission to access this resource");
+                    throw new AuthorizationException("User does not have permission to access this resource "+ experimentId);
                 }
             }
 
-            if(!(experimentModel.getExperimentStatus().get(0).getState() == ExperimentState.CREATED)){
+            if (!(experimentModel.getExperimentStatus().get(0).getState() == ExperimentState.CREATED)) {
                 logger.error("Error while deleting the experiment");
-                throw new RegistryServiceException("Experiment is not in CREATED state. Hence cannot deleted. ID:"+ experimentId);
+                throw new RegistryServiceException("Experiment is not in CREATED state. Hence cannot deleted. ID:" + experimentId);
             }
             boolean result = regClient.deleteExperiment(experimentId);
+            if (result) {
+                sharingManagementClient.deleteEntity(custosId, sharedEntity);
+            }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
+
             return result;
         } catch (Exception e) {
             logger.error("Error while deleting the experiment", e);
@@ -1489,7 +1662,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while deleting the experiment. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1503,50 +1675,57 @@
      * @throws org.apache.airavata.model.error.InvalidRequestException     For any incorrect forming of the request itself.
      * @throws org.apache.airavata.model.error.ExperimentNotFoundException If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
      * @throws org.apache.airavata.model.error.AiravataClientException     The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
-     *                                                                   <p/>
-     *                                                                   UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
-     *                                                                   step, then Airavata Registry will not have a provenance area setup. The client has to follow
-     *                                                                   gateway registration steps and retry this request.
-     *                                                                   <p/>
-     *                                                                   AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
-     *                                                                   For now this is a place holder.
-     *                                                                   <p/>
-     *                                                                   INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
-     *                                                                   is implemented, the authorization will be more substantial.
+     *                                                                     <p/>
+     *                                                                     UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+     *                                                                     step, then Airavata Registry will not have a provenance area setup. The client has to follow
+     *                                                                     gateway registration steps and retry this request.
+     *                                                                     <p/>
+     *                                                                     AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+     *                                                                     For now this is a place holder.
+     *                                                                     <p/>
+     *                                                                     INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+     *                                                                     is implemented, the authorization will be more substantial.
      * @throws org.apache.airavata.model.error.AiravataSystemException     This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
-     *                                                                   rather an Airavata Administrator will be notified to take corrective action.
+     *                                                                     rather an Airavata Administrator will be notified to take corrective action.
      */
     @Override
     @SecurityCheck
     public ExperimentModel getExperiment(AuthzToken authzToken, String airavataExperimentId) throws InvalidRequestException,
             ExperimentNotFoundException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         ExperimentModel experimentModel = null;
         try {
             experimentModel = regClient.getExperiment(airavataExperimentId);
-            if(authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(experimentModel.getUserName())
-                    && authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(experimentModel.getGatewayId())){
+            if (authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(experimentModel.getUserName())
+                    && authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(experimentModel.getGatewayId())) {
                 registryClientPool.returnResource(regClient);
-                sharingClientPool.returnResource(sharingClient);
                 return experimentModel;
-            }else if(ServerSettings.isEnableSharing()){
+            } else if (ServerSettings.isEnableSharing()) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            airavataExperimentId, gatewayId + ":READ")){
-                        throw new AuthorizationException("User does not have permission to access this resource");
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(airavataExperimentId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
+                        throw new AuthorizationException("User" + userId + "does not have permission to access this resource.");
                     }
                     registryClientPool.returnResource(regClient);
-                    sharingClientPool.returnResource(sharingClient);
                     return experimentModel;
                 } catch (Exception e) {
-                    throw new AuthorizationException("User does not have permission to access this resource");
+                    throw new AuthorizationException("User" + airavataExperimentId + "does not have permission to access this resource");
                 }
-            }else{
+            } else {
                 registryClientPool.returnResource(regClient);
-                sharingClientPool.returnResource(sharingClient);
                 return null;
             }
         } catch (Exception e) {
@@ -1555,7 +1734,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while getting the experiment. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1570,7 +1748,7 @@
             String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
             experimentModel = regClient.getExperiment(airavataExperimentId);
             registryClientPool.returnResource(regClient);
-            if(gatewayId.equals(experimentModel.getGatewayId())){
+            if (gatewayId.equals(experimentModel.getGatewayId())) {
                 return experimentModel;
             } else {
                 throw new AuthorizationException("User does not have permission to access this resource");
@@ -1595,37 +1773,35 @@
      * @throws org.apache.airavata.model.error.InvalidRequestException     For any incorrect forming of the request itself.
      * @throws org.apache.airavata.model.error.ExperimentNotFoundException If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
      * @throws org.apache.airavata.model.error.AiravataClientException     The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
-     *                                                                   <p/>
-     *                                                                   UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
-     *                                                                   step, then Airavata Registry will not have a provenance area setup. The client has to follow
-     *                                                                   gateway registration steps and retry this request.
-     *                                                                   <p/>
-     *                                                                   AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
-     *                                                                   For now this is a place holder.
-     *                                                                   <p/>
-     *                                                                   INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
-     *                                                                   is implemented, the authorization will be more substantial.
+     *                                                                     <p/>
+     *                                                                     UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+     *                                                                     step, then Airavata Registry will not have a provenance area setup. The client has to follow
+     *                                                                     gateway registration steps and retry this request.
+     *                                                                     <p/>
+     *                                                                     AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+     *                                                                     For now this is a place holder.
+     *                                                                     <p/>
+     *                                                                     INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+     *                                                                     is implemented, the authorization will be more substantial.
      * @throws org.apache.airavata.model.error.AiravataSystemException     This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
-     *                                                                   rather an Airavata Administrator will be notified to take corrective action.
+     *                                                                     rather an Airavata Administrator will be notified to take corrective action.
      */
     @Override
     @SecurityCheck
     public ExperimentModel getDetailedExperimentTree(AuthzToken authzToken, String airavataExperimentId) throws InvalidRequestException,
             ExperimentNotFoundException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
             ExperimentModel result = regClient.getDetailedExperimentTree(airavataExperimentId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
-            logger.error("Error while retrieving the experiment", e);
+            logger.error("Error while retrieving the experiment "+ airavataExperimentId, e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving the experiment. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1641,18 +1817,18 @@
      * @throws org.apache.airavata.model.error.InvalidRequestException     For any incorrect forming of the request itself.
      * @throws org.apache.airavata.model.error.ExperimentNotFoundException If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
      * @throws org.apache.airavata.model.error.AiravataClientException     The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
-     *                                                                   <p/>
-     *                                                                   UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
-     *                                                                   step, then Airavata Registry will not have a provenance area setup. The client has to follow
-     *                                                                   gateway registration steps and retry this request.
-     *                                                                   <p/>
-     *                                                                   AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
-     *                                                                   For now this is a place holder.
-     *                                                                   <p/>
-     *                                                                   INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
-     *                                                                   is implemented, the authorization will be more substantial.
+     *                                                                     <p/>
+     *                                                                     UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+     *                                                                     step, then Airavata Registry will not have a provenance area setup. The client has to follow
+     *                                                                     gateway registration steps and retry this request.
+     *                                                                     <p/>
+     *                                                                     AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+     *                                                                     For now this is a place holder.
+     *                                                                     <p/>
+     *                                                                     INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+     *                                                                     is implemented, the authorization will be more substantial.
      * @throws org.apache.airavata.model.error.AiravataSystemException     This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
-     *                                                                   rather an Airavata Administrator will be notified to take corrective action.
+     *                                                                     rather an Airavata Administrator will be notified to take corrective action.
      */
     @Override
     @SecurityCheck
@@ -1660,46 +1836,60 @@
             throws InvalidRequestException, ExperimentNotFoundException, AiravataClientException, AiravataSystemException,
             AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
             ExperimentModel experimentModel = regClient.getExperiment(airavataExperimentId);
             String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-            if(ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(experimentModel.getUserName())
-                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(experimentModel.getGatewayId())){
+            Entity sharedEntity = Entity.newBuilder().setId(airavataExperimentId).build();
+            if (ServerSettings.isEnableSharing() && !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.USER_NAME).equals(experimentModel.getUserName())
+                    || !authzToken.getClaimsMap().get(org.apache.airavata.common.utils.Constants.GATEWAY_ID).equals(experimentModel.getGatewayId())) {
+
                 try {
                     // Verify WRITE access
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            airavataExperimentId, gatewayId + ":WRITE")){
-                        throw new AuthorizationException("User does not have permission to access this resource");
+
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
+                        throw new AuthorizationException("User"+ userId + " does not have permission to access this resource.");
                     }
                 } catch (Exception e) {
-                    throw new AuthorizationException("User does not have permission to access this resource");
+                    throw new AuthorizationException("User does not have permission to access this resource "+ airavataExperimentId);
                 }
             }
 
             try {
                 // Update name, description and parent on Entity
                 // TODO: update the experiment via a DB event
-                Entity entity = sharingClient.getEntity(gatewayId, airavataExperimentId);
-                entity.setName(experiment.getExperimentName());
-                entity.setDescription(experiment.getDescription());
-                entity.setParentEntityId(experiment.getProjectId());
-                sharingClient.updateEntity(entity);
+                Entity exEntity = sharingManagementClient.getEntity(custosId, sharedEntity);
+                exEntity = exEntity.toBuilder()
+                        .setName(experiment.getExperimentName())
+                        .setDescription(experiment.getDescription() != null ? experiment.getDescription() : "")
+                        .setParentId(experiment.getProjectId()).build();
+                sharingManagementClient.updateEntity(custosId, exEntity);
+
             } catch (Exception e) {
                 throw new Exception("Failed to update entity in sharing registry", e);
             }
 
             regClient.updateExperiment(airavataExperimentId, experiment);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
+
         } catch (Exception e) {
             logger.error(airavataExperimentId, "Error while updating experiment", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while updating experiment. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -1709,6 +1899,7 @@
     public void updateExperimentConfiguration(AuthzToken authzToken, String airavataExperimentId, UserConfigurationDataModel userConfiguration)
             throws AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             regClient.updateExperimentConfiguration(airavataExperimentId, userConfiguration);
             registryClientPool.returnResource(regClient);
@@ -1730,6 +1921,7 @@
     public void updateResourceScheduleing(AuthzToken authzToken, String airavataExperimentId,
                                           ComputationalResourceSchedulingModel resourceScheduling) throws AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             regClient.updateResourceScheduleing(airavataExperimentId, resourceScheduling);
             registryClientPool.returnResource(regClient);
@@ -1801,24 +1993,25 @@
      * @throws org.apache.airavata.model.error.InvalidRequestException     For any incorrect forming of the request itself.
      * @throws org.apache.airavata.model.error.ExperimentNotFoundException If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
      * @throws org.apache.airavata.model.error.AiravataClientException     The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
-     *<p/>
-     *UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
-     *step, then Airavata Registry will not have a provenance area setup. The client has to follow
-     *gateway registration steps and retry this request.
-     *<p/>
-     *AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
-     *For now this is a place holder.
-     *<p/>
-     *INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
-     *is implemented, the authorization will be more substantial.
+     *                                                                     <p/>
+     *                                                                     UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+     *                                                                     step, then Airavata Registry will not have a provenance area setup. The client has to follow
+     *                                                                     gateway registration steps and retry this request.
+     *                                                                     <p/>
+     *                                                                     AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+     *                                                                     For now this is a place holder.
+     *                                                                     <p/>
+     *                                                                     INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+     *                                                                     is implemented, the authorization will be more substantial.
      * @throws org.apache.airavata.model.error.AiravataSystemException     This exception will be thrown for any
-     *          Airavata Server side issues and if the problem cannot be corrected by the client
-     *         rather an Airavata Administrator will be notified to take corrective action.
+     *                                                                     Airavata Server side issues and if the problem cannot be corrected by the client
+     *                                                                     rather an Airavata Administrator will be notified to take corrective action.
      */
     @Override
     @SecurityCheck
     public ExperimentStatus getExperimentStatus(AuthzToken authzToken, String airavataExperimentId) throws TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             ExperimentStatus result = regClient.getExperimentStatus(airavataExperimentId);
             registryClientPool.returnResource(regClient);
@@ -1837,6 +2030,7 @@
     public List<OutputDataObjectType> getExperimentOutputs(AuthzToken authzToken, String airavataExperimentId)
             throws AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<OutputDataObjectType> result = regClient.getExperimentOutputs(airavataExperimentId);
             registryClientPool.returnResource(regClient);
@@ -1862,6 +2056,7 @@
     public Map<String, JobStatus> getJobStatuses(AuthzToken authzToken, String airavataExperimentId)
             throws AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             Map<String, JobStatus> result = regClient.getJobStatuses(airavataExperimentId);
             registryClientPool.returnResource(regClient);
@@ -1881,6 +2076,7 @@
     public List<JobModel> getJobDetails(AuthzToken authzToken, String airavataExperimentId) throws InvalidRequestException,
             ExperimentNotFoundException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<JobModel> result = regClient.getJobDetails(airavataExperimentId);
             registryClientPool.returnResource(regClient);
@@ -1900,37 +2096,33 @@
      * Launch a previously created and configured experiment. Airavata Server will then start processing the request and appropriate
      * notifications and intermediate and output data will be subsequently available for this experiment.
      *
-     *
-     * @param airavataExperimentId   The identifier for the requested experiment. This is returned during the create experiment step.
+     * @param airavataExperimentId The identifier for the requested experiment. This is returned during the create experiment step.
      * @return This method call does not have a return value.
-     * @throws org.apache.airavata.model.error.InvalidRequestException
-     *          For any incorrect forming of the request itself.
-     * @throws org.apache.airavata.model.error.ExperimentNotFoundException
-     *          If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
-     * @throws org.apache.airavata.model.error.AiravataClientException
-     *          The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
-     *          <p/>
-     *          UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
-     *          step, then Airavata Registry will not have a provenance area setup. The client has to follow
-     *          gateway registration steps and retry this request.
-     *          <p/>
-     *          AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
-     *          For now this is a place holder.
-     *          <p/>
-     *          INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
-     *          is implemented, the authorization will be more substantial.
-     * @throws org.apache.airavata.model.error.AiravataSystemException
-     *          This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
-     *          rather an Airavata Administrator will be notified to take corrective action.
+     * @throws org.apache.airavata.model.error.InvalidRequestException     For any incorrect forming of the request itself.
+     * @throws org.apache.airavata.model.error.ExperimentNotFoundException If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+     * @throws org.apache.airavata.model.error.AiravataClientException     The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+     *                                                                     <p/>
+     *                                                                     UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+     *                                                                     step, then Airavata Registry will not have a provenance area setup. The client has to follow
+     *                                                                     gateway registration steps and retry this request.
+     *                                                                     <p/>
+     *                                                                     AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+     *                                                                     For now this is a place holder.
+     *                                                                     <p/>
+     *                                                                     INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+     *                                                                     is implemented, the authorization will be more substantial.
+     * @throws org.apache.airavata.model.error.AiravataSystemException     This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+     *                                                                     rather an Airavata Administrator will be notified to take corrective action.
      */
     @Override
     @SecurityCheck
     public void launchExperiment(AuthzToken authzToken, final String airavataExperimentId, String gatewayId)
             throws AuthorizationException, AiravataSystemException, TException {
         // TODO: verify that gatewayId matches gatewayId in authzToken
-        logger.info("Launching experiment {}", airavataExperimentId);
+
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
             ExperimentModel experiment = regClient.getExperiment(airavataExperimentId);
 
@@ -1955,8 +2147,20 @@
                 }
             }
 
+            String profileId = experiment.getUserConfigurationData().getGroupResourceProfileId();
             // Verify user has READ access to groupResourceProfileId
-            if (!sharingClient.userHasAccess(gatewayId, username + "@" + gatewayId, experiment.getUserConfigurationData().getGroupResourceProfileId(), gatewayId + ":READ")) {
+
+
+            PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+            Entity sharedEntity = Entity.newBuilder().setId(profileId).build();
+            SharingRequest sharingRequest = SharingRequest
+                    .newBuilder()
+                    .setEntity(sharedEntity)
+                    .setPermissionType(permissionType)
+                    .addOwnerId(username)
+                    .build();
+            Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+            if (!status.getStatus()) {
                 throw new AuthorizationException("User " + username + " in gateway " + gatewayId + " doesn't have access to group resource profile " + experiment.getUserConfigurationData().getGroupResourceProfileId());
             }
 
@@ -1974,19 +2178,30 @@
                     .findFirst();
             if (applicationDeploymentDescription.isPresent()) {
                 final String appDeploymentId = applicationDeploymentDescription.get().getAppDeploymentId();
-                if (!sharingClient.userHasAccess(gatewayId, username + "@" + gatewayId, appDeploymentId, gatewayId + ":READ")) {
-                    throw new AuthorizationException("User " + username + " in gateway " + gatewayId + " doesn't have access to app deployment " + appDeploymentId);
+
+                Entity deploymentEntity = Entity.newBuilder().setId(appDeploymentId).build();
+                SharingRequest request = SharingRequest
+                        .newBuilder()
+                        .setEntity(deploymentEntity)
+                        .setPermissionType(permissionType)
+                        .addOwnerId(username)
+                        .build();
+                Status appStatus = sharingManagementClient.userHasAccess(custosId, request);
+
+                if (!appStatus.getStatus()) {
+                    throw new AuthorizationException("User " + username + " in gateway "
+                            + gatewayId + " doesn't have access to app deployment " + appDeploymentId);
                 }
+
             } else {
                 throw new InvalidRequestException("Application deployment doesn't exist for application interface " + appInterfaceId + " and host " + resourceHostId + " in gateway " + gatewayId);
             }
             submitExperiment(gatewayId, airavataExperimentId);
             logger.info("Experiment with ExpId: " + airavataExperimentId + " was submitted in gateway with gatewayID: " + gatewayId);
             registryClientPool.returnResource(regClient);
-        } catch (InvalidRequestException|ExperimentNotFoundException|AuthorizationException e) {
+        } catch (InvalidRequestException | ExperimentNotFoundException | AuthorizationException e) {
             logger.error(e.getMessage(), e);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             throw e;
         } catch (Exception e1) {
             logger.error(airavataExperimentId, "Error while instantiate the registry instance", e1);
@@ -1994,13 +2209,11 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while instantiate the registry instance. More info : " + e1.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
 
 
-
 //    private OrchestratorService.Client getOrchestratorClient() throws TException {
 //	    try {
 //		    final String serverHost = ServerSettings.getOrchestratorServerHost();
@@ -2013,44 +2226,29 @@
 
     /**
      * Clone an specified experiment with a new name. A copy of the experiment configuration is made and is persisted with new metadata.
-     *   The client has to subsequently update this configuration if needed and launch the cloned experiment.
+     * The client has to subsequently update this configuration if needed and launch the cloned experiment.
      *
-     * @param existingExperimentID
-     *    This is the experiment identifier that already exists in the system. Will use this experimentID to retrieve
-     *    user configuration which is used with the clone experiment.
-     *
-     * @param newExperimentName
-     *   experiment name that should be used in the cloned experiment
-     *
-     * @return
-     *   The server-side generated.airavata.registry.core.experiment.globally unique identifier for the newly cloned experiment.
-     *
-     * @throws org.apache.airavata.model.error.InvalidRequestException
-     *    For any incorrect forming of the request itself.
-     *
-     * @throws org.apache.airavata.model.error.ExperimentNotFoundException
-     *    If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
-     *
-     * @throws org.apache.airavata.model.error.AiravataClientException
-     *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
-     *
-     *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
-     *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
-     *         gateway registration steps and retry this request.
-     *
-     *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
-     *         For now this is a place holder.
-     *
-     *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
-     *         is implemented, the authorization will be more substantial.
-     *
-     * @throws org.apache.airavata.model.error.AiravataSystemException
-     *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
-     *       rather an Airavata Administrator will be notified to take corrective action.
-     *
-     *
+     * @param existingExperimentID This is the experiment identifier that already exists in the system. Will use this experimentID to retrieve
+     *                             user configuration which is used with the clone experiment.
+     * @param newExperimentName    experiment name that should be used in the cloned experiment
      * @param existingExperimentID
      * @param newExperimentName
+     * @return The server-side generated.airavata.registry.core.experiment.globally unique identifier for the newly cloned experiment.
+     * @throws org.apache.airavata.model.error.InvalidRequestException     For any incorrect forming of the request itself.
+     * @throws org.apache.airavata.model.error.ExperimentNotFoundException If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+     * @throws org.apache.airavata.model.error.AiravataClientException     The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+     *                                                                     <p>
+     *                                                                     UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+     *                                                                     step, then Airavata Registry will not have a provenance area setup. The client has to follow
+     *                                                                     gateway registration steps and retry this request.
+     *                                                                     <p>
+     *                                                                     AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+     *                                                                     For now this is a place holder.
+     *                                                                     <p>
+     *                                                                     INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+     *                                                                     is implemented, the authorization will be more substantial.
+     * @throws org.apache.airavata.model.error.AiravataSystemException     This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+     *                                                                     rather an Airavata Administrator will be notified to take corrective action.
      */
     @Override
     @SecurityCheck
@@ -2058,13 +2256,12 @@
             throws InvalidRequestException, ExperimentNotFoundException, AiravataClientException, AiravataSystemException,
             AuthorizationException, ProjectNotFoundException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
             // getExperiment will apply sharing permissions
             ExperimentModel existingExperiment = this.getExperiment(authzToken, existingExperimentID);
-            String result = cloneExperimentInternal(regClient, sharingClient, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId, existingExperiment);
+            String result = cloneExperimentInternal(regClient, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId, existingExperiment);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
             logger.error(existingExperimentID, "Error while cloning the experiment with existing configuration...", e);
@@ -2072,7 +2269,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while cloning the experiment with existing configuration. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -2083,13 +2279,12 @@
             throws InvalidRequestException, ExperimentNotFoundException, AiravataClientException, AiravataSystemException,
             AuthorizationException, ProjectNotFoundException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
             // get existing experiment by bypassing normal sharing permissions for the admin user
             ExperimentModel existingExperiment = this.getExperimentByAdmin(authzToken, existingExperimentID);
-            String result = cloneExperimentInternal(regClient, sharingClient, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId, existingExperiment);
+            String result = cloneExperimentInternal(regClient, authzToken, existingExperimentID, newExperimentName, newExperimentProjectId, existingExperiment);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
             logger.error(existingExperimentID, "Error while cloning the experiment with existing configuration...", e);
@@ -2097,15 +2292,15 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while cloning the experiment with existing configuration. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
 
-    private String cloneExperimentInternal(RegistryService.Client regClient, SharingRegistryService.Client sharingClient,
+    private String cloneExperimentInternal(RegistryService.Client regClient,
                                            AuthzToken authzToken, String existingExperimentID, String newExperimentName, String newExperimentProjectId, ExperimentModel existingExperiment)
             throws ExperimentNotFoundException, ProjectNotFoundException, TException, AuthorizationException, ApplicationSettingsException {
-        if (existingExperiment == null){
+
+        if (existingExperiment == null) {
             logger.error(existingExperimentID, "Error while cloning experiment {}, experiment doesn't exist.", existingExperimentID);
             throw new ExperimentNotFoundException("Requested experiment id " + existingExperimentID + " does not exist in the system..");
         }
@@ -2113,7 +2308,7 @@
 
             // getProject will apply sharing permissions
             Project project = this.getProject(authzToken, newExperimentProjectId);
-            if (project == null){
+            if (project == null) {
                 logger.error("Error while cloning experiment {}, project {} doesn't exist.", existingExperimentID, newExperimentProjectId);
                 throw new ProjectNotFoundException("Requested project id " + newExperimentProjectId + " does not exist in the system..");
             }
@@ -2123,30 +2318,42 @@
         // make sure user has write access to the project
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-        if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                existingExperiment.getProjectId(), gatewayId + ":WRITE")){
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+        Entity deploymentEntity = Entity.newBuilder().setId(existingExperiment.getProjectId()).build();
+        PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+
+        SharingRequest request = SharingRequest
+                .newBuilder()
+                .setEntity(deploymentEntity)
+                .setPermissionType(permissionType)
+                .addOwnerId(userId)
+                .build();
+        Status appStatus = sharingManagementClient.userHasAccess(custosId, request);
+
+        if (! appStatus.getStatus()) {
             logger.error("Error while cloning experiment {}, user doesn't have write access to project {}", existingExperimentID, existingExperiment.getProjectId());
             throw new AuthorizationException("User does not have permission to clone an experiment in this project");
         }
 
         existingExperiment.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-        if (existingExperiment.getExecutionId() != null){
+        if (existingExperiment.getExecutionId() != null) {
             List<OutputDataObjectType> applicationOutputs = regClient.getApplicationOutputs(existingExperiment.getExecutionId());
             existingExperiment.setExperimentOutputs(applicationOutputs);
         }
-        if (validateString(newExperimentName)){
+        if (validateString(newExperimentName)) {
             existingExperiment.setExperimentName(newExperimentName);
         }
         existingExperiment.unsetErrors();
         existingExperiment.unsetProcesses();
         existingExperiment.unsetExperimentStatus();
-        if(existingExperiment.getUserConfigurationData() != null && existingExperiment.getUserConfigurationData()
-                .getComputationalResourceScheduling() != null){
+        if (existingExperiment.getUserConfigurationData() != null && existingExperiment.getUserConfigurationData()
+                .getComputationalResourceScheduling() != null) {
             String compResourceId = existingExperiment.getUserConfigurationData()
                     .getComputationalResourceScheduling().getResourceHostId();
 
             ComputeResourceDescription computeResourceDescription = regClient.getComputeResource(compResourceId);
-            if(!computeResourceDescription.isEnabled()){
+            if (!computeResourceDescription.isEnabled()) {
                 existingExperiment.getUserConfigurationData().setComputationalResourceScheduling(null);
             }
         }
@@ -2154,18 +2361,19 @@
         existingExperiment.setUserName(userId);
         String expId = regClient.createExperiment(gatewayId, existingExperiment);
 
-        if(ServerSettings.isEnableSharing()){
+        if (ServerSettings.isEnableSharing()) {
             try {
-                Entity entity = new Entity();
-                entity.setEntityId(expId);
-                final String domainId = existingExperiment.getGatewayId();
-                entity.setDomainId(domainId);
-                entity.setEntityTypeId(domainId + ":" + "EXPERIMENT");
-                entity.setOwnerId(existingExperiment.getUserName() + "@" + domainId);
-                entity.setName(existingExperiment.getExperimentName());
-                entity.setDescription(existingExperiment.getDescription());
-                sharingClient.createEntity(entity);
-                shareEntityWithAdminGatewayGroups(regClient, sharingClient, entity);
+                Entity entity = Entity.newBuilder()
+                        .setOwnerId(existingExperiment.getUserName())
+                        .setName(existingExperiment.getExperimentName())
+                        .setId(expId)
+                        .setDescription(existingExperiment.getDescription() != null ? existingExperiment.getDescription() :"")
+                        .setType(ResourceType.EXPERIMENT.name())
+                        .build();
+                sharingManagementClient.createEntity(custosId, entity);
+
+                shareEntityWithAdminGatewayGroups(regClient, custosId, existingExperiment.getGatewayId(), entity);
+
             } catch (Exception ex) {
                 logger.error(ex.getMessage(), ex);
                 logger.error("rolling back experiment creation Exp ID : " + expId);
@@ -2184,32 +2392,37 @@
      * @throws org.apache.airavata.model.error.InvalidRequestException     For any incorrect forming of the request itself.
      * @throws org.apache.airavata.model.error.ExperimentNotFoundException If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
      * @throws org.apache.airavata.model.error.AiravataClientException     The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
-     *                                                                   <p/>
-     *                                                                   UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
-     *                                                                   step, then Airavata Registry will not have a provenance area setup. The client has to follow
-     *                                                                   gateway registration steps and retry this request.
-     *                                                                   <p/>
-     *                                                                   AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
-     *                                                                   For now this is a place holder.
-     *                                                                   <p/>
-     *                                                                   INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
-     *                                                                   is implemented, the authorization will be more substantial.
+     *                                                                     <p/>
+     *                                                                     UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+     *                                                                     step, then Airavata Registry will not have a provenance area setup. The client has to follow
+     *                                                                     gateway registration steps and retry this request.
+     *                                                                     <p/>
+     *                                                                     AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+     *                                                                     For now this is a place holder.
+     *                                                                     <p/>
+     *                                                                     INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+     *                                                                     is implemented, the authorization will be more substantial.
      * @throws org.apache.airavata.model.error.AiravataSystemException     This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
-     *                                                                   rather an Airavata Administrator will be notified to take corrective action.
+     *                                                                     rather an Airavata Administrator will be notified to take corrective action.
      */
     @Override
     @SecurityCheck
     public void terminateExperiment(AuthzToken authzToken, String airavataExperimentId, String gatewayId)
             throws TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             ExperimentModel existingExperiment = regClient.getExperiment(airavataExperimentId);
-            if (existingExperiment == null){
+            ExperimentStatus experimentLastStatus = regClient.getExperimentStatus(airavataExperimentId);
+            if (existingExperiment == null) {
                 logger.error(airavataExperimentId, "Error while cancelling experiment {}, experiment doesn't exist.", airavataExperimentId);
                 throw new ExperimentNotFoundException("Requested experiment id " + airavataExperimentId + " does not exist in the system..");
             }
-            switch (existingExperiment.getExperimentStatus().get(0).getState()) {
-                case COMPLETED: case CANCELED: case FAILED: case CANCELING:
+            switch (experimentLastStatus.getState()) {
+                case COMPLETED:
+                case CANCELED:
+                case FAILED:
+                case CANCELING:
                     logger.warn("Can't terminate already {} experiment", existingExperiment.getExperimentStatus().get(0).getState().name());
                     break;
                 case CREATED:
@@ -2244,6 +2457,7 @@
     public String registerApplicationModule(AuthzToken authzToken, String gatewayId, ApplicationModule applicationModule)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.registerApplicationModule(gatewayId, applicationModule);
             registryClientPool.returnResource(regClient);
@@ -2270,6 +2484,8 @@
     public ApplicationModule getApplicationModule(AuthzToken authzToken, String appModuleId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
+
         try {
             ApplicationModule result = regClient.getApplicationModule(appModuleId);
             registryClientPool.returnResource(regClient);
@@ -2297,6 +2513,7 @@
     public boolean updateApplicationModule(AuthzToken authzToken, String appModuleId, ApplicationModule applicationModule)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateApplicationModule(appModuleId, applicationModule);
             registryClientPool.returnResource(regClient);
@@ -2322,6 +2539,7 @@
     public List<ApplicationModule> getAllAppModules(AuthzToken authzToken, String gatewayId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<ApplicationModule> result = regClient.getAllAppModules(gatewayId);
             registryClientPool.returnResource(regClient);
@@ -2348,35 +2566,27 @@
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+
         try {
             List<String> accessibleAppDeploymentIds = new ArrayList<>();
+
             if (ServerSettings.isEnableSharing()) {
-                List<SearchCriteria> sharingFilters = new ArrayList<>();
-                SearchCriteria entityTypeFilter = new SearchCriteria();
-                entityTypeFilter.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
-                entityTypeFilter.setSearchCondition(SearchCondition.EQUAL);
-                entityTypeFilter.setValue(gatewayId + ":" + ResourceType.APPLICATION_DEPLOYMENT.name());
-                sharingFilters.add(entityTypeFilter);
-                SearchCriteria permissionTypeFilter = new SearchCriteria();
-                permissionTypeFilter.setSearchField(EntitySearchField.PERMISSION_TYPE_ID);
-                permissionTypeFilter.setSearchCondition(SearchCondition.EQUAL);
-                permissionTypeFilter.setValue(gatewayId + ":" + ResourcePermissionType.READ);
-                sharingFilters.add(permissionTypeFilter);
-                sharingClient.searchEntities(authzToken.getClaimsMap().get(Constants.GATEWAY_ID),
-                        userName + "@" + gatewayId, sharingFilters, 0, -1).forEach(a -> accessibleAppDeploymentIds.add(a.getEntityId()));
+
+                accessibleAppDeploymentIds = getAccessibleIds(userName, ResourceType.APPLICATION_DEPLOYMENT, custosId);
+
             }
             List<String> accessibleComputeResourceIds = new ArrayList<>();
             List<GroupResourceProfile> groupResourceProfileList = getGroupResourceList(authzToken, gatewayId);
-            for(GroupResourceProfile groupResourceProfile : groupResourceProfileList) {
+            for (GroupResourceProfile groupResourceProfile : groupResourceProfileList) {
                 List<GroupComputeResourcePreference> groupComputeResourcePreferenceList = groupResourceProfile.getComputePreferences();
-                for(GroupComputeResourcePreference groupComputeResourcePreference : groupComputeResourcePreferenceList) {
+                for (GroupComputeResourcePreference groupComputeResourcePreference : groupComputeResourcePreferenceList) {
                     accessibleComputeResourceIds.add(groupComputeResourcePreference.getComputeResourceId());
                 }
             }
             List<ApplicationModule> result = regClient.getAccessibleAppModules(gatewayId, accessibleAppDeploymentIds, accessibleComputeResourceIds);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
             logger.error("Error while retrieving all application modules...", e);
@@ -2384,7 +2594,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving all application modules. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -2401,6 +2610,7 @@
     public boolean deleteApplicationModule(AuthzToken authzToken, String appModuleId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteApplicationModule(appModuleId);
             registryClientPool.returnResource(regClient);
@@ -2427,22 +2637,25 @@
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         // TODO: verify that gatewayId matches authzToken gatewayId
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+        String username = authzToken.getClaimsMap().get(Constants.USER_NAME);
+
         try {
             String result = regClient.registerApplicationDeployment(gatewayId, applicationDeployment);
-            Entity entity = new Entity();
-            entity.setEntityId(result);
-            final String domainId = gatewayId;
-            entity.setDomainId(domainId);
-            entity.setEntityTypeId(domainId + ":" + ResourceType.APPLICATION_DEPLOYMENT.name());
-            String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
-            entity.setOwnerId(userName + "@" + domainId);
-            entity.setName(result);
-            entity.setDescription(applicationDeployment.getAppDeploymentDescription());
-            sharingClient.createEntity(entity);
-            shareEntityWithAdminGatewayGroups(regClient, sharingClient, entity);
+
+            Entity entity = Entity.newBuilder()
+                    .setOwnerId(username)
+                    .setName(result)
+                    .setId(result)
+                    .setDescription(applicationDeployment.getAppDeploymentDescription() != null ?applicationDeployment.getAppDeploymentDescription():"")
+                    .setType(ResourceType.APPLICATION_DEPLOYMENT.name())
+                    .build();
+            sharingManagementClient.createEntity(custosId, entity);
+
+            shareEntityWithAdminGatewayGroups(regClient, custosId, gatewayId, entity);
+
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
+
             return result;
         } catch (Exception e) {
             logger.error("Error while adding application deployment...", e);
@@ -2450,7 +2663,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while adding application deployment. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -2467,17 +2679,17 @@
     public ApplicationDeploymentDescription getApplicationDeployment(AuthzToken authzToken, String appDeploymentId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
             if (ServerSettings.isEnableSharing()) {
-                final boolean hasAccess = userHasAccessInternal(sharingClient, authzToken, appDeploymentId, ResourcePermissionType.READ);
+                final boolean hasAccess = userHasAccessInternal(authzToken, appDeploymentId, ResourcePermissionType.READ);
+
                 if (!hasAccess) {
                     throw new AuthorizationException("User does not have access to application deployment " + appDeploymentId);
                 }
             }
             ApplicationDeploymentDescription result = regClient.getApplicationDeployment(appDeploymentId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
             logger.error(appDeploymentId, "Error while retrieving application deployment...", e);
@@ -2485,7 +2697,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving application deployment. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -2504,17 +2715,16 @@
                                                ApplicationDeploymentDescription applicationDeployment)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
             if (ServerSettings.isEnableSharing()) {
-                final boolean hasAccess = userHasAccessInternal(sharingClient, authzToken, appDeploymentId, ResourcePermissionType.WRITE);
+                final boolean hasAccess = userHasAccessInternal(authzToken, appDeploymentId, ResourcePermissionType.WRITE);
                 if (!hasAccess) {
                     throw new AuthorizationException("User does not have WRITE access to application deployment " + appDeploymentId);
                 }
             }
             boolean result = regClient.updateApplicationDeployment(appDeploymentId, applicationDeployment);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
             logger.error(appDeploymentId, "Error while updating application deployment...", e);
@@ -2522,7 +2732,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while updating application deployment. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -2539,17 +2748,20 @@
     public boolean deleteApplicationDeployment(AuthzToken authzToken, String appDeploymentId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            final boolean hasAccess = userHasAccessInternal(sharingClient, authzToken, appDeploymentId, ResourcePermissionType.WRITE);
+            final boolean hasAccess = userHasAccessInternal(authzToken, appDeploymentId, ResourcePermissionType.WRITE);
             if (!hasAccess) {
                 throw new AuthorizationException("User does not have WRITE access to application deployment " + appDeploymentId);
             }
-            final String domainId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
             boolean result = regClient.deleteApplicationDeployment(appDeploymentId);
-            sharingClient.deleteEntity(domainId, appDeploymentId);
+
+            Entity entity = Entity.newBuilder().setId(appDeploymentId).build();
+            if (result) {
+                sharingManagementClient.deleteEntity(custosId, entity);
+            }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
             logger.error(appDeploymentId, "Error while deleting application deployment...", e);
@@ -2557,7 +2769,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while deleting application deployment. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -2572,6 +2783,7 @@
     @SecurityCheck
     public List<ApplicationDeploymentDescription> getAllApplicationDeployments(AuthzToken authzToken, String gatewayId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
+
         return getAccessibleApplicationDeployments(authzToken, gatewayId, ResourcePermissionType.READ);
     }
 
@@ -2588,35 +2800,23 @@
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
             List<String> accessibleAppDeploymentIds = new ArrayList<>();
             if (ServerSettings.isEnableSharing()) {
-                List<SearchCriteria> sharingFilters = new ArrayList<>();
-                SearchCriteria entityTypeFilter = new SearchCriteria();
-                entityTypeFilter.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
-                entityTypeFilter.setSearchCondition(SearchCondition.EQUAL);
-                entityTypeFilter.setValue(gatewayId + ":" + ResourceType.APPLICATION_DEPLOYMENT.name());
-                sharingFilters.add(entityTypeFilter);
-                SearchCriteria permissionTypeFilter = new SearchCriteria();
-                permissionTypeFilter.setSearchField(EntitySearchField.PERMISSION_TYPE_ID);
-                permissionTypeFilter.setSearchCondition(SearchCondition.EQUAL);
-                permissionTypeFilter.setValue(gatewayId + ":" + permissionType.name());
-                sharingFilters.add(permissionTypeFilter);
-                sharingClient.searchEntities(authzToken.getClaimsMap().get(Constants.GATEWAY_ID),
-                        userName + "@" + gatewayId, sharingFilters, 0, -1).forEach(a -> accessibleAppDeploymentIds.add(a.getEntityId()));
+                accessibleAppDeploymentIds = getAccessibleIds(userName, ResourceType.APPLICATION_DEPLOYMENT, custosId);
             }
             List<String> accessibleComputeResourceIds = new ArrayList<>();
             List<GroupResourceProfile> groupResourceProfileList = getGroupResourceList(authzToken, gatewayId);
-            for(GroupResourceProfile groupResourceProfile : groupResourceProfileList) {
+            for (GroupResourceProfile groupResourceProfile : groupResourceProfileList) {
                 List<GroupComputeResourcePreference> groupComputeResourcePreferenceList = groupResourceProfile.getComputePreferences();
-                for(GroupComputeResourcePreference groupComputeResourcePreference : groupComputeResourcePreferenceList) {
+                for (GroupComputeResourcePreference groupComputeResourcePreference : groupComputeResourcePreferenceList) {
                     accessibleComputeResourceIds.add(groupComputeResourcePreference.getComputeResourceId());
                 }
             }
             List<ApplicationDeploymentDescription> result = regClient.getAccessibleApplicationDeployments(gatewayId, accessibleAppDeploymentIds, accessibleComputeResourceIds);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
             logger.error("Error while retrieving application deployments...", e);
@@ -2624,7 +2824,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving application deployments. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -2642,6 +2841,7 @@
     public List<String> getAppModuleDeployedResources(AuthzToken authzToken, String appModuleId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             // TODO: restrict to only application deployments that are accessible to user
             List<String> result = regClient.getAppModuleDeployedResources(appModuleId);
@@ -2661,14 +2861,10 @@
      * Fetch a list of Application Deployments that this user can use for executing the given Application Module using the given Group Resource Profile.
      * The user must have at least READ access to the Group Resource Profile.
      *
-     * @param appModuleId
-     *    The identifier for the Application Module
-     *
-     * @param groupResourceProfileId
-     *    The identifier for the Group Resource Profile
-     *
+     * @param appModuleId            The identifier for the Application Module
+     * @param groupResourceProfileId The identifier for the Group Resource Profile
      * @return list<ApplicationDeploymentDescription>
-     *    Returns a list of Application Deployments
+     * Returns a list of Application Deployments
      */
     @Override
     @SecurityCheck
@@ -2676,12 +2872,13 @@
             AuthzToken authzToken, String appModuleId, String groupResourceProfileId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
             // Get list of compute resources for this Group Resource Profile
-            if (!userHasAccessInternal(sharingClient, authzToken, groupResourceProfileId, ResourcePermissionType.READ)) {
+            if (!userHasAccessInternal(authzToken, groupResourceProfileId, ResourcePermissionType.READ)) {
                 throw new AuthorizationException("User is not authorized to access Group Resource Profile " + groupResourceProfileId);
             }
             GroupResourceProfile groupResourceProfile = regClient.getGroupResourceProfile(groupResourceProfileId);
@@ -2692,29 +2889,15 @@
 
             // Get list of accessible Application Deployments
             List<String> accessibleAppDeploymentIds = new ArrayList<>();
-            List<SearchCriteria> sharingFilters = new ArrayList<>();
-            SearchCriteria entityTypeFilter = new SearchCriteria();
-            entityTypeFilter.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
-            entityTypeFilter.setSearchCondition(SearchCondition.EQUAL);
-            entityTypeFilter.setValue(gatewayId + ":" + ResourceType.APPLICATION_DEPLOYMENT.name());
-            sharingFilters.add(entityTypeFilter);
-            SearchCriteria permissionTypeFilter = new SearchCriteria();
-            permissionTypeFilter.setSearchField(EntitySearchField.PERMISSION_TYPE_ID);
-            permissionTypeFilter.setSearchCondition(SearchCondition.EQUAL);
-            permissionTypeFilter.setValue(gatewayId + ":" + ResourcePermissionType.READ);
-            sharingFilters.add(permissionTypeFilter);
-            sharingClient.searchEntities(gatewayId, userName + "@" + gatewayId, sharingFilters, 0, -1)
-                    .forEach(a -> accessibleAppDeploymentIds.add(a.getEntityId()));
+            accessibleAppDeploymentIds = getAccessibleIds(userName, ResourceType.APPLICATION_DEPLOYMENT, custosId);
 
             List<ApplicationDeploymentDescription> result = regClient.getAccessibleApplicationDeploymentsForAppModule(
                     gatewayId, appModuleId, accessibleAppDeploymentIds, accessibleComputeResourceIds);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (AuthorizationException checkedException) {
             logger.error("Error while retrieving application deployments...", checkedException);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             throw checkedException;
         } catch (Exception e) {
             logger.error("Error while retrieving application deployments...", e);
@@ -2722,7 +2905,6 @@
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error while retrieving application deployments. More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -2739,6 +2921,7 @@
                                                ApplicationInterfaceDescription applicationInterface) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.registerApplicationInterface(gatewayId, applicationInterface);
             registryClientPool.returnResource(regClient);
@@ -2758,9 +2941,10 @@
     public String cloneApplicationInterface(AuthzToken authzToken, String existingAppInterfaceID, String newApplicationName, String gatewayId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             ApplicationInterfaceDescription existingInterface = regClient.getApplicationInterface(existingAppInterfaceID);
-            if (existingInterface == null){
+            if (existingInterface == null) {
                 logger.error("Provided application interface does not exist.Please provide a valid application interface id...");
                 throw new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             }
@@ -2768,7 +2952,7 @@
             existingInterface.setApplicationName(newApplicationName);
             existingInterface.setApplicationInterfaceId(airavata_commonsConstants.DEFAULT_ID);
             String interfaceId = regClient.registerApplicationInterface(gatewayId, existingInterface);
-            logger.debug("Airavata cloned application interface : " + existingAppInterfaceID + " for gateway id : " + gatewayId );
+            logger.debug("Airavata cloned application interface : " + existingAppInterfaceID + " for gateway id : " + gatewayId);
             registryClientPool.returnResource(regClient);
             return interfaceId;
         } catch (Exception e) {
@@ -2793,6 +2977,7 @@
     public ApplicationInterfaceDescription getApplicationInterface(AuthzToken authzToken, String appInterfaceId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             ApplicationInterfaceDescription result = regClient.getApplicationInterface(appInterfaceId);
             registryClientPool.returnResource(regClient);
@@ -2821,6 +3006,7 @@
                                               ApplicationInterfaceDescription applicationInterface) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateApplicationInterface(appInterfaceId, applicationInterface);
             registryClientPool.returnResource(regClient);
@@ -2847,6 +3033,7 @@
     public boolean deleteApplicationInterface(AuthzToken authzToken, String appInterfaceId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteApplicationInterface(appInterfaceId);
             registryClientPool.returnResource(regClient);
@@ -2872,6 +3059,7 @@
     public Map<String, String> getAllApplicationInterfaceNames(AuthzToken authzToken, String gatewayId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             Map<String, String> result = regClient.getAllApplicationInterfaceNames(gatewayId);
             registryClientPool.returnResource(regClient);
@@ -2897,6 +3085,7 @@
     public List<ApplicationInterfaceDescription> getAllApplicationInterfaces(AuthzToken authzToken, String gatewayId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<ApplicationInterfaceDescription> result = regClient.getAllApplicationInterfaces(gatewayId);
             registryClientPool.returnResource(regClient);
@@ -2923,6 +3112,7 @@
     public List<InputDataObjectType> getApplicationInputs(AuthzToken authzToken, String appInterfaceId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<InputDataObjectType> result = regClient.getApplicationInputs(appInterfaceId);
             registryClientPool.returnResource(regClient);
@@ -2949,6 +3139,7 @@
     public List<OutputDataObjectType> getApplicationOutputs(AuthzToken authzToken, String appInterfaceId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<OutputDataObjectType> result = regClient.getApplicationOutputs(appInterfaceId);
             registryClientPool.returnResource(regClient);
@@ -2976,6 +3167,7 @@
     public Map<String, String> getAvailableAppInterfaceComputeResources(AuthzToken authzToken, String appInterfaceId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             Map<String, String> result = regClient.getAvailableAppInterfaceComputeResources(appInterfaceId);
             registryClientPool.returnResource(regClient);
@@ -3002,6 +3194,7 @@
     public String registerComputeResource(AuthzToken authzToken, ComputeResourceDescription computeResourceDescription)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.registerComputeResource(computeResourceDescription);
             registryClientPool.returnResource(regClient);
@@ -3028,6 +3221,7 @@
     public ComputeResourceDescription getComputeResource(AuthzToken authzToken, String computeResourceId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             ComputeResourceDescription result = regClient.getComputeResource(computeResourceId);
             registryClientPool.returnResource(regClient);
@@ -3053,6 +3247,7 @@
     public Map<String, String> getAllComputeResourceNames(AuthzToken authzToken) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             Map<String, String> result = regClient.getAllComputeResourceNames();
             registryClientPool.returnResource(regClient);
@@ -3080,6 +3275,7 @@
     public boolean updateComputeResource(AuthzToken authzToken, String computeResourceId, ComputeResourceDescription computeResourceDescription)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateComputeResource(computeResourceId, computeResourceDescription);
             registryClientPool.returnResource(regClient);
@@ -3106,6 +3302,7 @@
     public boolean deleteComputeResource(AuthzToken authzToken, String computeResourceId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteComputeResource(computeResourceId);
             registryClientPool.returnResource(regClient);
@@ -3133,6 +3330,7 @@
     public String registerStorageResource(AuthzToken authzToken, StorageResourceDescription storageResourceDescription)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.registerStorageResource(storageResourceDescription);
             registryClientPool.returnResource(regClient);
@@ -3159,6 +3357,7 @@
     @SecurityCheck
     public StorageResourceDescription getStorageResource(AuthzToken authzToken, String storageResourceId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             StorageResourceDescription result = regClient.getStorageResource(storageResourceId);
             registryClientPool.returnResource(regClient);
@@ -3184,6 +3383,7 @@
     @SecurityCheck
     public Map<String, String> getAllStorageResourceNames(AuthzToken authzToken) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             Map<String, String> result = regClient.getAllStorageResourceNames();
             registryClientPool.returnResource(regClient);
@@ -3211,6 +3411,7 @@
     @SecurityCheck
     public boolean updateStorageResource(AuthzToken authzToken, String storageResourceId, StorageResourceDescription storageResourceDescription) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateStorageResource(storageResourceId, storageResourceDescription);
             registryClientPool.returnResource(regClient);
@@ -3237,6 +3438,7 @@
     @SecurityCheck
     public boolean deleteStorageResource(AuthzToken authzToken, String storageResourceId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteStorageResource(storageResourceId);
             registryClientPool.returnResource(regClient);
@@ -3266,6 +3468,7 @@
     public String addLocalSubmissionDetails(AuthzToken authzToken, String computeResourceId, int priorityOrder, LOCALSubmission localSubmission)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.addLocalSubmissionDetails(computeResourceId, priorityOrder, localSubmission);
             registryClientPool.returnResource(regClient);
@@ -3293,6 +3496,7 @@
     public boolean updateLocalSubmissionDetails(AuthzToken authzToken, String jobSubmissionInterfaceId, LOCALSubmission localSubmission)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateLocalSubmissionDetails(jobSubmissionInterfaceId, localSubmission);
             registryClientPool.returnResource(regClient);
@@ -3312,6 +3516,7 @@
     public LOCALSubmission getLocalJobSubmission(AuthzToken authzToken, String jobSubmissionId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             LOCALSubmission result = regClient.getLocalJobSubmission(jobSubmissionId);
             registryClientPool.returnResource(regClient);
@@ -3342,6 +3547,7 @@
     public String addSSHJobSubmissionDetails(AuthzToken authzToken, String computeResourceId, int priorityOrder, SSHJobSubmission sshJobSubmission)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.addSSHJobSubmissionDetails(computeResourceId, priorityOrder, sshJobSubmission);
             registryClientPool.returnResource(regClient);
@@ -3371,6 +3577,7 @@
     public String addSSHForkJobSubmissionDetails(AuthzToken authzToken, String computeResourceId, int priorityOrder, SSHJobSubmission sshJobSubmission)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.addSSHForkJobSubmissionDetails(computeResourceId, priorityOrder, sshJobSubmission);
             registryClientPool.returnResource(regClient);
@@ -3390,6 +3597,7 @@
     public SSHJobSubmission getSSHJobSubmission(AuthzToken authzToken, String jobSubmissionId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             SSHJobSubmission result = regClient.getSSHJobSubmission(jobSubmissionId);
             registryClientPool.returnResource(regClient);
@@ -3409,9 +3617,9 @@
      * Add a Cloud Job Submission details to a compute resource
      * App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
      *
-     * @param computeResourceId The identifier of the compute resource to which JobSubmission protocol to be added
-     * @param priorityOrder     Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
-     * @param cloudJobSubmission  The SSHJobSubmission object to be added to the resource.
+     * @param computeResourceId  The identifier of the compute resource to which JobSubmission protocol to be added
+     * @param priorityOrder      Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+     * @param cloudJobSubmission The SSHJobSubmission object to be added to the resource.
      * @return status
      * Returns a success/failure of the deletion.
      */
@@ -3421,6 +3629,7 @@
                                                CloudJobSubmission cloudJobSubmission) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.addCloudJobSubmissionDetails(computeResourceId, priorityOrder, cloudJobSubmission);
             registryClientPool.returnResource(regClient);
@@ -3440,6 +3649,7 @@
     public CloudJobSubmission getCloudJobSubmission(AuthzToken authzToken, String jobSubmissionId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             CloudJobSubmission result = regClient.getCloudJobSubmission(jobSubmissionId);
             registryClientPool.returnResource(regClient);
@@ -3461,6 +3671,7 @@
                                                  UnicoreJobSubmission unicoreJobSubmission)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.addUNICOREJobSubmissionDetails(computeResourceId, priorityOrder, unicoreJobSubmission);
             registryClientPool.returnResource(regClient);
@@ -3480,6 +3691,7 @@
     public UnicoreJobSubmission getUnicoreJobSubmission(AuthzToken authzToken, String jobSubmissionId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             UnicoreJobSubmission result = regClient.getUnicoreJobSubmission(jobSubmissionId);
             registryClientPool.returnResource(regClient);
@@ -3508,6 +3720,7 @@
     public boolean updateSSHJobSubmissionDetails(AuthzToken authzToken, String jobSubmissionInterfaceId, SSHJobSubmission sshJobSubmission)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateSSHJobSubmissionDetails(jobSubmissionInterfaceId, sshJobSubmission);
             registryClientPool.returnResource(regClient);
@@ -3526,7 +3739,7 @@
      * Update the given cloud Job Submission details
      *
      * @param jobSubmissionInterfaceId The identifier of the JobSubmission Interface to be updated.
-     * @param cloudJobSubmission         The SSHJobSubmission object to be updated.
+     * @param cloudJobSubmission       The SSHJobSubmission object to be updated.
      * @return status
      * Returns a success/failure of the deletion.
      */
@@ -3535,6 +3748,7 @@
     public boolean updateCloudJobSubmissionDetails(AuthzToken authzToken, String jobSubmissionInterfaceId, CloudJobSubmission cloudJobSubmission)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateCloudJobSubmissionDetails(jobSubmissionInterfaceId, cloudJobSubmission);
             registryClientPool.returnResource(regClient);
@@ -3554,6 +3768,7 @@
     public boolean updateUnicoreJobSubmissionDetails(AuthzToken authzToken, String jobSubmissionInterfaceId, UnicoreJobSubmission unicoreJobSubmission)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateUnicoreJobSubmissionDetails(jobSubmissionInterfaceId, unicoreJobSubmission);
             registryClientPool.returnResource(regClient);
@@ -3572,7 +3787,7 @@
      * Add a Local data moevement details to a compute resource
      * App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
      *
-     * @param resourceId The identifier of the compute resource to which JobSubmission protocol to be added
+     * @param resourceId        The identifier of the compute resource to which JobSubmission protocol to be added
      * @param priorityOrder     Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
      * @param localDataMovement The LOCALDataMovement object to be added to the resource.
      * @return status
@@ -3584,6 +3799,7 @@
                                               LOCALDataMovement localDataMovement) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.addLocalDataMovementDetails(resourceId, dmType, priorityOrder, localDataMovement);
             registryClientPool.returnResource(regClient);
@@ -3602,7 +3818,7 @@
      * Update the given Local data movement details
      *
      * @param dataMovementInterfaceId The identifier of the JobSubmission Interface to be updated.
-     * @param localDataMovement        The LOCALDataMovement object to be updated.
+     * @param localDataMovement       The LOCALDataMovement object to be updated.
      * @return status
      * Returns a success/failure of the update.
      */
@@ -3611,6 +3827,7 @@
     public boolean updateLocalDataMovementDetails(AuthzToken authzToken, String dataMovementInterfaceId, LOCALDataMovement localDataMovement)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateLocalDataMovementDetails(dataMovementInterfaceId, localDataMovement);
             registryClientPool.returnResource(regClient);
@@ -3630,6 +3847,7 @@
     public LOCALDataMovement getLocalDataMovement(AuthzToken authzToken, String dataMovementId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             LOCALDataMovement result = regClient.getLocalDataMovement(dataMovementId);
             registryClientPool.returnResource(regClient);
@@ -3650,9 +3868,9 @@
      * Add a SCP data moevement details to a compute resource
      * App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
      *
-     * @param resourceId The identifier of the compute resource to which JobSubmission protocol to be added
-     * @param priorityOrder     Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
-     * @param scpDataMovement   The SCPDataMovement object to be added to the resource.
+     * @param resourceId      The identifier of the compute resource to which JobSubmission protocol to be added
+     * @param priorityOrder   Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+     * @param scpDataMovement The SCPDataMovement object to be added to the resource.
      * @return status
      * Returns a success/failure of the deletion.
      */
@@ -3661,6 +3879,7 @@
     public String addSCPDataMovementDetails(AuthzToken authzToken, String resourceId, DMType dmType, int priorityOrder, SCPDataMovement scpDataMovement)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.addSCPDataMovementDetails(resourceId, dmType, priorityOrder, scpDataMovement);
             registryClientPool.returnResource(regClient);
@@ -3680,7 +3899,7 @@
      * App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
      *
      * @param dataMovementInterfaceId The identifier of the JobSubmission Interface to be updated.
-     * @param scpDataMovement          The SCPDataMovement object to be updated.
+     * @param scpDataMovement         The SCPDataMovement object to be updated.
      * @return status
      * Returns a success/failure of the update.
      */
@@ -3689,6 +3908,7 @@
     public boolean updateSCPDataMovementDetails(AuthzToken authzToken, String dataMovementInterfaceId, SCPDataMovement scpDataMovement)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateSCPDataMovementDetails(dataMovementInterfaceId, scpDataMovement);
             registryClientPool.returnResource(regClient);
@@ -3708,6 +3928,7 @@
     public SCPDataMovement getSCPDataMovement(AuthzToken authzToken, String dataMovementId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             SCPDataMovement result = regClient.getSCPDataMovement(dataMovementId);
             registryClientPool.returnResource(regClient);
@@ -3728,6 +3949,7 @@
     public String addUnicoreDataMovementDetails(AuthzToken authzToken, String resourceId, DMType dmType, int priorityOrder, UnicoreDataMovement unicoreDataMovement)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.addUnicoreDataMovementDetails(resourceId, dmType, priorityOrder, unicoreDataMovement);
             registryClientPool.returnResource(regClient);
@@ -3747,6 +3969,7 @@
     public boolean updateUnicoreDataMovementDetails(AuthzToken authzToken, String dataMovementInterfaceId, UnicoreDataMovement unicoreDataMovement)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateUnicoreDataMovementDetails(dataMovementInterfaceId, unicoreDataMovement);
             registryClientPool.returnResource(regClient);
@@ -3766,6 +3989,7 @@
     public UnicoreDataMovement getUnicoreDataMovement(AuthzToken authzToken, String dataMovementId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             UnicoreDataMovement result = regClient.getUnicoreDataMovement(dataMovementId);
             registryClientPool.returnResource(regClient);
@@ -3797,6 +4021,7 @@
                                                 GridFTPDataMovement gridFTPDataMovement) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.addGridFTPDataMovementDetails(computeResourceId, dmType, priorityOrder, gridFTPDataMovement);
             registryClientPool.returnResource(regClient);
@@ -3816,7 +4041,7 @@
      * App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
      *
      * @param dataMovementInterfaceId The identifier of the JobSubmission Interface to be updated.
-     * @param gridFTPDataMovement      The GridFTPDataMovement object to be updated.
+     * @param gridFTPDataMovement     The GridFTPDataMovement object to be updated.
      * @return status
      * Returns a success/failure of the updation.
      */
@@ -3825,6 +4050,7 @@
     public boolean updateGridFTPDataMovementDetails(AuthzToken authzToken, String dataMovementInterfaceId, GridFTPDataMovement gridFTPDataMovement)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateGridFTPDataMovementDetails(dataMovementInterfaceId, gridFTPDataMovement);
             registryClientPool.returnResource(regClient);
@@ -3844,6 +4070,7 @@
     public GridFTPDataMovement getGridFTPDataMovement(AuthzToken authzToken, String dataMovementId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             GridFTPDataMovement result = regClient.getGridFTPDataMovement(dataMovementId);
             registryClientPool.returnResource(regClient);
@@ -3929,6 +4156,7 @@
     public boolean deleteJobSubmissionInterface(AuthzToken authzToken, String computeResourceId, String jobSubmissionInterfaceId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteJobSubmissionInterface(computeResourceId, jobSubmissionInterfaceId);
             registryClientPool.returnResource(regClient);
@@ -3955,6 +4183,7 @@
     public boolean deleteDataMovementInterface(AuthzToken authzToken, String resourceId, String dataMovementInterfaceId, DMType dmType)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteDataMovementInterface(resourceId, dataMovementInterfaceId, dmType);
             registryClientPool.returnResource(regClient);
@@ -3974,6 +4203,7 @@
     public String registerResourceJobManager(AuthzToken authzToken, ResourceJobManager resourceJobManager) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.registerResourceJobManager(resourceJobManager);
             registryClientPool.returnResource(regClient);
@@ -3993,6 +4223,7 @@
     public boolean updateResourceJobManager(AuthzToken authzToken, String resourceJobManagerId, ResourceJobManager updatedResourceJobManager)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateResourceJobManager(resourceJobManagerId, updatedResourceJobManager);
             registryClientPool.returnResource(regClient);
@@ -4009,9 +4240,10 @@
 
     @Override
     @SecurityCheck
-    public ResourceJobManager getResourceJobManager(AuthzToken authzToken,String resourceJobManagerId) throws InvalidRequestException,
+    public ResourceJobManager getResourceJobManager(AuthzToken authzToken, String resourceJobManagerId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             ResourceJobManager result = regClient.getResourceJobManager(resourceJobManagerId);
             registryClientPool.returnResource(regClient);
@@ -4031,6 +4263,7 @@
     public boolean deleteResourceJobManager(AuthzToken authzToken, String resourceJobManagerId) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteResourceJobManager(resourceJobManagerId);
             registryClientPool.returnResource(regClient);
@@ -4050,6 +4283,7 @@
     public boolean deleteBatchQueue(AuthzToken authzToken, String computeResourceId, String queueName) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteBatchQueue(computeResourceId, queueName);
             registryClientPool.returnResource(regClient);
@@ -4068,8 +4302,8 @@
      * Register a Gateway Resource Profile.
      *
      * @param gatewayResourceProfile Gateway Resource Profile Object.
-     *   The GatewayID should be obtained from Airavata gateway registration and passed to register a corresponding
-     *      resource profile.
+     *                               The GatewayID should be obtained from Airavata gateway registration and passed to register a corresponding
+     *                               resource profile.
      * @return status.
      * Returns a success/failure of the registration.
      */
@@ -4078,6 +4312,7 @@
     public String registerGatewayResourceProfile(AuthzToken authzToken, GatewayResourceProfile gatewayResourceProfile)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.registerGatewayResourceProfile(gatewayResourceProfile);
             registryClientPool.returnResource(regClient);
@@ -4104,6 +4339,7 @@
     public GatewayResourceProfile getGatewayResourceProfile(AuthzToken authzToken, String gatewayID) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             GatewayResourceProfile result = regClient.getGatewayResourceProfile(gatewayID);
             registryClientPool.returnResource(regClient);
@@ -4132,6 +4368,7 @@
                                                 String gatewayID,
                                                 GatewayResourceProfile gatewayResourceProfile) throws TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateGatewayResourceProfile(gatewayID, gatewayResourceProfile);
             registryClientPool.returnResource(regClient);
@@ -4157,6 +4394,7 @@
     @SecurityCheck
     public boolean deleteGatewayResourceProfile(AuthzToken authzToken, String gatewayID) throws TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteGatewayResourceProfile(gatewayID);
             registryClientPool.returnResource(regClient);
@@ -4187,6 +4425,7 @@
                                                        ComputeResourcePreference computeResourcePreference) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.addGatewayComputeResourcePreference(gatewayID, computeResourceId, computeResourcePreference);
             registryClientPool.returnResource(regClient);
@@ -4206,6 +4445,7 @@
     public boolean addGatewayStoragePreference(AuthzToken authzToken, String gatewayID, String storageResourceId, StoragePreference dataStoragePreference)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.addGatewayStoragePreference(gatewayID, storageResourceId, dataStoragePreference);
             registryClientPool.returnResource(regClient);
@@ -4233,6 +4473,7 @@
     public ComputeResourcePreference getGatewayComputeResourcePreference(AuthzToken authzToken, String gatewayID, String computeResourceId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             ComputeResourcePreference result = regClient.getGatewayComputeResourcePreference(gatewayID, computeResourceId);
             registryClientPool.returnResource(regClient);
@@ -4251,6 +4492,7 @@
     @SecurityCheck
     public StoragePreference getGatewayStoragePreference(AuthzToken authzToken, String gatewayID, String storageId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             StoragePreference result = regClient.getGatewayStoragePreference(gatewayID, storageId);
             registryClientPool.returnResource(regClient);
@@ -4277,6 +4519,7 @@
     public List<ComputeResourcePreference> getAllGatewayComputeResourcePreferences(AuthzToken authzToken, String gatewayID)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<ComputeResourcePreference> result = regClient.getAllGatewayComputeResourcePreferences(gatewayID);
             registryClientPool.returnResource(regClient);
@@ -4295,6 +4538,7 @@
     @SecurityCheck
     public List<StoragePreference> getAllGatewayStoragePreferences(AuthzToken authzToken, String gatewayID) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<StoragePreference> result = regClient.getAllGatewayStoragePreferences(gatewayID);
             registryClientPool.returnResource(regClient);
@@ -4314,6 +4558,7 @@
     public List<GatewayResourceProfile> getAllGatewayResourceProfiles(AuthzToken authzToken) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<GatewayResourceProfile> result = regClient.getAllGatewayResourceProfiles();
             registryClientPool.returnResource(regClient);
@@ -4342,6 +4587,7 @@
                                                           ComputeResourcePreference computeResourcePreference)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateGatewayComputeResourcePreference(gatewayID, computeResourceId, computeResourcePreference);
             registryClientPool.returnResource(regClient);
@@ -4387,6 +4633,7 @@
     public boolean deleteGatewayComputeResourcePreference(AuthzToken authzToken, String gatewayID, String computeResourceId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteGatewayComputeResourcePreference(gatewayID, computeResourceId);
             registryClientPool.returnResource(regClient);
@@ -4405,6 +4652,7 @@
     @SecurityCheck
     public boolean deleteGatewayStoragePreference(AuthzToken authzToken, String gatewayID, String storageId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteGatewayStoragePreference(gatewayID, storageId);
             registryClientPool.returnResource(regClient);
@@ -4437,7 +4685,7 @@
                 sshAccountProvisionerConfigParam.setName(configParam.getName());
                 sshAccountProvisionerConfigParam.setDescription(configParam.getDescription());
                 sshAccountProvisionerConfigParam.setIsOptional(configParam.isOptional());
-                switch (configParam.getType()){
+                switch (configParam.getType()) {
                     case STRING:
                         sshAccountProvisionerConfigParam.setType(SSHAccountProvisionerConfigParamType.STRING);
                         break;
@@ -4457,8 +4705,10 @@
     @SecurityCheck
     public boolean doesUserHaveSSHAccount(AuthzToken authzToken, String computeResourceId, String userId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         try {
+
             String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
             return SSHAccountManager.doesUserHaveSSHAccount(gatewayId, computeResourceId, userId);
+
         } catch (Exception e) {
             String errorMessage = "Error occurred while checking if [" + userId + "] has an SSH Account on [" +
                     computeResourceId + "].";
@@ -4475,22 +4725,28 @@
     public boolean isSSHSetupCompleteForUserComputeResourcePreference(AuthzToken authzToken, String computeResourceId, String airavataCredStoreToken) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-        CredentialStoreService.Client csClient = csClientPool.getResource();
-        SSHCredential sshCredential = null;
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+        org.apache.airavata.model.credential.store.SSHCredential sshCredential1 = null;
         try {
-            sshCredential = csClient.getSSHCredential(airavataCredStoreToken, gatewayId);
-        }catch (Exception e){
+
+            SSHCredential sshCredential = resourceSecretClient.getSSHCredential(custosId, airavataCredStoreToken, false);
+
+            sshCredential1 =
+                    CustosToAiravataDataModelMapper.transform(sshCredential, gatewayId);
+
+        } catch (Exception e) {
             logger.error("Error occurred while retrieving SSH Credential", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error occurred while retrieving SSH Credential. More info : " + e.getMessage());
-            csClientPool.returnBrokenResource(csClient);
+
             throw exception;
         }
 
         try {
-            return SSHAccountManager.isSSHAccountSetupComplete(gatewayId, computeResourceId, userId, sshCredential);
-        }catch (Exception e){
+            return SSHAccountManager.isSSHAccountSetupComplete(gatewayId, computeResourceId, userId, sshCredential1);
+        } catch (Exception e) {
             final String msg = "Error occurred while checking if setup of SSH account is complete for user [" + userId + "].";
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException();
@@ -4504,23 +4760,24 @@
     @SecurityCheck
     public UserComputeResourcePreference setupUserComputeResourcePreferencesForSSH(AuthzToken authzToken, String computeResourceId, String userId, String airavataCredStoreToken) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-        CredentialStoreService.Client csClient = csClientPool.getResource();
-        SSHCredential sshCredential = null;
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+        org.apache.airavata.model.credential.store.SSHCredential sshCredential1 = null;
         try {
-            sshCredential = csClient.getSSHCredential(airavataCredStoreToken, gatewayId);
-        }catch (Exception e){
+            SSHCredential sshCredential = resourceSecretClient.getSSHCredential(custosId, airavataCredStoreToken, false);
+            sshCredential1 = CustosToAiravataDataModelMapper.transform(sshCredential, gatewayId);
+        } catch (Exception e) {
             logger.error("Error occurred while retrieving SSH Credential", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage("Error occurred while retrieving SSH Credential. More info : " + e.getMessage());
-            csClientPool.returnBrokenResource(csClient);
             throw exception;
         }
 
         try {
-            UserComputeResourcePreference userComputeResourcePreference = SSHAccountManager.setupSSHAccount(gatewayId, computeResourceId, userId, sshCredential);
+            UserComputeResourcePreference userComputeResourcePreference = SSHAccountManager.setupSSHAccount(gatewayId, computeResourceId, userId, sshCredential1);
             return userComputeResourcePreference;
-        }catch (Exception e){
+        } catch (Exception e) {
             logger.error("Error occurred while automatically setting up SSH account for user [" + userId + "]", e);
             AiravataSystemException exception = new AiravataSystemException();
             exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
@@ -4533,8 +4790,8 @@
      * Register a User Resource Profile.
      *
      * @param userResourceProfile User Resource Profile Object.
-     *   The userId should be obtained from Airavata user profile registration and passed to register a corresponding
-     *      resource profile.
+     *                            The userId should be obtained from Airavata user profile registration and passed to register a corresponding
+     *                            resource profile.
      * @return status.
      * Returns a success/failure of the registration.
      */
@@ -4543,6 +4800,7 @@
     public String registerUserResourceProfile(AuthzToken authzToken, UserResourceProfile userResourceProfile)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.registerUserResourceProfile(userResourceProfile);
             registryClientPool.returnResource(regClient);
@@ -4561,6 +4819,7 @@
     @SecurityCheck
     public boolean isUserResourceProfileExists(AuthzToken authzToken, String userId, String gatewayID) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.isUserResourceProfileExists(userId, gatewayID);
             registryClientPool.returnResource(regClient);
@@ -4578,10 +4837,8 @@
     /**
      * Fetch the given User Resource Profile.
      *
-     * @param userId The identifier for the requested User resource
-     *
+     * @param userId    The identifier for the requested User resource
      * @param gatewayID The identifier to link a gateway for the requested User resource
-     *
      * @return userResourceProfile
      * User Resource Profile Object.
      */
@@ -4590,6 +4847,7 @@
     public UserResourceProfile getUserResourceProfile(AuthzToken authzToken, String userId, String gatewayID) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             UserResourceProfile result = regClient.getUserResourceProfile(userId, gatewayID);
             registryClientPool.returnResource(regClient);
@@ -4607,8 +4865,8 @@
     /**
      * Update a User Resource Profile.
      *
-     * @param userId : The identifier for the requested user resource profile to be updated.
-     * @param gatewayID The identifier to link a gateway for the requested User resource
+     * @param userId              : The identifier for the requested user resource profile to be updated.
+     * @param gatewayID           The identifier to link a gateway for the requested User resource
      * @param userResourceProfile User Resource Profile Object.
      * @return status
      * Returns a success/failure of the update.
@@ -4620,6 +4878,7 @@
                                              String gatewayID,
                                              UserResourceProfile userResourceProfile) throws TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateUserResourceProfile(userId, gatewayID, userResourceProfile);
             registryClientPool.returnResource(regClient);
@@ -4637,7 +4896,7 @@
     /**
      * Delete the given User Resource Profile.
      *
-     * @param userId  : The identifier for the requested userId resource to be deleted.
+     * @param userId    : The identifier for the requested userId resource to be deleted.
      * @param gatewayID The identifier to link a gateway for the requested User resource
      * @return status
      * Returns a success/failure of the deletion.
@@ -4646,6 +4905,7 @@
     @SecurityCheck
     public boolean deleteUserResourceProfile(AuthzToken authzToken, String userId, String gatewayID) throws TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteUserResourceProfile(userId, gatewayID);
             registryClientPool.returnResource(regClient);
@@ -4663,8 +4923,8 @@
     /**
      * Add a Compute Resource Preference to a registered User Resource profile.
      *
-     * @param userId                 The identifier for the User Resource profile to be added.
-     * @param gatewayID The identifier to link a gateway for the requested User resource
+     * @param userId                        The identifier for the User Resource profile to be added.
+     * @param gatewayID                     The identifier to link a gateway for the requested User resource
      * @param userComputeResourceId         Preferences related to a particular compute resource
      * @param userComputeResourcePreference The ComputeResourcePreference object to be added to the resource profile.
      * @return status
@@ -4677,6 +4937,7 @@
                                                     UserComputeResourcePreference userComputeResourcePreference) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.addUserComputeResourcePreference(userId, gatewayID, userComputeResourceId, userComputeResourcePreference);
             registryClientPool.returnResource(regClient);
@@ -4696,6 +4957,7 @@
     public boolean addUserStoragePreference(AuthzToken authzToken, String userId, String gatewayID, String userStorageResourceId, UserStoragePreference dataStoragePreference)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.addUserStoragePreference(userId, gatewayID, userStorageResourceId, dataStoragePreference);
             registryClientPool.returnResource(regClient);
@@ -4713,8 +4975,8 @@
     /**
      * Fetch a Compute Resource Preference of a registered User Resource profile.
      *
-     * @param userId : The identifier for the User Resource profile to be requested
-     * @param gatewayID The identifier to link a gateway for the requested User resource
+     * @param userId                : The identifier for the User Resource profile to be requested
+     * @param gatewayID             The identifier to link a gateway for the requested User resource
      * @param userComputeResourceId Preferences related to a particular compute resource
      * @return computeResourcePreference
      * Returns the ComputeResourcePreference object.
@@ -4724,6 +4986,7 @@
     public UserComputeResourcePreference getUserComputeResourcePreference(AuthzToken authzToken, String userId, String gatewayID, String userComputeResourceId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             UserComputeResourcePreference result = regClient.getUserComputeResourcePreference(userId, gatewayID, userComputeResourceId);
             registryClientPool.returnResource(regClient);
@@ -4742,6 +5005,7 @@
     @SecurityCheck
     public UserStoragePreference getUserStoragePreference(AuthzToken authzToken, String userId, String gatewayID, String userStorageId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             UserStoragePreference result = regClient.getUserStoragePreference(userId, gatewayID, userStorageId);
             registryClientPool.returnResource(regClient);
@@ -4769,6 +5033,7 @@
     public List<UserComputeResourcePreference> getAllUserComputeResourcePreferences(AuthzToken authzToken, String userId, String gatewayID)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<UserComputeResourcePreference> result = regClient.getAllUserComputeResourcePreferences(userId, gatewayID);
             registryClientPool.returnResource(regClient);
@@ -4787,6 +5052,7 @@
     @SecurityCheck
     public List<UserStoragePreference> getAllUserStoragePreferences(AuthzToken authzToken, String userId, String gatewayID) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<UserStoragePreference> result = regClient.getAllUserStoragePreferences(userId, gatewayID);
             registryClientPool.returnResource(regClient);
@@ -4806,6 +5072,7 @@
     public List<UserResourceProfile> getAllUserResourceProfiles(AuthzToken authzToken) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<UserResourceProfile> result = regClient.getAllUserResourceProfiles();
             registryClientPool.returnResource(regClient);
@@ -4822,8 +5089,8 @@
     /**
      * Update a Compute Resource Preference to a registered User Resource profile.
      *
-     * @param userId : The identifier for the User Resource profile to be updated.
-     * @param gatewayID The identifier to link a gateway for the requested User resource
+     * @param userId                        : The identifier for the User Resource profile to be updated.
+     * @param gatewayID                     The identifier to link a gateway for the requested User resource
      * @param userComputeResourceId         Preferences related to a particular compute resource
      * @param userComputeResourcePreference The ComputeResourcePreference object to be updated to the resource profile.
      * @return status
@@ -4835,6 +5102,7 @@
                                                        UserComputeResourcePreference userComputeResourcePreference)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateUserComputeResourcePreference(userId, gatewayID, userComputeResourceId, userComputeResourcePreference);
             registryClientPool.returnResource(regClient);
@@ -4853,6 +5121,7 @@
     @SecurityCheck
     public boolean updateUserStoragePreference(AuthzToken authzToken, String userId, String gatewayID, String userStorageId, UserStoragePreference dataStoragePreference) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.updateUserStoragePreference(userId, gatewayID, userStorageId, dataStoragePreference);
             registryClientPool.returnResource(regClient);
@@ -4870,17 +5139,18 @@
     /**
      * Delete the Compute Resource Preference of a registered User Resource profile.
      *
-     * @param userId         The identifier for the User profile to be deleted.
-     * @param gatewayID The identifier to link a gateway for the requested User resource
+     * @param userId                The identifier for the User profile to be deleted.
+     * @param gatewayID             The identifier to link a gateway for the requested User resource
      * @param userComputeResourceId Preferences related to a particular compute resource
      * @return status
      * Returns a success/failure of the deletion.
      */
     @Override
     @SecurityCheck
-    public boolean deleteUserComputeResourcePreference(AuthzToken authzToken, String userId,String gatewayID, String userComputeResourceId)
+    public boolean deleteUserComputeResourcePreference(AuthzToken authzToken, String userId, String gatewayID, String userComputeResourceId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteUserComputeResourcePreference(userId, gatewayID, userComputeResourceId);
             registryClientPool.returnResource(regClient);
@@ -4899,6 +5169,7 @@
     @SecurityCheck
     public boolean deleteUserStoragePreference(AuthzToken authzToken, String userId, String gatewayID, String userStorageId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             boolean result = regClient.deleteUserStoragePreference(userId, gatewayID, userStorageId);
             registryClientPool.returnResource(regClient);
@@ -4914,8 +5185,11 @@
     }
 
     @Override
+    @SecurityCheck
     public List<QueueStatusModel> getLatestQueueStatuses(AuthzToken authzToken) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
+
         try {
             List<QueueStatusModel> result = regClient.getLatestQueueStatuses();
             registryClientPool.returnResource(regClient);
@@ -4924,7 +5198,7 @@
             String msg = "Error in retrieving queue statuses";
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -4932,6 +5206,7 @@
 
     /**
      * ReplicaCatalog Related Methods
+     *
      * @return
      * @throws TException
      * @throws ApplicationSettingsException
@@ -4941,15 +5216,16 @@
     public String registerDataProduct(AuthzToken authzToken, DataProductModel dataProductModel) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.registerDataProduct(dataProductModel);
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            String msg = "Error in registering the data resource"+dataProductModel.getProductName()+".";
+            String msg = "Error in registering the data resource" + dataProductModel.getProductName() + ".";
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -4960,15 +5236,16 @@
     public DataProductModel getDataProduct(AuthzToken authzToken, String productUri) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             DataProductModel result = regClient.getDataProduct(productUri);
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            String msg = "Error in retreiving the data product "+productUri+".";
+            String msg = "Error in retreiving the data product " + productUri + ".";
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -4979,15 +5256,16 @@
     public String registerReplicaLocation(AuthzToken authzToken, DataReplicaLocationModel replicaLocationModel) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String result = regClient.registerReplicaLocation(replicaLocationModel);
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            String msg = "Error in retreiving the replica "+replicaLocationModel.getReplicaName()+".";
+            String msg = "Error in retreiving the replica " + replicaLocationModel.getReplicaName() + ".";
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -4998,15 +5276,16 @@
     public DataProductModel getParentDataProduct(AuthzToken authzToken, String productUri) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             DataProductModel result = regClient.getParentDataProduct(productUri);
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            String msg = "Error in retreiving the parent data product for "+ productUri+".";
+            String msg = "Error in retreiving the parent data product for " + productUri + ".";
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5017,15 +5296,16 @@
     public List<DataProductModel> getChildDataProducts(AuthzToken authzToken, String productUri) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<DataProductModel> result = regClient.getChildDataProducts(productUri);
             registryClientPool.returnResource(regClient);
             return result;
         } catch (Exception e) {
-            String msg = "Error in retreiving the child products for "+productUri+".";
+            String msg = "Error in retreiving the child products for " + productUri + ".";
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5044,40 +5324,68 @@
                                           Map<String, ResourcePermissionType> userPermissionList) throws InvalidRequestException,
             AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+        Entity entity = Entity.newBuilder().setId(resourceId).build();
         try {
-            if (!userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.OWNER) && !userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.MANAGE_SHARING)) {
+            if (!userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.OWNER) && !userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.MANAGE_SHARING)) {
                 throw new AuthorizationException("User is not allowed to change sharing because the user is either not the resource owner or does not have access to share the resource");
             }
-            for(Map.Entry<String, ResourcePermissionType> userPermission : userPermissionList.entrySet()){
+            for (Map.Entry<String, ResourcePermissionType> userPermission : userPermissionList.entrySet()) {
                 String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-                if(userPermission.getValue().equals(ResourcePermissionType.WRITE))
-                    sharingClient.shareEntityWithUsers(gatewayId, resourceId,
-                            Arrays.asList(userPermission.getKey()), authzToken.getClaimsMap().get(Constants.GATEWAY_ID) + ":" + "WRITE", true);
-                else if(userPermission.getValue().equals(ResourcePermissionType.READ))
-                    sharingClient.shareEntityWithUsers(gatewayId, resourceId,
-                            Arrays.asList(userPermission.getKey()), authzToken.getClaimsMap().get(Constants.GATEWAY_ID) + ":" + "READ", true);
-                else if(userPermission.getValue().equals(ResourcePermissionType.MANAGE_SHARING)) {
-                    if (userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.OWNER))
-                        sharingClient.shareEntityWithUsers(gatewayId, resourceId,
-                                Arrays.asList(userPermission.getKey()), authzToken.getClaimsMap().get(Constants.GATEWAY_ID) + ":" + "MANAGE_SHARING", true);
-                    else
+                if (userPermission.getValue().equals(ResourcePermissionType.WRITE)) {
+
+                    PermissionType type = PermissionType.newBuilder().
+                            setId(ResourcePermissionType.WRITE.name()).build();
+
+                    SharingRequest request = SharingRequest.newBuilder()
+                            .setEntity(entity)
+                            .setPermissionType(type)
+                            .addAllOwnerId(Arrays.asList(userPermission.getKey()))
+                            .setCascade(true).build();
+
+                    sharingManagementClient.shareEntityWithUsers(custosId, request);
+
+                } else if (userPermission.getValue().equals(ResourcePermissionType.READ)) {
+
+                    PermissionType type = PermissionType.newBuilder().
+                            setId(ResourcePermissionType.READ.name()).build();
+
+                    SharingRequest request = SharingRequest.newBuilder()
+                            .setEntity(entity)
+                            .setPermissionType(type)
+                            .addAllOwnerId(Arrays.asList(userPermission.getKey()))
+                            .setCascade(true).build();
+
+                    sharingManagementClient.shareEntityWithUsers(custosId, request);
+                } else if (userPermission.getValue().equals(ResourcePermissionType.MANAGE_SHARING)) {
+                    if (userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.OWNER)) {
+                        PermissionType type = PermissionType.newBuilder().
+                                setId(ResourcePermissionType.MANAGE_SHARING.name()).build();
+
+                        SharingRequest request = SharingRequest.newBuilder()
+                                .setEntity(entity)
+                                .setPermissionType(type)
+                                .addAllOwnerId(Arrays.asList(userPermission.getKey()))
+                                .setCascade(true).build();
+
+                        sharingManagementClient.shareEntityWithUsers(custosId, request);
+
+                    } else
                         throw new AuthorizationException("User is not allowed to grant sharing permission because the user is not the resource owner.");
-                }
-                else {
+                } else {
                     logger.error("Invalid ResourcePermissionType : " + userPermission.getValue().toString());
                     throw new AiravataClientException(AiravataErrorType.UNSUPPORTED_OPERATION);
                 }
             }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return true;
         } catch (Exception e) {
             String msg = "Error in sharing resource with users. Resource ID : " + resourceId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
-            sharingClientPool.returnBrokenResource(sharingClient);
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5089,40 +5397,66 @@
                                            Map<String, ResourcePermissionType> groupPermissionList)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
+        Entity entity = Entity.newBuilder().setId(resourceId).build();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         try {
-            if (!userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.OWNER) && !userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.MANAGE_SHARING)) {
+            if (!userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.OWNER) && !userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.MANAGE_SHARING)) {
                 throw new AuthorizationException("User is not allowed to change sharing because the user is either not the resource owner or does not have access to share the resource");
             }
-            for(Map.Entry<String, ResourcePermissionType> groupPermission : groupPermissionList.entrySet()){
+            for (Map.Entry<String, ResourcePermissionType> groupPermission : groupPermissionList.entrySet()) {
                 String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-                if(groupPermission.getValue().equals(ResourcePermissionType.WRITE))
-                    sharingClient.shareEntityWithGroups(gatewayId, resourceId,
-                            Arrays.asList(groupPermission.getKey()), authzToken.getClaimsMap().get(Constants.GATEWAY_ID) + ":" + "WRITE", true);
-                else if(groupPermission.getValue().equals(ResourcePermissionType.READ))
-                    sharingClient.shareEntityWithGroups(gatewayId, resourceId,
-                            Arrays.asList(groupPermission.getKey()), authzToken.getClaimsMap().get(Constants.GATEWAY_ID) + ":" + "READ", true);
-                else if(groupPermission.getValue().equals(ResourcePermissionType.MANAGE_SHARING)){
-                    if(userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.OWNER))
-                        sharingClient.shareEntityWithGroups(gatewayId, resourceId,
-                                Arrays.asList(groupPermission.getKey()), authzToken.getClaimsMap().get(Constants.GATEWAY_ID) + ":" + "MANAGE_SHARING", true);
-                    else
+                if (groupPermission.getValue().equals(ResourcePermissionType.WRITE)) {
+
+                    PermissionType type = PermissionType.newBuilder().
+                            setId(ResourcePermissionType.WRITE.name()).build();
+
+                    SharingRequest request = SharingRequest.newBuilder()
+                            .setEntity(entity)
+                            .setPermissionType(type)
+                            .addAllOwnerId(Arrays.asList(groupPermission.getKey()))
+                            .setCascade(true).build();
+
+                    sharingManagementClient.shareEntityWithGroups(custosId, request);
+
+                } else if (groupPermission.getValue().equals(ResourcePermissionType.READ)) {
+
+                    PermissionType type = PermissionType.newBuilder().
+                            setId(ResourcePermissionType.READ.name()).build();
+
+                    SharingRequest request = SharingRequest.newBuilder()
+                            .setEntity(entity)
+                            .setPermissionType(type)
+                            .addAllOwnerId(Arrays.asList(groupPermission.getKey()))
+                            .setCascade(true).build();
+
+                    sharingManagementClient.shareEntityWithGroups(custosId, request);
+                } else if (groupPermission.getValue().equals(ResourcePermissionType.MANAGE_SHARING)) {
+                    if (userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.OWNER)) {
+                        PermissionType type = PermissionType.newBuilder().
+                                setId(ResourcePermissionType.MANAGE_SHARING.name()).build();
+
+                        SharingRequest request = SharingRequest.newBuilder()
+                                .setEntity(entity)
+                                .setPermissionType(type)
+                                .addAllOwnerId(Arrays.asList(groupPermission.getKey()))
+                                .setCascade(true).build();
+
+                        sharingManagementClient.shareEntityWithGroups(custosId, request);
+                    } else
                         throw new AuthorizationException("User is not allowed to grant sharing permission because the user is not the resource owner.");
-                }
-                else {
+                } else {
                     logger.error("Invalid ResourcePermissionType : " + groupPermission.getValue().toString());
                     throw new AiravataClientException(AiravataErrorType.UNSUPPORTED_OPERATION);
                 }
             }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return true;
         } catch (Exception e) {
             String msg = "Error in sharing resource with groups. Resource ID : " + resourceId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
-            sharingClientPool.returnBrokenResource(sharingClient);
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5133,40 +5467,67 @@
     public boolean revokeSharingOfResourceFromUsers(AuthzToken authzToken, String resourceId,
                                                     Map<String, ResourcePermissionType> userPermissionList) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+        Entity entity = Entity.newBuilder().setId(resourceId).build();
         try {
-            if (!userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.OWNER) && !userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.MANAGE_SHARING)) {
+            if (!userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.OWNER) && !userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.MANAGE_SHARING)) {
                 throw new AuthorizationException("User is not allowed to change sharing because the user is either not the resource owner or does not have access to share the resource");
             }
-            for(Map.Entry<String, ResourcePermissionType> userPermission : userPermissionList.entrySet()){
+            for (Map.Entry<String, ResourcePermissionType> userPermission : userPermissionList.entrySet()) {
                 String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-                if(userPermission.getValue().equals(ResourcePermissionType.WRITE))
-                    sharingClient.revokeEntitySharingFromUsers(gatewayId, resourceId,
-                            Arrays.asList(userPermission.getKey()), authzToken.getClaimsMap().get(Constants.GATEWAY_ID) + ":" + "WRITE");
-                else if(userPermission.getValue().equals(ResourcePermissionType.READ))
-                    sharingClient.revokeEntitySharingFromUsers(gatewayId, resourceId,
-                            Arrays.asList(userPermission.getKey()), authzToken.getClaimsMap().get(Constants.GATEWAY_ID) + ":" + "READ");
-                else if(userPermission.getValue().equals(ResourcePermissionType.MANAGE_SHARING)){
-                    if (userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.OWNER))
-                        sharingClient.revokeEntitySharingFromUsers(gatewayId, resourceId,
-                                Arrays.asList(userPermission.getKey()), authzToken.getClaimsMap().get(Constants.GATEWAY_ID) + ":" + "MANAGE_SHARING");
-                    else
+                if (userPermission.getValue().equals(ResourcePermissionType.WRITE)) {
+
+                    PermissionType type = PermissionType.newBuilder().
+                            setId(ResourcePermissionType.WRITE.name()).build();
+
+                    SharingRequest request = SharingRequest.newBuilder()
+                            .setEntity(entity)
+                            .setPermissionType(type)
+                            .addAllOwnerId(Arrays.asList(userPermission.getKey()))
+                            .setCascade(true).build();
+
+                    sharingManagementClient.revokeEntitySharingFromUsers(custosId, request);
+
+                } else if (userPermission.getValue().equals(ResourcePermissionType.READ)) {
+
+                    PermissionType type = PermissionType.newBuilder().
+                            setId(ResourcePermissionType.READ.name()).build();
+
+                    SharingRequest request = SharingRequest.newBuilder()
+                            .setEntity(entity)
+                            .setPermissionType(type)
+                            .addAllOwnerId(Arrays.asList(userPermission.getKey()))
+                            .setCascade(true).build();
+
+                    sharingManagementClient.revokeEntitySharingFromUsers(custosId, request);
+                } else if (userPermission.getValue().equals(ResourcePermissionType.MANAGE_SHARING)) {
+                    if (userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.OWNER)) {
+                        PermissionType type = PermissionType.newBuilder().
+                                setId(ResourcePermissionType.MANAGE_SHARING.name()).build();
+
+                        SharingRequest request = SharingRequest.newBuilder()
+                                .setEntity(entity)
+                                .setPermissionType(type)
+                                .addAllOwnerId(Arrays.asList(userPermission.getKey()))
+                                .setCascade(true).build();
+
+                        sharingManagementClient.revokeEntitySharingFromUsers(custosId, request);
+
+                    } else
                         throw new AuthorizationException("User is not allowed to change sharing permission because the user is not the resource owner.");
-                }
-                else {
+                } else {
                     logger.error("Invalid ResourcePermissionType : " + userPermission.getValue().toString());
                     throw new AiravataClientException(AiravataErrorType.UNSUPPORTED_OPERATION);
                 }
             }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return true;
         } catch (Exception e) {
             String msg = "Error in revoking access to resource from users. Resource ID : " + resourceId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
-            sharingClientPool.returnBrokenResource(sharingClient);
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5178,20 +5539,23 @@
                                                      Map<String, ResourcePermissionType> groupPermissionList)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         final String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+        Entity entity = Entity.newBuilder().setId(resourceId).build();
         try {
-            if (!userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.OWNER) && !userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.MANAGE_SHARING)) {
-                throw new AuthorizationException("User is not allowed to change sharing because the user is either not the resource owner or does not have access to share the resource");
+            if (!userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.OWNER) &&
+                    !userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.MANAGE_SHARING)) {
+                throw new AuthorizationException("User is not allowed to change sharing because the user " +
+                        "is either not the resource owner or does not have access to share the resource");
             }
             // For certain resource types, restrict them from being unshared with admin groups
-            ResourceType resourceType = getResourceType(sharingClient, gatewayId, resourceId);
+            ResourceType resourceType = getResourceType(custosId, gatewayId, resourceId);
             Set<ResourceType> adminRestrictedResourceTypes = new HashSet<>(Arrays.asList(
                     ResourceType.EXPERIMENT, ResourceType.APPLICATION_DEPLOYMENT, ResourceType.GROUP_RESOURCE_PROFILE
             ));
             if (adminRestrictedResourceTypes.contains(resourceType)) {
                 // Prevent removing Admins WRITE access and Read Only Admins READ access
-                GatewayGroups gatewayGroups = retrieveGatewayGroups(regClient, gatewayId);
+                GatewayGroups gatewayGroups = retrieveGatewayGroups(regClient, gatewayId, custosId);
                 if (groupPermissionList.containsKey(gatewayGroups.getAdminsGroupId())
                         && groupPermissionList.get(gatewayGroups.getAdminsGroupId()).equals(ResourcePermissionType.WRITE)) {
                     throw new Exception("Not allowed to remove Admins group's WRITE access.");
@@ -5205,34 +5569,58 @@
                     throw new Exception("Not allowed to remove Admins group's SHARING access.");
                 }
             }
-            for(Map.Entry<String, ResourcePermissionType> groupPermission : groupPermissionList.entrySet()){
-                if(groupPermission.getValue().equals(ResourcePermissionType.WRITE))
-                    sharingClient.revokeEntitySharingFromUsers(gatewayId, resourceId,
-                            Arrays.asList(groupPermission.getKey()), gatewayId + ":" + "WRITE");
-                else if(groupPermission.getValue().equals(ResourcePermissionType.READ))
-                    sharingClient.revokeEntitySharingFromUsers(gatewayId, resourceId,
-                            Arrays.asList(groupPermission.getKey()), gatewayId + ":" + "READ");
-                else if(groupPermission.getValue().equals(ResourcePermissionType.MANAGE_SHARING)){
-                    if(userHasAccessInternal(sharingClient, authzToken, resourceId, ResourcePermissionType.OWNER))
-                        sharingClient.revokeEntitySharingFromUsers(gatewayId, resourceId,
-                                Arrays.asList(groupPermission.getKey()), gatewayId + ":" + "MANAGE_SHARING");
-                    else
+            for (Map.Entry<String, ResourcePermissionType> groupPermission : groupPermissionList.entrySet()) {
+                if (groupPermission.getValue().equals(ResourcePermissionType.WRITE)) {
+
+                    PermissionType type = PermissionType.newBuilder().
+                            setId(ResourcePermissionType.WRITE.name()).build();
+
+                    SharingRequest request = SharingRequest.newBuilder()
+                            .setEntity(entity)
+                            .setPermissionType(type)
+                            .addAllOwnerId(Arrays.asList(groupPermission.getKey()))
+                            .setCascade(true).build();
+
+                    sharingManagementClient.revokeEntitySharingFromGroups(custosId, request);
+
+                } else if (groupPermission.getValue().equals(ResourcePermissionType.READ)) {
+
+                    PermissionType type = PermissionType.newBuilder().
+                            setId(ResourcePermissionType.READ.name()).build();
+
+                    SharingRequest request = SharingRequest.newBuilder()
+                            .setEntity(entity)
+                            .setPermissionType(type)
+                            .addAllOwnerId(Arrays.asList(groupPermission.getKey()))
+                            .setCascade(true).build();
+
+                    sharingManagementClient.revokeEntitySharingFromGroups(custosId, request);
+                } else if (groupPermission.getValue().equals(ResourcePermissionType.MANAGE_SHARING)) {
+                    if (userHasAccessInternal(authzToken, resourceId, ResourcePermissionType.OWNER)) {
+                        PermissionType type = PermissionType.newBuilder().
+                                setId(ResourcePermissionType.MANAGE_SHARING.name()).build();
+
+                        SharingRequest request = SharingRequest.newBuilder()
+                                .setEntity(entity)
+                                .setPermissionType(type)
+                                .addAllOwnerId(Arrays.asList(groupPermission.getKey()))
+                                .setCascade(true).build();
+
+                        sharingManagementClient.revokeEntitySharingFromGroups(custosId, request);
+                    } else
                         throw new AuthorizationException("User is not allowed to change sharing because the user is not the resource owner");
-                }
-                else {
+                } else {
                     logger.error("Invalid ResourcePermissionType : " + groupPermission.getValue().toString());
                     throw new AiravataClientException(AiravataErrorType.UNSUPPORTED_OPERATION);
                 }
             }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return true;
         } catch (Exception e) {
             String msg = "Error in revoking access to resource from groups. Resource ID : " + resourceId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
-            sharingClientPool.returnBrokenResource(sharingClient);
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5241,59 +5629,87 @@
     @Override
     @SecurityCheck
     public List<String> getAllAccessibleUsers(AuthzToken authzToken, String resourceId,
-            ResourcePermissionType permissionType) throws InvalidRequestException, AiravataClientException,
+                                              ResourcePermissionType permissionType) throws InvalidRequestException, AiravataClientException,
             AiravataSystemException, AuthorizationException, TException {
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         return getAllAccessibleUsersInternal(authzToken, resourceId, permissionType, (c, t) -> {
-            try {
-                return c.getListOfSharedUsers(gatewayId, resourceId, gatewayId + ":" + t.name());
-            } catch (TException e) {
-                throw new RuntimeException(e);
+
+            Entity entity = Entity.newBuilder().setId(resourceId).build();
+            PermissionType type = PermissionType.newBuilder().setId(t.name()).build();
+
+            SharingRequest request = SharingRequest.newBuilder()
+                    .setEntity(entity)
+                    .setPermissionType(type)
+                    .build();
+
+            SharedOwners owners = c.getListOfSharedUsers(custosId, request);
+            List<User> userList = new ArrayList<>();
+            for (String owner : owners.getOwnerIdsList()) {
+                User user = new User();
+                user.setUserId(owner);
+                userList.add(user);
             }
+
+            return userList;
         });
     }
 
     @Override
     @SecurityCheck
     public List<String> getAllDirectlyAccessibleUsers(AuthzToken authzToken, String resourceId,
-            ResourcePermissionType permissionType) throws InvalidRequestException, AiravataClientException,
+                                                      ResourcePermissionType permissionType) throws InvalidRequestException, AiravataClientException,
             AiravataSystemException, AuthorizationException, TException {
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         return getAllAccessibleUsersInternal(authzToken, resourceId, permissionType, (c, t) -> {
-            try {
-                return c.getListOfDirectlySharedUsers(gatewayId, resourceId, gatewayId + ":" + t.name());
-            } catch (TException e) {
-                throw new RuntimeException(e);
+            Entity entity = Entity.newBuilder().setId(resourceId).build();
+
+            PermissionType type = PermissionType.newBuilder().setId(t.name()).build();
+
+            SharingRequest request = SharingRequest.newBuilder()
+                    .setEntity(entity)
+                    .setPermissionType(type)
+                    .build();
+
+            SharedOwners owners = c.getListOfDirectlySharedUsers(custosId, request);
+            List<User> userList = new ArrayList<>();
+            for (String owner : owners.getOwnerIdsList()) {
+                User user = new User();
+                user.setUserId(owner);
+                userList.add(user);
             }
+
+            return userList;
         });
     }
 
-    private List<String> getAllAccessibleUsersInternal(AuthzToken authzToken, String resourceId, ResourcePermissionType permissionType,  BiFunction<SharingRegistryService.Client, ResourcePermissionType, Collection<User>> userListFunction) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
+    private List<String> getAllAccessibleUsersInternal(AuthzToken authzToken, String resourceId, ResourcePermissionType permissionType, BiFunction<SharingManagementClient, ResourcePermissionType, Collection<User>> userListFunction) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        SharingManagementClient sharingManagementClient = this.sharingManagementClient;
         try {
             HashSet<String> accessibleUsers = new HashSet<>();
             if (permissionType.equals(ResourcePermissionType.WRITE)) {
-                userListFunction.apply(sharingClient, ResourcePermissionType.WRITE).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
-                userListFunction.apply(sharingClient, ResourcePermissionType.OWNER).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
+                userListFunction.apply(sharingManagementClient, ResourcePermissionType.WRITE).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
+                userListFunction.apply(sharingManagementClient, ResourcePermissionType.OWNER).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
             } else if (permissionType.equals(ResourcePermissionType.READ)) {
-                userListFunction.apply(sharingClient, ResourcePermissionType.READ).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
-                userListFunction.apply(sharingClient, ResourcePermissionType.OWNER).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
+                userListFunction.apply(sharingManagementClient, ResourcePermissionType.READ).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
+                userListFunction.apply(sharingManagementClient, ResourcePermissionType.OWNER).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
             } else if (permissionType.equals(ResourcePermissionType.OWNER)) {
-                userListFunction.apply(sharingClient, ResourcePermissionType.OWNER).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
+                userListFunction.apply(sharingManagementClient, ResourcePermissionType.OWNER).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
             } else if (permissionType.equals(ResourcePermissionType.MANAGE_SHARING)) {
-                userListFunction.apply(sharingClient, ResourcePermissionType.MANAGE_SHARING).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
-                userListFunction.apply(sharingClient, ResourcePermissionType.OWNER).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
+                userListFunction.apply(sharingManagementClient, ResourcePermissionType.MANAGE_SHARING).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
+                userListFunction.apply(sharingManagementClient, ResourcePermissionType.OWNER).stream().forEach(u -> accessibleUsers.add(u.getUserId()));
             }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return new ArrayList<>(accessibleUsers);
         } catch (Exception e) {
             String msg = "Error in getting all accessible users for resource. Resource ID : " + resourceId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
-            sharingClientPool.returnBrokenResource(sharingClient);
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5303,58 +5719,85 @@
     @SecurityCheck
     public List<String> getAllAccessibleGroups(AuthzToken authzToken, String resourceId, ResourcePermissionType permissionType) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         return getAllAccessibleGroupsInternal(authzToken, resourceId, permissionType, (c, t) -> {
-            try {
-                return c.getListOfSharedGroups(gatewayId, resourceId, gatewayId + ":" + t.name());
-            } catch (TException e) {
-                throw new RuntimeException(e);
+
+            Entity entity = Entity.newBuilder().setId(resourceId).build();
+            PermissionType type = PermissionType.newBuilder().setId(t.name()).build();
+
+            SharingRequest request = SharingRequest.newBuilder()
+                    .setEntity(entity)
+                    .setPermissionType(type)
+                    .build();
+            SharedOwners owners = c.getListOfSharedGroups(custosId, request);
+
+            List<UserGroup> userList = new ArrayList<>();
+            for (String owner : owners.getOwnerIdsList()) {
+                UserGroup user = new UserGroup();
+                user.setGroupId(owner);
+                userList.add(user);
             }
+
+            return userList;
         });
     }
 
     @Override
     @SecurityCheck
     public List<String> getAllDirectlyAccessibleGroups(AuthzToken authzToken, String resourceId,
-            ResourcePermissionType permissionType) throws InvalidRequestException, AiravataClientException,
+                                                       ResourcePermissionType permissionType) throws InvalidRequestException, AiravataClientException,
             AiravataSystemException, AuthorizationException, TException {
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         return getAllAccessibleGroupsInternal(authzToken, resourceId, permissionType, (c, t) -> {
-            try {
-                return c.getListOfDirectlySharedGroups(gatewayId, resourceId, gatewayId + ":" + t.name());
-            } catch (TException e) {
-                throw new RuntimeException(e);
+            Entity entity = Entity.newBuilder().setId(resourceId).build();
+            PermissionType type = PermissionType.newBuilder().setId(t.name()).build();
+
+            SharingRequest request = SharingRequest.newBuilder()
+                    .setEntity(entity)
+                    .setPermissionType(type)
+                    .build();
+            SharedOwners owners = c.getListOfDirectlySharedGroups(custosId, request);
+
+            List<UserGroup> userList = new ArrayList<>();
+            for (String owner : owners.getOwnerIdsList()) {
+                UserGroup user = new UserGroup();
+                user.setGroupId(owner);
+                userList.add(user);
             }
+
+            return userList;
         });
     }
 
-    private List<String> getAllAccessibleGroupsInternal(AuthzToken authzToken, String resourceId, ResourcePermissionType permissionType, BiFunction<SharingRegistryService.Client, ResourcePermissionType, Collection<UserGroup>> groupListFunction)
+    private List<String> getAllAccessibleGroupsInternal(AuthzToken authzToken, String resourceId, ResourcePermissionType permissionType, BiFunction<SharingManagementClient, ResourcePermissionType, Collection<UserGroup>> groupListFunction)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        SharingManagementClient sharingManagementClient = this.sharingManagementClient;
         try {
             HashSet<String> accessibleGroups = new HashSet<>();
             if (permissionType.equals(ResourcePermissionType.WRITE)) {
-                groupListFunction.apply(sharingClient, ResourcePermissionType.WRITE)
+                groupListFunction.apply(sharingManagementClient, ResourcePermissionType.WRITE)
                         .stream()
                         .forEach(g -> accessibleGroups.add(g.getGroupId()));
             } else if (permissionType.equals(ResourcePermissionType.READ)) {
-                groupListFunction.apply(sharingClient, ResourcePermissionType.READ)
+                groupListFunction.apply(sharingManagementClient, ResourcePermissionType.READ)
                         .stream()
                         .forEach(g -> accessibleGroups.add(g.getGroupId()));
             } else if (permissionType.equals(ResourcePermissionType.MANAGE_SHARING)) {
-                groupListFunction.apply(sharingClient, ResourcePermissionType.MANAGE_SHARING)
+                groupListFunction.apply(sharingManagementClient, ResourcePermissionType.MANAGE_SHARING)
                         .stream()
                         .forEach(g -> accessibleGroups.add(g.getGroupId()));
             }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return new ArrayList<>(accessibleGroups);
         } catch (Exception e) {
             String msg = "Error in getting all accessible groups for resource. Resource ID : " + resourceId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
-            sharingClientPool.returnBrokenResource(sharingClient);
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5365,17 +5808,15 @@
     public boolean userHasAccess(AuthzToken authzToken, String resourceId, ResourcePermissionType permissionType) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         final String domainId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         final String userId = authzToken.getClaimsMap().get(Constants.USER_NAME) + "@" + domainId;
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            final boolean hasAccess = userHasAccessInternal(sharingClient, authzToken, resourceId, permissionType);
-            sharingClientPool.returnResource(sharingClient);
+            final boolean hasAccess = userHasAccessInternal(authzToken, resourceId, permissionType);
             return hasAccess;
         } catch (Exception e) {
             String msg = "Error in if user can access resource. User ID : " + userId + ", Resource ID : " + resourceId + ", Resource Permission Type : " + permissionType.toString();
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -5385,24 +5826,27 @@
     public String createGroupResourceProfile(AuthzToken authzToken, GroupResourceProfile groupResourceProfile) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         // TODO: verify that gatewayId in groupResourceProfile matches authzToken gatewayId
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            validateGroupResourceProfile(sharingClient, authzToken, groupResourceProfile);
+            validateGroupResourceProfile(authzToken, groupResourceProfile);
             String groupResourceProfileId = regClient.createGroupResourceProfile(groupResourceProfile);
             if (ServerSettings.isEnableSharing()) {
                 try {
-                    Entity entity = new Entity();
-                    entity.setEntityId(groupResourceProfileId);
+
                     final String domainId = groupResourceProfile.getGatewayId();
-                    entity.setDomainId(groupResourceProfile.getGatewayId());
-                    entity.setEntityTypeId(groupResourceProfile.getGatewayId() + ":" + "GROUP_RESOURCE_PROFILE");
-                    entity.setOwnerId(userName + "@" + groupResourceProfile.getGatewayId());
-                    entity.setName(groupResourceProfile.getGroupResourceProfileName());
 
-                    sharingClient.createEntity(entity);
+                    Entity entity = Entity.newBuilder()
+                            .setOwnerId(userName)
+                            .setName(groupResourceProfile.getGroupResourceProfileName())
+                            .setId(groupResourceProfileId)
+                            .setType(ResourceType.GROUP_RESOURCE_PROFILE.name())
+                            .build();
+                    sharingManagementClient.createEntity(custosId, entity);
 
-                    shareEntityWithAdminGatewayGroups(regClient, sharingClient, entity);
+                    shareEntityWithAdminGatewayGroups(regClient, custosId, domainId, entity);
+
                 } catch (Exception ex) {
                     logger.error(ex.getMessage(), ex);
                     logger.error("Rolling back group resource profile creation Group Resource Profile ID : " + groupResourceProfileId);
@@ -5413,24 +5857,22 @@
                 }
             }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return groupResourceProfileId;
         } catch (AuthorizationException ae) {
             logger.info("User " + userName + " not allowed access to resources referenced in this GroupResourceProfile. Reason: " + ae.getMessage());
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             throw ae;
         } catch (Exception e) {
             String msg = "Error creating group resource profile.";
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
     }
 
-    private void validateGroupResourceProfile(SharingRegistryService.Client sharingClient, AuthzToken authzToken, GroupResourceProfile groupResourceProfile) throws AuthorizationException {
+    private void validateGroupResourceProfile(AuthzToken authzToken, GroupResourceProfile groupResourceProfile) throws AuthorizationException {
         Set<String> tokenIds = new HashSet<>();
         if (groupResourceProfile.getComputePreferences() != null) {
             for (GroupComputeResourcePreference groupComputeResourcePreference : groupResourceProfile.getComputePreferences()) {
@@ -5443,7 +5885,7 @@
             tokenIds.add(groupResourceProfile.getDefaultCredentialStoreToken());
         }
         for (String tokenId : tokenIds) {
-            if (!userHasAccessInternal(sharingClient, authzToken, tokenId, ResourcePermissionType.READ)) {
+            if (!userHasAccessInternal(authzToken, tokenId, ResourcePermissionType.READ)) {
                 throw new AuthorizationException("User does not have READ permission to credential token " + tokenId + ".");
             }
         }
@@ -5453,26 +5895,24 @@
     @SecurityCheck
     public void updateGroupResourceProfile(AuthzToken authzToken, GroupResourceProfile groupResourceProfile) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            validateGroupResourceProfile(sharingClient, authzToken, groupResourceProfile);
-            if (!userHasAccessInternal(sharingClient, authzToken, groupResourceProfile.getGroupResourceProfileId(), ResourcePermissionType.WRITE)){
+            validateGroupResourceProfile(authzToken, groupResourceProfile);
+            if (!userHasAccessInternal(authzToken, groupResourceProfile.getGroupResourceProfileId(), ResourcePermissionType.WRITE)) {
                 throw new AuthorizationException("User does not have permission to update group resource profile");
             }
             regClient.updateGroupResourceProfile(groupResourceProfile);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
         } catch (AuthorizationException ae) {
             String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
             logger.info("User " + userName + " not allowed access to update GroupResourceProfile " + groupResourceProfile.getGroupResourceProfileId() + ", reason: " + ae.getMessage());
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             throw ae;
         } catch (Exception e) {
-            String msg = "Error updating group resource profile. groupResourceProfileId: "+groupResourceProfile.getGroupResourceProfileId();
+            String msg = "Error updating group resource profile. groupResourceProfileId: " + groupResourceProfile.getGroupResourceProfileId();
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5482,14 +5922,25 @@
     @SecurityCheck
     public GroupResourceProfile getGroupResourceProfile(AuthzToken authzToken, String groupResourceProfileId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            groupResourceProfileId, gatewayId + ":READ")){
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+                    Entity sharedEntity = Entity.newBuilder().setId(groupResourceProfileId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
                         throw new AuthorizationException("User does not have permission to access group resource profile");
                     }
                 } catch (Exception e) {
@@ -5498,18 +5949,16 @@
             }
             GroupResourceProfile groupResourceProfile = regClient.getGroupResourceProfile(groupResourceProfileId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return groupResourceProfile;
         } catch (AuthorizationException checkedException) {
             logger.error("Error while retrieving group resource profile. groupResourceProfileId: " + groupResourceProfileId, checkedException);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             throw checkedException;
         } catch (Exception e) {
-            String msg = "Error retrieving group resource profile. groupResourceProfileId: "+ groupResourceProfileId;
+            String msg = "Error retrieving group resource profile. groupResourceProfileId: " + groupResourceProfileId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5519,29 +5968,45 @@
     @SecurityCheck
     public boolean removeGroupResourceProfile(AuthzToken authzToken, String groupResourceProfileId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+        Entity sharedEntity = Entity.newBuilder().setId(groupResourceProfileId).build();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            groupResourceProfileId, gatewayId + ":WRITE")){
+
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
                         throw new AuthorizationException("User does not have permission to remove group resource profile");
                     }
+
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to remove group resource profile");
                 }
             }
             boolean result = regClient.removeGroupResourceProfile(groupResourceProfileId);
+
+            if (result) {
+                sharingManagementClient.deleteEntity(custosId, sharedEntity);
+            }
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
-            String msg = "Error removing group resource profile. groupResourceProfileId: "+ groupResourceProfileId;
+            String msg = "Error removing group resource profile. groupResourceProfileId: " + groupResourceProfileId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5551,33 +6016,45 @@
     @SecurityCheck
     public List<GroupResourceProfile> getGroupResourceList(AuthzToken authzToken, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
         String userName = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
             List<String> accessibleGroupResProfileIds = new ArrayList<>();
             if (ServerSettings.isEnableSharing()) {
-                List<SearchCriteria> filters = new ArrayList<>();
-                SearchCriteria searchCriteria = new SearchCriteria();
-                searchCriteria.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
-                searchCriteria.setSearchCondition(SearchCondition.EQUAL);
-                searchCriteria.setValue(gatewayId + ":" + ResourceType.GROUP_RESOURCE_PROFILE.name());
-                filters.add(searchCriteria);
-                sharingClient.searchEntities(authzToken.getClaimsMap().get(Constants.GATEWAY_ID),
-                        userName + "@" + gatewayId, filters, 0, -1).stream().forEach(p -> accessibleGroupResProfileIds
-                        .add(p.getEntityId()));
+
+
+                SearchCriteria searchCriteria = SearchCriteria
+                        .newBuilder()
+                        .setSearchField(EntitySearchField.ENTITY_TYPE_ID)
+                        .setCondition(SearchCondition.EQUAL)
+                        .setValue(ResourceType.GROUP_RESOURCE_PROFILE.name())
+                        .build();
+
+
+
+                SearchRequest searchRequest = SearchRequest.newBuilder()
+                        .addSearchCriteria(searchCriteria)
+                        .setOwnerId(userName)
+                        .build();
+
+                Entities entities = sharingManagementClient.searchEntities(custosId, searchRequest);
+
+                for (Entity entity : entities.getEntityArrayList()) {
+                    accessibleGroupResProfileIds.add(entity.getId());
+                }
 
             }
+
             List<GroupResourceProfile> groupResourceProfileList = regClient.getGroupResourceList(gatewayId, accessibleGroupResProfileIds);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return groupResourceProfileList;
         } catch (Exception e) {
-            String msg = "Error retrieving list group resource profile list. GatewayId: "+ gatewayId;
+            String msg = "Error retrieving list group resource profile list. GatewayId: " + gatewayId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
-            sharingClientPool.returnBrokenResource(sharingClient);
             throw exception;
         }
     }
@@ -5586,15 +6063,26 @@
     @SecurityCheck
     public boolean removeGroupComputePrefs(AuthzToken authzToken, String computeResourceId, String groupResourceProfileId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            groupResourceProfileId, gatewayId + ":WRITE")){
-                        throw new AuthorizationException("User does not have permission to remove group compute preferences");
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+                    Entity sharedEntity = Entity.newBuilder().setId(groupResourceProfileId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
+                        throw new AuthorizationException("User does not have permission to remove group resource profile");
                     }
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to remove group compute preferences");
@@ -5602,13 +6090,12 @@
             }
             boolean result = regClient.removeGroupComputePrefs(computeResourceId, groupResourceProfileId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
-            String msg = "Error removing group compute resource preferences. GroupResourceProfileId: "+ groupResourceProfileId;
+            String msg = "Error removing group compute resource preferences. GroupResourceProfileId: " + groupResourceProfileId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5618,30 +6105,40 @@
     @SecurityCheck
     public boolean removeGroupComputeResourcePolicy(AuthzToken authzToken, String resourcePolicyId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     ComputeResourcePolicy computeResourcePolicy = regClient.getGroupComputeResourcePolicy(resourcePolicyId);
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            computeResourcePolicy.getGroupResourceProfileId(), gatewayId + ":WRITE")){
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(computeResourcePolicy.getGroupResourceProfileId()).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
                         throw new AuthorizationException("User does not have permission to remove group compute resource policy");
                     }
+
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to remove group compute resource policy");
                 }
             }
             boolean result = regClient.removeGroupComputeResourcePolicy(resourcePolicyId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
-            String msg = "Error removing group compute resource policy. ResourcePolicyId: "+ resourcePolicyId;
+            String msg = "Error removing group compute resource policy. ResourcePolicyId: " + resourcePolicyId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5651,30 +6148,41 @@
     @SecurityCheck
     public boolean removeGroupBatchQueueResourcePolicy(AuthzToken authzToken, String resourcePolicyId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     BatchQueueResourcePolicy batchQueueResourcePolicy = regClient.getBatchQueueResourcePolicy(resourcePolicyId);
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            batchQueueResourcePolicy.getGroupResourceProfileId(), gatewayId + ":WRITE")){
-                        throw new AuthorizationException("User does not have permission to remove batch queue resource policy");
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(batchQueueResourcePolicy.getGroupResourceProfileId()).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
+                        throw new AuthorizationException("User does not have permission to remove group compute resource policy");
                     }
+
+
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to remove batch queue resource policy");
                 }
             }
             boolean result = regClient.removeGroupBatchQueueResourcePolicy(resourcePolicyId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return result;
         } catch (Exception e) {
-            String msg = "Error removing batch queue resource policy. ResourcePolicyId: "+ resourcePolicyId;
+            String msg = "Error removing batch queue resource policy. ResourcePolicyId: " + resourcePolicyId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5684,14 +6192,24 @@
     @SecurityCheck
     public GroupComputeResourcePreference getGroupComputeResourcePreference(AuthzToken authzToken, String computeResourceId, String groupResourceProfileId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            groupResourceProfileId, gatewayId + ":READ")){
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(groupResourceProfileId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
                         throw new AuthorizationException("User does not have permission to access group resource profile");
                     }
                 } catch (Exception e) {
@@ -5700,13 +6218,12 @@
             }
             GroupComputeResourcePreference groupComputeResourcePreference = regClient.getGroupComputeResourcePreference(computeResourceId, groupResourceProfileId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return groupComputeResourcePreference;
         } catch (Exception e) {
-            String msg = "Error retrieving Group compute preference. GroupResourceProfileId: "+ groupResourceProfileId;
+            String msg = "Error retrieving Group compute preference. GroupResourceProfileId: " + groupResourceProfileId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5716,17 +6233,28 @@
     @SecurityCheck
     public ComputeResourcePolicy getGroupComputeResourcePolicy(AuthzToken authzToken, String resourcePolicyId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     ComputeResourcePolicy computeResourcePolicy = regClient.getGroupComputeResourcePolicy(resourcePolicyId);
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            computeResourcePolicy.getGroupResourceProfileId(), gatewayId + ":READ")){
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(computeResourcePolicy.getGroupResourceProfileId()).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
                         throw new AuthorizationException("User does not have permission to access group resource profile");
                     }
+
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to access group resource profile");
                 }
@@ -5734,13 +6262,12 @@
 
             ComputeResourcePolicy computeResourcePolicy = regClient.getGroupComputeResourcePolicy(resourcePolicyId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return computeResourcePolicy;
         } catch (Exception e) {
-            String msg = "Error retrieving Group compute resource policy. ResourcePolicyId: "+ resourcePolicyId;
+            String msg = "Error retrieving Group compute resource policy. ResourcePolicyId: " + resourcePolicyId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5750,30 +6277,40 @@
     @SecurityCheck
     public BatchQueueResourcePolicy getBatchQueueResourcePolicy(AuthzToken authzToken, String resourcePolicyId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     BatchQueueResourcePolicy batchQueueResourcePolicy = regClient.getBatchQueueResourcePolicy(resourcePolicyId);
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            batchQueueResourcePolicy.getGroupResourceProfileId(), gatewayId + ":READ")){
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(batchQueueResourcePolicy.getGroupResourceProfileId()).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
                         throw new AuthorizationException("User does not have permission to access group resource profile");
                     }
+
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to access group resource profile");
                 }
             }
             BatchQueueResourcePolicy batchQueueResourcePolicy = regClient.getBatchQueueResourcePolicy(resourcePolicyId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return batchQueueResourcePolicy;
         } catch (Exception e) {
-            String msg = "Error retrieving Group batch queue resource policy. ResourcePolicyId: "+ resourcePolicyId;
+            String msg = "Error retrieving Group batch queue resource policy. ResourcePolicyId: " + resourcePolicyId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5783,14 +6320,24 @@
     @SecurityCheck
     public List<GroupComputeResourcePreference> getGroupComputeResourcePrefList(AuthzToken authzToken, String groupResourceProfileId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            groupResourceProfileId, gatewayId + ":READ")){
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(groupResourceProfileId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
                         throw new AuthorizationException("User does not have permission to access group resource profile");
                     }
                 } catch (Exception e) {
@@ -5799,13 +6346,12 @@
             }
             List<GroupComputeResourcePreference> groupComputeResourcePreferenceList = regClient.getGroupComputeResourcePrefList(groupResourceProfileId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return groupComputeResourcePreferenceList;
         } catch (Exception e) {
-            String msg = "Error retrieving Group compute resource preference. GroupResourceProfileId: "+ groupResourceProfileId;
+            String msg = "Error retrieving Group compute resource preference. GroupResourceProfileId: " + groupResourceProfileId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5815,29 +6361,40 @@
     @SecurityCheck
     public List<BatchQueueResourcePolicy> getGroupBatchQueueResourcePolicyList(AuthzToken authzToken, String groupResourceProfileId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            groupResourceProfileId, gatewayId + ":READ")){
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(groupResourceProfileId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
                         throw new AuthorizationException("User does not have permission to access group resource profile");
                     }
+
+
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to access group resource profile");
                 }
             }
             List<BatchQueueResourcePolicy> batchQueueResourcePolicyList = regClient.getGroupBatchQueueResourcePolicyList(groupResourceProfileId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return batchQueueResourcePolicyList;
         } catch (Exception e) {
-            String msg = "Error retrieving Group batch queue resource policy list. GroupResourceProfileId: "+ groupResourceProfileId;
+            String msg = "Error retrieving Group batch queue resource policy list. GroupResourceProfileId: " + groupResourceProfileId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
@@ -5847,26 +6404,37 @@
     @SecurityCheck
     public List<ComputeResourcePolicy> getGroupComputeResourcePolicyList(AuthzToken authzToken, String groupResourceProfileId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
-        SharingRegistryService.Client sharingClient = sharingClientPool.getResource();
+
         try {
-            if(ServerSettings.isEnableSharing()) {
+            if (ServerSettings.isEnableSharing()) {
                 try {
                     String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
                     String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-                    if (!sharingClient.userHasAccess(gatewayId, userId + "@" + gatewayId,
-                            groupResourceProfileId, gatewayId + ":READ")){
+                    String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+                    Entity sharedEntity = Entity.newBuilder().setId(groupResourceProfileId).build();
+                    PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+                    SharingRequest sharingRequest = SharingRequest
+                            .newBuilder()
+                            .setEntity(sharedEntity)
+                            .setPermissionType(permissionType)
+                            .addOwnerId(userId)
+                            .build();
+                    Status status = sharingManagementClient.userHasAccess(custosId, sharingRequest);
+
+                    if (!status.getStatus()) {
                         throw new AuthorizationException("User does not have permission to access group resource profile");
                     }
+
+
                 } catch (Exception e) {
                     throw new AuthorizationException("User does not have permission to access group resource profile");
                 }
             }
             List<ComputeResourcePolicy> computeResourcePolicyList = regClient.getGroupComputeResourcePolicyList(groupResourceProfileId);
             registryClientPool.returnResource(regClient);
-            sharingClientPool.returnResource(sharingClient);
             return computeResourcePolicyList;
         } catch (Exception e) {
-            String msg = "Error retrieving Group compute resource policy list. GroupResourceProfileId: "+ groupResourceProfileId;
+            String msg = "Error retrieving Group compute resource policy list. GroupResourceProfileId: " + groupResourceProfileId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -5879,10 +6447,11 @@
     @SecurityCheck
     public GatewayGroups getGatewayGroups(AuthzToken authzToken) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
 
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
-            GatewayGroups gatewayGroups = retrieveGatewayGroups(regClient, gatewayId);
+            GatewayGroups gatewayGroups = retrieveGatewayGroups(regClient, gatewayId, custosId);
             registryClientPool.returnResource(regClient);
             return gatewayGroups;
         } catch (Exception e) {
@@ -5896,8 +6465,10 @@
     }
 
     @Override
+    @SecurityCheck
     public Parser getParser(AuthzToken authzToken, String parserId, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             Parser parser = regClient.getParser(parserId, gatewayId);
             registryClientPool.returnResource(regClient);
@@ -5913,8 +6484,10 @@
     }
 
     @Override
+    @SecurityCheck
     public String saveParser(AuthzToken authzToken, Parser parser) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             String parserId = regClient.saveParser(parser);
             registryClientPool.returnResource(regClient);
@@ -5930,14 +6503,16 @@
     }
 
     @Override
+    @SecurityCheck
     public List<Parser> listAllParsers(AuthzToken authzToken, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<Parser> parsers = regClient.listAllParsers(gatewayId);
             registryClientPool.returnResource(regClient);
             return parsers;
         } catch (Exception e) {
-            String msg = "Error while listing the parsers for gateway " + gatewayId ;
+            String msg = "Error while listing the parsers for gateway " + gatewayId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -5947,14 +6522,16 @@
     }
 
     @Override
+    @SecurityCheck
     public boolean removeParser(AuthzToken authzToken, String parserId, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             regClient.removeParser(parserId, gatewayId);
             registryClientPool.returnResource(regClient);
             return true;
         } catch (Exception e) {
-            String msg = "Error while removing the parser " + parserId + " in gateway " + gatewayId ;
+            String msg = "Error while removing the parser " + parserId + " in gateway " + gatewayId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -5964,9 +6541,11 @@
     }
 
     @Override
+    @SecurityCheck
     public ParsingTemplate getParsingTemplate(AuthzToken authzToken, String templateId, String gatewayId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             ParsingTemplate parsingTemplate = regClient.getParsingTemplate(templateId, gatewayId);
             registryClientPool.returnResource(regClient);
@@ -5975,15 +6554,17 @@
             String msg = "Error retrieving parsing template with id: " + templateId;
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
     }
 
     @Override
+    @SecurityCheck
     public List<ParsingTemplate> getParsingTemplatesForExperiment(AuthzToken authzToken, String experimentId, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<ParsingTemplate> parsingTemplates = regClient.getParsingTemplatesForExperiment(experimentId, gatewayId);
             registryClientPool.returnResource(regClient);
@@ -5999,25 +6580,29 @@
     }
 
     @Override
+    @SecurityCheck
     public String saveParsingTemplate(AuthzToken authzToken, ParsingTemplate parsingTemplate) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
-            String templateId =  regClient.saveParsingTemplate(parsingTemplate);
+            String templateId = regClient.saveParsingTemplate(parsingTemplate);
             registryClientPool.returnResource(regClient);
             return templateId;
         } catch (Exception e) {
             String msg = "Error saving the parsing template";
             logger.error(msg, e);
             AiravataSystemException exception = new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage(msg+" More info : " + e.getMessage());
+            exception.setMessage(msg + " More info : " + e.getMessage());
             registryClientPool.returnBrokenResource(regClient);
             throw exception;
         }
     }
 
     @Override
+    @SecurityCheck
     public boolean removeParsingTemplate(AuthzToken authzToken, String templateId, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             regClient.removeParsingTemplate(templateId, gatewayId);
             registryClientPool.returnResource(regClient);
@@ -6033,8 +6618,10 @@
     }
 
     @Override
+    @SecurityCheck
     public List<ParsingTemplate> listAllParsingTemplates(AuthzToken authzToken, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
+
         try {
             List<ParsingTemplate> templates = regClient.listAllParsingTemplates(gatewayId);
             registryClientPool.returnResource(regClient);
@@ -6063,25 +6650,83 @@
         experimentPublisher.publish(messageContext);
     }
 
-    private void shareEntityWithAdminGatewayGroups(RegistryService.Client regClient, SharingRegistryService.Client sharingClient, Entity entity) throws TException {
-        final String domainId = entity.getDomainId();
-        GatewayGroups gatewayGroups = retrieveGatewayGroups(regClient, domainId);
-        sharingClient.shareEntityWithGroups(domainId, entity.getEntityId(), Arrays.asList(gatewayGroups.getAdminsGroupId()), domainId + ":WRITE", true);
-        sharingClient.shareEntityWithGroups(domainId, entity.getEntityId(), Arrays.asList(gatewayGroups.getAdminsGroupId(), gatewayGroups.getReadOnlyAdminsGroupId()), domainId + ":READ", true);
+    private void shareEntityWithAdminGatewayGroups(RegistryService.Client regClient, String custosId, String domainId, Entity entity) throws TException {
+        GatewayGroups gatewayGroups = retrieveGatewayGroups(regClient, domainId, custosId);
+
+        PermissionType writePermissionType = PermissionType.newBuilder().setId("WRITE").build();
+
+        SharingRequest request = SharingRequest.newBuilder()
+                .setEntity(entity)
+                .setPermissionType(writePermissionType)
+                .addAllOwnerId(Arrays.asList(gatewayGroups.getAdminsGroupId()))
+                .setCascade(true).build();
+
+
+        sharingManagementClient.shareEntityWithGroups(custosId, request);
+
+        PermissionType readPermissionType = PermissionType.newBuilder().setId("READ").build();
+
+        SharingRequest readRequest = SharingRequest.newBuilder()
+                .setEntity(entity)
+                .setPermissionType(readPermissionType)
+                .addAllOwnerId(Arrays.asList(gatewayGroups.getReadOnlyAdminsGroupId(), gatewayGroups.getAdminsGroupId()))
+                .setCascade(true).build();
+
+        sharingManagementClient.shareEntityWithGroups(custosId, readRequest);
+
     }
 
-    private boolean userHasAccessInternal(SharingRegistryService.Client sharingClient, AuthzToken authzToken, String entityId, ResourcePermissionType permissionType) {
-        final String domainId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-        final String userId = authzToken.getClaimsMap().get(Constants.USER_NAME) + "@" + domainId;
+    private boolean userHasAccessInternal(AuthzToken authzToken, String entityId, ResourcePermissionType permissionType) {
+        final String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        final String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         try {
-            final boolean hasOwnerAccess = sharingClient.userHasAccess(domainId, userId, entityId, domainId + ":" + ResourcePermissionType.OWNER);
+
+            Entity deploymentEntity = Entity.newBuilder().setId(entityId).build();
+            PermissionType type = PermissionType.newBuilder().setId(ResourcePermissionType.OWNER.name()).build();
+            SharingRequest request = SharingRequest
+                    .newBuilder()
+                    .setEntity(deploymentEntity)
+                    .setPermissionType(type)
+                    .addOwnerId(userId)
+                    .build();
+
+            Status appStatus = sharingManagementClient.userHasAccess(custosId, request);
+
+            final boolean hasOwnerAccess = appStatus.getStatus();
             boolean hasAccess = false;
             if (permissionType.equals(ResourcePermissionType.WRITE)) {
-                hasAccess = hasOwnerAccess || sharingClient.userHasAccess(domainId, userId, entityId, domainId + ":" + ResourcePermissionType.WRITE);
+                type = PermissionType.newBuilder().setId(ResourcePermissionType.WRITE.name()).build();
+                request = SharingRequest
+                        .newBuilder()
+                        .setEntity(deploymentEntity)
+                        .setPermissionType(type)
+                        .addOwnerId(userId)
+                        .build();
+                Status writeAccess = sharingManagementClient.userHasAccess(custosId, request);
+
+                hasAccess = hasOwnerAccess || writeAccess.getStatus();
             } else if (permissionType.equals(ResourcePermissionType.READ)) {
-                hasAccess = hasOwnerAccess || sharingClient.userHasAccess(domainId, userId, entityId, domainId + ":" + ResourcePermissionType.READ);
+                type = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+                request = SharingRequest
+                        .newBuilder()
+                        .setEntity(deploymentEntity)
+                        .setPermissionType(type)
+                        .addOwnerId(userId)
+                        .build();
+                Status writeAccess = sharingManagementClient.userHasAccess(custosId, request);
+
+                hasAccess = hasOwnerAccess || writeAccess.getStatus();
             } else if (permissionType.equals(ResourcePermissionType.MANAGE_SHARING)) {
-                hasAccess = hasOwnerAccess || sharingClient.userHasAccess(domainId, userId, entityId, domainId + ":" + ResourcePermissionType.MANAGE_SHARING);
+                type = PermissionType.newBuilder().setId(ResourcePermissionType.MANAGE_SHARING.name()).build();
+                request = SharingRequest
+                        .newBuilder()
+                        .setEntity(deploymentEntity)
+                        .setPermissionType(type)
+                        .addOwnerId(userId)
+                        .build();
+                Status writeAccess = sharingManagementClient.userHasAccess(custosId, request);
+
+                hasAccess = hasOwnerAccess || writeAccess.getStatus();
             } else if (permissionType.equals(ResourcePermissionType.OWNER)) {
                 hasAccess = hasOwnerAccess;
             }
@@ -6091,22 +6736,66 @@
         }
     }
 
-    private ResourceType getResourceType(SharingRegistryService.Client sharingClient, String domainId, String entityId) throws TException {
-        Entity entity = sharingClient.getEntity(domainId, entityId);
+    private ResourceType getResourceType(String custosId, String domainId, String entityId) throws TException {
+        logger.info("Entity Id" + entityId);
+        Entity entity = Entity.newBuilder().setId(entityId).build();
+        Entity exEn = sharingManagementClient.getEntity(custosId, entity);
+        logger.info("Resource Type " + exEn.getType());
         for (ResourceType resourceType : ResourceType.values()) {
-            if (entity.getEntityTypeId().equals(domainId + ":" + resourceType.name())) {
+            if (exEn.getType().equals(resourceType.name())) {
                 return resourceType;
             }
         }
-        throw new RuntimeException("Unrecognized entity type id: " + entity.getEntityTypeId());
+        throw new RuntimeException("Unrecognized entity type id: " + exEn.getType());
     }
 
-    private GatewayGroups retrieveGatewayGroups(RegistryService.Client regClient, String gatewayId) throws TException {
+    private GatewayGroups retrieveGatewayGroups(RegistryService.Client regClient, String gatewayId, String custosId) throws TException {
 
         if (regClient.isGatewayGroupsExists(gatewayId)) {
             return regClient.getGatewayGroups(gatewayId);
         } else {
-            return GatewayGroupsInitializer.initializeGatewayGroups(gatewayId);
+            return GatewayGroupsInitializer.initializeGatewayGroups(gatewayId, custosId);
         }
     }
+
+
+    private List<String> getAccessibleIds(String username, ResourceType type, String custosId) {
+
+        List<String> accessibleAppDeploymentIds = new ArrayList<>();
+
+        SearchCriteria searchCriteria = SearchCriteria
+                .newBuilder()
+                .setSearchField(EntitySearchField.ENTITY_TYPE_ID)
+                .setCondition(SearchCondition.EQUAL)
+                .setValue(type.name())
+                .build();
+
+        SearchRequest searchRequest = SearchRequest.newBuilder()
+                .addSearchCriteria(searchCriteria)
+                .setOwnerId(username)
+                .build();
+
+        Entities entities = sharingManagementClient.searchEntities(custosId, searchRequest);
+
+        for (Entity entity : entities.getEntityArrayList()) {
+
+            Entity deploymentEntity = Entity.newBuilder().setId(entity.getId()).build();
+            PermissionType permissionType = PermissionType.newBuilder().setId(ResourcePermissionType.READ.name()).build();
+
+            SharingRequest request = SharingRequest
+                    .newBuilder()
+                    .setEntity(deploymentEntity)
+                    .setPermissionType(permissionType)
+                    .addOwnerId(username)
+                    .build();
+
+            Status status = sharingManagementClient.userHasAccess(custosId, request);
+
+            if (status.getStatus()) {
+                accessibleAppDeploymentIds.add(entity.getId());
+            }
+
+        }
+        return accessibleAppDeploymentIds;
+    }
 }
diff --git a/airavata-api/airavata-api-stubs/pom.xml b/airavata-api/airavata-api-stubs/pom.xml
index 62f2a7f..1a1e0b8 100644
--- a/airavata-api/airavata-api-stubs/pom.xml
+++ b/airavata-api/airavata-api-stubs/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>airavata-api</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-api/airavata-base-api/pom.xml b/airavata-api/airavata-base-api/pom.xml
index 2866951..1358811 100644
--- a/airavata-api/airavata-base-api/pom.xml
+++ b/airavata-api/airavata-base-api/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>airavata-api</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -18,5 +18,10 @@
             <artifactId>libthrift</artifactId>
             <version>${thrift.version}</version>
         </dependency>
+        <dependency>
+            <groupId>javax.annotation</groupId>
+            <artifactId>javax.annotation-api</artifactId>
+            <version>${javax.annotation.version}</version>
+        </dependency>
     </dependencies>
 </project>
diff --git a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/pom.xml b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/pom.xml
index 2718538..73f1c06 100644
--- a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/pom.xml
+++ b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-client-sdks</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/pom.xml b/airavata-api/airavata-client-sdks/airavata-php-sdk/pom.xml
index b4e57e0..3a20b76 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/pom.xml
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-client-sdks</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/API/Sharing/SharingRegistryService.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/API/Sharing/SharingRegistryService.php
index 4038013..4b85f3d 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/API/Sharing/SharingRegistryService.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/API/Sharing/SharingRegistryService.php
@@ -62,6 +62,7 @@
    * <li>description : A short description for the domain</li>
    * <li>createdTime : Will be set by the system</li>
    * <li>updatedTime : Will be set by the system</li>
+   * <li>initialUserGroupId : New users will automatically be added to this group</li>
    * 
    * 
    * @throws \Airavata\Model\Sharing\SharingRegistryException
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/AppCatalog/GroupResourceProfile/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/AppCatalog/GroupResourceProfile/Types.php
index 50364a5..34b1077 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/AppCatalog/GroupResourceProfile/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/AppCatalog/GroupResourceProfile/Types.php
@@ -161,6 +161,199 @@
 
 }
 
+class ComputeResourceReservation {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $reservationId = "DO_NOT_SET_AT_CLIENTS";
+  /**
+   * @var string
+   */
+  public $reservationName = null;
+  /**
+   * @var string[]
+   */
+  public $queueNames = null;
+  /**
+   * @var int
+   */
+  public $startTime = null;
+  /**
+   * @var int
+   */
+  public $endTime = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'reservationId',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'reservationName',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'queueNames',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        4 => array(
+          'var' => 'startTime',
+          'type' => TType::I64,
+          ),
+        5 => array(
+          'var' => 'endTime',
+          'type' => TType::I64,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['reservationId'])) {
+        $this->reservationId = $vals['reservationId'];
+      }
+      if (isset($vals['reservationName'])) {
+        $this->reservationName = $vals['reservationName'];
+      }
+      if (isset($vals['queueNames'])) {
+        $this->queueNames = $vals['queueNames'];
+      }
+      if (isset($vals['startTime'])) {
+        $this->startTime = $vals['startTime'];
+      }
+      if (isset($vals['endTime'])) {
+        $this->endTime = $vals['endTime'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'ComputeResourceReservation';
+  }
+
+  public function read($input)
+  {
+    $xfer = 0;
+    $fname = null;
+    $ftype = 0;
+    $fid = 0;
+    $xfer += $input->readStructBegin($fname);
+    while (true)
+    {
+      $xfer += $input->readFieldBegin($fname, $ftype, $fid);
+      if ($ftype == TType::STOP) {
+        break;
+      }
+      switch ($fid)
+      {
+        case 1:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->reservationId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->reservationName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::LST) {
+            $this->queueNames = array();
+            $_size0 = 0;
+            $_etype3 = 0;
+            $xfer += $input->readListBegin($_etype3, $_size0);
+            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
+            {
+              $elem5 = null;
+              $xfer += $input->readString($elem5);
+              $this->queueNames []= $elem5;
+            }
+            $xfer += $input->readListEnd();
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->startTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->endTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        default:
+          $xfer += $input->skip($ftype);
+          break;
+      }
+      $xfer += $input->readFieldEnd();
+    }
+    $xfer += $input->readStructEnd();
+    return $xfer;
+  }
+
+  public function write($output) {
+    $xfer = 0;
+    $xfer += $output->writeStructBegin('ComputeResourceReservation');
+    if ($this->reservationId !== null) {
+      $xfer += $output->writeFieldBegin('reservationId', TType::STRING, 1);
+      $xfer += $output->writeString($this->reservationId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->reservationName !== null) {
+      $xfer += $output->writeFieldBegin('reservationName', TType::STRING, 2);
+      $xfer += $output->writeString($this->reservationName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->queueNames !== null) {
+      if (!is_array($this->queueNames)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('queueNames', TType::LST, 3);
+      {
+        $output->writeListBegin(TType::STRING, count($this->queueNames));
+        {
+          foreach ($this->queueNames as $iter6)
+          {
+            $xfer += $output->writeString($iter6);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->startTime !== null) {
+      $xfer += $output->writeFieldBegin('startTime', TType::I64, 4);
+      $xfer += $output->writeI64($this->startTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->endTime !== null) {
+      $xfer += $output->writeFieldBegin('endTime', TType::I64, 5);
+      $xfer += $output->writeI64($this->endTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
 class GroupComputeResourcePreference {
   static $_TSPEC;
 
@@ -215,18 +408,6 @@
   /**
    * @var string
    */
-  public $reservation = null;
-  /**
-   * @var int
-   */
-  public $reservationStartTime = null;
-  /**
-   * @var int
-   */
-  public $reservationEndTime = null;
-  /**
-   * @var string
-   */
   public $sshAccountProvisioner = null;
   /**
    * @var \Airavata\Model\AppCatalog\GroupResourceProfile\GroupAccountSSHProvisionerConfig[]
@@ -236,6 +417,10 @@
    * @var string
    */
   public $sshAccountProvisionerAdditionalInfo = null;
+  /**
+   * @var \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourceReservation[]
+   */
+  public $reservations = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -288,18 +473,6 @@
           'var' => 'qualityOfService',
           'type' => TType::STRING,
           ),
-        13 => array(
-          'var' => 'reservation',
-          'type' => TType::STRING,
-          ),
-        14 => array(
-          'var' => 'reservationStartTime',
-          'type' => TType::I64,
-          ),
-        15 => array(
-          'var' => 'reservationEndTime',
-          'type' => TType::I64,
-          ),
         16 => array(
           'var' => 'sshAccountProvisioner',
           'type' => TType::STRING,
@@ -317,6 +490,15 @@
           'var' => 'sshAccountProvisionerAdditionalInfo',
           'type' => TType::STRING,
           ),
+        19 => array(
+          'var' => 'reservations',
+          'type' => TType::LST,
+          'etype' => TType::STRUCT,
+          'elem' => array(
+            'type' => TType::STRUCT,
+            'class' => '\Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourceReservation',
+            ),
+          ),
         );
     }
     if (is_array($vals)) {
@@ -356,15 +538,6 @@
       if (isset($vals['qualityOfService'])) {
         $this->qualityOfService = $vals['qualityOfService'];
       }
-      if (isset($vals['reservation'])) {
-        $this->reservation = $vals['reservation'];
-      }
-      if (isset($vals['reservationStartTime'])) {
-        $this->reservationStartTime = $vals['reservationStartTime'];
-      }
-      if (isset($vals['reservationEndTime'])) {
-        $this->reservationEndTime = $vals['reservationEndTime'];
-      }
       if (isset($vals['sshAccountProvisioner'])) {
         $this->sshAccountProvisioner = $vals['sshAccountProvisioner'];
       }
@@ -374,6 +547,9 @@
       if (isset($vals['sshAccountProvisionerAdditionalInfo'])) {
         $this->sshAccountProvisionerAdditionalInfo = $vals['sshAccountProvisionerAdditionalInfo'];
       }
+      if (isset($vals['reservations'])) {
+        $this->reservations = $vals['reservations'];
+      }
     }
   }
 
@@ -480,27 +656,6 @@
             $xfer += $input->skip($ftype);
           }
           break;
-        case 13:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->reservation);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 14:
-          if ($ftype == TType::I64) {
-            $xfer += $input->readI64($this->reservationStartTime);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 15:
-          if ($ftype == TType::I64) {
-            $xfer += $input->readI64($this->reservationEndTime);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
         case 16:
           if ($ftype == TType::STRING) {
             $xfer += $input->readString($this->sshAccountProvisioner);
@@ -511,15 +666,15 @@
         case 17:
           if ($ftype == TType::LST) {
             $this->groupSSHAccountProvisionerConfigs = array();
-            $_size0 = 0;
-            $_etype3 = 0;
-            $xfer += $input->readListBegin($_etype3, $_size0);
-            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
+            $_size7 = 0;
+            $_etype10 = 0;
+            $xfer += $input->readListBegin($_etype10, $_size7);
+            for ($_i11 = 0; $_i11 < $_size7; ++$_i11)
             {
-              $elem5 = null;
-              $elem5 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupAccountSSHProvisionerConfig();
-              $xfer += $elem5->read($input);
-              $this->groupSSHAccountProvisionerConfigs []= $elem5;
+              $elem12 = null;
+              $elem12 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupAccountSSHProvisionerConfig();
+              $xfer += $elem12->read($input);
+              $this->groupSSHAccountProvisionerConfigs []= $elem12;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -533,6 +688,24 @@
             $xfer += $input->skip($ftype);
           }
           break;
+        case 19:
+          if ($ftype == TType::LST) {
+            $this->reservations = array();
+            $_size13 = 0;
+            $_etype16 = 0;
+            $xfer += $input->readListBegin($_etype16, $_size13);
+            for ($_i17 = 0; $_i17 < $_size13; ++$_i17)
+            {
+              $elem18 = null;
+              $elem18 = new \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourceReservation();
+              $xfer += $elem18->read($input);
+              $this->reservations []= $elem18;
+            }
+            $xfer += $input->readListEnd();
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -606,21 +779,6 @@
       $xfer += $output->writeString($this->qualityOfService);
       $xfer += $output->writeFieldEnd();
     }
-    if ($this->reservation !== null) {
-      $xfer += $output->writeFieldBegin('reservation', TType::STRING, 13);
-      $xfer += $output->writeString($this->reservation);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->reservationStartTime !== null) {
-      $xfer += $output->writeFieldBegin('reservationStartTime', TType::I64, 14);
-      $xfer += $output->writeI64($this->reservationStartTime);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->reservationEndTime !== null) {
-      $xfer += $output->writeFieldBegin('reservationEndTime', TType::I64, 15);
-      $xfer += $output->writeI64($this->reservationEndTime);
-      $xfer += $output->writeFieldEnd();
-    }
     if ($this->sshAccountProvisioner !== null) {
       $xfer += $output->writeFieldBegin('sshAccountProvisioner', TType::STRING, 16);
       $xfer += $output->writeString($this->sshAccountProvisioner);
@@ -634,9 +792,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->groupSSHAccountProvisionerConfigs));
         {
-          foreach ($this->groupSSHAccountProvisionerConfigs as $iter6)
+          foreach ($this->groupSSHAccountProvisionerConfigs as $iter19)
           {
-            $xfer += $iter6->write($output);
+            $xfer += $iter19->write($output);
           }
         }
         $output->writeListEnd();
@@ -648,6 +806,23 @@
       $xfer += $output->writeString($this->sshAccountProvisionerAdditionalInfo);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->reservations !== null) {
+      if (!is_array($this->reservations)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('reservations', TType::LST, 19);
+      {
+        $output->writeListBegin(TType::STRUCT, count($this->reservations));
+        {
+          foreach ($this->reservations as $iter20)
+          {
+            $xfer += $iter20->write($output);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
@@ -759,14 +934,14 @@
         case 4:
           if ($ftype == TType::LST) {
             $this->allowedBatchQueues = array();
-            $_size7 = 0;
-            $_etype10 = 0;
-            $xfer += $input->readListBegin($_etype10, $_size7);
-            for ($_i11 = 0; $_i11 < $_size7; ++$_i11)
+            $_size21 = 0;
+            $_etype24 = 0;
+            $xfer += $input->readListBegin($_etype24, $_size21);
+            for ($_i25 = 0; $_i25 < $_size21; ++$_i25)
             {
-              $elem12 = null;
-              $xfer += $input->readString($elem12);
-              $this->allowedBatchQueues []= $elem12;
+              $elem26 = null;
+              $xfer += $input->readString($elem26);
+              $this->allowedBatchQueues []= $elem26;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -809,9 +984,9 @@
       {
         $output->writeListBegin(TType::STRING, count($this->allowedBatchQueues));
         {
-          foreach ($this->allowedBatchQueues as $iter13)
+          foreach ($this->allowedBatchQueues as $iter27)
           {
-            $xfer += $output->writeString($iter13);
+            $xfer += $output->writeString($iter27);
           }
         }
         $output->writeListEnd();
@@ -1229,15 +1404,15 @@
         case 4:
           if ($ftype == TType::LST) {
             $this->computePreferences = array();
-            $_size14 = 0;
-            $_etype17 = 0;
-            $xfer += $input->readListBegin($_etype17, $_size14);
-            for ($_i18 = 0; $_i18 < $_size14; ++$_i18)
+            $_size28 = 0;
+            $_etype31 = 0;
+            $xfer += $input->readListBegin($_etype31, $_size28);
+            for ($_i32 = 0; $_i32 < $_size28; ++$_i32)
             {
-              $elem19 = null;
-              $elem19 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupComputeResourcePreference();
-              $xfer += $elem19->read($input);
-              $this->computePreferences []= $elem19;
+              $elem33 = null;
+              $elem33 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupComputeResourcePreference();
+              $xfer += $elem33->read($input);
+              $this->computePreferences []= $elem33;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -1247,15 +1422,15 @@
         case 5:
           if ($ftype == TType::LST) {
             $this->computeResourcePolicies = array();
-            $_size20 = 0;
-            $_etype23 = 0;
-            $xfer += $input->readListBegin($_etype23, $_size20);
-            for ($_i24 = 0; $_i24 < $_size20; ++$_i24)
+            $_size34 = 0;
+            $_etype37 = 0;
+            $xfer += $input->readListBegin($_etype37, $_size34);
+            for ($_i38 = 0; $_i38 < $_size34; ++$_i38)
             {
-              $elem25 = null;
-              $elem25 = new \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourcePolicy();
-              $xfer += $elem25->read($input);
-              $this->computeResourcePolicies []= $elem25;
+              $elem39 = null;
+              $elem39 = new \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourcePolicy();
+              $xfer += $elem39->read($input);
+              $this->computeResourcePolicies []= $elem39;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -1265,15 +1440,15 @@
         case 6:
           if ($ftype == TType::LST) {
             $this->batchQueueResourcePolicies = array();
-            $_size26 = 0;
-            $_etype29 = 0;
-            $xfer += $input->readListBegin($_etype29, $_size26);
-            for ($_i30 = 0; $_i30 < $_size26; ++$_i30)
+            $_size40 = 0;
+            $_etype43 = 0;
+            $xfer += $input->readListBegin($_etype43, $_size40);
+            for ($_i44 = 0; $_i44 < $_size40; ++$_i44)
             {
-              $elem31 = null;
-              $elem31 = new \Airavata\Model\AppCatalog\GroupResourceProfile\BatchQueueResourcePolicy();
-              $xfer += $elem31->read($input);
-              $this->batchQueueResourcePolicies []= $elem31;
+              $elem45 = null;
+              $elem45 = new \Airavata\Model\AppCatalog\GroupResourceProfile\BatchQueueResourcePolicy();
+              $xfer += $elem45->read($input);
+              $this->batchQueueResourcePolicies []= $elem45;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -1337,9 +1512,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->computePreferences));
         {
-          foreach ($this->computePreferences as $iter32)
+          foreach ($this->computePreferences as $iter46)
           {
-            $xfer += $iter32->write($output);
+            $xfer += $iter46->write($output);
           }
         }
         $output->writeListEnd();
@@ -1354,9 +1529,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->computeResourcePolicies));
         {
-          foreach ($this->computeResourcePolicies as $iter33)
+          foreach ($this->computeResourcePolicies as $iter47)
           {
-            $xfer += $iter33->write($output);
+            $xfer += $iter47->write($output);
           }
         }
         $output->writeListEnd();
@@ -1371,9 +1546,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->batchQueueResourcePolicies));
         {
-          foreach ($this->batchQueueResourcePolicies as $iter34)
+          foreach ($this->batchQueueResourcePolicies as $iter48)
           {
-            $xfer += $iter34->write($output);
+            $xfer += $iter48->write($output);
           }
         }
         $output->writeListEnd();
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Application/Io/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Application/Io/Types.php
index fb4977e..9543c61 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Application/Io/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Application/Io/Types.php
@@ -65,6 +65,8 @@
  * metaData:
  *   Any metadat. This is typically ignore by Airavata and is used by gateways for application configuration.
  * 
+ * overrideFilename:
+ *   Rename input file to given value when staging to compute resource.
  */
 class InputDataObjectType {
   static $_TSPEC;
@@ -121,6 +123,10 @@
    * @var bool
    */
   public $isReadOnly = null;
+  /**
+   * @var string
+   */
+  public $overrideFilename = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -177,6 +183,10 @@
           'var' => 'isReadOnly',
           'type' => TType::BOOL,
           ),
+        14 => array(
+          'var' => 'overrideFilename',
+          'type' => TType::STRING,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -219,6 +229,9 @@
       if (isset($vals['isReadOnly'])) {
         $this->isReadOnly = $vals['isReadOnly'];
       }
+      if (isset($vals['overrideFilename'])) {
+        $this->overrideFilename = $vals['overrideFilename'];
+      }
     }
   }
 
@@ -332,6 +345,13 @@
             $xfer += $input->skip($ftype);
           }
           break;
+        case 14:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->overrideFilename);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -410,6 +430,11 @@
       $xfer += $output->writeBool($this->isReadOnly);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->overrideFilename !== null) {
+      $xfer += $output->writeFieldBegin('overrideFilename', TType::STRING, 14);
+      $xfer += $output->writeString($this->overrideFilename);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Group/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Group/Types.php
index 9e17f8a..f74a97f 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Group/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Group/Types.php
@@ -40,10 +40,12 @@
   const WRITE = 0;
   const READ = 1;
   const OWNER = 2;
+  const MANAGE_SHARING = 3;
   static public $__names = array(
     0 => 'WRITE',
     1 => 'READ',
     2 => 'OWNER',
+    3 => 'MANAGE_SHARING',
   );
 }
 
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Sharing/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Sharing/Types.php
index 7a74f6d..d5dd2d3 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Sharing/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Sharing/Types.php
@@ -144,6 +144,7 @@
  * <li>description : A short description for the domain</li>
  * <li>createdTime : Will be set by the system</li>
  * <li>updatedTime : Will be set by the system</li>
+ * <li>initialUserGroupId : New users will automatically be added to this group</li>
  * 
  */
 class Domain {
@@ -169,6 +170,10 @@
    * @var int
    */
   public $updatedTime = null;
+  /**
+   * @var string
+   */
+  public $initialUserGroupId = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -193,6 +198,10 @@
           'var' => 'updatedTime',
           'type' => TType::I64,
           ),
+        6 => array(
+          'var' => 'initialUserGroupId',
+          'type' => TType::STRING,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -211,6 +220,9 @@
       if (isset($vals['updatedTime'])) {
         $this->updatedTime = $vals['updatedTime'];
       }
+      if (isset($vals['initialUserGroupId'])) {
+        $this->initialUserGroupId = $vals['initialUserGroupId'];
+      }
     }
   }
 
@@ -268,6 +280,13 @@
             $xfer += $input->skip($ftype);
           }
           break;
+        case 6:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->initialUserGroupId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -306,6 +325,11 @@
       $xfer += $output->writeI64($this->updatedTime);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->initialUserGroupId !== null) {
+      $xfer += $output->writeFieldBegin('initialUserGroupId', TType::STRING, 6);
+      $xfer += $output->writeString($this->initialUserGroupId);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Workspace/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Workspace/Types.php
index 8a2f3cb..efd10d0 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Workspace/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Workspace/Types.php
@@ -708,6 +708,14 @@
    * @var string
    */
   public $requesterUsername = null;
+  /**
+   * @var string[]
+   */
+  public $redirectURLs = null;
+  /**
+   * @var string
+   */
+  public $scope = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -792,6 +800,18 @@
           'var' => 'requesterUsername',
           'type' => TType::STRING,
           ),
+        21 => array(
+          'var' => 'redirectURLs',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        22 => array(
+          'var' => 'scope',
+          'type' => TType::STRING,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -855,6 +875,12 @@
       if (isset($vals['requesterUsername'])) {
         $this->requesterUsername = $vals['requesterUsername'];
       }
+      if (isset($vals['redirectURLs'])) {
+        $this->redirectURLs = $vals['redirectURLs'];
+      }
+      if (isset($vals['scope'])) {
+        $this->scope = $vals['scope'];
+      }
     }
   }
 
@@ -1017,6 +1043,30 @@
             $xfer += $input->skip($ftype);
           }
           break;
+        case 21:
+          if ($ftype == TType::LST) {
+            $this->redirectURLs = array();
+            $_size14 = 0;
+            $_etype17 = 0;
+            $xfer += $input->readListBegin($_etype17, $_size14);
+            for ($_i18 = 0; $_i18 < $_size14; ++$_i18)
+            {
+              $elem19 = null;
+              $xfer += $input->readString($elem19);
+              $this->redirectURLs []= $elem19;
+            }
+            $xfer += $input->readListEnd();
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 22:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->scope);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -1130,6 +1180,28 @@
       $xfer += $output->writeString($this->requesterUsername);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->redirectURLs !== null) {
+      if (!is_array($this->redirectURLs)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('redirectURLs', TType::LST, 21);
+      {
+        $output->writeListBegin(TType::STRING, count($this->redirectURLs));
+        {
+          foreach ($this->redirectURLs as $iter20)
+          {
+            $xfer += $output->writeString($iter20);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->scope !== null) {
+      $xfer += $output->writeFieldBegin('scope', TType::STRING, 22);
+      $xfer += $output->writeString($this->scope);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/.gitignore b/airavata-api/airavata-client-sdks/airavata-python-sdk/.gitignore
new file mode 100644
index 0000000..eadad48
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/.gitignore
@@ -0,0 +1,4 @@
+venv
+airavata_custos.egg-info
+*.pyc
+.tox
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/LICENSE b/airavata-api/airavata-client-sdks/airavata-python-sdk/LICENSE
new file mode 100644
index 0000000..f49a4e1
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/README.md b/airavata-api/airavata-client-sdks/airavata-python-sdk/README.md
new file mode 100644
index 0000000..06b97ff
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/README.md
@@ -0,0 +1,402 @@
+# Apache Airavata Python SDK
+The Apache Airavata Python SDK for  third party clients to  integrate with Airavata middleware
+
+
+### Folder Structure
+
+ - airavata
+      
+    Includes thrift stubs generated by a thrift compiler. Mainly contains data model and functions. You may 
+              need to import data model packages to integrate with clients. 
+              
+ - clients
+      
+     Includes integration clients, which you want to import and integrate with your code to access airavata middleware.
+              
+ - samples
+      
+   Includes set of sample implementation of  integration clients to demonastrate the integration with  airavata middleware
+              
+ - transport
+ 
+   Includes connection handling classes and connection pool implementations
+              
+
+### Before  Integration
+
+  -  Create a virtual environment
+                
+       ```
+       python3 -m venv venv
+        ```    
+  -  Activate the virtual environment
+        
+       ```
+       source venv/bin/activate
+       ```
+  -  Install dependencies
+            
+       ```
+       pip install -r requirements.txt
+       ```
+  -  Create a INI file containing server configuration details. For more information refer to default settings file
+            
+       [settings.ini](transport/settings.ini)
+       
+### Generating Distribution Archives (Optional)
+
+   You can generate *.tar.gz or .whl distribution and install to any external project. 
+   
+   - Make sure you have the latest versions of setuptools and wheel installed
+    
+       ```
+       python3 -m pip install --user --upgrade setuptools wheel
+       ``` 
+   - Now run this command from the same directory where setup.py is located
+   
+        ```
+        python3 setup.py sdist bdist_wheel
+        ```
+   - This command should output a lot of text and once completed should generate two files in the dist directory
+   
+        ```
+        dist/
+            airavata_python_sdk-1.0.0-py2.py3-none-any.whl
+            airavata-python-sdk-1.0.0.tar.gz
+        ```     
+
+You should be able to install those packages into your project.
+
+
+
+### Integrate With Your Clients
+
+   - [api_server_client](clients/api_server_client.py)
+      - is_user_exists(authz_token, gateway_id, user_name)
+      - add_gateway( authz_token, [gateway](airavata/model/workspace/ttypes.py)) 
+      - get_all_users_in_gateway( authz_token, gateway_id)
+      - update_gateway( authz_token, gateway_id, updated_gateway)
+      - get_gateway( authz_token, gateway_id)
+      - delete_gateway( authz_token, gateway_id)
+      - get_all_gateways( authz_token)
+      - is_gateway_exist( authz_token, gateway_id)
+      - create_notification( authz_token, [notification](airavata/model/workspace/ttypes.py))
+      - update_notification( authz_token, notification)
+      - delete_notification( authz_token, gateway_id, notification_id)
+      - get_notification( authz_token, gateway_id, notification_id)
+      - get_all_notifications( authz_token, gateway_id)
+      - generate_and_register_ssh_keys( authz_token, description)
+      - register_pwd_credential( authz_token, login_user_name, password, description)
+      - delete_ssh_pub_key( authz_token, airavata_cred_store_token)
+      - delete_pwd_credential( authz_token, airavata_cred_store_token)
+      - create_project( authz_token, gateway_id, [project](airavata/model/workspace/ttypes.py))
+      - update_project( authz_token, project_id, updated_project)
+      - get_project( authz_token, project_id)
+      - delete_project( authz_token, project_id)
+      - get_user_projects( authz_token, gateway_id, user_name, limit, offset)
+      - search_projects( authz_token, gateway_id, user_name, filters, limit, offset)
+      - search_experiments( authz_token, gateway_id, user_name, filters, limit, offset)
+      - get_experiment_statistics( authz_token, gateway_id, from_time, to_time, user_name, application_name,
+                                  resource_host_name)
+      - get_experiments_in_project( authz_token, project_id, limit, offset)
+      - get_user_experiments( authz_token, gateway_id, user_name, limit, offset)
+      - create_experiment( authz_token, gateway_id, [experiment](airavata/model/experiment/ttypes.py))
+      - delete_experiment( authz_token, experiment_id)
+      - get_experiment( authz_token, airavata_experiment_id)
+      - get_experiment_by_admin( authz_token, airavata_experiment_id)
+      - get_detailed_experiment_tree( authz_token, airavata_experiment_id)
+      - update_experiment( authz_token, airavata_experiment_id, experiment)
+      - update_experiment_configuration( authz_token, airavata_experiment_id, [user_configuration](airavata/model/experiment/ttypes.py))
+      - update_resource_scheduling( authz_token, airavata_experiment_id, [resource_scheduling](airavata/model/scheduling/ttypes.py))
+      - validate_experiment( authz_token, airavata_experiment_id)
+      - launch_experiment( authz_token, airavata_experiment_id, gateway_id)
+      - get_experiment_status( authz_token, airavata_experiment_id)
+      - get_experiment_outputs( authz_token, airavata_experiment_id)
+      - get_intermediate_outputs( authz_token, airavata_experiment_id)
+      - get_job_statuses( authz_token, airavata_experiment_id)
+      - get_job_details( authz_token, airavata_experiment_id)
+      - clone_experiment( authz_token, existing_experiment_id, new_experiment_name, new_experiment_projectId)
+      - clone_experiment_by_admin( authz_token, existing_experiment_id, new_experiment_name)
+      - terminate_experiment( authz_token, airavata_experiment_id, gateway_id)
+      - register_application_module( authz_token, gateway_id, application_module)
+      - get_application_module( authz_token, app_module_id)
+      - update_application_module( authz_token, app_module_id, [application_module](airavata/model/appcatalog/appdeployment/ttypes.py))
+      - get_all_app_modules( authz_token, gateway_id)
+      - get_accessible_app_modules( authz_token, gateway_id)
+      - delete_application_module( authz_token, app_module_id)
+      - register_application_deployment( authz_token, gateway_id, [application_deployment](airavata/model/appcatalog/appdeployment/ttypes.py))
+      - get_application_deployment( authz_token, app_deployment_id)
+      - update_application_deployment( authz_token, app_deployment_id, application_deployment)
+      - delete_application_deployment( authz_token, app_deployment_id)
+      - get_all_application_deployments( authz_token, gateway_id):
+      - get_accessible_application_deployments( authz_token, gateway_id, [permission_type](airavata/model/sharing/ttypes.py))
+      - get_app_module_deployed_resources( authz_token, app_module_id)
+      - get_application_deployments_for_app_module_and_group_resource_profile( authz_token, app_module_id,
+                                                                              group_resource_profileId)
+      - register_application_interface( authz_token, gateway_id, [application_interface](airavata/model/appcatalog/appinterface/ttypes.py))
+      - clone_application_interface( authz_token, existing_app_interface_id, new_application_name, gateway_id)
+      - get_application_interface( authz_token, app_interface_id)
+      - update_application_interface( authz_token, app_interface_id, application_interface)
+      - delete_application_interface( authz_token, app_interface_id)
+      - get_all_application_interface_names( authz_token, gateway_id)
+      - get_all_application_interfaces( authz_token, gateway_id)
+      - get_application_inputs( authz_token, app_interface_id)
+      - get_application_outputs( authz_token, app_interface_id)
+      - get_available_app_interface_compute_resources( authz_token, app_interface_id)
+      - register_compute_resource( authz_token, [compute_resource_description](airavata/model/appcatalog/computeresource/ttypes.py))
+      - get_compute_resource( authz_token, compute_resource_id)
+      - get_all_compute_resource_names( authz_token)
+      - update_compute_resource( authz_token, compute_resource_id, compute_resource_description)
+      - delete_compute_resource( authz_token, compute_resource_id)
+      - register_storage_resource( authz_token, [storage_resource_description](airavata/model/appcatalog/storageresource/ttypes.py))
+      - get_storage_resource( authz_token, storage_resource_id)
+      - get_all_storage_resource_names( authz_token)
+      - update_storage_resource( authz_token, storage_resource_id, storage_resource_description)
+      - delete_storage_resource( authz_token, storage_resource_id)
+      - add_local_submission_details( authz_token, compute_resource_id, priority_order, [local_submission](airavata/model/appcatalog/computeresource/ttypes.py))
+      - update_local_submission_details( authz_token, job_submission_interface_id, local_submission)
+      - get_local_job_submission( authz_token, job_submission_id)
+      - add_ssh_job_submission_details( authz_token, compute_resource_id, priority_order, [ssh_job_submission](airavata/model/appcatalog/computeresource/ttypes.py))
+      - add_ssh_fork_job_submission_details( authz_token, compute_resource_id, priority_order, ssh_job_submission)
+      - get_ssh_job_submission( authz_token, job_submission_id)
+      - get_unicore_job_submission( authz_token, job_submission_id)
+      - add_cloud_job_submission_details( authz_token, compute_resource_id, priority_order, [cloud_submission](airavata/model/appcatalog/computeresource/ttypes.py))
+      - get_cloud_job_submission( authz_token, job_submission_id)
+      - update_ssh_job_submission_details( authz_token, job_submission_interface_id, [ssh_job_submission](airavata/model/appcatalog/computeresource/ttypes.py))
+      - update_cloud_job_submission_details( authz_token, job_submission_interface_id, ssh_job_submission)
+      - update_unicore_job_submission_details( authz_token, job_submission_interface_id, [unicore_job_submission](airavata/model/appcatalog/computeresource/ttypes.py))
+      - add_local_data_movement_details( authz_token, product_uri, data_move_type, priority_order,
+                                        [local_data_movement](airavata/model/data/movement/ttypes.py))
+      - update_local_data_movement_details( authz_token, data_movementInterface_id, local_data_movement)
+      - get_local_data_movement( authz_token, data_movement_id)
+      - add_scp_data_movement_details( authz_token, product_uri, data_move_type, priority_order,[scp_data_movement](airavata/model/data/movement/ttypes.py))
+      - update_scp_data_movement_details( authz_token, data_movement_interface_id, scp_data_movement)
+      - get_scp_data_movement( authz_token, data_movement_id)
+      - add_unicore_data_movement_details( authz_token, product_uri, data_move_type, priority_order,
+      - update_unicore_data_movement_details( authz_token, data_movement_interface_id, unicore_data_movement)
+      - get_unicore_data_movement( authz_token, data_movement_id)
+      - add_grid_ftp_data_movement_details( authz_token, product_uri, data_move_type, priority_order,
+                                           grid_ftp_data_movement)
+      - update_grid_ftp_data_movement_details( authz_token, data_movement_interface_id, grid_ftp_data_movement)
+      - get_grid_ftp_data_movement( authz_token, data_movement_id)
+      - change_job_submission_priority( authz_token, job_submission_interface_id, new_priority_order)
+      - change_data_movement_priority( authz_token, data_movement_interface_id, new_priority_order)
+      - change_job_submission_priorities( authz_token, job_submission_priority_map)
+      - change_data_movement_priorities( authz_token, data_movement_priority_map)
+      - delete_job_submission_interface( authz_token, compute_resource_id, [job_submission_interface_id](airavata/model/appcatalog/computeresource/ttypes.py))
+      - delete_data_movement_interface( authz_token, product_uri, data_movement_interface_id, data_move_type)
+      - register_resource_job_manager( authz_token, [resource_job_manager](airavata/model/appcatalog/computeresource/ttypes.py))
+      - update_resource_job_manager( authz_token, resource_job_manager_id, updated_resource_job_manager)
+      - get_resource_job_manager( authz_token, resource_job_manager_id)
+      - delete_resource_job_manager( authz_token, resource_job_manager_id)
+      - delete_batch_queue( authz_token, compute_resource_id, queue_name)
+      - register_gateway_resource_profile( authz_token, gateway_resource_profile)
+      - get_gateway_resource_profile( authz_token, gateway_id)
+      - update_gateway_resource_profile( authz_token, gateway_id, gateway_resource_profile)
+      - delete_gateway_resource_profile( authz_token, gateway_id)
+      - add_gateway_compute_resource_preference( authz_token, gateway_id, compute_resource_id,
+                                                compute_resource_preferance)
+      - add_gateway_storage_preference( authz_token, gateway_id, storage_resource_id, storage_preference)
+      - get_gateway_compute_resource_preference( authz_token, gateway_id, compute_resource_id)
+      - get_gateway_storage_preference( authz_token, gateway_id, storage_resourceId)
+      - get_all_gateway_compute_resource_preferences( authz_token, gateway_id)
+      - get_all_gateway_storage_preferences( authz_token, gateway_id)
+      - get_all_gateway_resource_profiles( authz_token)
+      - update_gateway_compute_resource_preference( authz_token, gateway_id, compute_resource_id,
+                                                   compute_resource_preference)
+      - update_gateway_storage_preference( authz_token, gateway_id, storage_id, [storage_preference](airavata/model/appcatalog/gatewayprofile/ttypes.py))
+      - delete_gateway_compute_resource_preference( authz_token, gateway_id, compute_resource_id)
+      - delete_gateway_storage_preference( authz_token, gateway_id, storage_id)
+      - get_ssh_account_provisioners( authz_token)
+      - does_user_have_ssh_account( authz_token, compute_resource_id, user_id)
+      - is_ssh_setup_complete_for_user_compute_resource_preference( authz_token, compute_resource_id,
+                                                                   airavata_cred_store_token):
+      - setup_user_compute_resource_preferences_for_ssh( authz_token, compute_resource_id, user_id,
+                                                        airavata_cred_store_token)
+      - register_user_resource_profile( authz_token, user_resource_profile)
+      - is_user_resource_profile_exists( authz_token, user_id, gateway_id)
+      - get_user_resource_profile( authz_token, user_id, gateway_id)
+      - update_user_resource_profile( authz_token, user_id, gateway_id, user_resource_profile):
+      - delete_user_resource_profile( authz_token, user_id, gateway_id)
+      - add_user_compute_resource_preference( authz_token, user_id, gateway_id, user_compute_resource_id,
+                                             user_compute_resource_preference)
+      - add_user_storage_preference( authz_token, user_id, gateway_id, user_storage_resource_id,
+                                    user_storage_preference)
+      - get_user_compute_resource_preference( authz_token, user_id, gateway_id, user_compute_resource_id):
+      - get_user_storage_preference( authz_token, user_id, gateway_id, user_storage_resource_id)
+      - get_all_user_compute_resource_preferences( authz_token, user_id, gateway_id)
+      - get_all_user_storage_preferences( authz_token, user_id, gateway_id)
+      - get_all_user_resource_profiles( authz_token)
+      - update_user_compute_resource_preference( authz_token, user_id, gateway_id, user_compute_resourceId,
+                                                user_compute_resource_preference)
+      - update_user_storage_preference( authz_token, user_id, gateway_id, user_storage_id,
+                                       user_storage_preference)
+      - delete_user_compute_resource_preference( authz_token, user_id, gateway_id, user_compute_resource_id)
+      - delete_user_storage_preference( authz_token, user_id, gateway_id, user_storage_id)
+      - get_latest_queue_statuses( authz_token)
+      - register_data_product( authz_token, [data_product_model](airavata/model/data/replica/ttypes.py))
+      - get_data_product( authz_token, data_product_uri)
+      - register_replica_location( authz_token, [replica_location_model](airavata/model/data/replica/ttypes.py))
+      - get_parent_data_product( authz_token, product_uri)
+      - get_child_data_products( authz_token, product_uri)
+      - share_resource_with_users( authz_token, resource_id, user_permission_list)
+      - share_resource_with_groups( authz_token, resource_id, group_permission_list)
+      - revoke_sharing_of_resource_from_users( authz_token, resource_id, user_permission_list)
+      - revoke_sharing_of_resource_from_groups( authz_token, resource_id, group_permission_list)
+      - get_all_accessible_users( authz_token, resource_id, permission_type)
+      - get_all_accessible_groups( authz_token, resource_id, permission_type)
+      - get_all_directly_accessible_users( authz_token, resource_id, permission_type)
+      - get_all_directly_accessible_groups( authz_token, resource_id, permission_type)
+      - user_has_access( authz_token, resource_id, [permission_type](airavata/model/sharing/ttypes.py))
+      - create_group_resource_profile( authz_token, group_resource_profile)
+      - update_group_resource_profile( authz_token, group_resource_profile)
+      - get_group_resource_profile( authz_token, group_resource_profile_id)
+      - remove_group_resource_profile( authz_token, group_resource_profile_id)
+      - get_group_resource_list( authz_token, gateway_id)
+      - remove_group_compute_prefs( authz_token, compute_resource_id, group_resource_profile_id)
+      - remove_group_compute_resource_policy( authz_token, resource_policy_id)
+      - remove_group_batch_queue_resource_policy( authz_token, resource_policy_id)
+      - get_group_compute_resource_preference( authz_token, compute_resource_id, group_resource_profile_id)
+      - get_group_compute_resource_policy( authz_token, resource_policy_id)
+      - get_batch_queue_resource_policy( authz_token, resource_policy_id)
+      - get_group_compute_resource_pref_list( authz_token, group_resource_profile_id)
+      - get_group_batch_queue_resource_policy_list( authz_token, group_resource_profile_id)
+      - get_group_compute_resource_policy_list( authz_token, group_resource_profile_id)
+      - get_gateway_groups( authz_token)
+      - get_parser( authz_token, parser_id, gateway_id)
+      - save_parser( authz_token, parser)
+      - list_all_parsers( authz_token, gateway_id)
+      - remove_parser( authz_token, parser_id, gateway_id)
+      - get_parsing_template( authz_token, template_id, gateway_id)
+      - get_parsing_templates_for_experiment( authz_token, experiment_id, gateway_id)
+      - save_parsing_template( authz_token, parsing_template)
+      - remove_parsing_template( authz_token, template_id, gateway_id)
+      - list_all_parsing_templates( authz_token, gateway_id)
+      
+   Sample implementations can be found at [api_server_client_samples](samples/api_server_client_samples.py)
+      
+   -  [group_manager_client](clients/group_manager_client.py)
+   
+      - create_group( authz_token, [group_model](airavata/model/group/ttypes.py))
+      - update_group( authz_token, group_model)
+      - delete_group( authz_token, group_id, owner_id)
+      - get_group( authz_token, group_id)
+      - get_groups( authz_token)
+      - get_all_groups_user_belongs( authz_token, user_name)
+      - add_users_to_group( authz_token, user_ids, group_id)
+      - remove_users_from_group( authz_token, user_ids, group_id)
+      - transfer_group_ownership( authz_token, group_id, new_owner_id)
+      - add_group_admins( authz_token, group_id, admin_ids)
+      - remove_group_admins( authz_token, group_id, admin_ids)
+      - has_admin_access( authz_token, group_id, admin_id)
+      - has_owner_access( authz_token, group_id, owner_id)
+      
+   Sample implementations can be found at [group_manager_client_samples](samples/group_manager_client_samples.py)
+      
+   -   [iam_admin_client](clients/iam_admin_client.py)
+      
+       - set_up_gateway( authz_token, gateway)
+       - is_username_available( authz_token, username)
+       - register_user( authz_token, username, email_address, first_name, last_name, new_password)
+       - enable_user( authz_token, username)
+       - is_user_enabled( authz_token, username)
+       - is_user_exist( authz_token, username)
+       - get_user( authz_token, username)
+       - get_users( authz_token, offset, limit, search)
+       - reset_user_password( authz_token, username, new_password)
+       - find_users( authz_token, email, user_id)
+       - update_user_profile( authz_token, user_details)
+       - delete_user( authz_token, username)
+       - add_role_to_user( authz_token, username, role_name)
+       - remove_role_from_user( authz_token, username, role_name)
+       -  get_users_with_role( authz_token, role_name)
+   
+   Sample implementations can be found at [iam_admin_client_samples](samples/iam_admin_client_samples.py)
+    
+    
+   - [sharing_registry_client](clients/sharing_registry_client.py)   
+       
+       - create_domain([domain](airavata/model/sharing/ttypes.py)) 
+       - update_domain( domain)
+       - is_domain_exists( domain_id)
+       - delete_domain( domain_id)
+       - get_domain( domain_id)
+       - get_domains( offset, limit)
+       - create_user( user)
+       - updated_user( user)
+       - is_user_exists( domain_id, user_id)
+       - delete_user( domain_id, user_id)
+       - get_user( domain_id, user_id)
+       - get_users( domain_id, offset, limit)
+       - is_group_exists( domain_id, group_id)
+       - delete_group( domain_id, group_id)
+       - get_group( domain_id, group_id)
+       - get_groups( domain_id, offset, limit)
+       - add_users_to_group( domain_id, user_ids, group_id)
+       - remove_users_from_group( domain_id, user_ids, group_id)
+       - transfer_group_ownership( domain_id, group_id, new_owner_id)
+       - add_group_admins( domain_id, group_id, admin_ids)
+       - remove_group_admins( domain_id, group_id, admin_ids)
+       - has_admin_access( domain_id, group_id, admin_id)
+       - has_owner_access( domain_id, group_id, owner_id)
+       - get_group_members_of_type_user( domain_id, group_id, offset, limit)
+       - get_group_members_of_type_group( domain_id, group_id, offset, limit)
+       - add_child_groups_to_parent_group( domain_id, child_ids, group_id)
+       - remove_child_group_from_parent_group( domain_id, child_id, group_id)
+       - get_all_member_groups_for_user( domain_id, user_id)
+       - create_entity_type( entity_type)
+       - update_entity_type( entity_type)
+       - is_entity_type_exists( domain_id, entity_type_id)
+       - delete_entity_type( domain_id, entity_type_id)
+       - get_entity_type( domain_id, entity_type_id)
+       - get_entity_types( domain_id, offset, limit)
+       - create_entity( [entity](airavata/model/sharing/ttypes.py))
+       - update_entity( entity)
+       - is_entity_exists( domain_id, entity_id)
+       - delete_entity( domain_id, entity_id)
+       - get_entity( domain_id, entity_id)
+       - search_entities( domain_id, user_id, filters, offset, limit)
+       - get_list_of_shared_users( domain_id, entity_id, permission_type_id)
+       - get_list_of_directly_shared_users( domain_id, entity_id, permission_type_id)
+       - get_list_of_shared_groups( domain_id, entity_id, permission_type_id)
+       - get_list_of_directly_shared_groups( domain_id, entity_id, permission_type_id)
+       - create_permission_type( permission_type)
+       - update_permission_type( permission_type)
+       - is_permission_exists( domain_id, permission_id)
+       - delete_permission_type( domain_id, permission_type_id)
+       - get_permission_type( domain_id, permission_type_id)
+       - get_permission_types( domain_id, offset, limit)
+       - share_entity_with_users( domain_id, entity_id, user_list, permission_type_id, cascade_permission)
+       - revoke_entity_sharing_from_users( domain_id, entity_id, user_list, permission_type_id)
+       - share_entity_with_groups( domain_id, entity_id, group_list, permission_type_id, cascade_permission)
+       - revoke_entity_sharing_from_groups( domain_id, entity_id, group_list, permission_type_id)
+       - user_has_access( domain_id, user_id, entity_id, permission_type_id) 
+       
+   Sample implementations can be found at [sharing_registry_client_samples](samples/sharing_registry_client_samples.py)
+       
+       
+       
+   - [tenant_profile_client](clients/tenant_profile_client.py)
+   
+       - add_gateway( authz_token, gateway)
+       - update_gateway( authz_token, updated_gateway)
+       - get_gateway( authz_token, airavata_internal_gateway_id)
+       - delete_gateway( authz_token, airavata_internal_gateway_id, gateway_id)
+       - get_all_gateways( authz_token)
+       - is_gateway_exist( authz_token, gateway_id)
+       - get_all_gateways_for_user( authz_token, requester_username)
+   
+   Sample implementations can be found at [tenant_profile_client_samples](samples/tenant_profile_client_samples.py)    
+       
+       
+   - [user_profile_client](clients/user_profile_client.py)
+       
+       - initialize_user_profile( authz_token)
+       - add_user_profile( authz_token, [user_profile](airavata/model/user/ttypes.py))
+       - update_user_profile( authz_token, user_profile)
+       -  get_user_profile_by_id( authz_token, user_id, gateway_id)
+       - delete_user_profile( authz_token, user_id, gateway_id)
+       - get_all_user_profiles_in_gateway( authz_token, gateway_id, offset, limit)
+       - does_user_exist( authz_token, user_id, gateway_id)
+       
+   Sample implementations can be found at [user_profile_client_samples](samples/user_profile_client_samples.py)
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/Airavata-remote b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/Airavata-remote
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/Airavata-remote
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/Airavata-remote
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/Airavata.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/Airavata.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/Airavata.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/Airavata.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/CredentialStoreService-remote b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/CredentialStoreService-remote
new file mode 100755
index 0000000..2d43132
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/CredentialStoreService-remote
@@ -0,0 +1,208 @@
+#!/usr/bin/env python
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+import sys
+import pprint
+if sys.version_info[0] > 2:
+    from urllib.parse import urlparse
+else:
+    from urlparse import urlparse
+from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
+from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+
+from airavata.api.credential.store import CredentialStoreService
+from airavata.api.credential.store.ttypes import *
+
+if len(sys.argv) <= 1 or sys.argv[1] == '--help':
+    print('')
+    print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')
+    print('')
+    print('Functions:')
+    print('  CredentialSummary getCredentialSummary(string tokenId, string gatewayId)')
+    print('   getAllCredentialSummaries(SummaryType type,  accessibleTokenIds, string gatewayId)')
+    print('  string addSSHCredential(SSHCredential sshCredential)')
+    print('  string addCertificateCredential(CertificateCredential certificateCredential)')
+    print('  string addPasswordCredential(PasswordCredential passwordCredential)')
+    print('  SSHCredential getSSHCredential(string tokenId, string gatewayId)')
+    print('  CertificateCredential getCertificateCredential(string tokenId, string gatewayId)')
+    print('  PasswordCredential getPasswordCredential(string tokenId, string gatewayId)')
+    print('   getAllCredentialSummaryForGateway(SummaryType type, string gatewayId)')
+    print('   getAllCredentialSummaryForUserInGateway(SummaryType type, string gatewayId, string userId)')
+    print('   getAllPWDCredentialsForGateway(string gatewayId)')
+    print('  bool deleteSSHCredential(string tokenId, string gatewayId)')
+    print('  bool deletePWDCredential(string tokenId, string gatewayId)')
+    print('  string getAPIVersion()')
+    print('')
+    sys.exit(0)
+
+pp = pprint.PrettyPrinter(indent=2)
+host = 'localhost'
+port = 9090
+uri = ''
+framed = False
+ssl = False
+validate = True
+ca_certs = None
+keyfile = None
+certfile = None
+http = False
+argi = 1
+
+if sys.argv[argi] == '-h':
+    parts = sys.argv[argi + 1].split(':')
+    host = parts[0]
+    if len(parts) > 1:
+        port = int(parts[1])
+    argi += 2
+
+if sys.argv[argi] == '-u':
+    url = urlparse(sys.argv[argi + 1])
+    parts = url[1].split(':')
+    host = parts[0]
+    if len(parts) > 1:
+        port = int(parts[1])
+    else:
+        port = 80
+    uri = url[2]
+    if url[4]:
+        uri += '?%s' % url[4]
+    http = True
+    argi += 2
+
+if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
+    framed = True
+    argi += 1
+
+if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
+    ssl = True
+    argi += 1
+
+if sys.argv[argi] == '-novalidate':
+    validate = False
+    argi += 1
+
+if sys.argv[argi] == '-ca_certs':
+    ca_certs = sys.argv[argi+1]
+    argi += 2
+
+if sys.argv[argi] == '-keyfile':
+    keyfile = sys.argv[argi+1]
+    argi += 2
+
+if sys.argv[argi] == '-certfile':
+    certfile = sys.argv[argi+1]
+    argi += 2
+
+cmd = sys.argv[argi]
+args = sys.argv[argi + 1:]
+
+if http:
+    transport = THttpClient.THttpClient(host, port, uri)
+else:
+    if ssl:
+        socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)
+    else:
+        socket = TSocket.TSocket(host, port)
+    if framed:
+        transport = TTransport.TFramedTransport(socket)
+    else:
+        transport = TTransport.TBufferedTransport(socket)
+protocol = TBinaryProtocol(transport)
+client = CredentialStoreService.Client(protocol)
+transport.open()
+
+if cmd == 'getCredentialSummary':
+    if len(args) != 2:
+        print('getCredentialSummary requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getCredentialSummary(args[0], args[1],))
+
+elif cmd == 'getAllCredentialSummaries':
+    if len(args) != 3:
+        print('getAllCredentialSummaries requires 3 args')
+        sys.exit(1)
+    pp.pprint(client.getAllCredentialSummaries(eval(args[0]), eval(args[1]), args[2],))
+
+elif cmd == 'addSSHCredential':
+    if len(args) != 1:
+        print('addSSHCredential requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.addSSHCredential(eval(args[0]),))
+
+elif cmd == 'addCertificateCredential':
+    if len(args) != 1:
+        print('addCertificateCredential requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.addCertificateCredential(eval(args[0]),))
+
+elif cmd == 'addPasswordCredential':
+    if len(args) != 1:
+        print('addPasswordCredential requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.addPasswordCredential(eval(args[0]),))
+
+elif cmd == 'getSSHCredential':
+    if len(args) != 2:
+        print('getSSHCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getSSHCredential(args[0], args[1],))
+
+elif cmd == 'getCertificateCredential':
+    if len(args) != 2:
+        print('getCertificateCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getCertificateCredential(args[0], args[1],))
+
+elif cmd == 'getPasswordCredential':
+    if len(args) != 2:
+        print('getPasswordCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getPasswordCredential(args[0], args[1],))
+
+elif cmd == 'getAllCredentialSummaryForGateway':
+    if len(args) != 2:
+        print('getAllCredentialSummaryForGateway requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getAllCredentialSummaryForGateway(eval(args[0]), args[1],))
+
+elif cmd == 'getAllCredentialSummaryForUserInGateway':
+    if len(args) != 3:
+        print('getAllCredentialSummaryForUserInGateway requires 3 args')
+        sys.exit(1)
+    pp.pprint(client.getAllCredentialSummaryForUserInGateway(eval(args[0]), args[1], args[2],))
+
+elif cmd == 'getAllPWDCredentialsForGateway':
+    if len(args) != 1:
+        print('getAllPWDCredentialsForGateway requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.getAllPWDCredentialsForGateway(args[0],))
+
+elif cmd == 'deleteSSHCredential':
+    if len(args) != 2:
+        print('deleteSSHCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.deleteSSHCredential(args[0], args[1],))
+
+elif cmd == 'deletePWDCredential':
+    if len(args) != 2:
+        print('deletePWDCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.deletePWDCredential(args[0], args[1],))
+
+elif cmd == 'getAPIVersion':
+    if len(args) != 0:
+        print('getAPIVersion requires 0 args')
+        sys.exit(1)
+    pp.pprint(client.getAPIVersion())
+
+else:
+    print('Unrecognized method %s' % cmd)
+    sys.exit(1)
+
+transport.close()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/CredentialStoreService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/CredentialStoreService.py
new file mode 100644
index 0000000..434741f
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/CredentialStoreService.py
@@ -0,0 +1,2851 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+import airavata.base.api.BaseAPI
+import logging
+from .ttypes import *
+from thrift.Thrift import TProcessor
+from thrift.transport import TTransport
+
+
+class Iface(airavata.base.api.BaseAPI.Iface):
+    def getCredentialSummary(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getAllCredentialSummaries(self, type, accessibleTokenIds, gatewayId):
+        """
+        Parameters:
+         - type
+         - accessibleTokenIds
+         - gatewayId
+        """
+        pass
+
+    def addSSHCredential(self, sshCredential):
+        """
+        This method is to add SSHCredential which will return the token Id in success
+
+
+        Parameters:
+         - sshCredential
+        """
+        pass
+
+    def addCertificateCredential(self, certificateCredential):
+        """
+        Parameters:
+         - certificateCredential
+        """
+        pass
+
+    def addPasswordCredential(self, passwordCredential):
+        """
+        Parameters:
+         - passwordCredential
+        """
+        pass
+
+    def getSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getCertificateCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getPasswordCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getAllCredentialSummaryForGateway(self, type, gatewayId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+        """
+        pass
+
+    def getAllCredentialSummaryForUserInGateway(self, type, gatewayId, userId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+         - userId
+        """
+        pass
+
+    def getAllPWDCredentialsForGateway(self, gatewayId):
+        """
+        Parameters:
+         - gatewayId
+        """
+        pass
+
+    def deleteSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def deletePWDCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+
+class Client(airavata.base.api.BaseAPI.Client, Iface):
+    def __init__(self, iprot, oprot=None):
+        airavata.base.api.BaseAPI.Client.__init__(self, iprot, oprot)
+
+    def getCredentialSummary(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getCredentialSummary(tokenId, gatewayId)
+        return self.recv_getCredentialSummary()
+
+    def send_getCredentialSummary(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getCredentialSummary', TMessageType.CALL, self._seqid)
+        args = getCredentialSummary_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getCredentialSummary(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getCredentialSummary_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getCredentialSummary failed: unknown result")
+
+    def getAllCredentialSummaries(self, type, accessibleTokenIds, gatewayId):
+        """
+        Parameters:
+         - type
+         - accessibleTokenIds
+         - gatewayId
+        """
+        self.send_getAllCredentialSummaries(type, accessibleTokenIds, gatewayId)
+        return self.recv_getAllCredentialSummaries()
+
+    def send_getAllCredentialSummaries(self, type, accessibleTokenIds, gatewayId):
+        self._oprot.writeMessageBegin('getAllCredentialSummaries', TMessageType.CALL, self._seqid)
+        args = getAllCredentialSummaries_args()
+        args.type = type
+        args.accessibleTokenIds = accessibleTokenIds
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllCredentialSummaries(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllCredentialSummaries_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaries failed: unknown result")
+
+    def addSSHCredential(self, sshCredential):
+        """
+        This method is to add SSHCredential which will return the token Id in success
+
+
+        Parameters:
+         - sshCredential
+        """
+        self.send_addSSHCredential(sshCredential)
+        return self.recv_addSSHCredential()
+
+    def send_addSSHCredential(self, sshCredential):
+        self._oprot.writeMessageBegin('addSSHCredential', TMessageType.CALL, self._seqid)
+        args = addSSHCredential_args()
+        args.sshCredential = sshCredential
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_addSSHCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = addSSHCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "addSSHCredential failed: unknown result")
+
+    def addCertificateCredential(self, certificateCredential):
+        """
+        Parameters:
+         - certificateCredential
+        """
+        self.send_addCertificateCredential(certificateCredential)
+        return self.recv_addCertificateCredential()
+
+    def send_addCertificateCredential(self, certificateCredential):
+        self._oprot.writeMessageBegin('addCertificateCredential', TMessageType.CALL, self._seqid)
+        args = addCertificateCredential_args()
+        args.certificateCredential = certificateCredential
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_addCertificateCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = addCertificateCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "addCertificateCredential failed: unknown result")
+
+    def addPasswordCredential(self, passwordCredential):
+        """
+        Parameters:
+         - passwordCredential
+        """
+        self.send_addPasswordCredential(passwordCredential)
+        return self.recv_addPasswordCredential()
+
+    def send_addPasswordCredential(self, passwordCredential):
+        self._oprot.writeMessageBegin('addPasswordCredential', TMessageType.CALL, self._seqid)
+        args = addPasswordCredential_args()
+        args.passwordCredential = passwordCredential
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_addPasswordCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = addPasswordCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "addPasswordCredential failed: unknown result")
+
+    def getSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getSSHCredential(tokenId, gatewayId)
+        return self.recv_getSSHCredential()
+
+    def send_getSSHCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getSSHCredential', TMessageType.CALL, self._seqid)
+        args = getSSHCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getSSHCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getSSHCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getSSHCredential failed: unknown result")
+
+    def getCertificateCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getCertificateCredential(tokenId, gatewayId)
+        return self.recv_getCertificateCredential()
+
+    def send_getCertificateCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getCertificateCredential', TMessageType.CALL, self._seqid)
+        args = getCertificateCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getCertificateCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getCertificateCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getCertificateCredential failed: unknown result")
+
+    def getPasswordCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getPasswordCredential(tokenId, gatewayId)
+        return self.recv_getPasswordCredential()
+
+    def send_getPasswordCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getPasswordCredential', TMessageType.CALL, self._seqid)
+        args = getPasswordCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getPasswordCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getPasswordCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getPasswordCredential failed: unknown result")
+
+    def getAllCredentialSummaryForGateway(self, type, gatewayId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+        """
+        self.send_getAllCredentialSummaryForGateway(type, gatewayId)
+        return self.recv_getAllCredentialSummaryForGateway()
+
+    def send_getAllCredentialSummaryForGateway(self, type, gatewayId):
+        self._oprot.writeMessageBegin('getAllCredentialSummaryForGateway', TMessageType.CALL, self._seqid)
+        args = getAllCredentialSummaryForGateway_args()
+        args.type = type
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllCredentialSummaryForGateway(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllCredentialSummaryForGateway_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaryForGateway failed: unknown result")
+
+    def getAllCredentialSummaryForUserInGateway(self, type, gatewayId, userId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+         - userId
+        """
+        self.send_getAllCredentialSummaryForUserInGateway(type, gatewayId, userId)
+        return self.recv_getAllCredentialSummaryForUserInGateway()
+
+    def send_getAllCredentialSummaryForUserInGateway(self, type, gatewayId, userId):
+        self._oprot.writeMessageBegin('getAllCredentialSummaryForUserInGateway', TMessageType.CALL, self._seqid)
+        args = getAllCredentialSummaryForUserInGateway_args()
+        args.type = type
+        args.gatewayId = gatewayId
+        args.userId = userId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllCredentialSummaryForUserInGateway(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllCredentialSummaryForUserInGateway_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaryForUserInGateway failed: unknown result")
+
+    def getAllPWDCredentialsForGateway(self, gatewayId):
+        """
+        Parameters:
+         - gatewayId
+        """
+        self.send_getAllPWDCredentialsForGateway(gatewayId)
+        return self.recv_getAllPWDCredentialsForGateway()
+
+    def send_getAllPWDCredentialsForGateway(self, gatewayId):
+        self._oprot.writeMessageBegin('getAllPWDCredentialsForGateway', TMessageType.CALL, self._seqid)
+        args = getAllPWDCredentialsForGateway_args()
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllPWDCredentialsForGateway(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllPWDCredentialsForGateway_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllPWDCredentialsForGateway failed: unknown result")
+
+    def deleteSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_deleteSSHCredential(tokenId, gatewayId)
+        return self.recv_deleteSSHCredential()
+
+    def send_deleteSSHCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('deleteSSHCredential', TMessageType.CALL, self._seqid)
+        args = deleteSSHCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_deleteSSHCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = deleteSSHCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteSSHCredential failed: unknown result")
+
+    def deletePWDCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_deletePWDCredential(tokenId, gatewayId)
+        return self.recv_deletePWDCredential()
+
+    def send_deletePWDCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('deletePWDCredential', TMessageType.CALL, self._seqid)
+        args = deletePWDCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_deletePWDCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = deletePWDCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "deletePWDCredential failed: unknown result")
+
+
+class Processor(airavata.base.api.BaseAPI.Processor, Iface, TProcessor):
+    def __init__(self, handler):
+        airavata.base.api.BaseAPI.Processor.__init__(self, handler)
+        self._processMap["getCredentialSummary"] = Processor.process_getCredentialSummary
+        self._processMap["getAllCredentialSummaries"] = Processor.process_getAllCredentialSummaries
+        self._processMap["addSSHCredential"] = Processor.process_addSSHCredential
+        self._processMap["addCertificateCredential"] = Processor.process_addCertificateCredential
+        self._processMap["addPasswordCredential"] = Processor.process_addPasswordCredential
+        self._processMap["getSSHCredential"] = Processor.process_getSSHCredential
+        self._processMap["getCertificateCredential"] = Processor.process_getCertificateCredential
+        self._processMap["getPasswordCredential"] = Processor.process_getPasswordCredential
+        self._processMap["getAllCredentialSummaryForGateway"] = Processor.process_getAllCredentialSummaryForGateway
+        self._processMap["getAllCredentialSummaryForUserInGateway"] = Processor.process_getAllCredentialSummaryForUserInGateway
+        self._processMap["getAllPWDCredentialsForGateway"] = Processor.process_getAllPWDCredentialsForGateway
+        self._processMap["deleteSSHCredential"] = Processor.process_deleteSSHCredential
+        self._processMap["deletePWDCredential"] = Processor.process_deletePWDCredential
+
+    def process(self, iprot, oprot):
+        (name, type, seqid) = iprot.readMessageBegin()
+        if name not in self._processMap:
+            iprot.skip(TType.STRUCT)
+            iprot.readMessageEnd()
+            x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
+            oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
+            x.write(oprot)
+            oprot.writeMessageEnd()
+            oprot.trans.flush()
+            return
+        else:
+            self._processMap[name](self, seqid, iprot, oprot)
+        return True
+
+    def process_getCredentialSummary(self, seqid, iprot, oprot):
+        args = getCredentialSummary_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getCredentialSummary_result()
+        try:
+            result.success = self._handler.getCredentialSummary(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getCredentialSummary", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllCredentialSummaries(self, seqid, iprot, oprot):
+        args = getAllCredentialSummaries_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllCredentialSummaries_result()
+        try:
+            result.success = self._handler.getAllCredentialSummaries(args.type, args.accessibleTokenIds, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllCredentialSummaries", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_addSSHCredential(self, seqid, iprot, oprot):
+        args = addSSHCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = addSSHCredential_result()
+        try:
+            result.success = self._handler.addSSHCredential(args.sshCredential)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("addSSHCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_addCertificateCredential(self, seqid, iprot, oprot):
+        args = addCertificateCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = addCertificateCredential_result()
+        try:
+            result.success = self._handler.addCertificateCredential(args.certificateCredential)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("addCertificateCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_addPasswordCredential(self, seqid, iprot, oprot):
+        args = addPasswordCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = addPasswordCredential_result()
+        try:
+            result.success = self._handler.addPasswordCredential(args.passwordCredential)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("addPasswordCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getSSHCredential(self, seqid, iprot, oprot):
+        args = getSSHCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getSSHCredential_result()
+        try:
+            result.success = self._handler.getSSHCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getSSHCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getCertificateCredential(self, seqid, iprot, oprot):
+        args = getCertificateCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getCertificateCredential_result()
+        try:
+            result.success = self._handler.getCertificateCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getCertificateCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getPasswordCredential(self, seqid, iprot, oprot):
+        args = getPasswordCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getPasswordCredential_result()
+        try:
+            result.success = self._handler.getPasswordCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getPasswordCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllCredentialSummaryForGateway(self, seqid, iprot, oprot):
+        args = getAllCredentialSummaryForGateway_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllCredentialSummaryForGateway_result()
+        try:
+            result.success = self._handler.getAllCredentialSummaryForGateway(args.type, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllCredentialSummaryForGateway", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllCredentialSummaryForUserInGateway(self, seqid, iprot, oprot):
+        args = getAllCredentialSummaryForUserInGateway_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllCredentialSummaryForUserInGateway_result()
+        try:
+            result.success = self._handler.getAllCredentialSummaryForUserInGateway(args.type, args.gatewayId, args.userId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllCredentialSummaryForUserInGateway", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllPWDCredentialsForGateway(self, seqid, iprot, oprot):
+        args = getAllPWDCredentialsForGateway_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllPWDCredentialsForGateway_result()
+        try:
+            result.success = self._handler.getAllPWDCredentialsForGateway(args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllPWDCredentialsForGateway", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_deleteSSHCredential(self, seqid, iprot, oprot):
+        args = deleteSSHCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = deleteSSHCredential_result()
+        try:
+            result.success = self._handler.deleteSSHCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("deleteSSHCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_deletePWDCredential(self, seqid, iprot, oprot):
+        args = deletePWDCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = deletePWDCredential_result()
+        try:
+            result.success = self._handler.deletePWDCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("deletePWDCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+# HELPER FUNCTIONS AND STRUCTURES
+
+
+class getCredentialSummary_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCredentialSummary_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getCredentialSummary_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.CredentialSummary()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCredentialSummary_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaries_args(object):
+    """
+    Attributes:
+     - type
+     - accessibleTokenIds
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'type', None, None, ),  # 1
+        (2, TType.LIST, 'accessibleTokenIds', (TType.STRING, 'UTF8', False), None, ),  # 2
+        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
+    )
+
+    def __init__(self, type=None, accessibleTokenIds=None, gatewayId=None,):
+        self.type = type
+        self.accessibleTokenIds = accessibleTokenIds
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.LIST:
+                    self.accessibleTokenIds = []
+                    (_etype3, _size0) = iprot.readListBegin()
+                    for _i4 in range(_size0):
+                        _elem5 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.accessibleTokenIds.append(_elem5)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaries_args')
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 1)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.accessibleTokenIds is not None:
+            oprot.writeFieldBegin('accessibleTokenIds', TType.LIST, 2)
+            oprot.writeListBegin(TType.STRING, len(self.accessibleTokenIds))
+            for iter6 in self.accessibleTokenIds:
+                oprot.writeString(iter6.encode('utf-8') if sys.version_info[0] == 2 else iter6)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 3)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.type is None:
+            raise TProtocolException(message='Required field type is unset!')
+        if self.accessibleTokenIds is None:
+            raise TProtocolException(message='Required field accessibleTokenIds is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaries_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype10, _size7) = iprot.readListBegin()
+                    for _i11 in range(_size7):
+                        _elem12 = airavata.model.credential.store.ttypes.CredentialSummary()
+                        _elem12.read(iprot)
+                        self.success.append(_elem12)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaries_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter13 in self.success:
+                iter13.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addSSHCredential_args(object):
+    """
+    Attributes:
+     - sshCredential
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'sshCredential', (airavata.model.credential.store.ttypes.SSHCredential, airavata.model.credential.store.ttypes.SSHCredential.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, sshCredential=None,):
+        self.sshCredential = sshCredential
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.sshCredential = airavata.model.credential.store.ttypes.SSHCredential()
+                    self.sshCredential.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addSSHCredential_args')
+        if self.sshCredential is not None:
+            oprot.writeFieldBegin('sshCredential', TType.STRUCT, 1)
+            self.sshCredential.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.sshCredential is None:
+            raise TProtocolException(message='Required field sshCredential is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addSSHCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addSSHCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addCertificateCredential_args(object):
+    """
+    Attributes:
+     - certificateCredential
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'certificateCredential', (airavata.model.credential.store.ttypes.CertificateCredential, airavata.model.credential.store.ttypes.CertificateCredential.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, certificateCredential=None,):
+        self.certificateCredential = certificateCredential
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.certificateCredential = airavata.model.credential.store.ttypes.CertificateCredential()
+                    self.certificateCredential.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addCertificateCredential_args')
+        if self.certificateCredential is not None:
+            oprot.writeFieldBegin('certificateCredential', TType.STRUCT, 1)
+            self.certificateCredential.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.certificateCredential is None:
+            raise TProtocolException(message='Required field certificateCredential is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addCertificateCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addCertificateCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addPasswordCredential_args(object):
+    """
+    Attributes:
+     - passwordCredential
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'passwordCredential', (airavata.model.credential.store.ttypes.PasswordCredential, airavata.model.credential.store.ttypes.PasswordCredential.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, passwordCredential=None,):
+        self.passwordCredential = passwordCredential
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.passwordCredential = airavata.model.credential.store.ttypes.PasswordCredential()
+                    self.passwordCredential.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addPasswordCredential_args')
+        if self.passwordCredential is not None:
+            oprot.writeFieldBegin('passwordCredential', TType.STRUCT, 1)
+            self.passwordCredential.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.passwordCredential is None:
+            raise TProtocolException(message='Required field passwordCredential is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addPasswordCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addPasswordCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getSSHCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getSSHCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getSSHCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.SSHCredential, airavata.model.credential.store.ttypes.SSHCredential.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.SSHCredential()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getSSHCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getCertificateCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCertificateCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getCertificateCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.CertificateCredential, airavata.model.credential.store.ttypes.CertificateCredential.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.CertificateCredential()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCertificateCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getPasswordCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getPasswordCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getPasswordCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.PasswordCredential, airavata.model.credential.store.ttypes.PasswordCredential.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.PasswordCredential()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getPasswordCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForGateway_args(object):
+    """
+    Attributes:
+     - type
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'type', None, None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, type=None, gatewayId=None,):
+        self.type = type
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForGateway_args')
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 1)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.type is None:
+            raise TProtocolException(message='Required field type is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForGateway_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype17, _size14) = iprot.readListBegin()
+                    for _i18 in range(_size14):
+                        _elem19 = airavata.model.credential.store.ttypes.CredentialSummary()
+                        _elem19.read(iprot)
+                        self.success.append(_elem19)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForGateway_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter20 in self.success:
+                iter20.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForUserInGateway_args(object):
+    """
+    Attributes:
+     - type
+     - gatewayId
+     - userId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'type', None, None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+        (3, TType.STRING, 'userId', 'UTF8', None, ),  # 3
+    )
+
+    def __init__(self, type=None, gatewayId=None, userId=None,):
+        self.type = type
+        self.gatewayId = gatewayId
+        self.userId = userId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForUserInGateway_args')
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 1)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        if self.userId is not None:
+            oprot.writeFieldBegin('userId', TType.STRING, 3)
+            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.type is None:
+            raise TProtocolException(message='Required field type is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        if self.userId is None:
+            raise TProtocolException(message='Required field userId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForUserInGateway_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype24, _size21) = iprot.readListBegin()
+                    for _i25 in range(_size21):
+                        _elem26 = airavata.model.credential.store.ttypes.CredentialSummary()
+                        _elem26.read(iprot)
+                        self.success.append(_elem26)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForUserInGateway_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter27 in self.success:
+                iter27.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllPWDCredentialsForGateway_args(object):
+    """
+    Attributes:
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 1
+    )
+
+    def __init__(self, gatewayId=None,):
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllPWDCredentialsForGateway_args')
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 1)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllPWDCredentialsForGateway_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.MAP:
+                    self.success = {}
+                    (_ktype29, _vtype30, _size28) = iprot.readMapBegin()
+                    for _i32 in range(_size28):
+                        _key33 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        _val34 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.success[_key33] = _val34
+                    iprot.readMapEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllPWDCredentialsForGateway_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.MAP, 0)
+            oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
+            for kiter35, viter36 in self.success.items():
+                oprot.writeString(kiter35.encode('utf-8') if sys.version_info[0] == 2 else kiter35)
+                oprot.writeString(viter36.encode('utf-8') if sys.version_info[0] == 2 else viter36)
+            oprot.writeMapEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deleteSSHCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deleteSSHCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deleteSSHCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.BOOL, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.BOOL:
+                    self.success = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deleteSSHCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.BOOL, 0)
+            oprot.writeBool(self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deletePWDCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deletePWDCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deletePWDCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.BOOL, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.BOOL:
+                    self.success = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deletePWDCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.BOOL, 0)
+            oprot.writeBool(self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/__init__.py
new file mode 100644
index 0000000..5d704d6
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/__init__.py
@@ -0,0 +1 @@
+__all__ = ['ttypes', 'constants', 'CredentialStoreService']
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/constants.py
new file mode 100644
index 0000000..6cfae29
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/constants.py
@@ -0,0 +1,13 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+from .ttypes import *
+CS_CPI_VERSION = "0.18.0"
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/error/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/error/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/error/ttypes.py
new file mode 100644
index 0000000..87f6b46
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/error/ttypes.py
@@ -0,0 +1,78 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+
+from thrift.transport import TTransport
+
+
+class CredentialStoreException(TException):
+    """
+    Attributes:
+     - message
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'message', 'UTF8', None, ),  # 1
+    )
+
+    def __init__(self, message=None,):
+        self.message = message
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.message = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('CredentialStoreException')
+        if self.message is not None:
+            oprot.writeFieldBegin('message', TType.STRING, 1)
+            oprot.writeString(self.message.encode('utf-8') if sys.version_info[0] == 2 else self.message)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.message is None:
+            raise TProtocolException(message='Required field message is unset!')
+        return
+
+    def __str__(self):
+        return repr(self)
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/ttypes.py
new file mode 100644
index 0000000..ef69474
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/credential/store/ttypes.py
@@ -0,0 +1,16 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+import airavata.model.credential.store.ttypes
+import airavata.api.credential.store.error.ttypes
+import airavata.base.api.ttypes
+
+from thrift.transport import TTransport
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/error/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/error/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/error/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/SharingRegistryService-remote b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/SharingRegistryService-remote
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/SharingRegistryService-remote
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/SharingRegistryService-remote
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/SharingRegistryService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/SharingRegistryService.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/SharingRegistryService.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/SharingRegistryService.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/sharing/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/api/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/BaseAPI-remote b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/BaseAPI-remote
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/BaseAPI-remote
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/BaseAPI-remote
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/BaseAPI.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/BaseAPI.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/BaseAPI.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/BaseAPI.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/base/api/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appdeployment/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appdeployment/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appdeployment/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appdeployment/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appdeployment/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appdeployment/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appinterface/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appinterface/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appinterface/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appinterface/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appinterface/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/appinterface/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/computeresource/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/computeresource/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/computeresource/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/computeresource/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/computeresource/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/computeresource/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/ttypes.py
new file mode 100644
index 0000000..61df7f6
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/ttypes.py
@@ -0,0 +1,966 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+import airavata.model.commons.ttypes
+import airavata.model.appcatalog.computeresource.ttypes
+import airavata.model.data.movement.ttypes
+
+from thrift.transport import TTransport
+
+
+class GroupAccountSSHProvisionerConfig(object):
+    """
+    Attributes:
+     - resourceId
+     - groupResourceProfileId
+     - configName
+     - configValue
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'resourceId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 2
+        (3, TType.STRING, 'configName', 'UTF8', None, ),  # 3
+        (4, TType.STRING, 'configValue', 'UTF8', None, ),  # 4
+    )
+
+    def __init__(self, resourceId=None, groupResourceProfileId=thrift_spec[2][4], configName=None, configValue=None,):
+        self.resourceId = resourceId
+        self.groupResourceProfileId = groupResourceProfileId
+        self.configName = configName
+        self.configValue = configValue
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.resourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.groupResourceProfileId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.configName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.configValue = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('GroupAccountSSHProvisionerConfig')
+        if self.resourceId is not None:
+            oprot.writeFieldBegin('resourceId', TType.STRING, 1)
+            oprot.writeString(self.resourceId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceId)
+            oprot.writeFieldEnd()
+        if self.groupResourceProfileId is not None:
+            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
+            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
+            oprot.writeFieldEnd()
+        if self.configName is not None:
+            oprot.writeFieldBegin('configName', TType.STRING, 3)
+            oprot.writeString(self.configName.encode('utf-8') if sys.version_info[0] == 2 else self.configName)
+            oprot.writeFieldEnd()
+        if self.configValue is not None:
+            oprot.writeFieldBegin('configValue', TType.STRING, 4)
+            oprot.writeString(self.configValue.encode('utf-8') if sys.version_info[0] == 2 else self.configValue)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.resourceId is None:
+            raise TProtocolException(message='Required field resourceId is unset!')
+        if self.groupResourceProfileId is None:
+            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
+        if self.configName is None:
+            raise TProtocolException(message='Required field configName is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class ComputeResourceReservation(object):
+    """
+    Attributes:
+     - reservationId
+     - reservationName
+     - queueNames
+     - startTime
+     - endTime
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'reservationId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
+        (2, TType.STRING, 'reservationName', 'UTF8', None, ),  # 2
+        (3, TType.LIST, 'queueNames', (TType.STRING, 'UTF8', False), None, ),  # 3
+        (4, TType.I64, 'startTime', None, None, ),  # 4
+        (5, TType.I64, 'endTime', None, None, ),  # 5
+    )
+
+    def __init__(self, reservationId=thrift_spec[1][4], reservationName=None, queueNames=None, startTime=None, endTime=None,):
+        self.reservationId = reservationId
+        self.reservationName = reservationName
+        self.queueNames = queueNames
+        self.startTime = startTime
+        self.endTime = endTime
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.reservationId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.reservationName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.LIST:
+                    self.queueNames = []
+                    (_etype3, _size0) = iprot.readListBegin()
+                    for _i4 in range(_size0):
+                        _elem5 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.queueNames.append(_elem5)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.I64:
+                    self.startTime = iprot.readI64()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.I64:
+                    self.endTime = iprot.readI64()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('ComputeResourceReservation')
+        if self.reservationId is not None:
+            oprot.writeFieldBegin('reservationId', TType.STRING, 1)
+            oprot.writeString(self.reservationId.encode('utf-8') if sys.version_info[0] == 2 else self.reservationId)
+            oprot.writeFieldEnd()
+        if self.reservationName is not None:
+            oprot.writeFieldBegin('reservationName', TType.STRING, 2)
+            oprot.writeString(self.reservationName.encode('utf-8') if sys.version_info[0] == 2 else self.reservationName)
+            oprot.writeFieldEnd()
+        if self.queueNames is not None:
+            oprot.writeFieldBegin('queueNames', TType.LIST, 3)
+            oprot.writeListBegin(TType.STRING, len(self.queueNames))
+            for iter6 in self.queueNames:
+                oprot.writeString(iter6.encode('utf-8') if sys.version_info[0] == 2 else iter6)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.startTime is not None:
+            oprot.writeFieldBegin('startTime', TType.I64, 4)
+            oprot.writeI64(self.startTime)
+            oprot.writeFieldEnd()
+        if self.endTime is not None:
+            oprot.writeFieldBegin('endTime', TType.I64, 5)
+            oprot.writeI64(self.endTime)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.reservationId is None:
+            raise TProtocolException(message='Required field reservationId is unset!')
+        if self.reservationName is None:
+            raise TProtocolException(message='Required field reservationName is unset!')
+        if self.queueNames is None:
+            raise TProtocolException(message='Required field queueNames is unset!')
+        if self.startTime is None:
+            raise TProtocolException(message='Required field startTime is unset!')
+        if self.endTime is None:
+            raise TProtocolException(message='Required field endTime is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class GroupComputeResourcePreference(object):
+    """
+    Attributes:
+     - computeResourceId
+     - groupResourceProfileId
+     - overridebyAiravata
+     - loginUserName
+     - preferredJobSubmissionProtocol
+     - preferredDataMovementProtocol
+     - preferredBatchQueue
+     - scratchLocation
+     - allocationProjectNumber
+     - resourceSpecificCredentialStoreToken
+     - usageReportingGatewayId
+     - qualityOfService
+     - sshAccountProvisioner
+     - groupSSHAccountProvisionerConfigs
+     - sshAccountProvisionerAdditionalInfo
+     - reservations
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 2
+        (3, TType.BOOL, 'overridebyAiravata', None, True, ),  # 3
+        (4, TType.STRING, 'loginUserName', 'UTF8', None, ),  # 4
+        (5, TType.I32, 'preferredJobSubmissionProtocol', None, None, ),  # 5
+        (6, TType.I32, 'preferredDataMovementProtocol', None, None, ),  # 6
+        (7, TType.STRING, 'preferredBatchQueue', 'UTF8', None, ),  # 7
+        (8, TType.STRING, 'scratchLocation', 'UTF8', None, ),  # 8
+        (9, TType.STRING, 'allocationProjectNumber', 'UTF8', None, ),  # 9
+        (10, TType.STRING, 'resourceSpecificCredentialStoreToken', 'UTF8', None, ),  # 10
+        (11, TType.STRING, 'usageReportingGatewayId', 'UTF8', None, ),  # 11
+        (12, TType.STRING, 'qualityOfService', 'UTF8', None, ),  # 12
+        None,  # 13
+        None,  # 14
+        None,  # 15
+        (16, TType.STRING, 'sshAccountProvisioner', 'UTF8', None, ),  # 16
+        (17, TType.LIST, 'groupSSHAccountProvisionerConfigs', (TType.STRUCT, (GroupAccountSSHProvisionerConfig, GroupAccountSSHProvisionerConfig.thrift_spec), False), None, ),  # 17
+        (18, TType.STRING, 'sshAccountProvisionerAdditionalInfo', 'UTF8', None, ),  # 18
+        (19, TType.LIST, 'reservations', (TType.STRUCT, (ComputeResourceReservation, ComputeResourceReservation.thrift_spec), False), None, ),  # 19
+    )
+
+    def __init__(self, computeResourceId=None, groupResourceProfileId=thrift_spec[2][4], overridebyAiravata=thrift_spec[3][4], loginUserName=None, preferredJobSubmissionProtocol=None, preferredDataMovementProtocol=None, preferredBatchQueue=None, scratchLocation=None, allocationProjectNumber=None, resourceSpecificCredentialStoreToken=None, usageReportingGatewayId=None, qualityOfService=None, sshAccountProvisioner=None, groupSSHAccountProvisionerConfigs=None, sshAccountProvisionerAdditionalInfo=None, reservations=None,):
+        self.computeResourceId = computeResourceId
+        self.groupResourceProfileId = groupResourceProfileId
+        self.overridebyAiravata = overridebyAiravata
+        self.loginUserName = loginUserName
+        self.preferredJobSubmissionProtocol = preferredJobSubmissionProtocol
+        self.preferredDataMovementProtocol = preferredDataMovementProtocol
+        self.preferredBatchQueue = preferredBatchQueue
+        self.scratchLocation = scratchLocation
+        self.allocationProjectNumber = allocationProjectNumber
+        self.resourceSpecificCredentialStoreToken = resourceSpecificCredentialStoreToken
+        self.usageReportingGatewayId = usageReportingGatewayId
+        self.qualityOfService = qualityOfService
+        self.sshAccountProvisioner = sshAccountProvisioner
+        self.groupSSHAccountProvisionerConfigs = groupSSHAccountProvisionerConfigs
+        self.sshAccountProvisionerAdditionalInfo = sshAccountProvisionerAdditionalInfo
+        self.reservations = reservations
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.groupResourceProfileId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.BOOL:
+                    self.overridebyAiravata = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.loginUserName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.I32:
+                    self.preferredJobSubmissionProtocol = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.I32:
+                    self.preferredDataMovementProtocol = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 7:
+                if ftype == TType.STRING:
+                    self.preferredBatchQueue = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 8:
+                if ftype == TType.STRING:
+                    self.scratchLocation = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 9:
+                if ftype == TType.STRING:
+                    self.allocationProjectNumber = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 10:
+                if ftype == TType.STRING:
+                    self.resourceSpecificCredentialStoreToken = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 11:
+                if ftype == TType.STRING:
+                    self.usageReportingGatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 12:
+                if ftype == TType.STRING:
+                    self.qualityOfService = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 16:
+                if ftype == TType.STRING:
+                    self.sshAccountProvisioner = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 17:
+                if ftype == TType.LIST:
+                    self.groupSSHAccountProvisionerConfigs = []
+                    (_etype10, _size7) = iprot.readListBegin()
+                    for _i11 in range(_size7):
+                        _elem12 = GroupAccountSSHProvisionerConfig()
+                        _elem12.read(iprot)
+                        self.groupSSHAccountProvisionerConfigs.append(_elem12)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 18:
+                if ftype == TType.STRING:
+                    self.sshAccountProvisionerAdditionalInfo = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 19:
+                if ftype == TType.LIST:
+                    self.reservations = []
+                    (_etype16, _size13) = iprot.readListBegin()
+                    for _i17 in range(_size13):
+                        _elem18 = ComputeResourceReservation()
+                        _elem18.read(iprot)
+                        self.reservations.append(_elem18)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('GroupComputeResourcePreference')
+        if self.computeResourceId is not None:
+            oprot.writeFieldBegin('computeResourceId', TType.STRING, 1)
+            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
+            oprot.writeFieldEnd()
+        if self.groupResourceProfileId is not None:
+            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
+            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
+            oprot.writeFieldEnd()
+        if self.overridebyAiravata is not None:
+            oprot.writeFieldBegin('overridebyAiravata', TType.BOOL, 3)
+            oprot.writeBool(self.overridebyAiravata)
+            oprot.writeFieldEnd()
+        if self.loginUserName is not None:
+            oprot.writeFieldBegin('loginUserName', TType.STRING, 4)
+            oprot.writeString(self.loginUserName.encode('utf-8') if sys.version_info[0] == 2 else self.loginUserName)
+            oprot.writeFieldEnd()
+        if self.preferredJobSubmissionProtocol is not None:
+            oprot.writeFieldBegin('preferredJobSubmissionProtocol', TType.I32, 5)
+            oprot.writeI32(self.preferredJobSubmissionProtocol)
+            oprot.writeFieldEnd()
+        if self.preferredDataMovementProtocol is not None:
+            oprot.writeFieldBegin('preferredDataMovementProtocol', TType.I32, 6)
+            oprot.writeI32(self.preferredDataMovementProtocol)
+            oprot.writeFieldEnd()
+        if self.preferredBatchQueue is not None:
+            oprot.writeFieldBegin('preferredBatchQueue', TType.STRING, 7)
+            oprot.writeString(self.preferredBatchQueue.encode('utf-8') if sys.version_info[0] == 2 else self.preferredBatchQueue)
+            oprot.writeFieldEnd()
+        if self.scratchLocation is not None:
+            oprot.writeFieldBegin('scratchLocation', TType.STRING, 8)
+            oprot.writeString(self.scratchLocation.encode('utf-8') if sys.version_info[0] == 2 else self.scratchLocation)
+            oprot.writeFieldEnd()
+        if self.allocationProjectNumber is not None:
+            oprot.writeFieldBegin('allocationProjectNumber', TType.STRING, 9)
+            oprot.writeString(self.allocationProjectNumber.encode('utf-8') if sys.version_info[0] == 2 else self.allocationProjectNumber)
+            oprot.writeFieldEnd()
+        if self.resourceSpecificCredentialStoreToken is not None:
+            oprot.writeFieldBegin('resourceSpecificCredentialStoreToken', TType.STRING, 10)
+            oprot.writeString(self.resourceSpecificCredentialStoreToken.encode('utf-8') if sys.version_info[0] == 2 else self.resourceSpecificCredentialStoreToken)
+            oprot.writeFieldEnd()
+        if self.usageReportingGatewayId is not None:
+            oprot.writeFieldBegin('usageReportingGatewayId', TType.STRING, 11)
+            oprot.writeString(self.usageReportingGatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.usageReportingGatewayId)
+            oprot.writeFieldEnd()
+        if self.qualityOfService is not None:
+            oprot.writeFieldBegin('qualityOfService', TType.STRING, 12)
+            oprot.writeString(self.qualityOfService.encode('utf-8') if sys.version_info[0] == 2 else self.qualityOfService)
+            oprot.writeFieldEnd()
+        if self.sshAccountProvisioner is not None:
+            oprot.writeFieldBegin('sshAccountProvisioner', TType.STRING, 16)
+            oprot.writeString(self.sshAccountProvisioner.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisioner)
+            oprot.writeFieldEnd()
+        if self.groupSSHAccountProvisionerConfigs is not None:
+            oprot.writeFieldBegin('groupSSHAccountProvisionerConfigs', TType.LIST, 17)
+            oprot.writeListBegin(TType.STRUCT, len(self.groupSSHAccountProvisionerConfigs))
+            for iter19 in self.groupSSHAccountProvisionerConfigs:
+                iter19.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.sshAccountProvisionerAdditionalInfo is not None:
+            oprot.writeFieldBegin('sshAccountProvisionerAdditionalInfo', TType.STRING, 18)
+            oprot.writeString(self.sshAccountProvisionerAdditionalInfo.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisionerAdditionalInfo)
+            oprot.writeFieldEnd()
+        if self.reservations is not None:
+            oprot.writeFieldBegin('reservations', TType.LIST, 19)
+            oprot.writeListBegin(TType.STRUCT, len(self.reservations))
+            for iter20 in self.reservations:
+                iter20.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.computeResourceId is None:
+            raise TProtocolException(message='Required field computeResourceId is unset!')
+        if self.groupResourceProfileId is None:
+            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
+        if self.overridebyAiravata is None:
+            raise TProtocolException(message='Required field overridebyAiravata is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class ComputeResourcePolicy(object):
+    """
+    Attributes:
+     - resourcePolicyId
+     - computeResourceId
+     - groupResourceProfileId
+     - allowedBatchQueues
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'resourcePolicyId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
+        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
+        (3, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 3
+        (4, TType.LIST, 'allowedBatchQueues', (TType.STRING, 'UTF8', False), None, ),  # 4
+    )
+
+    def __init__(self, resourcePolicyId=thrift_spec[1][4], computeResourceId=None, groupResourceProfileId=thrift_spec[3][4], allowedBatchQueues=None,):
+        self.resourcePolicyId = resourcePolicyId
+        self.computeResourceId = computeResourceId
+        self.groupResourceProfileId = groupResourceProfileId
+        self.allowedBatchQueues = allowedBatchQueues
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.resourcePolicyId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.groupResourceProfileId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.LIST:
+                    self.allowedBatchQueues = []
+                    (_etype24, _size21) = iprot.readListBegin()
+                    for _i25 in range(_size21):
+                        _elem26 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.allowedBatchQueues.append(_elem26)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('ComputeResourcePolicy')
+        if self.resourcePolicyId is not None:
+            oprot.writeFieldBegin('resourcePolicyId', TType.STRING, 1)
+            oprot.writeString(self.resourcePolicyId.encode('utf-8') if sys.version_info[0] == 2 else self.resourcePolicyId)
+            oprot.writeFieldEnd()
+        if self.computeResourceId is not None:
+            oprot.writeFieldBegin('computeResourceId', TType.STRING, 2)
+            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
+            oprot.writeFieldEnd()
+        if self.groupResourceProfileId is not None:
+            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 3)
+            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
+            oprot.writeFieldEnd()
+        if self.allowedBatchQueues is not None:
+            oprot.writeFieldBegin('allowedBatchQueues', TType.LIST, 4)
+            oprot.writeListBegin(TType.STRING, len(self.allowedBatchQueues))
+            for iter27 in self.allowedBatchQueues:
+                oprot.writeString(iter27.encode('utf-8') if sys.version_info[0] == 2 else iter27)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.resourcePolicyId is None:
+            raise TProtocolException(message='Required field resourcePolicyId is unset!')
+        if self.computeResourceId is None:
+            raise TProtocolException(message='Required field computeResourceId is unset!')
+        if self.groupResourceProfileId is None:
+            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class BatchQueueResourcePolicy(object):
+    """
+    Attributes:
+     - resourcePolicyId
+     - computeResourceId
+     - groupResourceProfileId
+     - queuename
+     - maxAllowedNodes
+     - maxAllowedCores
+     - maxAllowedWalltime
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'resourcePolicyId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
+        (2, TType.STRING, 'computeResourceId', 'UTF8', None, ),  # 2
+        (3, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 3
+        (4, TType.STRING, 'queuename', 'UTF8', None, ),  # 4
+        (5, TType.I32, 'maxAllowedNodes', None, None, ),  # 5
+        (6, TType.I32, 'maxAllowedCores', None, None, ),  # 6
+        (7, TType.I32, 'maxAllowedWalltime', None, None, ),  # 7
+    )
+
+    def __init__(self, resourcePolicyId=thrift_spec[1][4], computeResourceId=None, groupResourceProfileId=thrift_spec[3][4], queuename=None, maxAllowedNodes=None, maxAllowedCores=None, maxAllowedWalltime=None,):
+        self.resourcePolicyId = resourcePolicyId
+        self.computeResourceId = computeResourceId
+        self.groupResourceProfileId = groupResourceProfileId
+        self.queuename = queuename
+        self.maxAllowedNodes = maxAllowedNodes
+        self.maxAllowedCores = maxAllowedCores
+        self.maxAllowedWalltime = maxAllowedWalltime
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.resourcePolicyId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.computeResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.groupResourceProfileId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.queuename = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.I32:
+                    self.maxAllowedNodes = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.I32:
+                    self.maxAllowedCores = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 7:
+                if ftype == TType.I32:
+                    self.maxAllowedWalltime = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('BatchQueueResourcePolicy')
+        if self.resourcePolicyId is not None:
+            oprot.writeFieldBegin('resourcePolicyId', TType.STRING, 1)
+            oprot.writeString(self.resourcePolicyId.encode('utf-8') if sys.version_info[0] == 2 else self.resourcePolicyId)
+            oprot.writeFieldEnd()
+        if self.computeResourceId is not None:
+            oprot.writeFieldBegin('computeResourceId', TType.STRING, 2)
+            oprot.writeString(self.computeResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.computeResourceId)
+            oprot.writeFieldEnd()
+        if self.groupResourceProfileId is not None:
+            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 3)
+            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
+            oprot.writeFieldEnd()
+        if self.queuename is not None:
+            oprot.writeFieldBegin('queuename', TType.STRING, 4)
+            oprot.writeString(self.queuename.encode('utf-8') if sys.version_info[0] == 2 else self.queuename)
+            oprot.writeFieldEnd()
+        if self.maxAllowedNodes is not None:
+            oprot.writeFieldBegin('maxAllowedNodes', TType.I32, 5)
+            oprot.writeI32(self.maxAllowedNodes)
+            oprot.writeFieldEnd()
+        if self.maxAllowedCores is not None:
+            oprot.writeFieldBegin('maxAllowedCores', TType.I32, 6)
+            oprot.writeI32(self.maxAllowedCores)
+            oprot.writeFieldEnd()
+        if self.maxAllowedWalltime is not None:
+            oprot.writeFieldBegin('maxAllowedWalltime', TType.I32, 7)
+            oprot.writeI32(self.maxAllowedWalltime)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.resourcePolicyId is None:
+            raise TProtocolException(message='Required field resourcePolicyId is unset!')
+        if self.computeResourceId is None:
+            raise TProtocolException(message='Required field computeResourceId is unset!')
+        if self.groupResourceProfileId is None:
+            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class GroupResourceProfile(object):
+    """
+    Group Resource Profile
+
+    gatewayID:
+     Unique identifier for the gateway assigned by Airavata. Corelate this to Airavata Admin API Gateway Registration.
+
+    groupResourceProfileId:
+
+    computeResourcePreferences:
+     List of resource preferences for each of the registered compute resources.
+
+    computeResourcePolicies:
+     List of enforced policies for each of the registered compute resources.
+
+    batchQueueResourcePolicies:
+     List of enforced policies on registered batch queues
+
+    defaultCredentialStoreToken:
+     The default credential store token to use for compute resources that don't specify a resource specific credential store token.
+
+
+    Attributes:
+     - gatewayId
+     - groupResourceProfileId
+     - groupResourceProfileName
+     - computePreferences
+     - computeResourcePolicies
+     - batchQueueResourcePolicies
+     - creationTime
+     - updatedTime
+     - defaultCredentialStoreToken
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 2
+        (3, TType.STRING, 'groupResourceProfileName', 'UTF8', None, ),  # 3
+        (4, TType.LIST, 'computePreferences', (TType.STRUCT, (GroupComputeResourcePreference, GroupComputeResourcePreference.thrift_spec), False), None, ),  # 4
+        (5, TType.LIST, 'computeResourcePolicies', (TType.STRUCT, (ComputeResourcePolicy, ComputeResourcePolicy.thrift_spec), False), None, ),  # 5
+        (6, TType.LIST, 'batchQueueResourcePolicies', (TType.STRUCT, (BatchQueueResourcePolicy, BatchQueueResourcePolicy.thrift_spec), False), None, ),  # 6
+        (7, TType.I64, 'creationTime', None, None, ),  # 7
+        (8, TType.I64, 'updatedTime', None, None, ),  # 8
+        (9, TType.STRING, 'defaultCredentialStoreToken', 'UTF8', None, ),  # 9
+    )
+
+    def __init__(self, gatewayId=None, groupResourceProfileId=thrift_spec[2][4], groupResourceProfileName=None, computePreferences=None, computeResourcePolicies=None, batchQueueResourcePolicies=None, creationTime=None, updatedTime=None, defaultCredentialStoreToken=None,):
+        self.gatewayId = gatewayId
+        self.groupResourceProfileId = groupResourceProfileId
+        self.groupResourceProfileName = groupResourceProfileName
+        self.computePreferences = computePreferences
+        self.computeResourcePolicies = computeResourcePolicies
+        self.batchQueueResourcePolicies = batchQueueResourcePolicies
+        self.creationTime = creationTime
+        self.updatedTime = updatedTime
+        self.defaultCredentialStoreToken = defaultCredentialStoreToken
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.groupResourceProfileId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.groupResourceProfileName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.LIST:
+                    self.computePreferences = []
+                    (_etype31, _size28) = iprot.readListBegin()
+                    for _i32 in range(_size28):
+                        _elem33 = GroupComputeResourcePreference()
+                        _elem33.read(iprot)
+                        self.computePreferences.append(_elem33)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.LIST:
+                    self.computeResourcePolicies = []
+                    (_etype37, _size34) = iprot.readListBegin()
+                    for _i38 in range(_size34):
+                        _elem39 = ComputeResourcePolicy()
+                        _elem39.read(iprot)
+                        self.computeResourcePolicies.append(_elem39)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.LIST:
+                    self.batchQueueResourcePolicies = []
+                    (_etype43, _size40) = iprot.readListBegin()
+                    for _i44 in range(_size40):
+                        _elem45 = BatchQueueResourcePolicy()
+                        _elem45.read(iprot)
+                        self.batchQueueResourcePolicies.append(_elem45)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 7:
+                if ftype == TType.I64:
+                    self.creationTime = iprot.readI64()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 8:
+                if ftype == TType.I64:
+                    self.updatedTime = iprot.readI64()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 9:
+                if ftype == TType.STRING:
+                    self.defaultCredentialStoreToken = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('GroupResourceProfile')
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 1)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        if self.groupResourceProfileId is not None:
+            oprot.writeFieldBegin('groupResourceProfileId', TType.STRING, 2)
+            oprot.writeString(self.groupResourceProfileId.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileId)
+            oprot.writeFieldEnd()
+        if self.groupResourceProfileName is not None:
+            oprot.writeFieldBegin('groupResourceProfileName', TType.STRING, 3)
+            oprot.writeString(self.groupResourceProfileName.encode('utf-8') if sys.version_info[0] == 2 else self.groupResourceProfileName)
+            oprot.writeFieldEnd()
+        if self.computePreferences is not None:
+            oprot.writeFieldBegin('computePreferences', TType.LIST, 4)
+            oprot.writeListBegin(TType.STRUCT, len(self.computePreferences))
+            for iter46 in self.computePreferences:
+                iter46.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.computeResourcePolicies is not None:
+            oprot.writeFieldBegin('computeResourcePolicies', TType.LIST, 5)
+            oprot.writeListBegin(TType.STRUCT, len(self.computeResourcePolicies))
+            for iter47 in self.computeResourcePolicies:
+                iter47.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.batchQueueResourcePolicies is not None:
+            oprot.writeFieldBegin('batchQueueResourcePolicies', TType.LIST, 6)
+            oprot.writeListBegin(TType.STRUCT, len(self.batchQueueResourcePolicies))
+            for iter48 in self.batchQueueResourcePolicies:
+                iter48.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.creationTime is not None:
+            oprot.writeFieldBegin('creationTime', TType.I64, 7)
+            oprot.writeI64(self.creationTime)
+            oprot.writeFieldEnd()
+        if self.updatedTime is not None:
+            oprot.writeFieldBegin('updatedTime', TType.I64, 8)
+            oprot.writeI64(self.updatedTime)
+            oprot.writeFieldEnd()
+        if self.defaultCredentialStoreToken is not None:
+            oprot.writeFieldBegin('defaultCredentialStoreToken', TType.STRING, 9)
+            oprot.writeString(self.defaultCredentialStoreToken.encode('utf-8') if sys.version_info[0] == 2 else self.defaultCredentialStoreToken)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        if self.groupResourceProfileId is None:
+            raise TProtocolException(message='Required field groupResourceProfileId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parallelism/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parallelism/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parallelism/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parallelism/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parallelism/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parallelism/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parser/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parser/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parser/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parser/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parser/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/parser/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/storageresource/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/storageresource/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/storageresource/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/storageresource/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/storageresource/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/storageresource/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/application/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/application/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/application/io/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/application/io/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/application/io/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/application/io/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/application/io/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/application/io/ttypes.py
new file mode 100644
index 0000000..17f1760
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/application/io/ttypes.py
@@ -0,0 +1,512 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+import airavata.model.appcatalog.computeresource.ttypes
+
+from thrift.transport import TTransport
+
+
+class DataType(object):
+    """
+    Data Types supported in Airavata. The primitive data types
+
+    """
+    STRING = 0
+    INTEGER = 1
+    FLOAT = 2
+    URI = 3
+    URI_COLLECTION = 4
+    STDOUT = 5
+    STDERR = 6
+
+    _VALUES_TO_NAMES = {
+        0: "STRING",
+        1: "INTEGER",
+        2: "FLOAT",
+        3: "URI",
+        4: "URI_COLLECTION",
+        5: "STDOUT",
+        6: "STDERR",
+    }
+
+    _NAMES_TO_VALUES = {
+        "STRING": 0,
+        "INTEGER": 1,
+        "FLOAT": 2,
+        "URI": 3,
+        "URI_COLLECTION": 4,
+        "STDOUT": 5,
+        "STDERR": 6,
+    }
+
+
+class InputDataObjectType(object):
+    """
+    Application Inputs. The paramters describe how inputs are passed to the application.
+
+    name:
+      Name of the parameter.
+
+    value:
+      Value of the parameter. A default value could be set during registration.
+
+    type:
+      Data type of the parameter
+
+    applicationArguement:
+      The argument flag sent to the application. Such as -p pressure.
+
+    standardInput:
+      When this value is set, the parameter is sent as standard input rather than a parameter.
+      Typically this is passed using redirection operator ">".
+
+    userFriendlyDescription:
+      Description to be displayed at the user interface.
+
+    metaData:
+      Any metadat. This is typically ignore by Airavata and is used by gateways for application configuration.
+
+    overrideFilename:
+      Rename input file to given value when staging to compute resource.
+
+    Attributes:
+     - name
+     - value
+     - type
+     - applicationArgument
+     - standardInput
+     - userFriendlyDescription
+     - metaData
+     - inputOrder
+     - isRequired
+     - requiredToAddedToCommandLine
+     - dataStaged
+     - storageResourceId
+     - isReadOnly
+     - overrideFilename
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'name', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'value', 'UTF8', None, ),  # 2
+        (3, TType.I32, 'type', None, None, ),  # 3
+        (4, TType.STRING, 'applicationArgument', 'UTF8', None, ),  # 4
+        (5, TType.BOOL, 'standardInput', None, None, ),  # 5
+        (6, TType.STRING, 'userFriendlyDescription', 'UTF8', None, ),  # 6
+        (7, TType.STRING, 'metaData', 'UTF8', None, ),  # 7
+        (8, TType.I32, 'inputOrder', None, None, ),  # 8
+        (9, TType.BOOL, 'isRequired', None, None, ),  # 9
+        (10, TType.BOOL, 'requiredToAddedToCommandLine', None, None, ),  # 10
+        (11, TType.BOOL, 'dataStaged', None, None, ),  # 11
+        (12, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 12
+        (13, TType.BOOL, 'isReadOnly', None, None, ),  # 13
+        (14, TType.STRING, 'overrideFilename', 'UTF8', None, ),  # 14
+    )
+
+    def __init__(self, name=None, value=None, type=None, applicationArgument=None, standardInput=None, userFriendlyDescription=None, metaData=None, inputOrder=None, isRequired=None, requiredToAddedToCommandLine=None, dataStaged=None, storageResourceId=None, isReadOnly=None, overrideFilename=None,):
+        self.name = name
+        self.value = value
+        self.type = type
+        self.applicationArgument = applicationArgument
+        self.standardInput = standardInput
+        self.userFriendlyDescription = userFriendlyDescription
+        self.metaData = metaData
+        self.inputOrder = inputOrder
+        self.isRequired = isRequired
+        self.requiredToAddedToCommandLine = requiredToAddedToCommandLine
+        self.dataStaged = dataStaged
+        self.storageResourceId = storageResourceId
+        self.isReadOnly = isReadOnly
+        self.overrideFilename = overrideFilename
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.name = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.value = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.applicationArgument = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.BOOL:
+                    self.standardInput = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.STRING:
+                    self.userFriendlyDescription = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 7:
+                if ftype == TType.STRING:
+                    self.metaData = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 8:
+                if ftype == TType.I32:
+                    self.inputOrder = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 9:
+                if ftype == TType.BOOL:
+                    self.isRequired = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 10:
+                if ftype == TType.BOOL:
+                    self.requiredToAddedToCommandLine = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 11:
+                if ftype == TType.BOOL:
+                    self.dataStaged = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 12:
+                if ftype == TType.STRING:
+                    self.storageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 13:
+                if ftype == TType.BOOL:
+                    self.isReadOnly = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 14:
+                if ftype == TType.STRING:
+                    self.overrideFilename = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('InputDataObjectType')
+        if self.name is not None:
+            oprot.writeFieldBegin('name', TType.STRING, 1)
+            oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name)
+            oprot.writeFieldEnd()
+        if self.value is not None:
+            oprot.writeFieldBegin('value', TType.STRING, 2)
+            oprot.writeString(self.value.encode('utf-8') if sys.version_info[0] == 2 else self.value)
+            oprot.writeFieldEnd()
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 3)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.applicationArgument is not None:
+            oprot.writeFieldBegin('applicationArgument', TType.STRING, 4)
+            oprot.writeString(self.applicationArgument.encode('utf-8') if sys.version_info[0] == 2 else self.applicationArgument)
+            oprot.writeFieldEnd()
+        if self.standardInput is not None:
+            oprot.writeFieldBegin('standardInput', TType.BOOL, 5)
+            oprot.writeBool(self.standardInput)
+            oprot.writeFieldEnd()
+        if self.userFriendlyDescription is not None:
+            oprot.writeFieldBegin('userFriendlyDescription', TType.STRING, 6)
+            oprot.writeString(self.userFriendlyDescription.encode('utf-8') if sys.version_info[0] == 2 else self.userFriendlyDescription)
+            oprot.writeFieldEnd()
+        if self.metaData is not None:
+            oprot.writeFieldBegin('metaData', TType.STRING, 7)
+            oprot.writeString(self.metaData.encode('utf-8') if sys.version_info[0] == 2 else self.metaData)
+            oprot.writeFieldEnd()
+        if self.inputOrder is not None:
+            oprot.writeFieldBegin('inputOrder', TType.I32, 8)
+            oprot.writeI32(self.inputOrder)
+            oprot.writeFieldEnd()
+        if self.isRequired is not None:
+            oprot.writeFieldBegin('isRequired', TType.BOOL, 9)
+            oprot.writeBool(self.isRequired)
+            oprot.writeFieldEnd()
+        if self.requiredToAddedToCommandLine is not None:
+            oprot.writeFieldBegin('requiredToAddedToCommandLine', TType.BOOL, 10)
+            oprot.writeBool(self.requiredToAddedToCommandLine)
+            oprot.writeFieldEnd()
+        if self.dataStaged is not None:
+            oprot.writeFieldBegin('dataStaged', TType.BOOL, 11)
+            oprot.writeBool(self.dataStaged)
+            oprot.writeFieldEnd()
+        if self.storageResourceId is not None:
+            oprot.writeFieldBegin('storageResourceId', TType.STRING, 12)
+            oprot.writeString(self.storageResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.storageResourceId)
+            oprot.writeFieldEnd()
+        if self.isReadOnly is not None:
+            oprot.writeFieldBegin('isReadOnly', TType.BOOL, 13)
+            oprot.writeBool(self.isReadOnly)
+            oprot.writeFieldEnd()
+        if self.overrideFilename is not None:
+            oprot.writeFieldBegin('overrideFilename', TType.STRING, 14)
+            oprot.writeString(self.overrideFilename.encode('utf-8') if sys.version_info[0] == 2 else self.overrideFilename)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.name is None:
+            raise TProtocolException(message='Required field name is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class OutputDataObjectType(object):
+    """
+    Application Outputs. The paramters describe how outputs generated by the application.
+
+    name:
+      Name of the parameter.
+
+    value:
+      Value of the parameter.
+
+    type:
+      Data type of the parameter
+
+    applicationArguement:
+      The argument flag sent to the application. Such as -p pressure.
+
+    standardInput:
+      When this value is set, the parameter is sent as standard input rather than a parameter.
+      Typically this is passed using redirection operator ">".
+
+    userFriendlyDescription:
+      Description to be displayed at the user interface.
+
+    metaData:
+      Any metadat. This is typically ignore by Airavata and is used by gateways for application configuration.
+
+
+    Attributes:
+     - name
+     - value
+     - type
+     - applicationArgument
+     - isRequired
+     - requiredToAddedToCommandLine
+     - dataMovement
+     - location
+     - searchQuery
+     - outputStreaming
+     - storageResourceId
+     - metaData
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'name', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'value', 'UTF8', None, ),  # 2
+        (3, TType.I32, 'type', None, None, ),  # 3
+        (4, TType.STRING, 'applicationArgument', 'UTF8', None, ),  # 4
+        (5, TType.BOOL, 'isRequired', None, None, ),  # 5
+        (6, TType.BOOL, 'requiredToAddedToCommandLine', None, None, ),  # 6
+        (7, TType.BOOL, 'dataMovement', None, None, ),  # 7
+        (8, TType.STRING, 'location', 'UTF8', None, ),  # 8
+        (9, TType.STRING, 'searchQuery', 'UTF8', None, ),  # 9
+        (10, TType.BOOL, 'outputStreaming', None, None, ),  # 10
+        (11, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 11
+        (12, TType.STRING, 'metaData', 'UTF8', None, ),  # 12
+    )
+
+    def __init__(self, name=None, value=None, type=None, applicationArgument=None, isRequired=None, requiredToAddedToCommandLine=None, dataMovement=None, location=None, searchQuery=None, outputStreaming=None, storageResourceId=None, metaData=None,):
+        self.name = name
+        self.value = value
+        self.type = type
+        self.applicationArgument = applicationArgument
+        self.isRequired = isRequired
+        self.requiredToAddedToCommandLine = requiredToAddedToCommandLine
+        self.dataMovement = dataMovement
+        self.location = location
+        self.searchQuery = searchQuery
+        self.outputStreaming = outputStreaming
+        self.storageResourceId = storageResourceId
+        self.metaData = metaData
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.name = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.value = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.applicationArgument = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.BOOL:
+                    self.isRequired = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.BOOL:
+                    self.requiredToAddedToCommandLine = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 7:
+                if ftype == TType.BOOL:
+                    self.dataMovement = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 8:
+                if ftype == TType.STRING:
+                    self.location = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 9:
+                if ftype == TType.STRING:
+                    self.searchQuery = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 10:
+                if ftype == TType.BOOL:
+                    self.outputStreaming = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 11:
+                if ftype == TType.STRING:
+                    self.storageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 12:
+                if ftype == TType.STRING:
+                    self.metaData = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('OutputDataObjectType')
+        if self.name is not None:
+            oprot.writeFieldBegin('name', TType.STRING, 1)
+            oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name)
+            oprot.writeFieldEnd()
+        if self.value is not None:
+            oprot.writeFieldBegin('value', TType.STRING, 2)
+            oprot.writeString(self.value.encode('utf-8') if sys.version_info[0] == 2 else self.value)
+            oprot.writeFieldEnd()
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 3)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.applicationArgument is not None:
+            oprot.writeFieldBegin('applicationArgument', TType.STRING, 4)
+            oprot.writeString(self.applicationArgument.encode('utf-8') if sys.version_info[0] == 2 else self.applicationArgument)
+            oprot.writeFieldEnd()
+        if self.isRequired is not None:
+            oprot.writeFieldBegin('isRequired', TType.BOOL, 5)
+            oprot.writeBool(self.isRequired)
+            oprot.writeFieldEnd()
+        if self.requiredToAddedToCommandLine is not None:
+            oprot.writeFieldBegin('requiredToAddedToCommandLine', TType.BOOL, 6)
+            oprot.writeBool(self.requiredToAddedToCommandLine)
+            oprot.writeFieldEnd()
+        if self.dataMovement is not None:
+            oprot.writeFieldBegin('dataMovement', TType.BOOL, 7)
+            oprot.writeBool(self.dataMovement)
+            oprot.writeFieldEnd()
+        if self.location is not None:
+            oprot.writeFieldBegin('location', TType.STRING, 8)
+            oprot.writeString(self.location.encode('utf-8') if sys.version_info[0] == 2 else self.location)
+            oprot.writeFieldEnd()
+        if self.searchQuery is not None:
+            oprot.writeFieldBegin('searchQuery', TType.STRING, 9)
+            oprot.writeString(self.searchQuery.encode('utf-8') if sys.version_info[0] == 2 else self.searchQuery)
+            oprot.writeFieldEnd()
+        if self.outputStreaming is not None:
+            oprot.writeFieldBegin('outputStreaming', TType.BOOL, 10)
+            oprot.writeBool(self.outputStreaming)
+            oprot.writeFieldEnd()
+        if self.storageResourceId is not None:
+            oprot.writeFieldBegin('storageResourceId', TType.STRING, 11)
+            oprot.writeString(self.storageResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.storageResourceId)
+            oprot.writeFieldEnd()
+        if self.metaData is not None:
+            oprot.writeFieldBegin('metaData', TType.STRING, 12)
+            oprot.writeString(self.metaData.encode('utf-8') if sys.version_info[0] == 2 else self.metaData)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.name is None:
+            raise TProtocolException(message='Required field name is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/commons/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/commons/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/commons/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/commons/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/commons/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/commons/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/credential/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/credential/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/credential/store/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/credential/store/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/credential/store/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/credential/store/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/credential/store/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/credential/store/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/movement/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/movement/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/movement/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/movement/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/movement/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/movement/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/replica/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/replica/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/replica/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/replica/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/replica/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/data/replica/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/dbevent/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/dbevent/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/dbevent/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/dbevent/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/dbevent/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/dbevent/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/experiment/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/experiment/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/experiment/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/experiment/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/experiment/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/experiment/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/group/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/group/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/group/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/group/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/group/ttypes.py
similarity index 98%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/group/ttypes.py
index 3be6af0..8bce444 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/ttypes.py
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/group/ttypes.py
@@ -48,17 +48,20 @@
     WRITE = 0
     READ = 1
     OWNER = 2
+    MANAGE_SHARING = 3
 
     _VALUES_TO_NAMES = {
         0: "WRITE",
         1: "READ",
         2: "OWNER",
+        3: "MANAGE_SHARING",
     }
 
     _NAMES_TO_VALUES = {
         "WRITE": 0,
         "READ": 1,
         "OWNER": 2,
+        "MANAGE_SHARING": 3,
     }
 
 
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/job/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/job/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/job/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/job/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/job/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/job/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/messaging/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/messaging/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/messaging/event/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/messaging/event/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/messaging/event/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/messaging/event/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/messaging/event/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/messaging/event/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/process/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/process/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/process/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/process/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/process/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/process/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/scheduling/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/scheduling/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/scheduling/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/scheduling/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/scheduling/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/scheduling/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/security/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/security/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/security/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/security/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/security/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/security/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/sharing/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/sharing/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/sharing/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/sharing/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/sharing/ttypes.py
similarity index 98%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/sharing/ttypes.py
index 1f2f0e9..661367f 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/ttypes.py
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/sharing/ttypes.py
@@ -190,6 +190,7 @@
     <li>description : A short description for the domain</li>
     <li>createdTime : Will be set by the system</li>
     <li>updatedTime : Will be set by the system</li>
+    <li>initialUserGroupId : New users will automatically be added to this group</li>
 
 
     Attributes:
@@ -198,6 +199,7 @@
      - description
      - createdTime
      - updatedTime
+     - initialUserGroupId
     """
 
     thrift_spec = (
@@ -207,14 +209,16 @@
         (3, TType.STRING, 'description', 'UTF8', None, ),  # 3
         (4, TType.I64, 'createdTime', None, None, ),  # 4
         (5, TType.I64, 'updatedTime', None, None, ),  # 5
+        (6, TType.STRING, 'initialUserGroupId', 'UTF8', None, ),  # 6
     )
 
-    def __init__(self, domainId=thrift_spec[1][4], name=None, description=None, createdTime=None, updatedTime=None,):
+    def __init__(self, domainId=thrift_spec[1][4], name=None, description=None, createdTime=None, updatedTime=None, initialUserGroupId=None,):
         self.domainId = domainId
         self.name = name
         self.description = description
         self.createdTime = createdTime
         self.updatedTime = updatedTime
+        self.initialUserGroupId = initialUserGroupId
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -250,6 +254,11 @@
                     self.updatedTime = iprot.readI64()
                 else:
                     iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.STRING:
+                    self.initialUserGroupId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
             else:
                 iprot.skip(ftype)
             iprot.readFieldEnd()
@@ -280,6 +289,10 @@
             oprot.writeFieldBegin('updatedTime', TType.I64, 5)
             oprot.writeI64(self.updatedTime)
             oprot.writeFieldEnd()
+        if self.initialUserGroupId is not None:
+            oprot.writeFieldBegin('initialUserGroupId', TType.STRING, 6)
+            oprot.writeString(self.initialUserGroupId.encode('utf-8') if sys.version_info[0] == 2 else self.initialUserGroupId)
+            oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
 
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/status/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/status/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/status/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/status/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/status/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/status/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/task/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/task/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/task/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/task/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/task/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/task/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/tenant/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/tenant/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/tenant/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/tenant/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/tenant/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/tenant/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/user/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/user/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/user/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/user/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/user/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/user/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workflow/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workflow/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workflow/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workflow/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workflow/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workflow/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workspace/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workspace/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workspace/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workspace/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workspace/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/workspace/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/GroupManagerService-remote b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/GroupManagerService-remote
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/GroupManagerService-remote
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/GroupManagerService-remote
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/GroupManagerService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/GroupManagerService.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/GroupManagerService.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/GroupManagerService.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/IamAdminServices-remote b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/IamAdminServices-remote
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/IamAdminServices-remote
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/IamAdminServices-remote
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/IamAdminServices.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/IamAdminServices.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/IamAdminServices.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/IamAdminServices.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/TenantProfileService-remote b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/TenantProfileService-remote
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/TenantProfileService-remote
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/TenantProfileService-remote
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/TenantProfileService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/TenantProfileService.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/TenantProfileService.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/TenantProfileService.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/tenant/cpi/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/UserProfileService-remote b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/UserProfileService-remote
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/UserProfileService-remote
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/UserProfileService-remote
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/UserProfileService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/UserProfileService.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/UserProfileService.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/UserProfileService.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/error/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/error/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/error/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/service/profile/user/cpi/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/PKG-INFO b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/PKG-INFO
new file mode 100644
index 0000000..e8e0dce
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/PKG-INFO
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: airavata-python-sdk
+Version: 1.0.0
+Summary: Apache Airavata Python  SDK
+Home-page: http://airavata.com
+Author: Airavata Developers
+Author-email: dev@airavata.apache.org
+License: Apache License 2.0
+Description: UNKNOWN
+Platform: UNKNOWN
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/SOURCES.txt b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/SOURCES.txt
new file mode 100644
index 0000000..b047fe9
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/SOURCES.txt
@@ -0,0 +1,202 @@
+LICENSE
+README.md
+setup.cfg
+setup.py
+airavata/__init__.py
+airavata/api/Airavata.py
+airavata/api/__init__.py
+airavata/api/constants.py
+airavata/api/ttypes.py
+airavata/api/credential/__init__.py
+airavata/api/credential/store/CredentialStoreService.py
+airavata/api/credential/store/__init__.py
+airavata/api/credential/store/constants.py
+airavata/api/credential/store/ttypes.py
+airavata/api/credential/store/error/__init__.py
+airavata/api/credential/store/error/constants.py
+airavata/api/credential/store/error/ttypes.py
+airavata/api/error/__init__.py
+airavata/api/error/constants.py
+airavata/api/error/ttypes.py
+airavata/api/sharing/SharingRegistryService.py
+airavata/api/sharing/__init__.py
+airavata/api/sharing/constants.py
+airavata/api/sharing/ttypes.py
+airavata/base/__init__.py
+airavata/base/api/BaseAPI.py
+airavata/base/api/__init__.py
+airavata/base/api/constants.py
+airavata/base/api/ttypes.py
+airavata/model/__init__.py
+airavata/model/constants.py
+airavata/model/ttypes.py
+airavata/model/appcatalog/__init__.py
+airavata/model/appcatalog/accountprovisioning/__init__.py
+airavata/model/appcatalog/accountprovisioning/constants.py
+airavata/model/appcatalog/accountprovisioning/ttypes.py
+airavata/model/appcatalog/appdeployment/__init__.py
+airavata/model/appcatalog/appdeployment/constants.py
+airavata/model/appcatalog/appdeployment/ttypes.py
+airavata/model/appcatalog/appinterface/__init__.py
+airavata/model/appcatalog/appinterface/constants.py
+airavata/model/appcatalog/appinterface/ttypes.py
+airavata/model/appcatalog/computeresource/__init__.py
+airavata/model/appcatalog/computeresource/constants.py
+airavata/model/appcatalog/computeresource/ttypes.py
+airavata/model/appcatalog/gatewaygroups/__init__.py
+airavata/model/appcatalog/gatewaygroups/constants.py
+airavata/model/appcatalog/gatewaygroups/ttypes.py
+airavata/model/appcatalog/gatewayprofile/__init__.py
+airavata/model/appcatalog/gatewayprofile/constants.py
+airavata/model/appcatalog/gatewayprofile/ttypes.py
+airavata/model/appcatalog/groupresourceprofile/__init__.py
+airavata/model/appcatalog/groupresourceprofile/constants.py
+airavata/model/appcatalog/groupresourceprofile/ttypes.py
+airavata/model/appcatalog/parallelism/__init__.py
+airavata/model/appcatalog/parallelism/constants.py
+airavata/model/appcatalog/parallelism/ttypes.py
+airavata/model/appcatalog/parser/__init__.py
+airavata/model/appcatalog/parser/constants.py
+airavata/model/appcatalog/parser/ttypes.py
+airavata/model/appcatalog/storageresource/__init__.py
+airavata/model/appcatalog/storageresource/constants.py
+airavata/model/appcatalog/storageresource/ttypes.py
+airavata/model/appcatalog/userresourceprofile/__init__.py
+airavata/model/appcatalog/userresourceprofile/constants.py
+airavata/model/appcatalog/userresourceprofile/ttypes.py
+airavata/model/application/__init__.py
+airavata/model/application/io/__init__.py
+airavata/model/application/io/constants.py
+airavata/model/application/io/ttypes.py
+airavata/model/commons/__init__.py
+airavata/model/commons/constants.py
+airavata/model/commons/ttypes.py
+airavata/model/credential/__init__.py
+airavata/model/credential/store/__init__.py
+airavata/model/credential/store/constants.py
+airavata/model/credential/store/ttypes.py
+airavata/model/data/__init__.py
+airavata/model/data/movement/__init__.py
+airavata/model/data/movement/constants.py
+airavata/model/data/movement/ttypes.py
+airavata/model/data/replica/__init__.py
+airavata/model/data/replica/constants.py
+airavata/model/data/replica/ttypes.py
+airavata/model/dbevent/__init__.py
+airavata/model/dbevent/constants.py
+airavata/model/dbevent/ttypes.py
+airavata/model/experiment/__init__.py
+airavata/model/experiment/constants.py
+airavata/model/experiment/ttypes.py
+airavata/model/group/__init__.py
+airavata/model/group/constants.py
+airavata/model/group/ttypes.py
+airavata/model/job/__init__.py
+airavata/model/job/constants.py
+airavata/model/job/ttypes.py
+airavata/model/messaging/__init__.py
+airavata/model/messaging/event/__init__.py
+airavata/model/messaging/event/constants.py
+airavata/model/messaging/event/ttypes.py
+airavata/model/process/__init__.py
+airavata/model/process/constants.py
+airavata/model/process/ttypes.py
+airavata/model/scheduling/__init__.py
+airavata/model/scheduling/constants.py
+airavata/model/scheduling/ttypes.py
+airavata/model/security/__init__.py
+airavata/model/security/constants.py
+airavata/model/security/ttypes.py
+airavata/model/sharing/__init__.py
+airavata/model/sharing/constants.py
+airavata/model/sharing/ttypes.py
+airavata/model/status/__init__.py
+airavata/model/status/constants.py
+airavata/model/status/ttypes.py
+airavata/model/task/__init__.py
+airavata/model/task/constants.py
+airavata/model/task/ttypes.py
+airavata/model/tenant/__init__.py
+airavata/model/tenant/constants.py
+airavata/model/tenant/ttypes.py
+airavata/model/user/__init__.py
+airavata/model/user/constants.py
+airavata/model/user/ttypes.py
+airavata/model/workflow/__init__.py
+airavata/model/workflow/constants.py
+airavata/model/workflow/ttypes.py
+airavata/model/workspace/__init__.py
+airavata/model/workspace/constants.py
+airavata/model/workspace/ttypes.py
+airavata/service/__init__.py
+airavata/service/profile/__init__.py
+airavata/service/profile/constants.py
+airavata/service/profile/ttypes.py
+airavata/service/profile/groupmanager/__init__.py
+airavata/service/profile/groupmanager/cpi/GroupManagerService.py
+airavata/service/profile/groupmanager/cpi/__init__.py
+airavata/service/profile/groupmanager/cpi/constants.py
+airavata/service/profile/groupmanager/cpi/ttypes.py
+airavata/service/profile/groupmanager/cpi/error/__init__.py
+airavata/service/profile/groupmanager/cpi/error/constants.py
+airavata/service/profile/groupmanager/cpi/error/ttypes.py
+airavata/service/profile/iam/__init__.py
+airavata/service/profile/iam/admin/__init__.py
+airavata/service/profile/iam/admin/services/__init__.py
+airavata/service/profile/iam/admin/services/cpi/IamAdminServices.py
+airavata/service/profile/iam/admin/services/cpi/__init__.py
+airavata/service/profile/iam/admin/services/cpi/constants.py
+airavata/service/profile/iam/admin/services/cpi/ttypes.py
+airavata/service/profile/iam/admin/services/cpi/error/__init__.py
+airavata/service/profile/iam/admin/services/cpi/error/constants.py
+airavata/service/profile/iam/admin/services/cpi/error/ttypes.py
+airavata/service/profile/tenant/__init__.py
+airavata/service/profile/tenant/cpi/TenantProfileService.py
+airavata/service/profile/tenant/cpi/__init__.py
+airavata/service/profile/tenant/cpi/constants.py
+airavata/service/profile/tenant/cpi/ttypes.py
+airavata/service/profile/tenant/cpi/error/__init__.py
+airavata/service/profile/tenant/cpi/error/constants.py
+airavata/service/profile/tenant/cpi/error/ttypes.py
+airavata/service/profile/user/__init__.py
+airavata/service/profile/user/cpi/UserProfileService.py
+airavata/service/profile/user/cpi/__init__.py
+airavata/service/profile/user/cpi/constants.py
+airavata/service/profile/user/cpi/ttypes.py
+airavata/service/profile/user/cpi/error/__init__.py
+airavata/service/profile/user/cpi/error/constants.py
+airavata/service/profile/user/cpi/error/ttypes.py
+airavata_python_sdk.egg-info/PKG-INFO
+airavata_python_sdk.egg-info/SOURCES.txt
+airavata_python_sdk.egg-info/dependency_links.txt
+airavata_python_sdk.egg-info/top_level.txt
+clients/__init__.py
+clients/api_server_client.py
+clients/credential_store_client.py
+clients/file_handling_client.py
+clients/group_manager_client.py
+clients/iam_admin_client.py
+clients/keycloak_token_fetcher.py
+clients/sftp_file_handling_client.py
+clients/sharing_registry_client.py
+clients/tenant_profile_client.py
+clients/user_profile_client.py
+clients/utils/__init__.py
+clients/utils/api_server_client_util.py
+clients/utils/data_model_creation_util.py
+samples/__init__.py
+samples/api_server_client_samples.py
+samples/create_launch_echo_experiment.py
+samples/create_launch_gaussian_experiment.py
+samples/file_utils.py
+samples/group_manager_client_samples.py
+samples/iam_admin_client_samples.py
+samples/metadata_fetcher.py
+samples/sharing_registry_client_samples.py
+samples/tenant_profile_client_samples.py
+samples/user_profile_client_samples.py
+samples/resources/__init__.py
+transport/__init__.py
+transport/settings.ini
+transport/settings.py
+transport/utils.py
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/dependency_links.txt b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/top_level.txt b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/top_level.txt
new file mode 100644
index 0000000..c01b4d5
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata_python_sdk.egg-info/top_level.txt
@@ -0,0 +1,4 @@
+airavata
+clients
+samples
+transport
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/Airavata.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/Airavata.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/Airavata.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/Airavata.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/CredentialStoreService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/CredentialStoreService.py
new file mode 100644
index 0000000..434741f
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/CredentialStoreService.py
@@ -0,0 +1,2851 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+import airavata.base.api.BaseAPI
+import logging
+from .ttypes import *
+from thrift.Thrift import TProcessor
+from thrift.transport import TTransport
+
+
+class Iface(airavata.base.api.BaseAPI.Iface):
+    def getCredentialSummary(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getAllCredentialSummaries(self, type, accessibleTokenIds, gatewayId):
+        """
+        Parameters:
+         - type
+         - accessibleTokenIds
+         - gatewayId
+        """
+        pass
+
+    def addSSHCredential(self, sshCredential):
+        """
+        This method is to add SSHCredential which will return the token Id in success
+
+
+        Parameters:
+         - sshCredential
+        """
+        pass
+
+    def addCertificateCredential(self, certificateCredential):
+        """
+        Parameters:
+         - certificateCredential
+        """
+        pass
+
+    def addPasswordCredential(self, passwordCredential):
+        """
+        Parameters:
+         - passwordCredential
+        """
+        pass
+
+    def getSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getCertificateCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getPasswordCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getAllCredentialSummaryForGateway(self, type, gatewayId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+        """
+        pass
+
+    def getAllCredentialSummaryForUserInGateway(self, type, gatewayId, userId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+         - userId
+        """
+        pass
+
+    def getAllPWDCredentialsForGateway(self, gatewayId):
+        """
+        Parameters:
+         - gatewayId
+        """
+        pass
+
+    def deleteSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def deletePWDCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+
+class Client(airavata.base.api.BaseAPI.Client, Iface):
+    def __init__(self, iprot, oprot=None):
+        airavata.base.api.BaseAPI.Client.__init__(self, iprot, oprot)
+
+    def getCredentialSummary(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getCredentialSummary(tokenId, gatewayId)
+        return self.recv_getCredentialSummary()
+
+    def send_getCredentialSummary(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getCredentialSummary', TMessageType.CALL, self._seqid)
+        args = getCredentialSummary_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getCredentialSummary(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getCredentialSummary_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getCredentialSummary failed: unknown result")
+
+    def getAllCredentialSummaries(self, type, accessibleTokenIds, gatewayId):
+        """
+        Parameters:
+         - type
+         - accessibleTokenIds
+         - gatewayId
+        """
+        self.send_getAllCredentialSummaries(type, accessibleTokenIds, gatewayId)
+        return self.recv_getAllCredentialSummaries()
+
+    def send_getAllCredentialSummaries(self, type, accessibleTokenIds, gatewayId):
+        self._oprot.writeMessageBegin('getAllCredentialSummaries', TMessageType.CALL, self._seqid)
+        args = getAllCredentialSummaries_args()
+        args.type = type
+        args.accessibleTokenIds = accessibleTokenIds
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllCredentialSummaries(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllCredentialSummaries_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaries failed: unknown result")
+
+    def addSSHCredential(self, sshCredential):
+        """
+        This method is to add SSHCredential which will return the token Id in success
+
+
+        Parameters:
+         - sshCredential
+        """
+        self.send_addSSHCredential(sshCredential)
+        return self.recv_addSSHCredential()
+
+    def send_addSSHCredential(self, sshCredential):
+        self._oprot.writeMessageBegin('addSSHCredential', TMessageType.CALL, self._seqid)
+        args = addSSHCredential_args()
+        args.sshCredential = sshCredential
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_addSSHCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = addSSHCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "addSSHCredential failed: unknown result")
+
+    def addCertificateCredential(self, certificateCredential):
+        """
+        Parameters:
+         - certificateCredential
+        """
+        self.send_addCertificateCredential(certificateCredential)
+        return self.recv_addCertificateCredential()
+
+    def send_addCertificateCredential(self, certificateCredential):
+        self._oprot.writeMessageBegin('addCertificateCredential', TMessageType.CALL, self._seqid)
+        args = addCertificateCredential_args()
+        args.certificateCredential = certificateCredential
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_addCertificateCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = addCertificateCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "addCertificateCredential failed: unknown result")
+
+    def addPasswordCredential(self, passwordCredential):
+        """
+        Parameters:
+         - passwordCredential
+        """
+        self.send_addPasswordCredential(passwordCredential)
+        return self.recv_addPasswordCredential()
+
+    def send_addPasswordCredential(self, passwordCredential):
+        self._oprot.writeMessageBegin('addPasswordCredential', TMessageType.CALL, self._seqid)
+        args = addPasswordCredential_args()
+        args.passwordCredential = passwordCredential
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_addPasswordCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = addPasswordCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "addPasswordCredential failed: unknown result")
+
+    def getSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getSSHCredential(tokenId, gatewayId)
+        return self.recv_getSSHCredential()
+
+    def send_getSSHCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getSSHCredential', TMessageType.CALL, self._seqid)
+        args = getSSHCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getSSHCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getSSHCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getSSHCredential failed: unknown result")
+
+    def getCertificateCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getCertificateCredential(tokenId, gatewayId)
+        return self.recv_getCertificateCredential()
+
+    def send_getCertificateCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getCertificateCredential', TMessageType.CALL, self._seqid)
+        args = getCertificateCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getCertificateCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getCertificateCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getCertificateCredential failed: unknown result")
+
+    def getPasswordCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getPasswordCredential(tokenId, gatewayId)
+        return self.recv_getPasswordCredential()
+
+    def send_getPasswordCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getPasswordCredential', TMessageType.CALL, self._seqid)
+        args = getPasswordCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getPasswordCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getPasswordCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getPasswordCredential failed: unknown result")
+
+    def getAllCredentialSummaryForGateway(self, type, gatewayId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+        """
+        self.send_getAllCredentialSummaryForGateway(type, gatewayId)
+        return self.recv_getAllCredentialSummaryForGateway()
+
+    def send_getAllCredentialSummaryForGateway(self, type, gatewayId):
+        self._oprot.writeMessageBegin('getAllCredentialSummaryForGateway', TMessageType.CALL, self._seqid)
+        args = getAllCredentialSummaryForGateway_args()
+        args.type = type
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllCredentialSummaryForGateway(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllCredentialSummaryForGateway_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaryForGateway failed: unknown result")
+
+    def getAllCredentialSummaryForUserInGateway(self, type, gatewayId, userId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+         - userId
+        """
+        self.send_getAllCredentialSummaryForUserInGateway(type, gatewayId, userId)
+        return self.recv_getAllCredentialSummaryForUserInGateway()
+
+    def send_getAllCredentialSummaryForUserInGateway(self, type, gatewayId, userId):
+        self._oprot.writeMessageBegin('getAllCredentialSummaryForUserInGateway', TMessageType.CALL, self._seqid)
+        args = getAllCredentialSummaryForUserInGateway_args()
+        args.type = type
+        args.gatewayId = gatewayId
+        args.userId = userId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllCredentialSummaryForUserInGateway(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllCredentialSummaryForUserInGateway_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaryForUserInGateway failed: unknown result")
+
+    def getAllPWDCredentialsForGateway(self, gatewayId):
+        """
+        Parameters:
+         - gatewayId
+        """
+        self.send_getAllPWDCredentialsForGateway(gatewayId)
+        return self.recv_getAllPWDCredentialsForGateway()
+
+    def send_getAllPWDCredentialsForGateway(self, gatewayId):
+        self._oprot.writeMessageBegin('getAllPWDCredentialsForGateway', TMessageType.CALL, self._seqid)
+        args = getAllPWDCredentialsForGateway_args()
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllPWDCredentialsForGateway(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllPWDCredentialsForGateway_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllPWDCredentialsForGateway failed: unknown result")
+
+    def deleteSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_deleteSSHCredential(tokenId, gatewayId)
+        return self.recv_deleteSSHCredential()
+
+    def send_deleteSSHCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('deleteSSHCredential', TMessageType.CALL, self._seqid)
+        args = deleteSSHCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_deleteSSHCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = deleteSSHCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteSSHCredential failed: unknown result")
+
+    def deletePWDCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_deletePWDCredential(tokenId, gatewayId)
+        return self.recv_deletePWDCredential()
+
+    def send_deletePWDCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('deletePWDCredential', TMessageType.CALL, self._seqid)
+        args = deletePWDCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_deletePWDCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = deletePWDCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "deletePWDCredential failed: unknown result")
+
+
+class Processor(airavata.base.api.BaseAPI.Processor, Iface, TProcessor):
+    def __init__(self, handler):
+        airavata.base.api.BaseAPI.Processor.__init__(self, handler)
+        self._processMap["getCredentialSummary"] = Processor.process_getCredentialSummary
+        self._processMap["getAllCredentialSummaries"] = Processor.process_getAllCredentialSummaries
+        self._processMap["addSSHCredential"] = Processor.process_addSSHCredential
+        self._processMap["addCertificateCredential"] = Processor.process_addCertificateCredential
+        self._processMap["addPasswordCredential"] = Processor.process_addPasswordCredential
+        self._processMap["getSSHCredential"] = Processor.process_getSSHCredential
+        self._processMap["getCertificateCredential"] = Processor.process_getCertificateCredential
+        self._processMap["getPasswordCredential"] = Processor.process_getPasswordCredential
+        self._processMap["getAllCredentialSummaryForGateway"] = Processor.process_getAllCredentialSummaryForGateway
+        self._processMap["getAllCredentialSummaryForUserInGateway"] = Processor.process_getAllCredentialSummaryForUserInGateway
+        self._processMap["getAllPWDCredentialsForGateway"] = Processor.process_getAllPWDCredentialsForGateway
+        self._processMap["deleteSSHCredential"] = Processor.process_deleteSSHCredential
+        self._processMap["deletePWDCredential"] = Processor.process_deletePWDCredential
+
+    def process(self, iprot, oprot):
+        (name, type, seqid) = iprot.readMessageBegin()
+        if name not in self._processMap:
+            iprot.skip(TType.STRUCT)
+            iprot.readMessageEnd()
+            x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
+            oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
+            x.write(oprot)
+            oprot.writeMessageEnd()
+            oprot.trans.flush()
+            return
+        else:
+            self._processMap[name](self, seqid, iprot, oprot)
+        return True
+
+    def process_getCredentialSummary(self, seqid, iprot, oprot):
+        args = getCredentialSummary_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getCredentialSummary_result()
+        try:
+            result.success = self._handler.getCredentialSummary(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getCredentialSummary", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllCredentialSummaries(self, seqid, iprot, oprot):
+        args = getAllCredentialSummaries_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllCredentialSummaries_result()
+        try:
+            result.success = self._handler.getAllCredentialSummaries(args.type, args.accessibleTokenIds, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllCredentialSummaries", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_addSSHCredential(self, seqid, iprot, oprot):
+        args = addSSHCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = addSSHCredential_result()
+        try:
+            result.success = self._handler.addSSHCredential(args.sshCredential)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("addSSHCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_addCertificateCredential(self, seqid, iprot, oprot):
+        args = addCertificateCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = addCertificateCredential_result()
+        try:
+            result.success = self._handler.addCertificateCredential(args.certificateCredential)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("addCertificateCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_addPasswordCredential(self, seqid, iprot, oprot):
+        args = addPasswordCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = addPasswordCredential_result()
+        try:
+            result.success = self._handler.addPasswordCredential(args.passwordCredential)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("addPasswordCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getSSHCredential(self, seqid, iprot, oprot):
+        args = getSSHCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getSSHCredential_result()
+        try:
+            result.success = self._handler.getSSHCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getSSHCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getCertificateCredential(self, seqid, iprot, oprot):
+        args = getCertificateCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getCertificateCredential_result()
+        try:
+            result.success = self._handler.getCertificateCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getCertificateCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getPasswordCredential(self, seqid, iprot, oprot):
+        args = getPasswordCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getPasswordCredential_result()
+        try:
+            result.success = self._handler.getPasswordCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getPasswordCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllCredentialSummaryForGateway(self, seqid, iprot, oprot):
+        args = getAllCredentialSummaryForGateway_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllCredentialSummaryForGateway_result()
+        try:
+            result.success = self._handler.getAllCredentialSummaryForGateway(args.type, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllCredentialSummaryForGateway", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllCredentialSummaryForUserInGateway(self, seqid, iprot, oprot):
+        args = getAllCredentialSummaryForUserInGateway_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllCredentialSummaryForUserInGateway_result()
+        try:
+            result.success = self._handler.getAllCredentialSummaryForUserInGateway(args.type, args.gatewayId, args.userId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllCredentialSummaryForUserInGateway", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllPWDCredentialsForGateway(self, seqid, iprot, oprot):
+        args = getAllPWDCredentialsForGateway_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllPWDCredentialsForGateway_result()
+        try:
+            result.success = self._handler.getAllPWDCredentialsForGateway(args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllPWDCredentialsForGateway", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_deleteSSHCredential(self, seqid, iprot, oprot):
+        args = deleteSSHCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = deleteSSHCredential_result()
+        try:
+            result.success = self._handler.deleteSSHCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("deleteSSHCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_deletePWDCredential(self, seqid, iprot, oprot):
+        args = deletePWDCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = deletePWDCredential_result()
+        try:
+            result.success = self._handler.deletePWDCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("deletePWDCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+# HELPER FUNCTIONS AND STRUCTURES
+
+
+class getCredentialSummary_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCredentialSummary_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getCredentialSummary_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.CredentialSummary()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCredentialSummary_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaries_args(object):
+    """
+    Attributes:
+     - type
+     - accessibleTokenIds
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'type', None, None, ),  # 1
+        (2, TType.LIST, 'accessibleTokenIds', (TType.STRING, 'UTF8', False), None, ),  # 2
+        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
+    )
+
+    def __init__(self, type=None, accessibleTokenIds=None, gatewayId=None,):
+        self.type = type
+        self.accessibleTokenIds = accessibleTokenIds
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.LIST:
+                    self.accessibleTokenIds = []
+                    (_etype3, _size0) = iprot.readListBegin()
+                    for _i4 in range(_size0):
+                        _elem5 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.accessibleTokenIds.append(_elem5)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaries_args')
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 1)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.accessibleTokenIds is not None:
+            oprot.writeFieldBegin('accessibleTokenIds', TType.LIST, 2)
+            oprot.writeListBegin(TType.STRING, len(self.accessibleTokenIds))
+            for iter6 in self.accessibleTokenIds:
+                oprot.writeString(iter6.encode('utf-8') if sys.version_info[0] == 2 else iter6)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 3)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.type is None:
+            raise TProtocolException(message='Required field type is unset!')
+        if self.accessibleTokenIds is None:
+            raise TProtocolException(message='Required field accessibleTokenIds is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaries_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype10, _size7) = iprot.readListBegin()
+                    for _i11 in range(_size7):
+                        _elem12 = airavata.model.credential.store.ttypes.CredentialSummary()
+                        _elem12.read(iprot)
+                        self.success.append(_elem12)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaries_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter13 in self.success:
+                iter13.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addSSHCredential_args(object):
+    """
+    Attributes:
+     - sshCredential
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'sshCredential', (airavata.model.credential.store.ttypes.SSHCredential, airavata.model.credential.store.ttypes.SSHCredential.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, sshCredential=None,):
+        self.sshCredential = sshCredential
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.sshCredential = airavata.model.credential.store.ttypes.SSHCredential()
+                    self.sshCredential.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addSSHCredential_args')
+        if self.sshCredential is not None:
+            oprot.writeFieldBegin('sshCredential', TType.STRUCT, 1)
+            self.sshCredential.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.sshCredential is None:
+            raise TProtocolException(message='Required field sshCredential is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addSSHCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addSSHCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addCertificateCredential_args(object):
+    """
+    Attributes:
+     - certificateCredential
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'certificateCredential', (airavata.model.credential.store.ttypes.CertificateCredential, airavata.model.credential.store.ttypes.CertificateCredential.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, certificateCredential=None,):
+        self.certificateCredential = certificateCredential
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.certificateCredential = airavata.model.credential.store.ttypes.CertificateCredential()
+                    self.certificateCredential.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addCertificateCredential_args')
+        if self.certificateCredential is not None:
+            oprot.writeFieldBegin('certificateCredential', TType.STRUCT, 1)
+            self.certificateCredential.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.certificateCredential is None:
+            raise TProtocolException(message='Required field certificateCredential is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addCertificateCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addCertificateCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addPasswordCredential_args(object):
+    """
+    Attributes:
+     - passwordCredential
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'passwordCredential', (airavata.model.credential.store.ttypes.PasswordCredential, airavata.model.credential.store.ttypes.PasswordCredential.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, passwordCredential=None,):
+        self.passwordCredential = passwordCredential
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.passwordCredential = airavata.model.credential.store.ttypes.PasswordCredential()
+                    self.passwordCredential.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addPasswordCredential_args')
+        if self.passwordCredential is not None:
+            oprot.writeFieldBegin('passwordCredential', TType.STRUCT, 1)
+            self.passwordCredential.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.passwordCredential is None:
+            raise TProtocolException(message='Required field passwordCredential is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addPasswordCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addPasswordCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getSSHCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getSSHCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getSSHCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.SSHCredential, airavata.model.credential.store.ttypes.SSHCredential.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.SSHCredential()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getSSHCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getCertificateCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCertificateCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getCertificateCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.CertificateCredential, airavata.model.credential.store.ttypes.CertificateCredential.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.CertificateCredential()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCertificateCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getPasswordCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getPasswordCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getPasswordCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.PasswordCredential, airavata.model.credential.store.ttypes.PasswordCredential.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.PasswordCredential()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getPasswordCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForGateway_args(object):
+    """
+    Attributes:
+     - type
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'type', None, None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, type=None, gatewayId=None,):
+        self.type = type
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForGateway_args')
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 1)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.type is None:
+            raise TProtocolException(message='Required field type is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForGateway_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype17, _size14) = iprot.readListBegin()
+                    for _i18 in range(_size14):
+                        _elem19 = airavata.model.credential.store.ttypes.CredentialSummary()
+                        _elem19.read(iprot)
+                        self.success.append(_elem19)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForGateway_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter20 in self.success:
+                iter20.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForUserInGateway_args(object):
+    """
+    Attributes:
+     - type
+     - gatewayId
+     - userId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'type', None, None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+        (3, TType.STRING, 'userId', 'UTF8', None, ),  # 3
+    )
+
+    def __init__(self, type=None, gatewayId=None, userId=None,):
+        self.type = type
+        self.gatewayId = gatewayId
+        self.userId = userId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForUserInGateway_args')
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 1)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        if self.userId is not None:
+            oprot.writeFieldBegin('userId', TType.STRING, 3)
+            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.type is None:
+            raise TProtocolException(message='Required field type is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        if self.userId is None:
+            raise TProtocolException(message='Required field userId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForUserInGateway_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype24, _size21) = iprot.readListBegin()
+                    for _i25 in range(_size21):
+                        _elem26 = airavata.model.credential.store.ttypes.CredentialSummary()
+                        _elem26.read(iprot)
+                        self.success.append(_elem26)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForUserInGateway_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter27 in self.success:
+                iter27.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllPWDCredentialsForGateway_args(object):
+    """
+    Attributes:
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 1
+    )
+
+    def __init__(self, gatewayId=None,):
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllPWDCredentialsForGateway_args')
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 1)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllPWDCredentialsForGateway_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.MAP:
+                    self.success = {}
+                    (_ktype29, _vtype30, _size28) = iprot.readMapBegin()
+                    for _i32 in range(_size28):
+                        _key33 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        _val34 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.success[_key33] = _val34
+                    iprot.readMapEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllPWDCredentialsForGateway_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.MAP, 0)
+            oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
+            for kiter35, viter36 in self.success.items():
+                oprot.writeString(kiter35.encode('utf-8') if sys.version_info[0] == 2 else kiter35)
+                oprot.writeString(viter36.encode('utf-8') if sys.version_info[0] == 2 else viter36)
+            oprot.writeMapEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deleteSSHCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deleteSSHCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deleteSSHCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.BOOL, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.BOOL:
+                    self.success = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deleteSSHCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.BOOL, 0)
+            oprot.writeBool(self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deletePWDCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deletePWDCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deletePWDCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.BOOL, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.BOOL:
+                    self.success = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deletePWDCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.BOOL, 0)
+            oprot.writeBool(self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/__init__.py
new file mode 100644
index 0000000..5d704d6
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/__init__.py
@@ -0,0 +1 @@
+__all__ = ['ttypes', 'constants', 'CredentialStoreService']
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/constants.py
new file mode 100644
index 0000000..6cfae29
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/constants.py
@@ -0,0 +1,13 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+from .ttypes import *
+CS_CPI_VERSION = "0.18.0"
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/error/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/error/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/error/ttypes.py
new file mode 100644
index 0000000..87f6b46
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/error/ttypes.py
@@ -0,0 +1,78 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+
+from thrift.transport import TTransport
+
+
+class CredentialStoreException(TException):
+    """
+    Attributes:
+     - message
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'message', 'UTF8', None, ),  # 1
+    )
+
+    def __init__(self, message=None,):
+        self.message = message
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.message = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('CredentialStoreException')
+        if self.message is not None:
+            oprot.writeFieldBegin('message', TType.STRING, 1)
+            oprot.writeString(self.message.encode('utf-8') if sys.version_info[0] == 2 else self.message)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.message is None:
+            raise TProtocolException(message='Required field message is unset!')
+        return
+
+    def __str__(self):
+        return repr(self)
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/ttypes.py
new file mode 100644
index 0000000..ef69474
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/credential/store/ttypes.py
@@ -0,0 +1,16 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+import airavata.model.credential.store.ttypes
+import airavata.api.credential.store.error.ttypes
+import airavata.base.api.ttypes
+
+from thrift.transport import TTransport
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/error/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/error/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/error/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/error/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/SharingRegistryService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/sharing/SharingRegistryService.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/SharingRegistryService.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/sharing/SharingRegistryService.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/sharing/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/sharing/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/sharing/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/sharing/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/sharing/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/sharing/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/sharing/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/api/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/api/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/BaseAPI.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/api/BaseAPI.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/BaseAPI.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/api/BaseAPI.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/api/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/api/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/api/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/api/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/api/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/base/api/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/base/api/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/accountprovisioning/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/accountprovisioning/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/accountprovisioning/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/accountprovisioning/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/accountprovisioning/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/accountprovisioning/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/accountprovisioning/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appdeployment/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appdeployment/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appdeployment/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appdeployment/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appdeployment/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appdeployment/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appdeployment/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appinterface/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appinterface/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appinterface/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appinterface/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appinterface/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/appinterface/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/appinterface/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/computeresource/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/computeresource/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/computeresource/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/computeresource/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/computeresource/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/computeresource/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/computeresource/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewaygroups/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewaygroups/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewaygroups/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewaygroups/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewaygroups/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewaygroups/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewaygroups/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewayprofile/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewayprofile/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewayprofile/constants.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/constants.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewayprofile/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewayprofile/ttypes.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/gatewayprofile/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/gatewayprofile/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/groupresourceprofile/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/groupresourceprofile/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/groupresourceprofile/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/groupresourceprofile/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/groupresourceprofile/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/groupresourceprofile/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parallelism/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parallelism/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parallelism/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parallelism/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parallelism/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parallelism/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parallelism/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parser/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parser/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parser/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parser/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parser/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/parser/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/parser/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/storageresource/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/storageresource/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/storageresource/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/storageresource/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/storageresource/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/storageresource/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/storageresource/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/userresourceprofile/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/userresourceprofile/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/userresourceprofile/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/userresourceprofile/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/userresourceprofile/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/userresourceprofile/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/userresourceprofile/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/io/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/io/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/io/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/io/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/io/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/io/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/commons/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/commons/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/commons/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/commons/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/commons/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/commons/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/commons/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/credential/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/credential/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/credential/store/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/credential/store/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/credential/store/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/credential/store/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/credential/store/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/credential/store/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/credential/store/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/movement/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/movement/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/movement/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/movement/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/movement/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/movement/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/movement/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/replica/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/replica/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/replica/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/replica/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/replica/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/data/replica/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/data/replica/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/dbevent/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/dbevent/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/dbevent/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/dbevent/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/dbevent/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/dbevent/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/dbevent/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/experiment/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/experiment/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/experiment/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/experiment/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/experiment/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/experiment/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/experiment/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/group/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/group/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/group/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/group/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/group/ttypes.py
similarity index 98%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/group/ttypes.py
index 3be6af0..8bce444 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/group/ttypes.py
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/group/ttypes.py
@@ -48,17 +48,20 @@
     WRITE = 0
     READ = 1
     OWNER = 2
+    MANAGE_SHARING = 3
 
     _VALUES_TO_NAMES = {
         0: "WRITE",
         1: "READ",
         2: "OWNER",
+        3: "MANAGE_SHARING",
     }
 
     _NAMES_TO_VALUES = {
         "WRITE": 0,
         "READ": 1,
         "OWNER": 2,
+        "MANAGE_SHARING": 3,
     }
 
 
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/job/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/job/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/job/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/job/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/job/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/job/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/job/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/messaging/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/messaging/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/messaging/event/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/messaging/event/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/messaging/event/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/messaging/event/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/messaging/event/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/messaging/event/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/messaging/event/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/process/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/process/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/process/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/process/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/process/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/process/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/process/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/scheduling/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/scheduling/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/scheduling/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/scheduling/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/scheduling/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/scheduling/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/scheduling/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/security/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/security/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/security/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/security/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/security/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/security/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/security/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/sharing/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/sharing/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/sharing/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/sharing/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/sharing/ttypes.py
similarity index 98%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/sharing/ttypes.py
index 1f2f0e9..661367f 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/sharing/ttypes.py
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/sharing/ttypes.py
@@ -190,6 +190,7 @@
     <li>description : A short description for the domain</li>
     <li>createdTime : Will be set by the system</li>
     <li>updatedTime : Will be set by the system</li>
+    <li>initialUserGroupId : New users will automatically be added to this group</li>
 
 
     Attributes:
@@ -198,6 +199,7 @@
      - description
      - createdTime
      - updatedTime
+     - initialUserGroupId
     """
 
     thrift_spec = (
@@ -207,14 +209,16 @@
         (3, TType.STRING, 'description', 'UTF8', None, ),  # 3
         (4, TType.I64, 'createdTime', None, None, ),  # 4
         (5, TType.I64, 'updatedTime', None, None, ),  # 5
+        (6, TType.STRING, 'initialUserGroupId', 'UTF8', None, ),  # 6
     )
 
-    def __init__(self, domainId=thrift_spec[1][4], name=None, description=None, createdTime=None, updatedTime=None,):
+    def __init__(self, domainId=thrift_spec[1][4], name=None, description=None, createdTime=None, updatedTime=None, initialUserGroupId=None,):
         self.domainId = domainId
         self.name = name
         self.description = description
         self.createdTime = createdTime
         self.updatedTime = updatedTime
+        self.initialUserGroupId = initialUserGroupId
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -250,6 +254,11 @@
                     self.updatedTime = iprot.readI64()
                 else:
                     iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.STRING:
+                    self.initialUserGroupId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
             else:
                 iprot.skip(ftype)
             iprot.readFieldEnd()
@@ -280,6 +289,10 @@
             oprot.writeFieldBegin('updatedTime', TType.I64, 5)
             oprot.writeI64(self.updatedTime)
             oprot.writeFieldEnd()
+        if self.initialUserGroupId is not None:
+            oprot.writeFieldBegin('initialUserGroupId', TType.STRING, 6)
+            oprot.writeString(self.initialUserGroupId.encode('utf-8') if sys.version_info[0] == 2 else self.initialUserGroupId)
+            oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
 
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/status/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/status/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/status/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/status/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/status/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/status/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/status/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/task/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/task/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/task/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/task/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/task/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/task/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/task/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/tenant/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/tenant/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/tenant/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/tenant/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/tenant/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/tenant/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/tenant/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/user/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/user/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/user/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/user/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/user/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/user/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/user/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workflow/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workflow/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workflow/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workflow/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workflow/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workflow/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workflow/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workspace/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workspace/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workspace/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workspace/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workspace/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/workspace/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/workspace/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/GroupManagerService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/GroupManagerService.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/GroupManagerService.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/GroupManagerService.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/error/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/error/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/error/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/error/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/groupmanager/cpi/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/groupmanager/cpi/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/IamAdminServices.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/IamAdminServices.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/IamAdminServices.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/IamAdminServices.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/error/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/error/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/error/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/error/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/iam/admin/services/cpi/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/iam/admin/services/cpi/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/TenantProfileService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/TenantProfileService.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/TenantProfileService.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/TenantProfileService.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/error/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/error/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/error/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/error/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/tenant/cpi/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/tenant/cpi/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/UserProfileService.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/UserProfileService.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/UserProfileService.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/UserProfileService.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/error/__init__.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/__init__.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/error/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/constants.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/error/constants.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/constants.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/error/constants.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/error/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/error/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/error/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/ttypes.py
similarity index 100%
rename from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/service/profile/user/cpi/ttypes.py
rename to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/service/profile/user/cpi/ttypes.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/api_server_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/api_server_client.py
new file mode 100644
index 0000000..e5ed86e
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/api_server_client.py
@@ -0,0 +1,7049 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import APIServerClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import InvalidRequestException, AiravataClientException, AiravataSystemException, \
+    AuthorizationException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class APIServerClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.api_server_settings = APIServerClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.api_server_client_pool = utils.initialize_api_client_pool(self.api_server_settings.API_SERVER_HOST,
+                                                                       self.api_server_settings.API_SERVER_PORT,
+                                                                       self.api_server_settings.API_SERVER_SECURE)
+
+    def is_user_exists(self, authz_token, gateway_id, user_name):
+        """
+        :param authz_token:
+        :param gateway_id:
+        :param user_name:
+        :return: true/false
+        """
+        try:
+            return self.api_server_client_pool.isUserExists(authz_token, gateway_id, user_name)
+        except InvalidRequestException:
+            logger.exception("Error occurred in is_user_exists, probably due to invalid parameters ")
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in is_user_exists, probably due to  client misconfiguration ")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in is_user_exists, probably due to server side error ")
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in is_user_exists, probably due to invalid authz token ")
+            raise
+
+    def add_gateway(self, authz_token, gateway):
+        """
+        :param authz_token:
+        :param gateway:
+        :return: gatewayId
+        """
+        try:
+            return self.api_server_client_pool.addGateway(authz_token, gateway)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_gateway, probably due to invalid parameters ")
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in add_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_gateway, probably due to server side error ",
+                             )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in add_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_users_in_gateway(self, authz_token, gateway_id):
+        """
+        :param authz_token:
+        :param gateway_id:
+        :return:
+        """
+        try:
+            return self.api_server_client_pool.getAllUsersInGateway(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_users_in_gateway, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_all_users_in_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_users_in_gateway, probably due to server side error ",
+                             )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_users_in_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_gateway(self, authz_token, gateway_id, updated_gateway):
+        """
+        update  the gateway with gateway_id with provided information
+        :param authz_token:
+        :param gateway_id:
+        :param updated_gateway:
+        :return:
+        """
+        try:
+            return self.api_server_client_pool.updateGateway(authz_token, gateway_id, updated_gateway)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_gateway, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_gateway, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_gateway(self, authz_token, gateway_id):
+        """
+        return gateway provided by the gateway_id
+        :param authz_token:
+        :param gateway_id:
+        :param updated_gateway:
+        :return: gateway
+        """
+        try:
+            return self.api_server_client_pool.getGateway(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_gateway, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_gateway, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_gateway(self, authz_token, gateway_id):
+        """
+        delete the given gateway
+        :param authz_token:
+        :param gateway_id:
+        :return: true/false
+        """
+        try:
+            return self.api_server_client_pool.deleteGateway(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_gateway, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_gateway, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_gateways(self, authz_token):
+        """
+        get all gateways
+        :param authz_token:
+        :return: gateways
+        """
+        try:
+            return self.api_server_client_pool.getAllGateways(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_gateways, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_all_gateways, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_gateways, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_gateways, probably due to invalid authz token ",
+                             )
+            raise
+
+    def is_gateway_exist(self, authz_token, gateway_id):
+        """
+        return gateway exists
+        :param authz_token:
+        :param gateway_id:
+        :return: true/false
+        """
+        try:
+            return self.api_server_client_pool.isGatewayExist(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in is_gateway_exist, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in is_gateway_exist, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in is_gateway_exist, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in is_gateway_exist, probably due to invalid authz token ")
+            raise
+
+    def create_notification(self, authz_token, notification):
+        """
+        create notification
+        :param authz_token:
+        :param notification:
+        :return: notification id
+        """
+        try:
+            return self.api_server_client_pool.createNotification(authz_token, notification)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_notification, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in create_notification, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_notification, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_notification, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_notification(self, authz_token, notification):
+        """
+        update notification
+        :param authz_token:
+        :param notification:
+        :return: true /false
+        """
+        try:
+            return self.api_server_client_pool.updateNotification(authz_token, notification)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_notification, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_notification, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_notification, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_notification, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_notification(self, authz_token, gateway_id, notification_id):
+        """
+        delete notification
+        :param authz_token:
+        :param gateway_id:
+        :param notification_id:
+        :return: true/false
+        """
+        try:
+            return self.api_server_client_pool.deleteNotification(authz_token, gateway_id, notification_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_notification, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_notification, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_notification, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_notification, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_notification(self, authz_token, gateway_id, notification_id):
+        """
+        get notification
+        :param authz_token:
+        :param gateway_id:
+        :param notification_id:
+        :return: notification
+        """
+        try:
+            return self.api_server_client_pool.getNotification(authz_token, gateway_id, notification_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_notification, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_notification, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_notification, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_notification, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_notifications(self, authz_token, gateway_id):
+        """
+        get all notifications
+        :param authz_token:
+        :param gateway_id:
+        :param notification_id:
+        :return: notifications
+        """
+        try:
+            return self.api_server_client_pool.getAllNotifications(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_notifications, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_all_notifications, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_notifications, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_notifications, probably due to invalid authz token ",
+                             )
+            raise
+
+    def generate_and_register_ssh_keys(self, authz_token, description):
+        """
+        Generate and Register SSH Key Pair with Airavata Credential Store.
+
+        @param description
+           The description field for a credential type, all type of credential can have a description.
+
+        @return airavataCredStoreToken
+          An SSH Key pair is generated and stored in the credential store and associated with users or community account
+          belonging to a Gateway.
+
+
+
+        Parameters:
+         - authz_token
+         - description
+        """
+        try:
+            return self.api_server_client_pool.generateAndRegisterSSHKeys(authz_token, description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in generate_and_register_ssh_keys, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in generate_and_register_ssh_keys, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in generate_and_register_ssh_keys, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in generate_and_register_ssh_keys, probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_pwd_credential(self, authz_token, login_user_name, password, description):
+        """
+        Generate and Register Username PWD Pair with Airavata Credential Store.
+
+        @param loginUserName
+
+        @param password
+
+        @return airavataCredStoreToken
+          An SSH Key pair is generated and stored in the credential store and associated with users or community account
+          belonging to a Gateway.
+        Parameters:
+         :param description:
+         :param authz_token:
+         :param login_user_name:
+         :param authz_token:
+        """
+        try:
+            return self.api_server_client_pool.registerPwdCredential(authz_token, login_user_name, password,
+                                                                     description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_pwd_credential, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in register_pwd_credential, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_pwd_credential, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_pwd_credential, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_credential_summary(self, authz_token, token_id):
+        """
+        get credential summary
+        Parameters:
+         - authz_token
+         - tokenId
+        """
+        try:
+            return self.api_server_client_pool.getCredentialSummary(authz_token, token_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_credential_summary, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_credential_summary, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_credential_summary, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_credential_summary, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_credential_summaries(self, authz_token, type):
+        """
+        Parameters:
+         - authz_token
+         - type
+        """
+        try:
+            return self.api_server_client_pool.getAllCredentialSummaries(authz_token, type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_credential_summaries, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_credential_summaries, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_credential_summaries, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_credential_summaries, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_ssh_pub_key(self, authz_token, airavata_cred_store_token):
+        """
+        Parameters:
+         - authz_token
+         - airavataCredStoreToken
+        """
+        try:
+            return self.api_server_client_pool.delete_ssh_pub_key(authz_token, airavata_cred_store_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_ssh_pub_key, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_ssh_pub_key, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_ssh_pub_key, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_ssh_pub_key, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_pwd_credential(self, authz_token, airavata_cred_store_token):
+        """
+        Parameters:
+         - authz_token
+         - airavataCredStoreToken
+        """
+        try:
+            return self.api_server_client_pool.deletePWDCredential(authz_token, airavata_cred_store_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_pwd_credential, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_pwd_credential, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_pwd_credential, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_pwd_credential, probably due to invalid authz token ",
+                             )
+            raise
+
+    def create_project(self, authz_token, gateway_id, project):
+        """
+
+        Creates a Project with basic metadata.
+           A Project is a container of experiments.
+
+        @param gatewayId
+           The identifier for the requested gateway.
+
+        @param Project
+           The Project Object described in the workspace_model.
+
+
+
+        Parameters:
+         - authz_token
+         - gatewayId
+         - project
+        """
+        try:
+            return self.api_server_client_pool.createProject(authz_token, gateway_id, project)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in create_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_project(self, authz_token, project_id, updated_project):
+        """
+
+        Update an Existing Project
+
+        @param projectId
+           The projectId of the project needed an update.
+
+        @return void
+           Currently this does not return any value.
+
+
+
+        Parameters:
+         - authz_token
+         - projectId
+         - updatedProject
+        """
+        try:
+            return self.api_server_client_pool.updateProject(authz_token, project_id, updated_project)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_project(self, authz_token, project_id):
+        """
+
+        Get a Project by ID
+           This method is to obtain a project by providing a projectId.
+
+        @param projectId
+           projectId of the project you require.
+
+        @return project
+           project data model will be returned.
+
+
+
+        Parameters:
+         - authz_token
+         - projectId
+        """
+        try:
+            return self.api_server_client_pool.getProject(authz_token, project_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_project(self, authz_token, project_id):
+        """
+
+        Delete a Project
+           This method is used to delete an existing Project.
+
+        @param projectId
+           projectId of the project you want to delete.
+
+        @return boolean
+           Boolean identifier for the success or failure of the deletion operation.
+
+           NOTE: This method is not used within gateways connected with Airavata.
+
+
+
+        Parameters:
+         - authz_token
+         - projectId
+        """
+        try:
+            return self.api_server_client_pool.deleteProject(authz_token, project_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_user_projects(self, authz_token, gateway_id, user_name, limit, offset):
+        """
+
+        Get All User Projects
+        Get all Project for the user with pagination. Results will be ordered based on creation time DESC.
+
+        @param gateway_id
+           The identifier for the requested gateway.
+
+        @param user_name
+           The identifier of the user.
+
+        @param limit
+           The amount results to be fetched.
+
+        @param offset
+           The starting point of the results to be fetched.
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - userName
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.getUserProjects(authz_token, gateway_id, user_name, limit, offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def search_projects(self, authz_token, gateway_id, user_name, filters, limit, offset):
+        """
+
+        Search User Projects
+        Search and get all Projects for user by project description or/and project name  with pagination.
+        Results will be ordered based on creation time DESC.
+
+        @param gatewayId
+           The unique identifier of the gateway making the request.
+
+        @param userName
+           The identifier of the user.
+
+        @param filters
+           Map of multiple filter criteria. Currenlt search filters includes Project Name and Project Description
+
+        @param limit
+           The amount results to be fetched.
+
+        @param offset
+           The starting point of the results to be fetched.
+
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - user_name
+         - filters
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.searchProjects(authz_token, gateway_id, user_name, filters, limit,
+                                                              offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in search_projects, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in search_projects, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in search_projects, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in search_projects, probably due to invalid authz token ",
+                             )
+            raise
+
+    def search_experiments(self, authz_token, gateway_id, user_name, filters, limit, offset):
+        """
+        Search Experiments.
+        Search Experiments by using multiple filter criteria with pagination. Results will be sorted based on creation time DESC.
+
+        @param gatewayId
+              Identifier of the requested gateway.
+
+        @param userName
+              Username of the user requesting the search function.
+
+        @param filters
+              Map of multiple filter criteria. Currenlt search filters includes Experiment Name, Description, Application, etc....
+
+        @param limit
+              Amount of results to be fetched.
+
+        @param offset
+              The starting point of the results to be fetched.
+
+        @return ExperimentSummaryModel
+           List of experiments for the given search filter. Here only the Experiment summary will be returned.
+
+
+
+        Parameters:
+         - authz_token
+         - gatewayId
+         - userName
+         - filters
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.searchExperiments(authz_token, gateway_id, user_name, filters, limit,
+                                                                 offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in search_experiments, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in search_experiments, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in search_experiments, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in search_experiments, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment_statistics(self, authz_token, gateway_id, from_time, to_time, user_name, application_name,
+                                  resource_host_name):
+        """
+
+        Get Experiment Statistics
+        Get Experiment Statisitics for a given gateway for a specific time period. This feature is available only for admins of a particular gateway. Gateway admin access is managed by the user roles.
+
+        @param gateway_id
+              Unique identifier of the gateway making the request to fetch statistics.
+
+        @param from_time
+              Starting date time.
+
+        @param to_time
+              Ending data time.
+
+        @param user_name
+              Gateway username substring with which to further filter statistics.
+
+        @param application_name
+              Application id substring with which to further filter statistics.
+
+        @param resource_host_name
+              Hostname id substring with which to further filter statistics.
+
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - from_time
+         - to_time
+         - user_name
+         - application_name
+         - resource_host_name
+        """
+        try:
+            return self.api_server_client_pool.getExperimentStatistics(authz_token, gateway_id, from_time, to_time,
+                                                                       user_name, application_name, resource_host_name)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment_statistics, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment_statistics, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment_statistics, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment_statistics, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiments_in_project(self, authz_token, project_id, limit, offset):
+        """
+
+        Get All Experiments of the Project
+        Get Experiments within project with pagination. Results will be sorted based on creation time DESC.
+
+        @param project_id
+              Uniqie identifier of the project.
+
+        @param limit
+              Amount of results to be fetched.
+
+        @param offset
+              The starting point of the results to be fetched.
+
+
+
+        Parameters:
+         - authz_token
+         - project_id
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.getExperimentsInProject(authz_token, project_id, limit, offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiments_in_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiments_in_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiments_in_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiments_in_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_user_experiments(self, authz_token, gateway_id, user_name, limit, offset):
+        """
+
+        Get All Experiments of the User
+        Get experiments by user with pagination. Results will be sorted based on creation time DESC.
+
+        @param gatewayId
+              Identifier of the requesting gateway.
+
+        @param userName
+              Username of the requested end user.
+
+        @param limit
+              Amount of results to be fetched.
+
+        @param offset
+              The starting point of the results to be fetched.
+
+
+
+        Parameters:
+         - authz_token
+         - gatewayId
+         - userName
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.getUserExperiments(authz_token, gateway_id, user_name, limit, offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_user_experiments, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_user_experiments, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_user_experiments, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_user_experiments, probably due to invalid authz token ",
+                             )
+            raise
+
+    def create_experiment(self, authz_token, gateway_id, experiment):
+        """
+          *
+          * Create New Experiment
+          * Create an experiment for the specified user belonging to the gateway. The gateway identity is not explicitly passed
+          *   but inferred from the sshKeyAuthentication header. This experiment is just a persistent place holder. The client
+          *   has to subsequently configure and launch the created experiment. No action is taken on Airavata Server except
+          *   registering the experiment in a persistent store.
+          *
+          * @param gatewayId
+          *    The unique ID of the gateway where the experiment is been created.
+          *
+          * @param ExperimentModel
+          *    The create experiment will require the basic experiment metadata like the name and description, intended user,
+          *      the gateway identifer and if the experiment should be shared public by defualt. During the creation of an experiment
+          *      the ExperimentMetadata is a required field.
+          *
+          * @return
+          *   The server-side generated.airavata.registry.core.experiment.globally unique identifier.
+          *
+          * @throws org.apache.airavata.model.error.InvalidRequestException
+          *    For any incorrect forming of the request itself.
+          *
+          * @throws org.apache.airavata.model.error.AiravataClientException
+          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+          *
+          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
+          *         gateway registration steps and retry this request.
+          *
+          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+          *         For now this is a place holder.
+          *
+          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+          *         is implemented, the authorization will be more substantial.
+          *
+          * @throws org.apache.airavata.model.error.AiravataSystemException
+          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+          *       rather an Airavata Administrator will be notified to take corrective action.
+          *
+        *
+
+        Parameters:
+         - authz_token
+         - gatewayId
+         - experiment
+        """
+        try:
+            return self.api_server_client_pool.createExperiment(authz_token, gateway_id, experiment)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_experiment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in create_experiment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_experiment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_experiment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_experiment(self, authz_token, experiment_id):
+        """
+
+        Delete an Experiment
+        If the experiment is not already launched experiment can be deleted.
+
+        @param authz_token
+
+        @param experiment_id
+            Experiment ID of the experimnet you want to delete.
+
+        @return boolean
+            Identifier for the success or failure of the deletion operation.
+
+
+
+        Parameters:
+         - authz_token
+         - experimentId
+        """
+        try:
+            return self.api_server_client_pool.deleteExperiment(authz_token, experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_experiment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in create_experiment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_experiment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_experiment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment(self, authz_token, airavata_experiment_id):
+        """
+          *
+          * Get Experiment
+          * Fetch previously created experiment metadata.
+          *
+          * @param airavataExperimentId
+          *    The unique identifier of the requested experiment. This ID is returned during the create experiment step.
+          *
+          * @return ExperimentModel
+          *   This method will return the previously stored experiment metadata.
+          *
+          * @throws org.apache.airavata.model.error.InvalidRequestException
+          *    For any incorrect forming of the request itself.
+          *
+          * @throws org.apache.airavata.model.error.ExperimentNotFoundException
+          *    If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+          *
+          * @throws org.apache.airavata.model.error.AiravataClientException
+          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+          *
+          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
+          *         gateway registration steps and retry this request.
+          *
+          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+          *         For now this is a place holder.
+          *
+          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+          *         is implemented, the authorization will be more substantial.
+          *
+          * @throws org.apache.airavata.model.error.AiravataSystemException
+          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+          *       rather an Airavata Administrator will be notified to take corrective action.
+          *
+        *
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.getExperiment(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment_by_admin(self, authz_token, airavata_experiment_id):
+        """
+          *
+          * Get Experiment by an admin user
+          *
+          * Used by an admin user to fetch previously created experiment metadata.
+          *
+          * @param airavataExperimentId
+          *    The unique identifier of the requested experiment. This ID is returned during the create experiment step.
+          *
+          * @return ExperimentModel
+          *   This method will return the previously stored experiment metadata.
+          *
+          * @throws org.apache.airavata.model.error.InvalidRequestException
+          *    For any incorrect forming of the request itself.
+          *
+          * @throws org.apache.airavata.model.error.ExperimentNotFoundException
+          *    If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+          *
+          * @throws org.apache.airavata.model.error.AiravataClientException
+          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+          *
+          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
+          *         gateway registration steps and retry this request.
+          *
+          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+          *         For now this is a place holder.
+          *
+          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+          *         is implemented, the authorization will be more substantial.
+          *
+          * @throws org.apache.airavata.model.error.AiravataSystemException
+          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+          *       rather an Airavata Administrator will be notified to take corrective action.
+          *
+        *
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.get_experiment_by_admin(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment_by_admin, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment_by_admin, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment_by_admin, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment_by_admin, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_detailed_experiment_tree(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Complete Experiment Details
+        Fetch the completed nested tree structue of previously created experiment metadata which includes processes ->
+        tasks -> jobs information.
+
+        @param airavataExperimentId
+           The identifier for the requested experiment. This is returned during the create experiment step.
+
+        @return ExperimentModel
+          This method will return the previously stored experiment metadata including application input parameters, computational resource scheduling
+          information, special input output handling and additional quality of service parameters.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.getDetailedExperimentTree(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_detailed_experiment_tree, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_experiment(self, authz_token, airavata_experiment_id, experiment):
+        """
+
+        Update a Previously Created Experiment
+        Configure the CREATED experiment with required inputs, scheduling and other quality of service parameters. This method only updates the experiment object within the registry.
+        The experiment has to be launched to make it actionable by the server.
+
+        @param airavataExperimentId
+           The identifier for the requested experiment. This is returned during the create experiment step.
+
+        @param ExperimentModel
+           The configuration information of the experiment with application input parameters, computational resource scheduling
+             information, special input output handling and additional quality of service parameters.
+
+        @return
+          This method call does not have a return value.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+         - experiment
+        """
+        try:
+            return self.api_server_client_pool.updateExperiment(authz_token, airavata_experiment_id, experiment)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_detailed_experiment_tree, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_experiment_configuration(self, authz_token, airavata_experiment_id, user_configuration):
+        """
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+         - user_configuration
+        """
+        try:
+            return self.api_server_client_pool.updateExperimentConfiguration(authz_token, airavata_experiment_id,
+                                                                             user_configuration)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_detailed_experiment_tree, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_resource_scheduling(self, authz_token, airavata_experiment_id, resource_scheduling):
+        """
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+         - resource_scheduling
+        """
+        try:
+            return self.api_server_client_pool.updateResourceScheduleing(authz_token, airavata_experiment_id,
+                                                                         resource_scheduling)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to invalid authz token ",
+                             )
+            raise
+
+    def validate_experiment(self, authz_token, airavata_experiment_id):
+        """
+         *
+         * Validate experiment configuration.
+         * A true in general indicates, the experiment is ready to be launched.
+         *
+         * @param airavataExperimentId
+         *    Unique identifier of the experiment (Experimnent ID) of the experiment which need to be validated.
+         *
+         * @return boolean
+         *      Identifier for the success or failure of the validation operation.
+         *
+        *
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+        """
+        try:
+            return self.api_server_client_pool.validateExperiment(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to invalid authz token ",
+                             )
+            raise
+
+    def launch_experiment(self, authz_token, airavata_experiment_id, gateway_id):
+        """
+
+        Launch a Previously Created & Configured Experiment.
+        Airavata Server will then start processing the request and appropriate notifications and intermediate and output data will be subsequently available for this experiment.
+
+        @gateway_id
+           ID of the gateway which will launch the experiment.
+
+        @param airavata_experiment_id
+           The identifier for the requested experiment. This is returned during the create experiment step.
+
+        @return
+          This method call does not have a return value.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.launchExperiment(authz_token, airavata_experiment_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in launch_experiment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in launch_experiment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in launch_experiment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in launch_experiment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment_status(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Experiment Status
+
+        Obtain the status of an experiment by providing the Experiment Id
+
+        @param authz_token
+
+        @param airavata_experiment_id
+            Experiment ID of the experimnet you require the status.
+
+        @return ExperimentStatus
+            ExperimentStatus model with the current status will be returned.
+
+
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.getExperimentStatus(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment_status, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment_status, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment_status, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment_status, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment_outputs(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Experiment Outputs
+        This method to be used when need to obtain final outputs of a certain Experiment
+
+        @param authz_token
+
+        @param airavata_experiment_id
+            Experiment ID of the experimnet you need the outputs.
+
+        @return list
+            List of experiment outputs will be returned. They will be returned as a list of OutputDataObjectType for the experiment.
+
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+        """
+        try:
+            return self.api_server_client_pool.getExperimentOutputs(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment_outputs, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment_outputs, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment_outputs, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment_outputs, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_intermediate_outputs(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Intermediate Experiment Outputs
+        This method to be used when need to obtain intermediate outputs of a certain Experiment
+
+        @param authz_token
+
+        @param airavataExperimentId
+            Experiment ID of the experimnet you need intermediate outputs.
+
+        @return list
+            List of intermediate experiment outputs will be returned. They will be returned as a list of OutputDataObjectType for the experiment.
+
+
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.getIntermediateOutputs(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_job_statuses(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Job Statuses for an Experiment
+        This method to be used when need to get the job status of an Experiment. An experiment may have one or many jobs; there for one or many job statuses may turnup
+
+        @param authz_token
+
+        @param airavata_experiment_id
+            Experiment ID of the experimnet you need the job statuses.
+
+        @return JobStatus
+            Job status (string) for all all the existing jobs for the experiment will be returned in the form of a map
+
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+        """
+        try:
+            return self.api_server_client_pool.getJobStatuses(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_job_details(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Job Details for all the jobs within an Experiment.
+        This method to be used when need to get the job details for one or many jobs of an Experiment.
+
+        @param authz_token
+
+        @param airavata_experiment_id
+            Experiment ID of the experimnet you need job details.
+
+        @return list of JobDetails
+            Job details.
+
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+        """
+        try:
+            return self.api_server_client_pool.getJobDetails(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def clone_experiment(self, authz_token, existing_experiment_id, new_experiment_name, new_experiment_projectId):
+        """
+
+        Clone an Existing Experiment
+        Existing specified experiment is cloned and a new name is provided. A copy of the experiment configuration is made and is persisted with new metadata.
+          The client has to subsequently update this configuration if needed and launch the cloned experiment.
+
+        @param existing_experiment_id
+           experiment name that should be used in the cloned experiment
+
+        @param new_experiment_name
+           Once an experiment is cloned, to disambiguate, the users are suggested to provide new metadata. This will again require
+             the basic experiment metadata like the name and description, intended user, the gateway identifier and if the experiment
+             should be shared public by default.
+        @param new_experiment_projectId
+           The project in which to create the cloned experiment. This is optional and if null the experiment will be created
+             in the same project as the existing experiment.
+
+        @return
+          The server-side generated.airavata.registry.core.experiment.globally unique identifier (Experiment ID) for the newly cloned experiment.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - existing_experiment_id
+         - new_experiment_name
+         - new_experiment_projectId
+        """
+        try:
+            return self.api_server_client_pool.cloneExperiment(authz_token, existing_experiment_id, new_experiment_name,
+                                                               new_experiment_projectId)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def clone_experiment_by_admin(self, authz_token, existing_experiment_id, new_experiment_name,
+                                  new_experiment_projectId):
+        """
+
+        Clone an Existing Experiment by an admin user
+        Existing specified experiment is cloned and a new name is provided. A copy of the experiment configuration is made and is persisted with new metadata.
+          The client has to subsequently update this configuration if needed and launch the cloned experiment.
+
+        @param new_experiment_name
+           experiment name that should be used in the cloned experiment
+
+        @param existing_experiment_id
+           Once an experiment is cloned, to disambiguate, the users are suggested to provide new metadata. This will again require
+             the basic experiment metadata like the name and description, intended user, the gateway identifier and if the experiment
+             should be shared public by default.
+        @param new_experiment_projectId
+           The project in which to create the cloned experiment. This is optional and if null the experiment will be created
+             in the same project as the existing experiment.
+
+        @return
+          The server-side generated.airavata.registry.core.experiment.globally unique identifier (Experiment ID) for the newly cloned experiment.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - existing_experiment_id
+         - new_experiment_name
+         - new_experiment_projectId
+        """
+        try:
+            return self.api_server_client_pool.cloneExperimentByAdmin(authz_token, existing_experiment_id,
+                                                                      new_experiment_name,
+                                                                      new_experiment_projectId)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def terminate_experiment(self, authz_token, airavata_experiment_id, gateway_id):
+        """
+
+        Terminate a running Experiment.
+
+        @gateway_id
+           ID of the gateway which will terminate the running Experiment.
+
+        @param airavata_experiment_id
+           The identifier of the experiment required termination. This ID is returned during the create experiment step.
+
+        @return status
+          This method call does not have a return value.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.terminateExperiment(authz_token, airavata_experiment_id,
+                                                                   gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_application_module(self, authz_token, gateway_id, application_module):
+        """
+
+        Register a Application Module.
+
+        @gatewayId
+           ID of the gateway which is registering the new Application Module.
+
+        @param applicationModule
+           Application Module Object created from the datamodel.
+
+        @return appModuleId
+          Returns the server-side generated airavata appModule globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - application_module
+        """
+        try:
+            return self.api_server_client_pool.registerApplicationModule(authz_token, gateway_id,
+                                                                         application_module)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_application_module(self, authz_token, app_module_id):
+        """
+
+        Fetch a Application Module.
+
+        @param app_module_id
+          The unique identifier of the application module required
+
+        @return applicationModule
+          Returns an Application Module Object.
+
+
+        Parameters:
+         - authz_token
+         - app_module_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationModule(authz_token, app_module_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_module, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_module, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_module, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_module, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_application_module(self, authz_token, app_module_id, application_module):
+        """
+
+        Update a Application Module.
+
+        @param app_module_id
+          The identifier for the requested application module to be updated.
+
+        @param application_module
+           Application Module Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - appModuleId
+         - applicationModule
+        """
+        try:
+            return self.api_server_client_pool.updateApplicationModule(authz_token, app_module_id, application_module)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_application_module, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_application_module, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_application_module, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_application_module, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_app_modules(self, authz_token, gateway_id):
+        """
+
+        Fetch all Application Module Descriptions.
+
+        @param gateway_id
+           ID of the gateway which need to list all available application deployment documentation.
+
+        @return list
+           Returns the list of all Application Module Objects.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllAppModules(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_app_modules, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_all_app_modules, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_app_modules, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_app_modules, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_accessible_app_modules(self, authz_token, gateway_id):
+        """
+
+        Fetch all accessible Application Module Descriptions.
+
+        @param gateway_id
+           ID of the gateway which need to list all accessible application deployment documentation.
+
+        @return list
+           Returns the list of all Application Module Objects that are accessible to the user.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAccessibleAppModules(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_accessible_app_modules, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_accessible_app_modules, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_accessible_app_modules, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_accessible_app_modules, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_application_module(self, authz_token, app_module_id):
+        """
+
+        Delete an Application Module.
+
+        @param appModuleId
+          The identifier of the Application Module to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - appModuleId
+        """
+        try:
+            return self.api_server_client_pool.deleteApplicationModule(authz_token, app_module_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_application_module, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_application_module, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_application_module, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_application_module, probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_application_deployment(self, authz_token, gateway_id, application_deployment):
+        """
+
+        Register an Application Deployment.
+
+        @param gateway_id
+           ID of the gateway which is registering the new Application Deployment.
+
+        @param application_deployment
+           Application Module Object created from the datamodel.
+
+        @return appDeploymentId
+          Returns a server-side generated airavata appDeployment globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - application_deployment
+        """
+        try:
+            return self.api_server_client_pool.registerApplicationDeployment(authz_token, gateway_id,
+                                                                             application_deployment)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_application_deployment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_application_deployment, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_application_deployment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_application_deployment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_application_deployment(self, authz_token, app_deployment_id):
+        """
+
+        Fetch a Application Deployment.
+
+        @param app_deployment_id
+          The identifier for the requested application module
+
+        @return applicationDeployment
+          Returns a application Deployment Object.
+
+
+        Parameters:
+         - authz_token
+         - app_deployment_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationDeployment(authz_token, app_deployment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_deployment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_deployment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_deployment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_deployment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_application_deployment(self, authz_token, app_deployment_id, application_deployment):
+        """
+
+        Update an Application Deployment.
+
+        @param app_deployment_id
+          The identifier of the requested application deployment to be updated.
+
+        @param application_deployment
+           Application Deployment Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - app_deployment_id
+         - application_deployment
+        """
+        try:
+            return self.api_server_client_pool.updateApplicationDeployment(authz_token, app_deployment_id,
+                                                                           application_deployment)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_application_deployment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_application_deployment, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_application_deployment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_application_deployment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_application_deployment(self, authz_token, app_deployment_id):
+        """
+
+        Delete an Application Deployment.
+
+        @param app_deployment_id
+          The unique identifier of application deployment to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - app_deployment_id
+        """
+        try:
+            return self.api_server_client_pool.deleteApplicationDeployment(authz_token, app_deployment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_application_deployment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_application_deployment, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_application_deployment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_application_deployment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_application_deployments(self, authz_token, gateway_id):
+        """
+
+        Fetch all Application Deployment Descriptions.
+
+        @param gatewayId
+           ID of the gateway which need to list all available application deployment documentation.
+
+        @return list<applicationDeployment.
+           Returns the list of all application Deployment Objects.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllApplicationDeployments(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_application_deployments, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_application_deployments, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_application_deployments, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_application_deployments, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_accessible_application_deployments(self, authz_token, gateway_id, permission_type):
+        """
+
+        Fetch all accessible Application Deployment Descriptions.
+
+        @param gateway_id
+           ID of the gateway which need to list all accessible application deployment documentation.
+        @param permission_type
+           ResourcePermissionType to check for this user
+
+        @return list<applicationDeployment.
+           Returns the list of all application Deployment Objects that are accessible to the user.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.get_accessible_application_deployments(authz_token, gateway_id,
+                                                                                      permission_type)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_accessible_application_deployments, probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_accessible_application_deployments,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_accessible_application_deployments, probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_accessible_application_deployments, probably due to invalid authz token ",
+                )
+            raise
+
+    def get_app_module_deployed_resources(self, authz_token, app_module_id):
+        """
+        Fetch a list of Deployed Compute Hosts.
+
+        @param app_module_id
+          The identifier for the requested application module
+
+        @return list<string>
+          Returns a list of Deployed Resources.
+
+
+        Parameters:
+         - authz_token
+         - app_module_id
+        """
+        try:
+            return self.api_server_client_pool.getAppModuleDeployedResources(authz_token, app_module_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_app_module_deployed_resources, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_app_module_deployed_resources,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_app_module_deployed_resources, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_app_module_deployed_resources, probably due to invalid authz token ",
+                )
+            raise
+
+    def get_application_deployments_for_app_module_and_group_resource_profile(self, authz_token, app_module_id,
+                                                                              group_resource_profileId):
+        """
+        Fetch a list of Application Deployments that this user can use for executing the given Application Module using the given Group Resource Profile.
+        The user must have at least READ access to the Group Resource Profile.
+
+        @param app_module_id
+           The identifier for the Application Module
+
+        @param group_resource_profileId
+           The identifier for the Group Resource Profile
+
+        @return list<ApplicationDeploymentDescription>
+           Returns a list of Application Deployments
+
+        Parameters:
+         - authz_token
+         - app_module_id
+         - group_resource_profileId
+        """
+        try:
+            return self.api_server_client_pool.getApplicationDeploymentsForAppModuleAndGroupResourceProfile(authz_token,
+                                                                                                            app_module_id,
+                                                                                                            group_resource_profileId)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_application_interface(self, authz_token, gateway_id, application_interface):
+        """
+
+        Register a Application Interface.
+
+        @param applicationInterface
+           Application Module Object created from the datamodel.
+
+        @return appInterfaceId
+          Returns a server-side generated airavata application interface globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - application_interface
+        """
+        try:
+            return self.api_server_client_pool.registerApplicationInterface(authz_token, gateway_id,
+                                                                            application_interface)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to invalid authz token ",
+                             )
+            raise
+
+    def clone_application_interface(self, authz_token, existing_app_interface_id, new_application_name, gateway_id):
+        """
+
+        Clone an Application Interface.
+
+        @gateway_id
+           The identifier for the gateway profile to be requested
+
+        @param existing_app_interface_id
+           Identifier of the existing Application interface you wich to clone.
+
+        @param new_application_name
+           Name for the new application interface.
+
+        @return appInterfaceId
+           Returns a server-side generated globally unique identifier for the newly cloned application interface.
+
+
+        Parameters:
+         - authz_token
+         - existing_app_interface_id
+         - new_application_name
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.cloneApplicationInterface(authz_token, existing_app_interface_id,
+                                                                         new_application_name, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_application_interface(self, authz_token, app_interface_id):
+        """
+
+        Fetch an Application Interface.
+
+        @param app_interface_id
+          The identifier for the requested application interface.
+
+        @return applicationInterface
+          Returns an application Interface Object.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInterface(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_interface," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_interface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_interface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_interface, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_application_interface(self, authz_token, app_interface_id, application_interface):
+        """
+
+        Update a Application Interface.
+
+        @param app_interface_id
+          The identifier of the requested application deployment to be updated.
+
+        @param application_interface
+           Application Interface Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - appInterfaceId
+         - applicationInterface
+        """
+        try:
+            return self.api_server_client_pool.updateApplicationInterface(authz_token, app_interface_id,
+                                                                          application_interface)
+        except InvalidRequestException:
+            logger.exception("Error occurred in updateApplicationInterface," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in updateApplicationInterface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in updateApplicationInterface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in updateApplicationInterface, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_application_interface(self, authz_token, app_interface_id):
+        """
+
+        Delete an Application Interface.
+
+        @param app_interface_id
+          The identifier for the requested application interface to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.deleteApplicationInterface(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_application_interface," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_application_interface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_application_interface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_application_interface, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_application_interface_names(self, authz_token, gateway_id):
+        """
+
+        Fetch name and ID of  Application Interface documents.
+
+
+        @return map<applicationId, applicationInterfaceNames>
+          Returns a list of application interfaces with corresponsing ID's
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllApplicationInterfaceNames(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_application_interfaces(self, authz_token, gateway_id):
+        """
+
+        Fetch all Application Interface documents.
+
+
+        @return map<applicationId, applicationInterfaceNames>
+          Returns a list of application interfaces documents (Application Interface ID, name, description, Inputs and Outputs objects).
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllApplicationInterfaces(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_application_inputs(self, authz_token, app_interface_id):
+        """
+
+        Fetch the list of Application Inputs.
+
+        @param app_interface_id
+          The identifier of the application interface which need inputs to be fetched.
+
+        @return list<application_interface_model.InputDataObjectType>
+          Returns a list of application inputs.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInputs(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_application_outputs(self, authz_token, app_interface_id):
+        """
+
+        Fetch list of Application Outputs.
+
+        @param appInterfaceId
+          The identifier of the application interface which need outputs to be fetched.
+
+        @return list<application_interface_model.OutputDataObjectType>
+          Returns a list of application outputs.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationOutputs(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_outputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_outputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_outputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_outputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_available_app_interface_compute_resources(self, authz_token, app_interface_id):
+        """
+
+        Fetch a list of all deployed Compute Hosts for a given application interfaces.
+
+        @param app_interface_id
+          The identifier for the requested application interface.
+
+        @return map<computeResourceId, computeResourceName>
+          A map of registered compute resource id's and their corresponding hostnames.
+          Deployments of each modules listed within the interfaces will be listed.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.getAvailableAppInterfaceComputeResources(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_compute_resource(self, authz_token, compute_resource_description):
+        """
+        Register a Compute Resource.
+
+        @param compute_resource_description
+           Compute Resource Object created from the datamodel.
+
+        @return computeResourceId
+          Returns a server-side generated airavata compute resource globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_description
+        """
+        try:
+            return self.api_server_client_pool.registerComputeResource(authz_token, compute_resource_description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_compute_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_compute_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_compute_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_compute_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_compute_resource(self, authz_token, compute_resource_id):
+        """
+        Fetch the given Compute Resource.
+
+        @param compute_resource_id
+          The identifier for the requested compute resource
+
+        @return computeResourceDescription
+           Compute Resource Object created from the datamodel..
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.getComputeResource(authz_token, compute_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_compute_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_compute_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_compute_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_compute_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_compute_resource_names(self, authz_token):
+        """
+
+        Fetch all registered Compute Resources.
+
+        @return A map of registered compute resource id's and thier corresponding hostnames.
+           Compute Resource Object created from the datamodel..
+
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getAllComputeResourceNames(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_compute_resource_names," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_compute_resource_names," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_compute_resource_names, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_compute_resource_names, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_compute_resource(self, authz_token, compute_resource_id, compute_resource_description):
+        """
+        Update a Compute Resource.
+
+        @param compute_resource_id
+          The identifier for the requested compute resource to be updated.
+
+        @param compute_resource_description
+           Compute Resource Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - compute_resource_description
+        """
+        try:
+            return self.api_server_client_pool.updateComputeResource(authz_token, compute_resource_id,
+                                                                     compute_resource_description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_compute_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_compute_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_compute_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_compute_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_compute_resource(self, authz_token, compute_resource_id):
+        """
+        Delete a Compute Resource.
+
+        @param compute_resource_id
+          The identifier for the requested compute resource to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.deleteComputeResource(authz_token, compute_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_compute_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_compute_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_compute_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_compute_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_storage_resource(self, authz_token, storage_resource_description):
+        """
+        Register a Storage Resource.
+
+        @param storage_resource_description
+           Storge Resource Object created from the datamodel.
+
+        @return storageResourceId
+          Returns a server-side generated airavata storage resource globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - storage_resource_description
+        """
+        try:
+            return self.api_server_client_pool.registerStorageResource(authz_token, storage_resource_description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_storage_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_storage_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_storage_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_storage_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_storage_resource(self, authz_token, storage_resource_id):
+        """
+        Fetch the given Storage Resource.
+
+        @param storageResourceId
+          The identifier for the requested storage resource
+
+        @return storageResourceDescription
+           Storage Resource Object created from the datamodel..
+
+
+        Parameters:
+         - authz_token
+         - storage_resource_id
+        """
+        try:
+            return self.api_server_client_pool.getStorageResource(authz_token, storage_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_storage_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_storage_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_storage_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_storage_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_storage_resource_names(self, authz_token):
+        """
+        Fetch all registered Storage Resources.
+
+        @return A map of registered compute resource id's and thier corresponding hostnames.
+           Compute Resource Object created from the datamodel..
+
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getAllStorageResourceNames(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_storage_resource_names," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_storage_resource_names," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_storage_resource_names, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_storage_resource_names, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_storage_resource(self, authz_token, storage_resource_id, storage_resource_description):
+        """
+        Update a Storage Resource.
+
+        @param storage_resource_id
+          The identifier for the requested compute resource to be updated.
+
+        @param storage_resource_description
+           Storage Resource Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - storage_resource_id
+         - storage_resource_description
+        """
+        try:
+            return self.api_server_client_pool.updateStorageResource(authz_token, storage_resource_id,
+                                                                     storage_resource_description)
+            logger.exception("Error occurred in update_storage_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_storage_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_storage_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_storage_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_storage_resource(self, authz_token, storage_resource_id):
+        """
+        Delete a Storage Resource.
+
+        @param storage_resource_id
+          The identifier of the requested compute resource to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - storageResourceId
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInputs(authz_token, storage_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_storage_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_storage_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_storage_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_storage_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_local_submission_details(self, authz_token, compute_resource_id, priority_order, local_submission):
+        """
+        Add a Local Job Submission details to a compute resource
+         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+
+        @param compute_resource_id
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param local_submission
+          The LOCALSubmission object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - local_submission
+        """
+        try:
+            return self.api_server_client_pool.addLocalSubmissionDetails(authz_token, compute_resource_id,
+                                                                         priority_order, local_submission)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_local_submission_details," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_local_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_local_submission_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in add_local_submission_details, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_local_submission_details(self, authz_token, job_submission_interface_id, local_submission):
+        """
+        Update the given Local Job Submission details
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be updated.
+
+        @param local_submission
+          The LOCALSubmission object to be updated.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - local_submission
+        """
+        try:
+            return self.api_server_client_pool.updateLocalSubmissionDetails(authz_token, authz_token,
+                                                                            job_submission_interface_id,
+                                                                            local_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_local_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_local_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_local_submission_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_local_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_local_job_submission(self, authz_token, job_submission_id):
+        """
+        This method returns localJobSubmission object
+        @param job_submission_id
+          The identifier of the JobSubmission Interface to be retrieved.
+         @return LOCALSubmission instance
+
+
+        Parameters:
+         - authz_token
+         - job_submission_id
+        """
+        try:
+            return self.api_server_client_pool.getLocalJobSubmission(authz_token, job_submission_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_local_job_submission," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_local_job_submission," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_local_job_submission, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_local_job_submission, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_ssh_job_submission_details(self, authz_token, compute_resource_id, priority_order, ssh_job_submission):
+        """
+        Add a SSH Job Submission details to a compute resource
+         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+
+        @param compute_resource_id
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param ssh_job_submission
+          The SSHJobSubmission object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - ssh_job_submission
+        """
+        try:
+            return self.api_server_client_pool.addSSHJobSubmissionDetails(authz_token, compute_resource_id,
+                                                                          priority_order, ssh_job_submission)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_ssh_job_submission_details," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_ssh_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_ssh_job_submission_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_ssh_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_ssh_fork_job_submission_details(self, authz_token, compute_resource_id, priority_order, ssh_job_submission):
+        """
+        Add a SSH_FORK Job Submission details to a compute resource
+         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+
+        @param compute_resource_id
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param ssh_job_submission
+          The SSHJobSubmission object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - ssh_job_submission
+        """
+        try:
+            return self.api_server_client_pool.addSSHForkJobSubmissionDetails(authz_token, compute_resource_id,
+                                                                              priority_order, ssh_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_ssh_fork_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_ssh_fork_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_ssh_fork_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_ssh_fork_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_ssh_job_submission(self, authz_token, job_submission_id):
+        """
+        This method returns SSHJobSubmission object
+        @param job_submission_id
+          The identifier of the JobSubmission Interface to be retrieved.
+         @return SSHJobSubmission instance
+
+
+        Parameters:
+         - authz_token
+         - job_submission_id
+        """
+        try:
+            return self.api_server_client_pool.getSSHJobSubmission(authz_token, job_submission_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_ssh_job_submission," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_ssh_job_submission," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_ssh_job_submission, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_ssh_job_submission, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_unicore_job_submission_details(self, authz_token, compute_resource_id, priority_order,
+                                           unicore_job_submission):
+        """
+
+        Add a UNICORE Job Submission details to a compute resource
+         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+
+        @param compute_resource_id
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param unicore_job_submission
+          The UnicoreJobSubmission object to be added to the resource.
+
+        @return status
+         Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - unicore_job_submission
+        """
+        try:
+            return self.api_server_client_pool.addUNICOREJobSubmissionDetails(authz_token, compute_resource_id,
+                                                                              priority_order, unicore_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_unicore_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_unicore_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_unicore_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_unicore_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_unicore_job_submission(self, authz_token, job_submission_id):
+        """
+          *
+          * This method returns UnicoreJobSubmission object
+          *
+          * @param job_submission_id
+          *   The identifier of the JobSubmission Interface to be retrieved.
+          *  @return UnicoreJobSubmission instance
+          *
+        *
+
+        Parameters:
+         - authz_token
+         - job_submission_id
+        """
+        try:
+            return self.api_server_client_pool.getUnicoreJobSubmission(authz_token, job_submission_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_unicore_job_submission," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_unicore_job_submission," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_unicore_job_submission, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_unicore_job_submission, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_cloud_job_submission_details(self, authz_token, compute_resource_id, priority_order, cloud_submission):
+        """
+           *
+           * Add a Cloud Job Submission details to a compute resource
+           *  App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+           *
+           * @param compute_resource_id
+           *   The identifier of the compute resource to which JobSubmission protocol to be added
+           *
+           * @param priority_order
+           *   Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+           *
+           * @param cloud_submission
+           *   The SSHJobSubmission object to be added to the resource.
+           *
+           * @return status
+           *   Returns the unique job submission id.
+           *
+        *
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - cloud_submission
+        """
+        try:
+            return self.api_server_client_pool.addCloudJobSubmissionDetails(authz_token, compute_resource_id,
+                                                                            priority_order, cloud_submission)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_cloud_job_submission(self, authz_token, job_submission_id):
+        """
+           *
+           * This method returns cloudJobSubmission object
+           * @param jobSubmissionInterfaceI
+               *   The identifier of the JobSubmission Interface to be retrieved.
+           *  @return CloudJobSubmission instance
+        *
+
+        Parameters:
+         - authz_token
+         - job_submission_id
+        """
+        try:
+            return self.api_server_client_pool.getCloudJobSubmission(authz_token, job_submission_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_cloud_job_submission," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_cloud_job_submission," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_cloud_job_submission, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_cloud_job_submission, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_ssh_job_submission_details(self, authz_token, job_submission_interface_id, ssh_job_submission):
+        """
+
+        Update the given SSH Job Submission details
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be updated.
+
+        @param ssh_job_submission
+          The SSHJobSubmission object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - ssh_job_submission
+        """
+        try:
+            return self.api_server_client_pool.updateSSHJobSubmissionDetails(authz_token, job_submission_interface_id,
+                                                                             ssh_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_ssh_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_ssh_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_ssh_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_ssh_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_cloud_job_submission_details(self, authz_token, job_submission_interface_id, ssh_job_submission):
+        """
+
+        Update the cloud Job Submission details
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be updated.
+
+        @param ssh_job_submission
+          The CloudJobSubmission object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - ssh_job_submission
+        """
+        try:
+            return self.api_server_client_pool.updateCloudJobSubmissionDetails(authz_token, job_submission_interface_id,
+                                                                               ssh_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_cloud_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_cloud_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_cloud_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_cloud_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_unicore_job_submission_details(self, authz_token, job_submission_interface_id, unicore_job_submission):
+        """
+
+        Update the UNIOCRE Job Submission details
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be updated.
+
+        @param unicore_job_submission
+          The UnicoreJobSubmission object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - unicore_job_submission
+        """
+        try:
+            return self.api_server_client_pool.updateUnicoreJobSubmissionDetails(authz_token,
+                                                                                 job_submission_interface_id,
+                                                                                 unicore_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_unicore_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_unicore_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_unicore_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_unicore_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_local_data_movement_details(self, authz_token, product_uri, data_move_type, priority_order,
+                                        local_data_movement):
+        """
+
+        Add a Local data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param product_uri
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param data_move_type
+          DMType object to be added to the resource.
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param local_data_movement
+          The LOCALDataMovement object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_move_type
+         - priority_order
+         - local_data_movement
+        """
+        try:
+            return self.api_server_client_pool.addLocalDataMovementDetails(authz_token, product_uri, data_move_type,
+                                                                           priority_order, local_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_local_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_local_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_local_data_movement_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_local_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_local_data_movement_details(self, authz_token, data_movementInterface_id, local_data_movement):
+        """
+
+        Update the given Local data movement details
+
+        @param data_movementInterface_id
+          The identifier of the data movement Interface to be updated.
+
+        @param local_data_movement
+          The LOCALDataMovement object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movementInterface_id
+         - local_data_movement
+        """
+        try:
+            return self.api_server_client_pool.updateLocalDataMovementDetails(authz_token, data_movementInterface_id,
+                                                                              local_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_local_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_local_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_local_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_local_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_local_data_movement(self, authz_token, data_movement_id):
+        """
+
+        This method returns local datamovement object.
+
+        @param data_movement_id
+          The identifier of the datamovement Interface to be retrieved.
+
+         @return LOCALDataMovement instance
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_id
+        """
+        try:
+            return self.api_server_client_pool.getLocalDataMovement(authz_token, data_movement_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_local_data_movement," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_local_data_movement," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_local_data_movement, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_local_data_movement, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_scp_data_movement_details(self, authz_token, product_uri, data_move_type, priority_order,
+                                      scp_data_movement):
+        """
+
+        Add a SCP data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param productUri
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priorityOrder
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param scpDataMovement
+          The SCPDataMovement object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_move_type
+         - priority_order
+         - scp_data_movement
+        """
+        try:
+            return self.api_server_client_pool.addSCPDataMovementDetails(authz_token, product_uri, data_move_type,
+                                                                         priority_order, scp_data_movement)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_scp_data_movement_details," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_scp_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_scp_data_movement_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in add_scp_data_movement_details, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_scp_data_movement_details(self, authz_token, data_movement_interface_id, scp_data_movement):
+        """
+
+        Update the given scp data movement details
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param data_movement_interface_id
+          The identifier of the data movement Interface to be updated.
+
+        @param scp_data_movement
+          The SCPDataMovement object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - data_movement_interface_id
+         - scp_data_movement
+        """
+        try:
+            return self.api_server_client_pool.updateSCPDataMovementDetails(authz_token, data_movement_interface_id,
+                                                                            scp_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_scp_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_scp_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_scp_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_scp_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_scp_data_movement(self, authz_token, data_movement_id):
+        """
+        This method returns SCP datamovement object
+
+        @param dataMovementId
+          The identifier of the datamovement Interface to be retrieved.
+
+        @return SCPDataMovement instance
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_id
+        """
+        try:
+            return self.api_server_client_pool.getSCPDataMovement(authz_token, data_movement_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_scp_data_movement," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_scp_data_movement," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_scp_data_movement, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_scp_data_movement, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_unicore_data_movement_details(self, authz_token, product_uri, data_move_type, priority_order,
+                                          unicore_data_movement):
+        """
+
+        Add a UNICORE data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param product_uri
+          The identifier of the compute resource to which data movement protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param unicore_data_movement
+          The UnicoreDataMovement object to be added to the resource.
+
+        @return status
+          Returns the unique data movement id.
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_move_type
+         - priority_order
+         - unicore_data_movement
+        """
+        try:
+            return self.api_server_client_pool.addUnicoreDataMovementDetails(authz_token, product_uri, data_move_type,
+                                                                             priority_order, unicore_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_unicore_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_unicore_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_unicore_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_unicore_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_unicore_data_movement_details(self, authz_token, data_movement_interface_id, unicore_data_movement):
+        """
+
+        Update a selected UNICORE data movement details
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param data_movement_interface_id
+          The identifier of the data movement Interface to be updated.
+
+        @param unicore_data_movement
+          The UnicoreDataMovement object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_interface_id
+         - unicore_data_movement
+        """
+        try:
+            return self.api_server_client_pool.updateUnicoreDataMovementDetails(authz_token, data_movement_interface_id,
+                                                                                unicore_data_movement)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_unicore_data_movement(self, authz_token, data_movement_id):
+        """
+
+        This method returns UNICORE datamovement object
+
+        @param data_movement_id
+          The identifier of the datamovement Interface to be retrieved.
+
+        @return UnicoreDataMovement instance
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_id
+        """
+        try:
+            return self.api_server_client_pool.getUnicoreDataMovement(authz_token, data_movement_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_unicore_data_movement," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_unicore_data_movement," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_unicore_data_movement, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_unicore_data_movement, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_grid_ftp_data_movement_details(self, authz_token, product_uri, data_move_type, priority_order,
+                                           grid_ftp_data_movement):
+        """
+
+        Add a GridFTP data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param product_uri
+          The identifier of the compute resource to which dataMovement protocol to be added
+
+        @param data_move_type
+           The DMType object to be added to the resource.
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param grid_ftp_data_movement
+          The GridFTPDataMovement object to be added to the resource.
+
+        @return status
+          Returns the unique data movement id.
+
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_move_type
+         - priority_order
+         - grid_ftp_data_movement
+        """
+        try:
+            return self.api_server_client_pool.addGridFTPDataMovementDetails(authz_token, product_uri, data_move_type,
+                                                                             priority_order, grid_ftp_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_grid_ftp_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_grid_ftp_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_grid_ftp_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_grid_ftp_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_grid_ftp_data_movement_details(self, authz_token, data_movement_interface_id, grid_ftp_data_movement):
+        """
+        Update the given GridFTP data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param data_movement_interface_id
+          The identifier of the data movement Interface to be updated.
+
+        @param grid_ftp_data_movement
+          The GridFTPDataMovement object to be updated.
+
+        @return boolean
+          Returns a success/failure of the update.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_interface_id
+         - grid_ftp_data_movement
+        """
+        try:
+            return self.api_server_client_pool.updateGridFTPDataMovementDetails(authz_token, data_movement_interface_id,
+                                                                                grid_ftp_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_grid_ftp_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_grid_ftp_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_grid_ftp_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_grid_ftp_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_grid_ftp_data_movement(self, authz_token, data_movement_id):
+        """
+        This method returns GridFTP datamovement object
+
+        @param data_movement_id
+          The identifier of the datamovement Interface to be retrieved.
+
+         @return GridFTPDataMovement instance
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_id
+        """
+        try:
+            return self.api_server_client_pool.getGridFTPDataMovement(authz_token, data_movement_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_grid_ftp_data_movement," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_grid_ftp_data_movement," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_grid_ftp_data_movement, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_grid_ftp_data_movement, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def change_job_submission_priority(self, authz_token, job_submission_interface_id, new_priority_order):
+        """
+        Change the priority of a given job submisison interface
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be changed
+
+        @param new_priority_order
+          The new priority of the job manager interface.
+
+        @return status
+          Returns a success/failure of the change.
+
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - new_priority_order
+        """
+        try:
+            return self.api_server_client_pool.changeJobSubmissionPriority(authz_token, job_submission_interface_id,
+                                                                           new_priority_order)
+        except InvalidRequestException:
+            logger.exception("Error occurred in change_job_submission_priority," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in change_job_submission_priority," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in change_job_submission_priority, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in change_job_submission_priority, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def change_data_movement_priority(self, authz_token, data_movement_interface_id, new_priority_order):
+        """
+        Change the priority of a given data movement interface
+
+        @param data_movement_interface_id
+          The identifier of the DataMovement Interface to be changed
+
+        @param new_priority_order
+          The new priority of the data movement interface.
+
+        @return status
+          Returns a success/failure of the change.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_interface_id
+         - new_priority_order
+        """
+        try:
+            return self.api_server_client_pool.changeDataMovementPriority(authz_token, data_movement_interface_id,
+                                                                          new_priority_order)
+        except InvalidRequestException:
+            logger.exception("Error occurred in change_data_movement_priority," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in change_data_movement_priority," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in change_data_movement_priority, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in change_data_movement_priority, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def change_job_submission_priorities(self, authz_token, job_submission_priority_map):
+        """
+        Change the priorities of a given set of job submission interfaces
+
+        @param job_submission_priority_map
+          A Map of identifiers of the JobSubmission Interfaces and thier associated priorities to be set.
+
+        @return status
+          Returns a success/failure of the changes.
+
+
+        Parameters:
+         - authz_token
+         - job_submission_priority_map
+        """
+        try:
+            return self.api_server_client_pool.changeJobSubmissionPriorities(authz_token, job_submission_priority_map)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in change_job_submission_priorities," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in change_job_submission_priorities," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in change_job_submission_priorities, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in change_job_submission_priorities, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def change_data_movement_priorities(self, authz_token, data_movement_priority_map):
+        """
+        Change the priorities of a given set of data movement interfaces
+
+        @param data_movement_priority_map
+          A Map of identifiers of the DataMovement Interfaces and thier associated priorities to be set.
+
+        @return status
+          Returns a success/failure of the changes.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_priority_map
+        """
+        try:
+            return self.api_server_client_pool.changeDataMovementPriorities(authz_token, data_movement_priority_map)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in change_data_movement_priorities," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in change_data_movement_priorities," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in change_data_movement_priorities, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in change_data_movement_priorities, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_job_submission_interface(self, authz_token, compute_resource_id, job_submission_interface_id):
+        """
+        Delete a given job submisison interface
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be changed
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - jobSubmissionInterfaceId
+        """
+        try:
+            return self.api_server_client_pool.deleteJobSubmissionInterface(authz_token, compute_resource_id,
+                                                                            job_submission_interface_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_job_submission_interface," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_job_submission_interface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_job_submission_interface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_job_submission_interface, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_data_movement_interface(self, authz_token, product_uri, data_movement_interface_id, data_move_type):
+        """
+        Delete a given data movement interface
+
+        @param data_movement_interface_id
+          The identifier of the DataMovement Interface to be changed
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_movement_interface_id
+         - data_move_type
+        """
+        try:
+            return self.api_server_client_pool.deleteDataMovementInterface(authz_token, product_uri,
+                                                                           data_movement_interface_id, data_move_type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_data_movement_interface," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_data_movement_interface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_data_movement_interface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_data_movement_interface, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def register_resource_job_manager(self, authz_token, resource_job_manager):
+        """
+        Parameters:
+         - authz_token
+         - resource_job_manager
+        """
+        try:
+            return self.api_server_client_pool.registerResourceJobManager(authz_token, resource_job_manager)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_resource_job_manager," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_resource_job_manager," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_resource_job_manager, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_resource_job_manager, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_resource_job_manager(self, authz_token, resource_job_manager_id, updated_resource_job_manager):
+        """
+        Parameters:
+         - authz_token
+         - resourceJobManagerId
+         - updatedResourceJobManager
+        """
+        try:
+            return self.api_server_client_pool.updateResourceJobManager(authz_token,
+                                                                        resource_job_manager_id,
+                                                                        updated_resource_job_manager)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_resource_job_manager," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_resource_job_manager," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_resource_job_manager, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_resource_job_manager, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_resource_job_manager(self, authz_token, resource_job_manager_id):
+        """
+        Parameters:
+         - authz_token
+         - resourceJobManagerId
+        """
+        try:
+            return self.api_server_client_pool.getResourceJobManager(authz_token, resource_job_manager_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_resource_job_manager," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_resource_job_manager," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_resource_job_manager, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_resource_job_manager, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_resource_job_manager(self, authz_token, resource_job_manager_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_job_manager_id
+        """
+        try:
+            return self.api_server_client_pool.deleteResourceJobManager(authz_token, resource_job_manager_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_resource_job_manager," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_resource_job_manager," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_resource_job_manager, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_resource_job_manager, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_batch_queue(self, authz_token, compute_resource_id, queue_name):
+        """
+        Delete a Compute Resource Queue
+
+        @param compute_resource_id
+          The identifier of the compute resource which has the queue to be deleted
+
+        @param queue_name
+          Name of the queue need to be deleted. Name is the uniqueue identifier for the queue within a compute resource
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - queue_name
+        """
+        try:
+            return self.api_server_client_pool.deleteBatchQueue(authz_token, compute_resource_id, queue_name)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_batch_queue," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_batch_queue," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_batch_queue, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_batch_queue, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_gateway_resource_profile(self, authz_token, gateway_resource_profile):
+        """
+        Register a Gateway Resource Profile.
+
+        @param gateway_resource_profile
+           Gateway Resource Profile Object.
+           The GatewayID should be obtained from Airavata gateway registration and passed to register a corresponding
+             resource profile.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - gateway_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.registerGatewayResourceProfile(authz_token, gateway_resource_profile)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in register_gateway_resource_profile," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_gateway_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in register_gateway_resource_profile, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in register_gateway_resource_profile, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_gateway_resource_profile(self, authz_token, gateway_id):
+        """
+        Fetch the given Gateway Resource Profile.
+
+        @param gateway_id
+          The identifier for the requested gateway resource.
+
+        @return gatewayResourceProfile
+           Gateway Resource Profile Object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getGatewayResourceProfile(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_gateway_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_gateway_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_gateway_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_gateway_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_gateway_resource_profile(self, authz_token, gateway_id, gateway_resource_profile):
+        """
+        Update a Gateway Resource Profile.
+
+        @param gateway_id
+          The identifier for the requested gateway resource to be updated.
+
+        @param gateway_resource_profile
+           Gateway Resource Profile Object.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - gateway_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.updateGatewayResourceProfile(authz_token, gateway_id,
+                                                                            gateway_resource_profile)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_gateway_resource_profile," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_gateway_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_gateway_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_gateway_resource_profile, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_gateway_resource_profile(self, authz_token, gateway_id):
+        """
+        Delete the given Gateway Resource Profile.
+
+        @param gateway_id
+          The identifier for the requested gateway resource to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.deleteGatewayResourceProfile(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_gateway_resource_profile," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_gateway_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_gateway_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_gateway_resource_profile, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_gateway_compute_resource_preference(self, authz_token, gateway_id, compute_resource_id,
+                                                compute_resource_preferance):
+        """
+        Add a Compute Resource Preference to a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be added.
+
+        @param compute_resource_id
+          Preferences related to a particular compute resource
+
+        @param compute_resource_preferance
+          The ComputeResourcePreference object to be added to the resource profile.
+
+        @return status
+          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
+           Instead an update should be used.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - compute_resource_id
+         - compute_resource_preferance
+        """
+        try:
+            return self.api_server_client_pool.addGatewayComputeResourcePreference(authz_token, gateway_id,
+                                                                                   compute_resource_id,
+                                                                                   compute_resource_preferance)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_gateway_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_gateway_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_gateway_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_gateway_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_gateway_storage_preference(self, authz_token, gateway_id, storage_resource_id, storage_preference):
+        """
+        Add a Storage Resource Preference to a registered gateway profile.
+
+        @param gateway_id
+          The identifier of the gateway profile to be added.
+
+        @param storage_resource_id
+          Preferences related to a particular compute resource
+
+        @param storage_preference
+          The ComputeResourcePreference object to be added to the resource profile.
+
+        @return status
+          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
+           Instead an update should be used.
+
+
+        Parameters:
+         - authz_token
+         - gatewayID
+         - storageResourceId
+         - storagePreference
+        """
+        try:
+            return self.api_server_client_pool.addGatewayStoragePreference(authz_token, authz_token, gateway_id,
+                                                                           storage_resource_id, storage_preference)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_gateway_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_gateway_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_gateway_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_gateway_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_gateway_compute_resource_preference(self, authz_token, gateway_id, compute_resource_id):
+        """
+
+        Fetch a Compute Resource Preference of a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @param compute_resource_id
+          Preferences related to a particular compute resource
+
+        @return computeResourcePreference
+          Returns the ComputeResourcePreference object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.getGatewayComputeResourcePreference(authz_token, gateway_id,
+                                                                                   compute_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_gateway_storage_preference(self, authz_token, gateway_id, storage_resourceId):
+        """
+
+        Fetch a Storage Resource Preference of a registered gateway profile.
+
+        @param gatewayID
+          The identifier of the gateway profile to request to fetch the particular storage resource preference.
+
+        @param storageResourceId
+          Identifier of the Stprage Preference required to be fetched.
+
+        @return StoragePreference
+          Returns the StoragePreference object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - storage_resourceId
+        """
+        try:
+            return self.api_server_client_pool.getGatewayStoragePreference(authz_token, gateway_id, storage_resourceId)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_gateway_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_gateway_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_gateway_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_gateway_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_gateway_compute_resource_preferences(self, authz_token, gateway_id):
+        """
+
+        Fetch all Compute Resource Preferences of a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @return computeResourcePreference
+          Returns the ComputeResourcePreference object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllGatewayComputeResourcePreferences(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_gateway_compute_resource_preferences," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_gateway_compute_resource_preferences," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_gateway_compute_resource_preferences, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_gateway_compute_resource_preferences, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_gateway_storage_preferences(self, authz_token, gateway_id):
+        """
+        Fetch all Storage Resource Preferences of a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @return StoragePreference
+          Returns the StoragePreference object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllGatewayStoragePreferences(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_gateway_storage_preferences," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_gateway_storage_preferences," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_gateway_storage_preferences, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_gateway_storage_preferences, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_gateway_resource_profiles(self, authz_token):
+        """
+
+        Fetch all Gateway Profiles registered
+
+        @return GatewayResourceProfile
+          Returns all the GatewayResourcePrifle list object.
+
+
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getAllGatewayResourceProfiles(authz_token)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_gateway_resource_profiles," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_gateway_resource_profiles," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_gateway_resource_profiles, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_gateway_resource_profiles, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_gateway_compute_resource_preference(self, authz_token, gateway_id, compute_resource_id,
+                                                   compute_resource_preference):
+        """
+        Update a Compute Resource Preference to a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be updated.
+
+        @param compute_resource_id
+          Preferences related to a particular compute resource
+
+        @param compute_resource_preference
+          The ComputeResourcePreference object to be updated to the resource profile.
+
+        @return status
+          Returns a success/failure of the updation.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - compute_resource_id
+         - compute_resource_preference
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInputs(authz_token, gateway_id, compute_resource_id,
+                                                                    compute_resource_preference)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_gateway_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_gateway_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_gateway_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_gateway_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_gateway_storage_preference(self, authz_token, gateway_id, storage_id, storage_preference):
+        """
+        Update a Storage Resource Preference of a registered gateway profile.
+
+        @param gateway_id
+          The identifier of the gateway profile to be updated.
+
+        @param storage_id
+          The Storage resource identifier of the one that you want to update
+
+        @param storage_preference
+          The storagePreference object to be updated to the resource profile.
+
+        @return status
+          Returns a success/failure of the updation.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - storage_id
+         - storage_preference
+        """
+        try:
+            return self.api_server_client_pool.updateGatewayStoragePreference(authz_token, gateway_id, storage_id,
+                                                                              storage_preference)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_gateway_storage_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_gateway_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_gateway_storage_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_gateway_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_gateway_compute_resource_preference(self, authz_token, gateway_id, compute_resource_id):
+        """
+        Delete the Compute Resource Preference of a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be deleted.
+
+        @param compute_resource_id
+          Preferences related to a particular compute resource
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.deleteGatewayComputeResourcePreference(authz_token, gateway_id,
+                                                                                      compute_resource_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_gateway_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_gateway_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in delete_gateway_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_gateway_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_gateway_storage_preference(self, authz_token, gateway_id, storage_id):
+        """
+        Delete the Storage Resource Preference of a registered gateway profile.
+
+        @param gateway_id
+          The identifier of the gateway profile to be deleted.
+
+        @param storage_id
+          ID of the storage preference you want to delete.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - storage_id
+        """
+        try:
+            return self.api_server_client_pool.deleteGatewayStoragePreference(authz_token, gateway_id, storage_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_gateway_storage_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_gateway_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in delete_gateway_storage_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_gateway_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_ssh_account_provisioners(self, authz_token):
+        """
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getSSHAccountProvisioners(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_ssh_account_provisioners," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_ssh_account_provisioners," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_ssh_account_provisioners, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_ssh_account_provisioners, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def does_user_have_ssh_account(self, authz_token, compute_resource_id, user_id):
+        """
+        Check if user has an SSH account on the given compute resource. This
+        method will only work if the compute resource has an SSHAccountProvisioner configured for it.
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - user_id
+        """
+        try:
+            return self.api_server_client_pool.doesUserHaveSSHAccount(authz_token, compute_resource_id, user_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def is_ssh_setup_complete_for_user_compute_resource_preference(self, authz_token, compute_resource_id,
+                                                                   airavata_cred_store_token):
+        """
+        Check if SSH account setup is complete for this user on the given compute resource.
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - airavata_cred_store_token
+        """
+        try:
+            return self.api_server_client_pool.isSSHSetupCompleteForUserComputeResourcePreference(authz_token,
+                                                                                                  compute_resource_id,
+                                                                                                  airavata_cred_store_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def setup_user_compute_resource_preferences_for_ssh(self, authz_token, compute_resource_id, user_id,
+                                                        airavata_cred_store_token):
+        """
+        Setup and return a UserComputeResourcePreference object for this user to SSH into the given compute resource with
+        the given SSH credential. This method will only work if the compute resource has an SSHAccountProvisioner
+        configured for it. The returned UserComputeResourcePreference object is not saved; it is up to the client to
+        call addUserComputeResourcePreference to persist it.
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - user_id
+         - airavata_cred_store_token
+        """
+        try:
+            return self.api_server_client_pool.setupUserComputeResourcePreferencesForSSH(authz_token,
+                                                                                         compute_resource_id, user_id,
+                                                                                         airavata_cred_store_token)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in setup_user_compute_resource_preferences_for_ssh," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in setup_user_compute_resource_preferences_for_ssh," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in setup_user_compute_resource_preferences_for_ssh, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in setup_user_compute_resource_preferences_for_ssh, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def register_user_resource_profile(self, authz_token, user_resource_profile):
+        """
+        Register User Resource Profile.
+
+        @param user_resource_profile
+           User Resource Profile Object.
+           The userId should be obtained from Airavata user profile data model and passed to register a corresponding
+             resource profile.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - user_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.registerUserResourceProfile(authz_token, user_resource_profile)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_user_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_user_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_user_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in register_user_resource_profile, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def is_user_resource_profile_exists(self, authz_token, user_id, gateway_id):
+        """
+        Check if User Resource Profile exists.
+
+        @param user_id
+          The identifier for the requested user resource profile.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @return bool
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.isUserResourceProfileExists(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in is_user_resource_profile_exists," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in is_user_resource_profile_exists," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in is_user_resource_profile_exists, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in is_user_resource_profile_exists, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_user_resource_profile(self, authz_token, user_id, gateway_id):
+        """
+        Fetch the given User Resource Profile.
+
+        @param userId
+          The identifier for the requested user resource profile.
+
+        @param gatewayID
+          The identifier to link a gateway for the requested user resource profile.
+
+        @return UserResourceProfile
+           User Resource Profile Object.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getUserResourceProfile(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_user_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_user_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_user_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_user_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_user_resource_profile(self, authz_token, user_id, gateway_id, user_resource_profile):
+        """
+        Update a User Resource Profile.
+
+        @param user_id
+          The identifier for the requested user resource to be updated.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_resource_profile
+           User Resource Profile Object.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.updateUserResourceProfile(authz_token, user_id, gateway_id,
+                                                                         user_resource_profile)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_user_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_user_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_user_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_user_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_user_resource_profile(self, authz_token, user_id, gateway_id):
+        """
+        Delete the given User Resource Profile.
+
+        @param user_id
+          The identifier for the requested user resource to be deleted.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.deleteUserResourceProfile(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_user_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_user_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_user_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_user_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_user_compute_resource_preference(self, authz_token, user_id, gateway_id, user_compute_resource_id,
+                                             user_compute_resource_preference):
+        """
+        Add a Compute Resource Preference to a registered User profile.
+
+        @param user_id
+          The identifier for the User resource profile to be added.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_compute_resource_id
+          Preferences related to a particular compute resource
+
+        @param user_compute_resource_preference
+          The ComputeResourcePreference object to be added to the resource profile.
+
+        @return status
+          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
+           Instead an update should be used.
+
+
+        Parameters:
+         - authz_token
+         - userId
+         - gatewayID
+         - userComputeResourceId
+         - userComputeResourcePreference
+        """
+        try:
+            return self.api_server_client_pool.addUserComputeResourcePreference(authz_token, user_id, gateway_id,
+                                                                                user_compute_resource_id,
+                                                                                user_compute_resource_preference)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_user_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_user_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_user_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_user_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_user_storage_preference(self, authz_token, user_id, gateway_id, user_storage_resource_id,
+                                    user_storage_preference):
+        """
+        Add a Storage Resource Preference to a registered user resource profile.
+
+        @param user_id
+          The identifier of the user resource profile to be added.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_storage_resource_id
+          Preferences related to a particular compute resource
+
+        @param user_storage_preference
+          The ComputeResourcePreference object to be added to the resource profile.
+
+        @return status
+          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
+           Instead an update should be used.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_storage_resource_id
+         - user_storage_preference
+        """
+        try:
+            return self.api_server_client_pool.addUserStoragePreference(authz_token, user_id, gateway_id,
+                                                                        user_storage_resource_id,
+                                                                        user_storage_preference)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_user_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_user_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_user_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in add_user_storage_preference, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_user_compute_resource_preference(self, authz_token, user_id, gateway_id, user_compute_resource_id):
+        """
+
+        Fetch a Compute Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier for the user profile to be requested
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_compute_resource_id
+          Preferences related to a particular compute resource
+
+        @return computeResourcePreference
+          Returns the ComputeResourcePreference object.
+
+
+        Parameters:
+         - authz_token
+         - userId
+         - gatewayID
+         - userComputeResourceId
+        """
+        try:
+            return self.api_server_client_pool.getUserComputeResourcePreference(authz_token, user_id, gateway_id,
+                                                                                user_compute_resource_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_user_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_user_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_user_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_user_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_user_storage_preference(self, authz_token, user_id, gateway_id, user_storage_resource_id):
+        """
+
+        Fetch a Storage Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier of the user resource profile to request to fetch the particular storage resource preference.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_storage_resource_id
+          Identifier of the Stprage Preference required to be fetched.
+
+        @return UserStoragePreference
+          Returns the StoragePreference object.
+
+
+        Parameters:
+         - authz_token
+         - userId
+         - gatewayID
+         - userStorageResourceId
+        """
+        try:
+            return self.api_server_client_pool.getUserStoragePreference(authz_token, user_id, gateway_id,
+                                                                        user_storage_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_user_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_user_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_user_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_user_storage_preference, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_user_compute_resource_preferences(self, authz_token, user_id, gateway_id):
+        """
+
+        Fetch all Compute Resource Preferences of a registered gateway profile.
+
+        @param user_id
+          The identifier of the user resource profile to request to fetch the particular storage resource preference.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @return computeResourcePreference
+          Returns the ComputeResourcePreference object.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllUserComputeResourcePreferences(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_user_compute_resource_preferences," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_user_compute_resource_preferences," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_user_compute_resource_preferences, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_user_compute_resource_preferences, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_user_storage_preferences(self, authz_token, user_id, gateway_id):
+        """
+        Fetch all User Storage Resource Preferences of a registered user profile.
+
+        @param user_id
+          The identifier of the user resource profile to request to fetch the particular storage resource preference.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @return StoragePreference
+          Returns the StoragePreference object.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInputs(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_user_storage_preferences," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_user_storage_preferences," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_user_storage_preferences, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_user_storage_preferences, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_user_resource_profiles(self, authz_token):
+        """
+
+        Fetch all user resources Profiles registered
+
+        @return UserResourceProfile
+          Returns all the UserResourcePrifle list object.
+
+
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getAllUserResourceProfiles(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_user_resource_profiles," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_user_resource_profiles," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_user_resource_profiles, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_user_resource_profiles, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_user_compute_resource_preference(self, authz_token, user_id, gateway_id, user_compute_resourceId,
+                                                user_compute_resource_preference):
+        """
+        Update a Compute Resource Preference to a registered user resource profile.
+
+        @param user_id
+          The identifier for the user profile to be updated.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_compute_resourceId
+          Preferences related to a particular compute resource
+
+        @param user_compute_resource_preference
+          The ComputeResourcePreference object to be updated to the resource profile.
+
+        @return status
+          Returns a success/failure of the updation.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_compute_resourceId
+         - user_compute_resource_preference
+        """
+        try:
+            return self.api_server_client_pool.updateUserComputeResourcePreference(authz_token, user_id, gateway_id,
+                                                                                   user_compute_resourceId,
+                                                                                   user_compute_resource_preference)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_user_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_user_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_user_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_user_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_user_storage_preference(self, authz_token, user_id, gateway_id, user_storage_id,
+                                       user_storage_preference):
+        """
+        Update a Storage Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier of the user resource profile to be updated.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_storage_id
+          The Storage resource identifier of the one that you want to update
+
+        @param user_storage_preference
+          The storagePreference object to be updated to the resource profile.
+
+        @return status
+          Returns a success/failure of the updation.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_storage_id
+         - user_storage_preference
+        """
+        try:
+            return self.api_server_client_pool.updateUerStoragePreference(authz_token, user_id, gateway_id,
+                                                                          user_storage_id, user_storage_preference)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_user_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_user_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_user_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_user_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_user_compute_resource_preference(self, authz_token, user_id, gateway_id, user_compute_resource_id):
+        """
+        Delete the Compute Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier for the user resource profile to be deleted.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_compute_resource_id
+          Preferences related to a particular compute resource
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.deleteUserComputeResourcePreference(authz_token, user_id, gateway_id,
+                                                                                   user_compute_resource_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_user_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_user_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in delete_user_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_user_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_user_storage_preference(self, authz_token, user_id, gateway_id, user_storage_id):
+        """
+        Delete the Storage Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier of the user profile to be deleted.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_storage_id
+          ID of the storage preference you want to delete.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_storage_id
+        """
+        try:
+            return self.api_server_client_pool.deleteUserStoragePreference(authz_token, user_id, gateway_id,
+                                                                           user_storage_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_user_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_user_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_user_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_user_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_latest_queue_statuses(self, authz_token):
+        """
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getLatestQueueStatuses(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_latest_queue_statuses," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_latest_queue_statuses," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_latest_queue_statuses, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_latest_queue_statuses, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_data_product(self, authz_token, data_product_model):
+        """
+        API Methods related to replica catalog
+
+
+        Parameters:
+         - authz_token
+         - data_product_model
+        """
+        try:
+            return self.api_server_client_pool.registerDataProduct(authz_token, data_product_model)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_data_product," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_data_product," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_data_product, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_data_product, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_data_product(self, authz_token, data_product_uri):
+        """
+        Parameters:
+         - authz_token
+         - data_product_uri
+        """
+        try:
+            return self.api_server_client_pool.getDataProduct(authz_token, data_product_uri)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_data_product," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_data_product," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_data_product, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_data_product, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_replica_location(self, authz_token, replica_location_model):
+        """
+        Parameters:
+         - authz_token
+         - replica_location_model
+        """
+        try:
+            return self.api_server_client_pool.registerReplicaLocation(authz_token, replica_location_model)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_replica_location," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_replica_location," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_replica_location, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_replica_location, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_parent_data_product(self, authz_token, product_uri):
+        """
+        Parameters:
+         - authz_token
+         - product_uri
+        """
+        try:
+            return self.api_server_client_pool.getParentDataProduct(authz_token, product_uri)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_parent_data_product," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_parent_data_product," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_parent_data_product, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_parent_data_product, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_child_data_products(self, authz_token, product_uri):
+        """
+        Parameters:
+         - authz_token
+         - product_uri
+        """
+        try:
+            return self.api_server_client_pool.getChildDataProducts(authz_token, product_uri)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_child_data_products," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_child_data_products," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_child_data_products, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_child_data_products, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def share_resource_with_users(self, authz_token, resource_id, user_permission_list):
+        """
+        Group Manager and Data Sharing Related API methods
+
+
+        Parameters:
+         - authz_token
+         - resource_id
+         - user_permission_list
+        """
+        try:
+            return self.api_server_client_pool.shareResourceWithUsers(authz_token, resource_id, user_permission_list)
+        except InvalidRequestException:
+            logger.exception("Error occurred in share_resource_with_users," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in share_resource_with_users," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in share_resource_with_users, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in share_resource_with_users, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def share_resource_with_groups(self, authz_token, resource_id, group_permission_list):
+        """
+        Parameters:
+         - authz_token
+         - resourceId
+         - groupPermissionList
+        """
+        try:
+            return self.api_server_client_pool.shareResourceWithGroups(authz_token, resource_id, group_permission_list)
+        except InvalidRequestException:
+            logger.exception("Error occurred in share_resource_with_groups," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in share_resource_with_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in share_resource_with_groups, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in share_resource_with_groups, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def revoke_sharing_of_resource_from_users(self, authz_token, resource_id, user_permission_list):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - user_permission_list
+        """
+        try:
+            return self.api_server_client_pool.revokeSharingOfResourceFromUsers(authz_token, resource_id,
+                                                                                user_permission_list)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_users," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_users," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_users, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_users, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def revoke_sharing_of_resource_from_groups(self, authz_token, resource_id, group_permission_list):
+        """
+        Parameters:
+         - authz_token
+         - resourceId
+         - groupPermissionList
+        """
+        try:
+            return self.api_server_client_pool.revokeSharingOfResourceFromGroups(authz_token, resource_id,
+                                                                                 group_permission_list)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_groups," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_groups, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_groups, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_accessible_users(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.getAllAccessibleUsers(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_accessible_users," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_accessible_users," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_accessible_users, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_accessible_users, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_accessible_groups(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.getAllAccessibleGroups(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_accessible_groups," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_accessible_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_accessible_groups, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_accessible_groups, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_directly_accessible_users(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.getAllDirectlyAccessibleUsers(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_users," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_users," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_users, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_users, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_directly_accessible_groups(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.getAllDirectlyAccessibleGroups(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_groups," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_groups, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_groups, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def user_has_access(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resourceId
+         - permissionType
+        """
+        try:
+            return self.api_server_client_pool.userHasAccess(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in user_has_access," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in user_has_access," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in user_has_access, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in user_has_access, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def create_group_resource_profile(self, authz_token, group_resource_profile):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.createGroupResourceProfile(authz_token, group_resource_profile)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_group_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in create_group_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_group_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_group_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_group_resource_profile(self, authz_token, group_resource_profile):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.updateGroupResourceProfile(authz_token, group_resource_profile)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_group_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_group_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_group_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_group_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_group_resource_profile(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupResourceProfile(authz_token, group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_group_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_group_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_group_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_group_resource_profile(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.removeGroupResourceProfile(authz_token, group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in remove_group_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_group_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in remove_group_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in remove_group_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_group_resource_list(self, authz_token, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupResourceList(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_group_resource_list," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_resource_list," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_group_resource_list, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_group_resource_list, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_group_compute_prefs(self, authz_token, compute_resource_id, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.removeGroupComputePrefs(authz_token, compute_resource_id,
+                                                                       group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in remove_group_compute_prefs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_group_compute_prefs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in remove_group_compute_prefs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in remove_group_compute_prefs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_group_compute_resource_policy(self, authz_token, resource_policy_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_policy_id
+        """
+        try:
+            return self.api_server_client_pool.removeGroupComputeResourcePolicy(authz_token, resource_policy_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in remove_group_compute_resource_policy," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_group_compute_resource_policy," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in remove_group_compute_resource_policy, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in remove_group_compute_resource_policy, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def remove_group_batch_queue_resource_policy(self, authz_token, resource_policy_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_policy_id
+        """
+        try:
+            return self.api_server_client_pool.removeGroupBatchQueueResourcePolicy(authz_token, resource_policy_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in remove_group_batch_queue_resource_policy," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_group_batch_queue_resource_policy," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in remove_group_batch_queue_resource_policy, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in remove_group_batch_queue_resource_policy, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_compute_resource_preference(self, authz_token, compute_resource_id, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupComputeResourcePreference(authz_token, compute_resource_id,
+                                                                                 group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_compute_resource_policy(self, authz_token, resource_policy_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_policy_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupComputeResourcePolicy(authz_token, resource_policy_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_batch_queue_resource_policy(self, authz_token, resource_policy_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_policy_id
+        """
+        try:
+            return self.api_server_client_pool.getBatchQueueResourcePolicy(authz_token, resource_policy_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_batch_queue_resource_policy," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_batch_queue_resource_policy," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_batch_queue_resource_policy, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_batch_queue_resource_policy, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_compute_resource_pref_list(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupComputeResourcePrefList(authz_token, group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_pref_list," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_pref_list," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_pref_list, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_pref_list, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_batch_queue_resource_policy_list(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupBatchQueueResourcePolicyList(authz_token,
+                                                                                    group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_batch_queue_resource_policy_list," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_batch_queue_resource_policy_list," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_batch_queue_resource_policy_list, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_batch_queue_resource_policy_list, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_compute_resource_policy_list(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupComputeResourcePolicyList(authz_token, group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy_list," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy_list," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy_list, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy_list, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_gateway_groups(self, authz_token):
+        """
+        GatewayGroups API methods
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getGatewayGroups(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_gateway_groups," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_gateway_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_gateway_groups, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_gateway_groups, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_parser(self, authz_token, parser_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - parserId
+         - gatewayId
+        """
+        try:
+            return self.api_server_client_pool.getParser(authz_token, parser_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_parser," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_parser," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_parser, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_parser, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def save_parser(self, authz_token, parser):
+        """
+        Parameters:
+         - authz_token
+         - parser
+        """
+        try:
+            return self.api_server_client_pool.saveParser(authz_token, parser)
+        except InvalidRequestException:
+            logger.exception("Error occurred in save_parser," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in save_parser," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in save_parser, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in save_parser, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def list_all_parsers(self, authz_token, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.listAllParsers(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in list_all_parsers," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in list_all_parsers," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in list_all_parsers, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in list_all_parsers, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_parser(self, authz_token, parser_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - parser_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.removeParser(authz_token, parser_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in remove_parser," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_parser," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in remove_parser, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in remove_parser, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_parsing_template(self, authz_token, template_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - template_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getParsingTemplate(authz_token, template_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_parsing_template," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_parsing_template," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_parsing_template, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_parsing_template, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_parsing_templates_for_experiment(self, authz_token, experiment_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - experimentId
+         - gatewayId
+        """
+        try:
+            return self.api_server_client_pool.getParsingTemplatesForExperiment(authz_token, experiment_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_parsing_templates_for_experiment," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_parsing_templates_for_experiment," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_parsing_templates_for_experiment, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_parsing_templates_for_experiment, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def save_parsing_template(self, authz_token, parsing_template):
+        """
+        Parameters:
+         - authz_token
+         - parsing_template
+        """
+        try:
+            return self.api_server_client_pool.saveParsingTemplate(authz_token, parsing_template)
+        except InvalidRequestException:
+            logger.exception("Error occurred in save_parsing_template," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in save_parsing_template," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in save_parsing_template, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in save_parsing_template, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_parsing_template(self, authz_token, template_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - template_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.removeParsingTemplate(authz_token, template_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in remove_parsing_template," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_parsing_template," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in remove_parsing_template, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in remove_parsing_template, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def list_all_parsing_templates(self, authz_token, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.listAllParsingTemplates(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in list_all_parsing_templates," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in list_all_parsing_templates," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in list_all_parsing_templates, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in list_all_parsing_templates, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.api_server_settings.API_SERVER_HOST = config.get('APIServer', 'API_HOST')
+            self.api_server_settings.API_SERVER_PORT = config.getint('APIServer', 'API_PORT')
+            self.api_server_settings.API_SERVER_SECURE = config.getboolean('APIServer', 'API_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/credential_store_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/credential_store_client.py
new file mode 100644
index 0000000..8b4c2cb
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/credential_store_client.py
@@ -0,0 +1,60 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import CredentialStoreAPIClientSettings
+from transport import utils
+from airavata.api.credential.store.error.ttypes import CredentialStoreException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class CredentialStoreClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.credential_store_server_settings = CredentialStoreAPIClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.credential_store_client_pool = utils.initialize_credential_store_client(
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_HOST,
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_PORT,
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_SECURE)
+
+    def get_SSH_credential(self, token_id, gateway_id):
+        """
+        :param token_id:
+        :param gateway_id
+        :return: credential
+        """
+        try:
+            return self.credential_store_client_pool.getSSHCredential(token_id, gateway_id)
+        except CredentialStoreException:
+            logger.exception("Error occurred in get_SSH_credential, probably due to invalid parameters ")
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_HOST = config.get('CredentialStoreServer',
+                                                                                         'CREDENTIAL_STORE_API_HOST')
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_PORT = config.getint('CredentialStoreServer',
+                                                                                            'CREDENTIAL_STORE_API_PORT')
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_SECURE = config.getboolean(
+                'CredentialStoreServer',
+                'CREDENTIAL_STORE_API_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/file_handling_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/file_handling_client.py
new file mode 100644
index 0000000..cf2b5a1
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/file_handling_client.py
@@ -0,0 +1,61 @@
+#  Licrecursive=Nonepache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import paramiko
+from paramiko import SSHClient
+from scp import SCPClient
+
+ssh = SSHClient()
+ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ssh.load_system_host_keys()
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class FileHandler(object):
+
+    def __init__(self, host, port, username, passphrase, privateKeyFilePath):
+        self.host = host
+        self.port = port
+        self.username = username
+        self.password = passphrase
+        self.filePath = privateKeyFilePath
+
+    def upload_file(self, files, remote_path, recursive, preserve_item):
+        try:
+            ssh.connect(self.host, self.port, self.username, passphrase=self.password, pkey=self.filePath)
+            with SCPClient(ssh.get_transport()) as scp:
+                scp.put(files, remote_path, recursive, preserve_item)
+        finally:
+            scp.close()
+
+    def download_file(self, remote_path, local_path, recursive, preserve_item):
+        try:
+            ssh.connect(self.host, self.port, self.username, passphrase=self.password, pkey=self.filePath)
+            with SCPClient(ssh.get_transport()) as scp:
+                scp.get(remote_path, local_path, recursive, preserve_item)
+        finally:
+            scp.close()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/file_upload_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/file_upload_client.py
new file mode 100644
index 0000000..2399847
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/file_upload_client.py
@@ -0,0 +1,46 @@
+#  Licrecursive=Nonepache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 paramiko
+from paramiko import SSHClient
+from scp import SCPClient
+
+ssh = SSHClient()
+ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ssh.load_system_host_keys()
+
+
+class FileHandler(object):
+
+    def __init__(self, host, port, username, password):
+        self.host = host
+        self.port = port
+        self.username = username
+        self.password = password
+
+
+def upload_file(self, files, remote_path, recursive, preserve_item):
+    ssh.connect(self.host, self.port, self.username, self.password)
+    with SCPClient(ssh.get_transport()) as scp:
+        scp.put(files, remote_path, recursive, preserve_item)
+        scp.close()
+
+
+def download_file(self, remote_path, local_path, recursive, preserve_item):
+    ssh.connect(self.host, self.port, self.username, self.password)
+    with SCPClient(ssh.get_transport()) as scp:
+        scp.get(self, remote_path, local_path, recursive, preserve_item)
+        scp.close()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/group_manager_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/group_manager_client.py
new file mode 100644
index 0000000..86de6e1
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/group_manager_client.py
@@ -0,0 +1,224 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import GroupManagerClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class GroupManagerClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.group_manager_settings = GroupManagerClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.group_manager_client_pool = utils.initialize_group_manager_client(
+            self.group_manager_settings.PROFILE_SERVICE_HOST,
+            self.group_manager_settings.PROFILE_SERVICE_PORT,
+            self.group_manager_settings.PROFILE_SERVICE_SECURE)
+
+    def get_api_version(self):
+        try:
+            return self.group_manager_client_pool.getAPIVersion()
+        except TException:
+            logger.exception("Error occurred in get_api_version, ")
+            raise
+
+    def create_group(self, authz_token, group_model):
+        """
+        Parameters:
+         - authz_token
+         - group_model
+        """
+        try:
+            return self.group_manager_client_pool.createGroup(authz_token, group_model)
+        except TException:
+            logger.exception("Error occurred in create_group, ")
+            raise
+
+    def update_group(self, authz_token, group_model):
+        """
+        Parameters:
+         - authz_token
+         - group_model
+        """
+        try:
+            return self.group_manager_client_pool.updateGroup(authz_token, group_model)
+        except TException:
+            logger.exception("Error occurred in update_group, ")
+            raise
+
+    def delete_group(self, authz_token, group_id, owner_id):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+         - owner_id
+        """
+        try:
+            return self.group_manager_client_pool.deleteGroup(authz_token, group_id, owner_id)
+        except TException:
+            logger.exception("Error occurred in delete_group,")
+            raise
+
+    def get_group(self, authz_token, group_id):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+        """
+        try:
+            return self.group_manager_client_pool.getGroup(authz_token, group_id)
+        except TException:
+            logger.exception("Error occurred in get_group, ")
+            raise
+
+    def get_groups(self, authz_token):
+        """
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.group_manager_client_pool.getGroups(authz_token)
+        except TException:
+            logger.exception("Error occurred in get_groups, ")
+            raise
+
+    def get_all_groups_user_belongs(self, authz_token, user_name):
+        """
+        Parameters:
+         - authz_token
+         - user_name
+        """
+        try:
+            return self.group_manager_client_pool.getAllGroupsUserBelongs(authz_token, user_name)
+        except TException:
+            logger.exception("Error occurred in get_all_groups_user_belongs, ")
+            raise
+
+    def add_users_to_group(self, authz_token, user_ids, group_id):
+        """
+        Parameters:
+         - authz_token
+         - user_ids
+         - group_id
+        """
+        try:
+            return self.group_manager_client_pool.addUsersToGroup(authz_token, user_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in add_users_to_group, ")
+            raise
+
+    def remove_users_from_group(self, authz_token, user_ids, group_id):
+        """
+        Parameters:
+         - authz_token
+         - user_ids
+         - group_id
+        """
+        try:
+            return self.group_manager_client_pool.removeUsersFromGroup(authz_token, user_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in remove_users_from_group, ")
+            raise
+
+    def transfer_group_ownership(self, authz_token, group_id, new_owner_id):
+        """
+        Parameters:
+         - authzToken
+         - groupId
+         - newOwnerId
+        """
+        try:
+            return self.group_manager_client_pool.transferGroupOwnership(authz_token, group_id, new_owner_id)
+        except TException:
+            logger.exception("Error occurred in transfer_group_ownership, ")
+            raise
+
+    def add_group_admins(self, authz_token, group_id, admin_ids):
+        """
+        Parameters:
+         - authzToken
+         - group_id
+         - admin_ids
+        """
+        try:
+            return self.group_manager_client_pool.addGroupAdmins(authz_token, group_id, admin_ids)
+        except TException:
+            logger.exception("Error occurred in add_group_admins, ")
+            raise
+
+    def remove_group_admins(self, authz_token, group_id, admin_ids):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+         - admin_ids
+        """
+        try:
+            return self.group_manager_client_pool.removeGroupAdmins(authz_token, group_id, admin_ids)
+        except TException:
+            logger.exception("Error occurred in remove_group_admins, ")
+            raise
+
+    def has_admin_access(self, authz_token, group_id, admin_id):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+         - admin_id
+        """
+        try:
+            return self.group_manager_client_pool.hasAdminAccess(authz_token, group_id, admin_id)
+        except TException:
+            logger.exception("Error occurred in has_admin_access, ")
+            raise
+
+    def has_owner_access(self, authz_token, group_id, owner_id):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+         - owner_id
+        """
+        try:
+            return self.group_manager_client_pool.hasOwnerAccess(authz_token, group_id, owner_id)
+        except TException:
+            logger.exception("Error occurred in has_owner_access, ")
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.group_manager_settings.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+            self.group_manager_settings.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+            self.group_manager_settings.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer',
+                                                                                   'PROFILE_SERVICE_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/iam_admin_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/iam_admin_client.py
new file mode 100644
index 0000000..9c75f4c
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/iam_admin_client.py
@@ -0,0 +1,246 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import IAMAdminClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class IAMAdminClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.iam_admin_settings = IAMAdminClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.iam_admin_client_pool = utils.initialize_iam_admin_client(
+            self.iam_admin_settings.PROFILE_SERVICE_HOST,
+            self.iam_admin_settings.PROFILE_SERVICE_PORT,
+            self.iam_admin_settings.PROFILE_SERVICE_SECURE)
+
+    def set_up_gateway(self, authz_token, gateway):
+        """
+        Parameters:
+         - authz_token
+         - gateway
+        """
+        try:
+            return self.iam_admin_client_pool.setUpGateway(authz_token, gateway)
+        except TException:
+            logger.exception("Error occurred in set_up_gateway, ", TException)
+            raise
+
+    def is_username_available(self, authz_token, username):
+        """
+        Parameters:
+         - authz_token
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.isUsernameAvailable(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in is_username_available, ", TException)
+            raise
+
+    def register_user(self, authz_token, username, email_address, first_name, last_name, new_password):
+        """
+        Parameters:
+         - authz_token
+         - username
+         - email_address
+         - first_name
+         - last_name
+         - new_password
+        """
+        try:
+            return self.iam_admin_client_pool.registerUser(authz_token, username, email_address,
+                                                              first_name, last_name, new_password)
+        except TException:
+            logger.exception("Error occurred in register_user, ", TException)
+            raise
+
+    def enable_user(self, authz_token, username):
+        """
+        Parameters:
+         - authz_token
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.enableUser(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in enable_user, ", TException)
+            raise
+
+    def is_user_enabled(self, authz_token, username):
+        """
+        Parameters:
+         - authzToken
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.isUserEnabled(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in is_user_enabled, ", TException)
+            raise
+
+    def is_user_exist(self, authz_token, username):
+        """
+        Parameters:
+         - authzToken
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.isUserExist(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in is_user_exist, ", TException)
+            raise
+
+    def get_user(self, authz_token, username):
+        """
+        Parameters:
+         - authzToken
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.getUser(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in get_user, ", TException)
+            raise
+
+    def get_users(self, authz_token, offset, limit, search):
+        """
+        Parameters:
+         - authzToken
+         - offset
+         - limit
+         - search
+        """
+        try:
+            return self.iam_admin_client_pool.getUsers(authz_token, offset, limit, search)
+        except TException:
+            logger.exception("Error occurred in get_users, ", TException)
+            raise
+
+    def reset_user_password(self, authz_token, username, new_password):
+        """
+        Parameters:
+         - authzToken
+         - username
+         - newPassword
+        """
+        try:
+            return self.iam_admin_client_pool.resetUserPassword( authz_token, username, new_password)
+        except TException:
+            logger.exception("Error occurred in reset_user_password, ", TException)
+            raise
+
+    def find_users(self, authz_token, email, user_id):
+        """
+        Parameters:
+         - authzToken
+         - email
+         - userId
+        """
+        try:
+            return self.iam_admin_client_pool.findUsers(authz_token, email, user_id)
+        except TException:
+            logger.exception("Error occurred in find_users, ", TException)
+            raise
+
+    def update_user_profile(self, authz_token, user_details):
+        """
+        Parameters:
+         - authzToken
+         - userDetails
+        """
+        try:
+            return self.iam_admin_client_pool.updateUserProfile(authz_token, user_details)
+        except TException:
+            logger.exception("Error occurred in update_user_profile, ", TException)
+            raise
+
+    def delete_user(self, authz_token, username):
+        """
+        Parameters:
+         - authzToken
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.deleteUser(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in delete_user, ", TException)
+            raise
+
+    def add_role_to_user(self, authz_token, username, role_name):
+        """
+        Parameters:
+         - authzToken
+         - username
+         - roleName
+        """
+        try:
+            return self.iam_admin_client_pool.addRoleToUser(authz_token, username, role_name)
+        except TException:
+            logger.exception("Error occurred in add_role_to_user, ", TException)
+            raise
+
+    def remove_role_from_user(self, authz_token, username, role_name):
+        """
+        Parameters:
+         - authzToken
+         - username
+         - roleName
+        """
+        try:
+            return self.iam_admin_client_pool.removeRoleFromUser(authz_token, username, role_name)
+        except TException:
+            logger.exception("Error occurred in remove_role_from_user, ", TException)
+            raise
+
+    def get_users_with_role(self, authz_token, role_name):
+        """
+        Parameters:
+         - authzToken
+         - roleName
+        """
+        try:
+            return self.iam_admin_client_pool.getUsersWithRole(authz_token, role_name)
+        except TException:
+            logger.exception("Error occurred in create_group, ", TException)
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.iam_admin_settings.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+            self.iam_admin_settings.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+            self.iam_admin_settings.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer',
+                                                                                   'PROFILE_SERVICE_SECURE')
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/keycloak_token_fetcher.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/keycloak_token_fetcher.py
new file mode 100644
index 0000000..36c7e62
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/keycloak_token_fetcher.py
@@ -0,0 +1,67 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 configparser
+
+from requests_oauthlib import OAuth2Session
+from oauthlib.oauth2 import LegacyApplicationClient
+from airavata.model.security.ttypes import AuthzToken
+
+from transport.settings import KeycloakConfiguration
+import os
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+
+class Authenticator(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.keycloak_settings = KeycloakConfiguration(configuration_file_location)
+        self._load_settings(configuration_file_location)
+
+    def get_token_and_user_info_password_flow(self, username, password, gateway_id):
+        client_id = self.keycloak_settings.CLIENT_ID
+        client_secret = self.keycloak_settings.CLIENT_SECRET
+        token_url = self.keycloak_settings.TOKEN_URL
+        userinfo_url = self.keycloak_settings.USER_INFO_URL
+        verify_ssl = self.keycloak_settings.VERIFY_SSL
+        oauth2_session = OAuth2Session(client=LegacyApplicationClient(
+            client_id=client_id))
+        oauth2_session.verify = self.keycloak_settings.KEYCLOAK_CA_CERTIFICATE
+        token = oauth2_session.fetch_token(token_url=token_url,
+                                           username=username,
+                                           password=password,
+                                           client_id=client_id,
+                                           client_secret=client_secret,
+                                           verify=verify_ssl)
+
+        claimsMap = {
+            "userName": username,
+            "gatewayID": gateway_id
+        }
+        return AuthzToken(accessToken=token['access_token'], claimsMap=claimsMap)
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.keycloak_settings.KEYCLOAK_CA_CERTIFICATE = config.get("KeycloakServer",'CERTIFICATE_FILE_PATH')
+            self.keycloak_settings.CLIENT_ID = config.get('KeycloakServer', 'CLIENT_ID')
+            self.keycloak_settings.CLIENT_SECRET = config.get('KeycloakServer', 'CLIENT_SECRET')
+            self.keycloak_settings.TOKEN_URL = config.get('KeycloakServer', 'TOKEN_URL')
+            self.keycloak_settings.USER_INFO_URL = config.get('KeycloakServer', 'USER_INFO_URL')
+            self.keycloak_settings.VERIFY_SSL = config.getboolean('KeycloakServer', 'VERIFY_SSL')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/sharing_registry_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/sharing_registry_client.py
new file mode 100644
index 0000000..27ed805
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/sharing_registry_client.py
@@ -0,0 +1,880 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import SharingAPIClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class SharingRegistryClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.sharing_registry_client_settings = SharingAPIClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.sharing_registry_client_pool = utils.initialize_sharing_registry_client(
+            self.sharing_registry_client_settings.SHARING_API_HOST,
+            self.sharing_registry_client_settings.SHARING_API_PORT,
+            self.sharing_registry_client_settings.SHARING_API_SECURE)
+
+    def create_domain(self, domain):
+        """
+        <p>API method to create a new domain</p>
+
+        Parameters:
+         - domain
+        """
+        try:
+            return self.sharing_registry_client_pool.createDomain(domain)
+        except TException:
+            logger.exception("Error occurred in create_domain, ", )
+            raise
+
+    def update_domain(self, domain):
+        """
+        <p>API method to update a domain</p>
+
+        Parameters:
+         - domain
+        """
+        try:
+            return self.sharing_registry_client_pool.updateDomain(domain)
+        except TException:
+            logger.exception("Error occurred in update_domain, ", )
+            raise
+
+    def is_domain_exists(self, domain_id):
+        """
+        <p>API method to check Domain Exists</p>
+
+        Parameters:
+         - domainId
+        """
+        try:
+            return self.sharing_registry_client_pool.isDomainExists(domain_id)
+        except TException:
+            logger.exception("Error occurred in is_domain_exists, ", )
+            raise
+
+    def delete_domain(self, domain_id):
+        """
+        <p>API method to delete domain</p>
+
+        Parameters:
+         - domainId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteDomain(domain_id)
+        except TException:
+            logger.exception("Error occurred in delete_domain, ", )
+            raise
+
+    def get_domain(self, domain_id):
+        """
+        <p>API method to retrieve a domain</p>
+
+        Parameters:
+         - domainId
+        """
+        try:
+            return self.sharing_registry_client_pool.getDomain(domain_id)
+        except TException:
+            logger.exception("Error occurred in get_domain, ", )
+            raise
+
+    def get_domains(self, offset, limit):
+        """
+        <p>API method to get all domain.</p>
+
+        Parameters:
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getDomains(offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_domains, ", )
+            raise
+
+    def create_user(self, user):
+        """
+        <p>API method to register a user in the system</p>
+
+        Parameters:
+         - user
+        """
+        try:
+            return self.sharing_registry_client_pool.createUser(user)
+        except TException:
+            logger.exception("Error occurred in create_user, ", )
+            raise
+
+    def updated_user(self, user):
+        """
+        <p>API method to update existing user</p>
+
+        Parameters:
+         - user
+        """
+        try:
+            return self.sharing_registry_client_pool.updatedUser(user)
+        except TException:
+            logger.exception("Error occurred in updated_user, ", )
+            raise
+
+    def is_user_exists(self, domain_id, user_id):
+        """
+        <p>API method to check User Exists</p>
+
+        Parameters:
+         - domainId
+         - userId
+        """
+        try:
+            return self.sharing_registry_client_pool.isUserExists(domain_id, user_id)
+        except TException:
+            logger.exception("Error occurred in is_user_exists, ", )
+            raise
+
+    def delete_user(self, domain_id, user_id):
+        """
+        <p>API method to delete user</p>
+
+        Parameters:
+         - domainId
+         - userId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteUser(domain_id, user_id)
+        except TException:
+            logger.exception("Error occurred in delete_user, ", )
+            raise
+
+    def get_user(self, domain_id, user_id):
+        """
+        <p>API method to get a user</p>
+
+        Parameters:
+         - domainId
+         - userId
+        """
+        try:
+            return self.sharing_registry_client_pool.getUser(domain_id, user_id)
+        except TException:
+            logger.exception("Error occurred in get_user, ", )
+            raise
+
+    def get_users(self, domain_id, offset, limit):
+        """
+        <p>API method to get a list of users in a specific domain.</p>
+        <li>domainId : Domain id</li>
+        <li>offset : Starting result number</li>
+        <li>limit : Number of max results to be sent</li>
+
+        Parameters:
+         - domainId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getUsers(domain_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_users, ", )
+            raise
+
+    def create_group(self, group):
+        """
+        <p>API method to create a new group</p>
+
+        Parameters:
+         - group
+        """
+        try:
+            return self.sharing_registry_client_pool.createGroup(group)
+        except TException:
+            logger.exception("Error occurred in create_group, ", )
+            raise
+
+    def update_group(self, group):
+        """
+        <p>API method to update a group</p>
+
+        Parameters:
+         - group
+        """
+        try:
+            return self.sharing_registry_client_pool.updateGroup(group)
+        except TException:
+            logger.exception("Error occurred in update_group, ", )
+            raise
+
+    def is_group_exists(self, domain_id, group_id):
+        """
+        <p>API method to check Group Exists</p>
+
+        Parameters:
+         - domainId
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.isGroupExists(domain_id, group_id)
+        except TException:
+            logger.exception("Error occurred in is_group_exists, ", )
+            raise
+
+    def delete_group(self, domain_id, group_id):
+        """
+        <p>API method to delete a group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteGroup(domain_id, group_id)
+        except TException:
+            logger.exception("Error occurred in delete_group, ", )
+            raise
+
+    def get_group(self, domain_id, group_id):
+        """
+        <p>API method to get a group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.getGroup(domain_id, group_id)
+        except TException:
+            logger.exception("Error occurred in get_group, ", )
+            raise
+
+    def get_groups(self, domain_id, offset, limit):
+        """
+        <p>API method to get groups in a domainId.</p>
+
+        Parameters:
+         - domainId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getGroups(domain_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_groups, ", )
+            raise
+
+    def add_users_to_group(self, domain_id, user_ids, group_id):
+        """
+        <p>API method to add list of users to a group</p>
+
+        Parameters:
+         - domainId
+         - userIds
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.addUsersToGroup(domain_id, user_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in add_users_to_group, ", )
+            raise
+
+    def remove_users_from_group(self, domain_id, user_ids, group_id):
+        """
+        <p>API method to remove users from a group</p>
+
+        Parameters:
+         - domainId
+         - userIds
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.removeUsersFromGroup(domain_id, user_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in remove_users_from_group, ", )
+            raise
+
+    def transfer_group_ownership(self, domain_id, group_id, new_owner_id):
+        """
+        <p>API method to transfer group ownership</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - newOwnerId
+        """
+        try:
+            return self.sharing_registry_client_pool.transferGroupOwnership(domain_id, group_id, new_owner_id)
+        except TException:
+            logger.exception("Error occurred in transfer_group_ownership, ", )
+            raise
+
+    def add_group_admins(self, domain_id, group_id, admin_ids):
+        """
+        <p>API method to add Admin for a group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - adminIds
+        """
+        try:
+            return self.sharing_registry_client_pool.addGroupAdmins(domain_id, group_id, admin_ids)
+        except TException:
+            logger.exception("Error occurred in add_group_admins, ", )
+            raise
+
+    def remove_group_admins(self, domain_id, group_id, admin_ids):
+        """
+        <p>API method to remove Admin for a group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - adminIds
+        """
+        try:
+            return self.sharing_registry_client_pool.removeGroupAdmins(domain_id, group_id, admin_ids)
+        except TException:
+            logger.exception("Error occurred in remove_group_admins, ", )
+            raise
+
+    def has_admin_access(self, domain_id, group_id, admin_id):
+        """
+        <p>API method to check whether the user has Admin access for the group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - adminId
+        """
+        try:
+            return self.sharing_registry_client_pool.hasAdminAccess(domain_id, group_id, admin_id)
+        except TException:
+            logger.exception("Error occurred in has_admin_access, ", )
+            raise
+
+    def has_owner_access(self, domain_id, group_id, owner_id):
+        """
+        <p>API method to check whether the user has Admin access for the group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - ownerId
+        """
+        try:
+            return self.sharing_registry_client_pool.hasOwnerAccess(domain_id, group_id, owner_id)
+        except TException:
+            logger.exception("Error occurred in has_owner_access, ", )
+            raise
+
+    def get_group_members_of_type_user(self, domain_id, group_id, offset, limit):
+        """
+        <p>API method to get list of child users in a group. Only the direct members will be returned.</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getGroupMembersOfTypeUser(domain_id, group_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_group_members_of_type_user, ", )
+            raise
+
+    def get_group_members_of_type_group(self, domain_id, group_id, offset, limit):
+        """
+        <p>API method to get list of child groups in a group. Only the direct members will be returned.</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getGroupMembersOfTypeGroup(domain_id, group_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_group_members_of_type_group, ", )
+            raise
+
+    def add_child_groups_to_parent_group(self, domain_id, child_ids, group_id):
+        """
+        <p>API method to add a child group to a parent group.</p>
+
+        Parameters:
+         - domainId
+         - childIds
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.addChildGroupsToParentGroup(domain_id, child_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in add_child_groups_to_parent_group, ", )
+            raise
+
+    def remove_child_group_from_parent_group(self, domain_id, child_id, group_id):
+        """
+        <p>API method to remove a child group from parent group.</p>
+
+        Parameters:
+         - domainId
+         - childId
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.removeChildGroupFromParentGroup(domain_id, child_id, group_id)
+        except TException:
+            logger.exception("Error occurred in remove_child_group_from_parent_group, ", )
+            raise
+
+    def get_all_member_groups_for_user(self, domain_id, user_id):
+        """
+        Parameters:
+         - domainId
+         - userId
+        """
+        try:
+            return self.sharing_registry_client_pool.getAllMemberGroupsForUser(domain_id, user_id)
+        except TException:
+            logger.exception("Error occurred in get_all_member_groups_for_user, ", )
+            raise
+
+    def create_entity_type(self, entity_type):
+        """
+        <p>API method to create a new entity type</p>
+
+        Parameters:
+         - entityType
+        """
+        try:
+            return self.sharing_registry_client_pool.createEntityType(entity_type)
+        except TException:
+            logger.exception("Error occurred in create_entity_type, ", )
+            raise
+
+    def update_entity_type(self, entity_type):
+        """
+        <p>API method to update entity type</p>
+
+        Parameters:
+         - entityType
+        """
+        try:
+            return self.sharing_registry_client_pool.updateEntityType(entity_type)
+        except TException:
+            logger.exception("Error occurred in update_entity_type, ", )
+            raise
+
+    def is_entity_type_exists(self, domain_id, entity_type_id):
+        """
+        <p>API method to check EntityType Exists</p>
+
+        Parameters:
+         - domainId
+         - entityTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.isEntityTypeExists(domain_id, entity_type_id)
+        except TException:
+            logger.exception("Error occurred in is_entity_type_exists, ", )
+            raise
+
+    def delete_entity_type(self, domain_id, entity_type_id):
+        """
+        <p>API method to delete entity type</p>
+
+        Parameters:
+         - domainId
+         - entityTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteEntityType(domain_id, entity_type_id)
+        except TException:
+            logger.exception("Error occurred in delete_entity_type, ", )
+            raise
+
+    def get_entity_type(self, domain_id, entity_type_id):
+        """
+        <p>API method to get an entity type</p>
+
+        Parameters:
+         - domainId
+         - entityTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getEntityType(domain_id, entity_type_id)
+        except TException:
+            logger.exception("Error occurred in get_entity_type, ", )
+            raise
+
+    def get_entity_types(self, domain_id, offset, limit):
+        """
+        <p>API method to get entity types in a domainId.</p>
+
+        Parameters:
+         - domainId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getEntityTypes(domain_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_entity_types, ", )
+            raise
+
+    def create_entity(self, entity):
+        """
+        <p>API method to register new entity</p>
+
+        Parameters:
+         - entity
+        """
+        try:
+            return self.sharing_registry_client_pool.createEntity(entity)
+        except TException:
+            logger.exception("Error occurred in create_entity, ", )
+            raise
+
+    def update_entity(self, entity):
+        """
+        <p>API method to update entity</p>
+
+        Parameters:
+         - entity
+        """
+        try:
+            return self.sharing_registry_client_pool.updateEntity(entity)
+        except TException:
+            logger.exception("Error occurred in update_entity, ", )
+            raise
+
+    def is_entity_exists(self, domain_id, entity_id):
+        """
+        <p>API method to check Entity Exists</p>
+
+        Parameters:
+         - domainId
+         - entityId
+        """
+        try:
+            return self.sharing_registry_client_pool.isEntityExists(domain_id, entity_id)
+        except TException:
+            logger.exception("Error occurred in is_entity_exists, ", )
+            raise
+
+    def delete_entity(self, domain_id, entity_id):
+        """
+        <p>API method to delete entity</p>
+
+        Parameters:
+         - domainId
+         - entityId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteEntity(domain_id, entity_id)
+        except TException:
+            logger.exception("Error occurred in delete_entity, ", )
+            raise
+
+    def get_entity(self, domain_id, entity_id):
+        """
+        <p>API method to get entity</p>
+
+        Parameters:
+         - domainId
+         - entityId
+        """
+        try:
+            return self.sharing_registry_client_pool.getEntity(domain_id, entity_id)
+        except TException:
+            logger.exception("Error occurred in get_entity, ", )
+            raise
+
+    def search_entities(self, domain_id, user_id, filters, offset, limit):
+        """
+        <p>API method to search entities</p>
+
+        Parameters:
+         - domainId
+         - userId
+         - filters
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.searchEntities(domain_id, user_id, filters, offset, limit)
+        except TException:
+            logger.exception("Error occurred in search_entities, ", )
+            raise
+
+    def get_list_of_shared_users(self, domain_id, entity_id, permission_type_id):
+        """
+        <p>API method to get a list of shared users given the entity id</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getListOfSharedUsers(domain_id, entity_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_list_of_shared_users, ", )
+            raise
+
+    def get_list_of_directly_shared_users(self, domain_id, entity_id, permission_type_id):
+        """
+        <p>API method to get a list of shared users given the entity id where the sharing type is directly applied</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getListOfDirectlySharedUsers(domain_id, entity_id,
+                                                                                  permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_list_of_directly_shared_users, ", )
+            raise
+
+    def get_list_of_shared_groups(self, domain_id, entity_id, permission_type_id):
+        """
+        <p>API method to get a list of shared groups given the entity id</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getListOfSharedGroups(domain_id, entity_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_list_of_shared_groups, ", )
+            raise
+
+    def get_list_of_directly_shared_groups(self, domain_id, entity_id, permission_type_id):
+        """
+        <p>API method to get a list of directly shared groups given the entity id where the sharing type is directly applied</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getListOfDirectlySharedGroups(domain_id, entity_id,
+                                                                                   permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_list_of_directly_shared_groups, ", )
+            raise
+
+    def create_permission_type(self, permission_type):
+        """
+        <p>API method to create permission type</p>
+
+        Parameters:
+         - permissionType
+        """
+        try:
+            return self.sharing_registry_client_pool.createPermissionType(permission_type)
+        except TException:
+            logger.exception("Error occurred in create_permission_type, ", )
+            raise
+
+    def update_permission_type(self, permission_type):
+        """
+        <p>API method to update permission type</p>
+
+        Parameters:
+         - permissionType
+        """
+        try:
+            return self.sharing_registry_client_pool.updatePermissionType(permission_type)
+        except TException:
+            logger.exception("Error occurred in update_permission_type, ", )
+            raise
+
+    def is_permission_exists(self, domain_id, permission_id):
+        """
+        <p>API method to check Permission Exists</p>
+
+        Parameters:
+         - dimainId
+         - permissionId
+        """
+        try:
+            return self.sharing_registry_client_pool.isPermissionExists(domain_id, permission_id)
+        except TException:
+            logger.exception("Error occurred in is_permission_exists, ", )
+            raise
+
+    def delete_permission_type(self, domain_id, permission_type_id):
+        """
+        <p>API method to delete permission type</p>
+
+        Parameters:
+         - domainId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.deletePermissionType(domain_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in delete_permission_type, ", )
+            raise
+
+    def get_permission_type(self, domain_id, permission_type_id):
+        """
+        <p>API method to get permission type</p>
+
+        Parameters:
+         - domainId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getPermissionType(domain_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_permission_type, ", )
+            raise
+
+    def get_permission_types(self, domain_id, offset, limit):
+        """
+        <p>API method to get list of permission types in a given domainId.</p>
+
+        Parameters:
+         - domainId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getPermissionTypes(domain_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_permission_types, ", )
+            raise
+
+    def share_entity_with_users(self, domain_id, entity_id, user_list, permission_type_id, cascade_permission):
+        """
+        <p>API method to share an entity with users</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - userList
+         - permissionTypeId
+         - cascadePermission
+        """
+        try:
+            return self.sharing_registry_client_pool.shareEntityWithUsers(domain_id, entity_id, user_list,
+                                                                          permission_type_id, cascade_permission)
+        except TException:
+            logger.exception("Error occurred in share_entity_with_users, ", )
+            raise
+
+    def revoke_entity_sharing_from_users(self, domain_id, entity_id, user_list, permission_type_id):
+        """
+        <p>API method to revoke sharing from a list of users</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - userList
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.revokeEntitySharingFromUsers(domain_id, entity_id, user_list,
+                                                                                  permission_type_id)
+        except TException:
+            logger.exception("Error occurred in revoke_entity_sharing_from_users, ", )
+            raise
+
+    def share_entity_with_groups(self, domain_id, entity_id, group_list, permission_type_id, cascade_permission):
+        """
+        <p>API method to share an entity with list of groups</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - groupList
+         - permissionTypeId
+         - cascadePermission
+        """
+        try:
+            return self.sharing_registry_client_pool.shareEntityWithGroups(domain_id, entity_id, group_list,
+                                                                           permission_type_id, cascade_permission)
+        except TException:
+            logger.exception("Error occurred in share_entity_with_groups, ", )
+            raise
+
+    def revoke_entity_sharing_from_groups(self, domain_id, entity_id, group_list, permission_type_id):
+        """
+        <p>API method to revoke sharing from list of users</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - groupList
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.revokeEntitySharingFromGroups(domain_id, entity_id, group_list,
+                                                                                   permission_type_id)
+        except TException:
+            logger.exception("Error occurred in revoke_entity_sharing_from_groups, ", )
+            raise
+
+    def user_has_access(self, domain_id, user_id, entity_id, permission_type_id):
+        """
+        <p>API method to check whether a user has access to a specific entity</p>
+
+        Parameters:
+         - domainId
+         - userId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.userHasAccess(domain_id, user_id, entity_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in user_has_access, ", )
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.sharing_registry_client_settings.SHARING_API_HOST = config.get('SharingServer', 'SHARING_API_HOST')
+            self.sharing_registry_client_settings.SHARING_API_PORT = config.getint('SharingServer', 'SHARING_API_PORT')
+            self.sharing_registry_client_settings.SHARING_API_SECURE = config.getboolean('SharingServer',
+                                                                                         'SHARING_API_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/tenant_profile_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/tenant_profile_client.py
new file mode 100644
index 0000000..878f728
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/tenant_profile_client.py
@@ -0,0 +1,140 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import TenantProfileServerClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class TenantProfileClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.tenant_profile_settings = TenantProfileServerClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.tenant_profile_client_pool = utils.initialize_tenant_profile_client(
+            self.tenant_profile_settings.PROFILE_SERVICE_HOST,
+            self.tenant_profile_settings.PROFILE_SERVICE_PORT,
+            self.tenant_profile_settings.PROFILE_SERVICE_SECURE)
+
+    def add_gateway(self, authz_token, gateway):
+        """
+        Return the airavataInternalGatewayId assigned to given gateway.
+
+        Parameters:
+         - authz_token
+         - gateway
+        """
+        try:
+            return self.tenant_profile_client_pool.addGateway(authz_token, gateway)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def update_gateway(self, authz_token, updated_gateway):
+        """
+        Parameters:
+         - authz_token
+         - updated_gateway
+        """
+        try:
+            return self.tenant_profile_client_pool.updateGateway(authz_token, updated_gateway)
+        except TException:
+            logger.exception("Error occurred in update_gateway, ", TException)
+            raise
+
+    def get_gateway(self, authz_token, airavata_internal_gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - airavata_internal_gateway_id
+        """
+        try:
+            return self.tenant_profile_client_pool.getGateway(authz_token, airavata_internal_gateway_id)
+        except TException:
+            logger.exception("Error occurred in get_gateway, ", TException)
+            raise
+
+    def delete_gateway(self, authz_token, airavata_internal_gateway_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - airavata_internal_gateway_id
+         - gateway_id
+        """
+        try:
+            return self.tenant_profile_client_pool.deleteGateway(authz_token, airavata_internal_gateway_id, gateway_id)
+        except TException:
+            logger.exception("Error occurred in delete_gateway, ", TException)
+            raise
+
+    def get_all_gateways(self, authz_token):
+        """
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.tenant_profile_client_pool.getAllGateways(authz_token)
+        except TException:
+            logger.exception("Error occurred in get_all_gateways, ", TException)
+            raise
+
+    def is_gateway_exist(self, authz_token, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.tenant_profile_client_pool.isGatewayExist(authz_token, gateway_id)
+        except TException:
+            logger.exception("Error occurred in is_gateway_exist, ", TException)
+            raise
+
+    def get_all_gateways_for_user(self, authz_token, requester_username):
+        """
+        Parameters:
+         - authz_token
+         - requester_username
+        """
+        try:
+            return self.tenant_profile_client_pool.getAllGatewaysForUser(authz_token, requester_username)
+        except TException:
+            logger.exception("Error occurred in get_all_gateways_for_user, ", TException)
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            settings = config['ProfileServer']
+            self.tenant_profile_settings.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+            self.tenant_profile_settings.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+            self.tenant_profile_settings.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/user_profile_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/user_profile_client.py
new file mode 100644
index 0000000..5762f22
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/user_profile_client.py
@@ -0,0 +1,150 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import UserProfileClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class UserProfileClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.user_profile_client_settings = UserProfileClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.user_profile_client_pool = utils.initialize_user_profile_client(
+            self.user_profile_client_settings.PROFILE_SERVICE_HOST,
+            self.user_profile_client_settings.PROFILE_SERVICE_PORT,
+            self.user_profile_client_settings.PROFILE_SERVICE_SECURE)
+
+    def get_api_version(self):
+        try:
+            return self.user_profile_client_pool.getAPIVersion()
+        except TException:
+            logger.exception("Error occurred in get_api_version, ", TException)
+            raise
+
+    def initialize_user_profile(self, authz_token):
+        """
+        Create an initial UserProfile based on information in the IAM service for this user.
+
+        Parameters:
+         - authzToken
+        """
+        try:
+            return self.user_profile_client_pool.initializeUserProfile(authz_token)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def add_user_profile(self, authz_token, user_profile):
+        """
+        Parameters:
+         - authzToken
+         - userProfile
+        """
+        try:
+            return self.user_profile_client_pool.addUserProfile(authz_token, user_profile)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def update_user_profile(self, authz_token, user_profile):
+        """
+        Parameters:
+         - authzToken
+         - userProfile
+        """
+        try:
+            return self.user_profile_client_pool.updateUserProfile(authz_token, user_profile)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def get_user_profile_by_id(self, authz_token, user_id, gateway_id):
+        """
+        Parameters:
+         - authzToken
+         - userId
+         - gatewayId
+        """
+        try:
+            return self.user_profile_client_pool.getUserProfileById(authz_token, user_id, gateway_id)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def delete_user_profile(self, authz_token, user_id, gateway_id):
+        """
+        Parameters:
+         - authzToken
+         - userId
+         - gatewayId
+        """
+        try:
+            return self.user_profile_client_pool.deleteUserProfile(authz_token, user_id, gateway_id)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def get_all_user_profiles_in_gateway(self, authz_token, gateway_id, offset, limit):
+        """
+        Parameters:
+         - authzToken
+         - gatewayId
+         - offset
+         - limit
+        """
+        try:
+            return self.user_profile_client_pool.getAllUserProfilesInGateway(authz_token, gateway_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def does_user_exist(self, authz_token, user_id, gateway_id):
+        """
+        Parameters:
+         - authzToken
+         - userId
+         - gatewayId
+        """
+        try:
+            return self.user_profile_client_pool.doesUserExist(authz_token, user_id, gateway_id)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.user_profile_client_settings.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+            self.user_profile_client_settings.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+            self.user_profile_client_settings.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/utils/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/utils/__init__.py
new file mode 100644
index 0000000..92883a4
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/utils/__init__.py
@@ -0,0 +1,16 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/utils/api_server_client_util.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/utils/api_server_client_util.py
new file mode 100644
index 0000000..bb6751d
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/clients/utils/api_server_client_util.py
@@ -0,0 +1,74 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import time
+import logging
+import samples.file_utils as fb
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from clients.api_server_client import APIServerClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class APIServerClientUtil(object):
+
+    def __init__(self, configuration_file_location, username, password, gateway_id):
+        self.authenticator = Authenticator(configuration_file_location)
+        self.token = self.authenticator.get_token_and_user_info_password_flow(username=username,
+                                                                              password=password, gateway_id=gateway_id)
+        self.gateway_id = gateway_id
+        self.username = username
+        self.password = password
+        self.api_server_client = APIServerClient(configuration_file_location)
+
+    def get_project_id(self, project_name):
+        response = self.api_server_client.get_user_projects(self.token, self.gateway_id, self.username, 10, 0)
+        for project in response:
+            if project.name == project_name:
+                return project.projectID
+        return None
+
+    def get_execution_id(self, application_name):
+        response = self.api_server_client.get_all_application_interfaces(self.token, self.gateway_id)
+        for app in response:
+            if app.applicationName == application_name:
+                return app.applicationInterfaceId
+        return None
+
+    def get_resource_host_id(self, resource_name):
+        response = self.api_server_client.get_all_compute_resource_names(self.token)
+        for k in response.keys():
+            if response[k] == resource_name:
+                return k
+        return None
+
+    def get_group_resource_profile_id(self, group_resource_profile_name):
+        response = self.api_server_client.get_group_resource_list(self.token, self.gateway_id)
+        for x in response:
+            if x.groupResourceProfileName == group_resource_profile_name:
+                return x.groupResourceProfileId
+        return None
+
+    def get_storage_resource_id(self, storage_name):
+        response = self.api_server_client.get_all_storage_resource_names(self.token)
+        for k in response.keys():
+            if response[k] == storage_name:
+                return k
+        return None
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/__init__.py
new file mode 100644
index 0000000..1983496
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/__init__.py
@@ -0,0 +1,15 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/api_server_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/api_server_client_samples.py
new file mode 100644
index 0000000..345fda4
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/api_server_client_samples.py
@@ -0,0 +1,201 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.api_server_client import APIServerClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.model.workspace.ttypes import Gateway, Notification, Project
+from airavata.model.experiment.ttypes import ExperimentModel, ExperimentType, UserConfigurationDataModel
+from airavata.model.appcatalog.groupresourceprofile.ttypes import GroupResourceProfile
+
+from airavata.api.error.ttypes import TException, InvalidRequestException, AiravataSystemException, \
+    AiravataClientException, AuthorizationException
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load APIServerClient with default configuration
+client = APIServerClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+
+# client = APIServerClient('../transport/settings.ini')
+
+
+# check for given gateway exists
+def is_gateway_exists():
+    try:
+        is_exists = client.is_gateway_exist(token, "default")
+        print("Gateway exist: " + str(is_exists))
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+# check if given user exists in given gateway
+def is_user_exists():
+    try:
+        is_exists = client.is_user_exists(token, "default", "default-admin")
+        print("User exist: " + str(is_exists))
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+# adding a new gateway
+def add_gateway():
+    try:
+        gateway = Gateway()
+        gateway.gatewayId = "test-gw"
+        gateway.domain = "airavata.org"
+        gateway.gatewayAdminEmail = "gw@gmail.com"
+        gateway.gatewayAdminFirstName = "isuru"
+        gateway.gatewayAdminLastName = "ranawaka"
+        gateway.gatewayName = "test-gw"
+        gateway.gatewayApprovalStatus = 0
+        gateway_id = client.add_gateway(token, gateway)
+        print("Gateway Id :" + gateway_id)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+# delete gateway
+def delete_gateway():
+    try:
+        gateway = client.delete_gateway(token, "test-gw")
+        print("Gateway deleted ", gateway)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+# get all exisisting gateways
+def get_all_gateways():
+    try:
+        gateway = client.get_all_gateways(token)
+        print("Get all gateways :", gateway)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def create_notification():
+    try:
+        notification = Notification()
+        notification.gatewayId = "default"
+        notification.title = "default-gateway-notification"
+        notification.notificationMessage = "Hello gateway"
+        created_notification = client.create_notification(token, notification)
+        print("Notification Created ", created_notification)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def get_all_notifications():
+    try:
+        notifications = client.get_all_notifications(token, "default")
+        print("Notifications ", notifications)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def create_project():
+    try:
+        project = Project()
+        project.projectID = "def1234"
+        project.owner = "default-admin"
+        project.gatewayId = "default"
+        project.name = "defaultProject"
+
+        pro = client.create_project(token, "default", project)
+        print("Project created ", pro)
+
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def search_projects():
+    try:
+        filter = {1: 'defaultProject'}
+        projects = client.search_projects(token, "default-gateway", "default-admin", filter, limit=0, offset=10)
+        print(projects)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def create_experiment():
+    try:
+        experiment_model = ExperimentModel()
+        experiment_model.experimentId = "exp123"
+        experiment_model.projectId = "def1234"
+        experiment_model.gatewayId = "default"
+        experiment_model.experimentType = ExperimentType.SINGLE_APPLICATION
+        experiment_model.userName = "default-admin"
+        experiment_model.experimentName = "test_exp"
+        exp = client.create_experiment(token, "default", experiment_model)
+    
+        print("Experiment created ", exp)
+
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def get_experiment():
+    try:
+        experiment = client.get_experiment(token, 'test_exp_26302f87-c8eb-4d44-8b6b-4a5c7b1ff014')
+        print("Experiment ", experiment);
+
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def create_group_resource_profile():
+    try:
+        group_resource = GroupResourceProfile()
+        group_resource.gatewayId = "default"
+        group_resource.groupResourceProfileId = "default_profile"
+        group_resource.groupResourceProfileName = "default_profile_1"
+        resource = client.create_group_resource_profile(token, group_resource)
+        print("Group resource created ", group_resource)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def update_experiment():
+    try:
+        data_model = UserConfigurationDataModel()
+        data_model.groupResourceProfileId = "default_profile"
+        data_model.airavataAutoSchedule = True
+        data_model.overrideManualScheduledParams = True
+        experiment = client.get_experiment(token, 'test_exp_26302f87-c8eb-4d44-8b6b-4a5c7b1ff014')
+        experiment.userConfigurationData = data_model
+        exp = client.update_experiment(token, 'test_exp_26302f87-c8eb-4d44-8b6b-4a5c7b1ff014', experiment)
+        print("Updated Experiment ", exp)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+         logger.exception("Error occurred")
+
+
+def launch_experiment():
+    try:
+        status = client.launch_experiment(token, 'test_exp_26302f87-c8eb-4d44-8b6b-4a5c7b1ff014', 'default')
+        print("Experiment Status ", status)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/create_launch_echo_experiment.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/create_launch_echo_experiment.py
new file mode 100644
index 0000000..73ad975
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/create_launch_echo_experiment.py
@@ -0,0 +1,107 @@
+import logging
+import time
+import json
+import samples.file_utils as fb
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from clients.api_server_client import APIServerClient
+
+from clients.credential_store_client import CredentialStoreClient
+
+from airavata.model.experiment.ttypes import ExperimentModel, ExperimentType, UserConfigurationDataModel
+from airavata.model.scheduling.ttypes import ComputationalResourceSchedulingModel
+
+from clients.utils.data_model_creation_util import DataModelCreationUtil
+
+from clients.utils.api_server_client_util import APIServerClientUtil
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+configFile = "settings.ini"
+
+authenticator = Authenticator(configFile)
+username = "username"
+password = "password"
+gateway_id = "cyberwater"
+token = authenticator.get_token_and_user_info_password_flow(username=username, password=password, gateway_id=gateway_id)
+
+api_server_client = APIServerClient(configFile)
+
+data_model_client = DataModelCreationUtil(configFile,
+                                          username=username,
+                                          password=password,
+                                          gateway_id=gateway_id)
+
+credential_store_client = CredentialStoreClient(configFile)
+
+airavata_util = APIServerClientUtil(configFile,
+                                    username=username,
+                                    password=password,
+                                    gateway_id=gateway_id)
+
+executionId = airavata_util.get_execution_id("Echo")
+
+projectId = airavata_util.get_project_id("Default Project")
+
+resourceHostId = airavata_util.get_resource_host_id("karst.uits.iu.edu")
+
+groupResourceProfileId = airavata_util.get_group_resource_profile_id("Default Gateway Profile")
+
+storageId = airavata_util.get_storage_resource_id("pgadev.scigap.org")
+
+# create experiment data model
+experiment = data_model_client.get_experiment_data_model_for_single_application(
+    project_name="Default Project",
+    application_name="Echo",
+    experiment_name="Testing_ECHO_SDK 25",
+    description="Testing")
+
+path = fb.upload_files(api_server_client, credential_store_client, token, "cyberwater",
+                       storageId,
+                       "pgadev.scigap.org", username, "Default_Project", experiment.experimentName,
+                       "/Users/isururanawaka/Documents/Cyberwater/poc/resources/storage")
+
+# configure computational resources
+experiment = data_model_client.configure_computation_resource_scheduling(experiment_model=experiment,
+                                                                         computation_resource_name="karst.uits.iu.edu",
+                                                                         group_resource_profile_name="Default Gateway Profile",
+                                                                         storage_name="pgadev.scigap.org",
+                                                                         node_count=1,
+                                                                         total_cpu_count=16,
+                                                                         wall_time_limit=15,
+                                                                         queue_name="batch",
+                                                                         experiment_dir_path=path)
+
+inputs = api_server_client.get_application_inputs(token, executionId)
+
+experiment.experimentInputs = inputs
+
+outputs = api_server_client.get_application_outputs(token, executionId)
+
+experiment.experimentOutputs = outputs
+
+# create experiment
+ex_id = api_server_client.create_experiment(token, gateway_id, experiment)
+print(ex_id)
+# launch experiment
+api_server_client.launch_experiment(token, ex_id,
+                                    gateway_id)
+
+status = api_server_client.get_experiment_status(token, ex_id);
+
+if status is not None:
+    print("Initial state " + str(status.state))
+while status.state <= 6:
+    status = api_server_client.get_experiment_status(token,
+                                                     ex_id);
+    time.sleep(30)
+    print("State " + str(status.state))
+
+print("Completed")
+
+fb.download_files(api_server_client, credential_store_client, token, gateway_id,
+                  storageId,
+                  "pgadev.scigap.org", username, "Default_Project", experiment.experimentName, ".")
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/group_manager_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/group_manager_client_samples.py
new file mode 100644
index 0000000..14e656f
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/group_manager_client_samples.py
@@ -0,0 +1,86 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.group_manager_client import GroupManagerClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+from airavata.model.group.ttypes import GroupModel
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+client = GroupManagerClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+
+#client = GroupManagerClient('../transport/settings.ini')
+
+
+# create group in airavata
+def create_group():
+    try:
+        group_model = GroupModel()
+        group_model.id = "testing_group"
+        group_model.name = "testing_group_name"
+        group_model.ownerId = "default-admin"
+        group_model.description = "This group is used for testing users"
+
+        users = ['default-admin']
+
+        group_model.members = users
+        group_model.admins = users
+
+        created_group = client.create_group(token, group_model)
+        print(created_group)
+    except TException:
+        logger.exception("Exception occurred")
+
+
+# get all groups
+def get_groups():
+    try:
+        created_group = client.get_groups(token)
+        print("Groups :", created_group)
+    except TException:
+        logger.exception("Exception occurred")
+
+
+def add_group_admin():
+    try:
+        created_group = client.add_group_admins(token, "testing_group", "default-admin")
+        print("Groups :", created_group)
+    except TException:
+        logger.exception("Exception occurred")
+
+
+def has_owner_access():
+    try:
+        has_access = client.has_owner_access(token, "testing_group", "default-admin")
+        print("Is have accesss ", has_access)
+    except TException:
+        logger.exception("Exception occurred")
+
+get_groups()
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/iam_admin_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/iam_admin_client_samples.py
new file mode 100644
index 0000000..02f0932
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/iam_admin_client_samples.py
@@ -0,0 +1,61 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.iam_admin_client import IAMAdminClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+client = IAMAdminClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+# client = IAMAdminClient('../transport/settings.ini')
+
+
+def is_user_exisits():
+    try:
+        user = client.is_user_exist(token, "default-admin")
+        print("Is user exists :", user)
+    except TException:
+        logger.exception("Error occurred")
+
+
+def get_user():
+    try:
+        user = client.get_user(token, "default-admin")
+        print("User :", user)
+    except TException:
+        logger.exception("Error occurred")
+
+
+def get_users_with_role():
+    try:
+        user = client.get_users_with_role(token, "admin")
+        print("Users :", user)
+    except TException:
+        logger.exception("Error occurred")
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/metadata_fetcher.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/metadata_fetcher.py
new file mode 100644
index 0000000..c89359c
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/metadata_fetcher.py
@@ -0,0 +1,67 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from clients.api_server_client import APIServerClient
+
+from airavata.model.workspace.ttypes import Gateway, Notification, Project
+from airavata.model.experiment.ttypes import ExperimentModel, ExperimentType, UserConfigurationDataModel
+from airavata.model.scheduling.ttypes import ComputationalResourceSchedulingModel
+from airavata.model.data.replica.ttypes import DataProductModel, DataProductType, DataReplicaLocationModel, \
+    ReplicaLocationCategory, ReplicaPersistentType
+
+from airavata.model.application.io.ttypes import InputDataObjectType
+
+from airavata.model.appcatalog.groupresourceprofile.ttypes import GroupResourceProfile
+
+from airavata.api.error.ttypes import TException, InvalidRequestException, AiravataSystemException, \
+    AiravataClientException, AuthorizationException
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+configFile = "/Users/isururanawaka/Documents/Cyberwater/poc/resources/settings.ini"
+
+authenticator = Authenticator(configFile)
+token = authenticator.get_token_and_user_info_password_flow("username", "password", "cyberwater")
+
+api_server_client = APIServerClient(configFile)
+
+# fetch all application deployments
+deployments = api_server_client.get_all_application_deployments(token, "cyberwater");
+print(deployments);
+# appModuleId  for execution Id
+
+
+# compute resource names and Ids
+compute_resoure_name = api_server_client.get_all_compute_resource_names(token);
+print(compute_resoure_name);
+
+# get  resource profiles
+resource_profile = api_server_client.get_all_gateway_resource_profiles(token);
+print(resource_profile);
+
+# get resource profiles
+group_resource_list = api_server_client.get_group_resource_list(token, "cyberwater");
+print(group_resource_list);
+
+# provides storage resources
+storage_resource = api_server_client.get_all_storage_resource_names(token)
+print(storage_resource);
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/resources/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/resources/__init__.py
new file mode 100644
index 0000000..1983496
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/resources/__init__.py
@@ -0,0 +1,15 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/sharing_registry_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/sharing_registry_client_samples.py
new file mode 100644
index 0000000..fbbb8c1
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/sharing_registry_client_samples.py
@@ -0,0 +1,92 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.sharing_registry_client import SharingRegistryClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+from airavata.model.sharing.ttypes import Domain, Entity, EntityType
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+client = SharingRegistryClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+
+# client = SharingRegistryClient('../transport/settings.ini')
+
+# create domian
+def create_domain():
+    try:
+        domain = Domain()
+        domain.domainId = "gw@scigap.org"
+        domain.name = "gw"
+        domain.description = "this domain is used by testing server"
+
+        domain = client.create_domain(domain)
+        print("Domian created :", domain)
+
+    except TException:
+        logger.exception("Error occurred")
+
+
+# get domain
+def get_domain():
+    try:
+
+        domains = client.get_domain("gw")
+        print("Domians created :", domains)
+
+    except TException:
+        logger.exception("Error occurred")
+
+
+def create_entity_type():
+    try:
+        entity_type = EntityType()
+        entity_type.domainId = "gw@scigap.org"
+        entity_type.description = "project entity type"
+        entity_type.name = "PROJECT"
+        entity_type.entityTypeId = "gw@scigap.org:PROJECT"
+        en_type = client.create_entity_type(entity_type)
+        print("Entity Type ", en_type)
+    except TException:
+        logger.exception("Error occurred")
+
+
+def create_entity():
+    try:
+        entity = Entity()
+        entity.entityTypeId = "gw@scigap.org:PROJECT"
+        entity.name = "PROJECT_ENTITY"
+        entity.domainId = "gw"
+        entity.ownerId = "default-admin"
+        en_type = client.create_entity(entity)
+        print("Entity Type ", en_type)
+    except TException:
+        logger.exception("Error occurred")
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/tenant_profile_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/tenant_profile_client_samples.py
new file mode 100644
index 0000000..a6db6df
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/tenant_profile_client_samples.py
@@ -0,0 +1,53 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.tenant_profile_client import TenantProfileClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+#client = TenantProfileClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+client = TenantProfileClient('../transport/settings.ini')
+
+
+def get_all_gateways():
+    try:
+        gws = client.get_all_gateways(token)
+        print("Gateways ", gws)
+    except TException:
+        logger.exception("Error occurred")
+
+
+def is_gateway_exsist():
+    try:
+        gw_exisist = client.is_gateway_exist(token, "default")
+        print("Gateways ", gw_exisist)
+    except TException:
+        logger.exception("Error occurred")
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/user_profile_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/user_profile_client_samples.py
new file mode 100644
index 0000000..d14bb58
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/samples/user_profile_client_samples.py
@@ -0,0 +1,66 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.user_profile_client import UserProfileClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+from airavata.model.user.ttypes import UserProfile, Status
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+client = UserProfileClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+# client = UserProfileClient('../transport/settings.ini')
+
+
+def add_user_profile():
+    try:
+        profile = UserProfile()
+        profile.gatewayId = "default"
+        profile.userId = "default-admin"
+        profile.emails = ['gw@scigap.org']
+        profile.airavataInternalUserId = "default-admin"
+        profile.userModelVersion = "1.0.0"
+        profile.firstName = "Isuru"
+        profile.lastName = "Ranawaka"
+        profile.creationTime = 1576103354
+        profile.lastAccessTime = 1576103296
+        profile.validUntil = 1607725696
+        profile.State = Status.ACTIVE
+        added_profile = client.add_user_profile(token, profile)
+        print("Add user proflile", added_profile)
+    except TException:
+        logger.exception("Error Occurred")
+
+
+def get_all_user_profiles_in_gateway():
+    try:
+        profiles = client.get_all_user_profiles_in_gateway(token, "default", 0, -1)
+        print("User Profiles ", profiles)
+    except TException:
+        logger.exception("Error Occurred")
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/settings.ini b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/settings.ini
new file mode 100644
index 0000000..b66e69d
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/settings.ini
@@ -0,0 +1,31 @@
+[APIServer]
+API_HOST = localhost
+API_PORT = 9930
+API_SECURE = True
+[Gateway]
+GATEWAY_ID = default
+GATEWAY_DATA_STORE_RESOURCE_ID = airavata.host_77116e91-f042-4d3a-ab9c-3e7b4ebcd5bd
+GATEWAY_DATA_STORE_DIR = /tmp
+GATEWAY_DATA_STORE_HOSTNAME = localhost
+FILE_UPLOAD_TEMP_DIR = /tmp
+[ProfileServer]
+PROFILE_SERVICE_HOST = localhost
+PROFILE_SERVICE_PORT = 8962
+PROFILE_SERVICE_SECURE = False
+[SharingServer]
+SHARING_API_HOST = localhost
+SHARING_API_PORT = 7878
+SHARING_API_SECURE = False
+[CredentialStoreServer]
+CREDENTIAL_STORE_API_HOST = localhost
+CREDENTIAL_STORE_API_PORT = 8960
+CREDENTIAL_STORE_API_SECURE = False
+[Thrift]
+THRIFT_CLIENT_POOL_KEEPALIVE = 5
+[KeycloakServer]
+CLIENT_ID = pga
+CLIENT_SECRET = 9790c8c4-7d9b-4ccc-a820-ca5aac38d2ad
+TOKEN_URL = https://airavata.host:8443/auth/realms/default/protocol/openid-connect/token
+USER_INFO_URL = https://airavata.host:8443/auth/realms/default/protocol/openid-connect/userinfo
+VERIFY_SSL = False
+CERTIFICATE_FILE_PATH = samples/resources/incommon_rsa_server_ca.pem
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/settings.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/settings.py
new file mode 100644
index 0000000..12f2cda
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/settings.py
@@ -0,0 +1,107 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 configparser
+import os
+
+config = configparser.ConfigParser()
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+defaultSettings = os.path.join(BASE_DIR, "transport", "settings.ini")
+config.read(defaultSettings)
+
+
+class APIServerClientSettings(object):
+
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.API_SERVER_HOST = config.get('APIServer', 'API_HOST')
+        self.API_SERVER_PORT = config.getint('APIServer', 'API_PORT')
+        self.API_SERVER_SECURE = config.getboolean('APIServer', 'API_SECURE')
+
+
+class IAMAdminClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+        self.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+        self.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
+
+
+class TenantProfileServerClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+        self.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+        self.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
+
+
+class GroupManagerClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+        self.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+        self.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
+
+
+class SharingAPIClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.SHARING_API_HOST = config.get('SharingServer', 'SHARING_API_HOST')
+        self.SHARING_API_PORT = config.getint('SharingServer', 'SHARING_API_PORT')
+        self.SHARING_API_SECURE = config.getboolean('SharingServer', 'SHARING_API_SECURE')
+
+
+class CredentialStoreAPIClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.CREDENTIAL_STORE_API_HOST = config.get('CredentialStoreServer', 'CREDENTIAL_STORE_API_HOST')
+        self.CREDENTIAL_STORE_API_PORT = config.getint('CredentialStoreServer', 'CREDENTIAL_STORE_API_PORT')
+        self.CREDENTIAL_STORE_API_SECURE = config.getboolean('CredentialStoreServer', 'CREDENTIAL_STORE_API_SECURE')
+
+
+class UserProfileClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+        self.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+        self.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
+
+
+class ThriftSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.THRIFT_CLIENT_POOL_KEEPALIVE = config.getfloat('Thrift', 'THRIFT_CLIENT_POOL_KEEPALIVE')
+
+
+class KeycloakConfiguration(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.KEYCLOAK_CA_CERTIFICATE = os.path.join(BASE_DIR, "samples", "resources", "incommon_rsa_server_ca.pem")
+        self.CLIENT_ID = config.get('KeycloakServer', 'CLIENT_ID')
+        self.CLIENT_SECRET = config.get('KeycloakServer', 'CLIENT_SECRET')
+        self.TOKEN_URL = config.get('KeycloakServer', 'TOKEN_URL')
+        self.USER_INFO_URL = config.get('KeycloakServer', 'USER_INFO_URL')
+        self.VERIFY_SSL = config.getboolean('KeycloakServer', 'VERIFY_SSL')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/utils.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/utils.py
new file mode 100644
index 0000000..5c32fb9
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/transport/utils.py
@@ -0,0 +1,234 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+
+import thrift_connector.connection_pool as connection_pool
+from thrift.protocol import TBinaryProtocol
+from thrift.protocol.TMultiplexedProtocol import TMultiplexedProtocol
+from thrift.transport import TSocket, TSSLSocket, TTransport
+
+from airavata.api import Airavata
+from airavata.api.sharing import SharingRegistryService
+from airavata.service.profile.groupmanager.cpi import GroupManagerService
+from airavata.service.profile.groupmanager.cpi.constants import (
+    GROUP_MANAGER_CPI_NAME
+)
+from airavata.service.profile.iam.admin.services.cpi import IamAdminServices
+from airavata.service.profile.iam.admin.services.cpi.constants import (
+    IAM_ADMIN_SERVICES_CPI_NAME
+)
+from airavata.service.profile.tenant.cpi import TenantProfileService
+from airavata.service.profile.tenant.cpi.constants import (
+    TENANT_PROFILE_CPI_NAME
+)
+from airavata.service.profile.user.cpi import UserProfileService
+from airavata.service.profile.user.cpi.constants import USER_PROFILE_CPI_NAME
+from airavata.api.credential.store import CredentialStoreService
+
+from transport.settings import APIServerClientSettings, UserProfileClientSettings, TenantProfileServerClientSettings, \
+    IAMAdminClientSettings, GroupManagerClientSettings, SharingAPIClientSettings, CredentialStoreAPIClientSettings, \
+    ThriftSettings
+
+log = logging.getLogger(__name__)
+
+default_api_server_settings = APIServerClientSettings()
+default_user_profile_server_settings = UserProfileClientSettings()
+default_tenant_profile_client_settings = TenantProfileServerClientSettings()
+default_iam_client_settings = IAMAdminClientSettings()
+default_group_manager_client_settings = GroupManagerClientSettings()
+default_sharing_API_client_settings = SharingAPIClientSettings()
+default_credential_store_client_settings = CredentialStoreAPIClientSettings()
+thrift_settings = ThriftSettings()
+
+
+class ThriftConnectionException(Exception):
+    pass
+
+
+class ThriftClientException(Exception):
+    pass
+
+
+class CustomThriftClient(connection_pool.ThriftClient):
+    secure = False
+    validate = False
+
+    @classmethod
+    def get_socket_factory(cls):
+        if not cls.secure:
+            return super().get_socket_factory()
+        else:
+            def factory(host, port):
+                return TSSLSocket.TSSLSocket(host, port, validate=cls.validate)
+
+            return factory
+
+    def ping(self):
+        try:
+            self.client.getAPIVersion()
+        except Exception as e:
+            log.debug("getAPIVersion failed: {}".format(str(e)))
+            raise
+
+
+class MultiplexThriftClientMixin:
+    service_name = None
+
+    @classmethod
+    def get_protoco_factory(cls):
+        def factory(transport):
+            protocol = TBinaryProtocol.TBinaryProtocol(transport)
+            multiplex_prot = TMultiplexedProtocol(protocol, cls.service_name)
+            return multiplex_prot
+
+        return factory
+
+
+class AiravataAPIThriftClient(CustomThriftClient):
+    secure = default_api_server_settings.API_SERVER_SECURE
+
+
+class GroupManagerServiceThriftClient(MultiplexThriftClientMixin,
+                                      CustomThriftClient):
+    service_name = GROUP_MANAGER_CPI_NAME
+    secure = default_group_manager_client_settings.PROFILE_SERVICE_SECURE
+
+
+class IAMAdminServiceThriftClient(MultiplexThriftClientMixin,
+                                  CustomThriftClient):
+    service_name = IAM_ADMIN_SERVICES_CPI_NAME
+    secure = default_iam_client_settings.PROFILE_SERVICE_SECURE
+
+
+class TenantProfileServiceThriftClient(MultiplexThriftClientMixin,
+                                       CustomThriftClient):
+    service_name = TENANT_PROFILE_CPI_NAME
+    secure = default_tenant_profile_client_settings.PROFILE_SERVICE_SECURE
+
+
+class UserProfileServiceThriftClient(MultiplexThriftClientMixin,
+                                     CustomThriftClient):
+    service_name = USER_PROFILE_CPI_NAME
+    secure = default_user_profile_server_settings.PROFILE_SERVICE_SECURE
+
+
+class CredentialStoreServiceThriftClient(CustomThriftClient):
+    secure = default_credential_store_client_settings.CREDENTIAL_STORE_API_SECURE
+
+
+class SharingAPIThriftClient(CustomThriftClient):
+    secure = default_sharing_API_client_settings.SHARING_API_SECURE
+
+
+def initialize_api_client_pool(host=default_api_server_settings.API_SERVER_HOST,
+                               port=default_api_server_settings.API_SERVER_PORT,
+                               is_secure=default_api_server_settings.API_SERVER_SECURE):
+    AiravataAPIThriftClient.secure = is_secure
+    airavata_api_client_pool = connection_pool.ClientPool(
+        Airavata,
+        host,
+        port,
+        connection_class=AiravataAPIThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return airavata_api_client_pool
+
+
+def initialize_group_manager_client(host=default_group_manager_client_settings.PROFILE_SERVICE_HOST,
+                                    port=default_group_manager_client_settings.PROFILE_SERVICE_PORT,
+                                    is_secure=default_group_manager_client_settings.PROFILE_SERVICE_SECURE):
+    GroupManagerServiceThriftClient.secure = is_secure
+    group_manager_client_pool = connection_pool.ClientPool(
+        GroupManagerService,
+        host,
+        port,
+        connection_class=GroupManagerServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return group_manager_client_pool
+
+
+def initialize_iam_admin_client(host=default_iam_client_settings.PROFILE_SERVICE_HOST,
+                                port=default_iam_client_settings.PROFILE_SERVICE_PORT,
+                                is_secure=default_iam_client_settings.PROFILE_SERVICE_SECURE):
+    IAMAdminServiceThriftClient.secure = is_secure
+    iamadmin_client_pool = connection_pool.ClientPool(
+        IamAdminServices,
+        host,
+        port,
+        connection_class=IAMAdminServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return iamadmin_client_pool
+
+
+def initialize_tenant_profile_client(host=default_tenant_profile_client_settings.PROFILE_SERVICE_HOST,
+                                     port=default_tenant_profile_client_settings.PROFILE_SERVICE_PORT,
+                                     is_secure=default_tenant_profile_client_settings.PROFILE_SERVICE_SECURE):
+    TenantProfileServiceThriftClient.secure = is_secure
+
+    tenant_profile_client_pool = connection_pool.ClientPool(
+        TenantProfileService,
+        host,
+        port,
+        connection_class=TenantProfileServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return tenant_profile_client_pool
+
+
+def initialize_user_profile_client(host=default_user_profile_server_settings.PROFILE_SERVICE_HOST,
+                                   port=default_user_profile_server_settings.PROFILE_SERVICE_PORT,
+                                   is_secure=default_user_profile_server_settings.PROFILE_SERVICE_SECURE):
+    UserProfileServiceThriftClient.secure = is_secure
+    user_profile_client_pool = connection_pool.ClientPool(
+        UserProfileService,
+        host,
+        port,
+        connection_class=UserProfileServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return user_profile_client_pool
+
+
+def initialize_sharing_registry_client(host=default_sharing_API_client_settings.SHARING_API_HOST,
+                                       port=default_sharing_API_client_settings.SHARING_API_PORT,
+                                       is_secure=default_sharing_API_client_settings.SHARING_API_SECURE):
+    SharingAPIThriftClient.secure = is_secure
+
+    sharing_api_client_pool = connection_pool.ClientPool(
+        SharingRegistryService,
+        host,
+        port,
+        connection_class=SharingAPIThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return sharing_api_client_pool
+
+def initialize_credential_store_client(host=default_credential_store_client_settings.CREDENTIAL_STORE_API_HOST,
+                                       port=default_credential_store_client_settings.CREDENTIAL_STORE_API_PORT,
+                                       is_secure=default_credential_store_client_settings.CREDENTIAL_STORE_API_SECURE):
+    CredentialStoreService.secure = is_secure
+
+    credential_store_api_client_pool = connection_pool.ClientPool(
+        CredentialStoreService,
+        host,
+        port,
+        connection_class=CredentialStoreServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return credential_store_api_client_pool
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/clients/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/api_server_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/api_server_client.py
new file mode 100644
index 0000000..e5ed86e
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/api_server_client.py
@@ -0,0 +1,7049 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import APIServerClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import InvalidRequestException, AiravataClientException, AiravataSystemException, \
+    AuthorizationException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class APIServerClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.api_server_settings = APIServerClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.api_server_client_pool = utils.initialize_api_client_pool(self.api_server_settings.API_SERVER_HOST,
+                                                                       self.api_server_settings.API_SERVER_PORT,
+                                                                       self.api_server_settings.API_SERVER_SECURE)
+
+    def is_user_exists(self, authz_token, gateway_id, user_name):
+        """
+        :param authz_token:
+        :param gateway_id:
+        :param user_name:
+        :return: true/false
+        """
+        try:
+            return self.api_server_client_pool.isUserExists(authz_token, gateway_id, user_name)
+        except InvalidRequestException:
+            logger.exception("Error occurred in is_user_exists, probably due to invalid parameters ")
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in is_user_exists, probably due to  client misconfiguration ")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in is_user_exists, probably due to server side error ")
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in is_user_exists, probably due to invalid authz token ")
+            raise
+
+    def add_gateway(self, authz_token, gateway):
+        """
+        :param authz_token:
+        :param gateway:
+        :return: gatewayId
+        """
+        try:
+            return self.api_server_client_pool.addGateway(authz_token, gateway)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_gateway, probably due to invalid parameters ")
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in add_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_gateway, probably due to server side error ",
+                             )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in add_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_users_in_gateway(self, authz_token, gateway_id):
+        """
+        :param authz_token:
+        :param gateway_id:
+        :return:
+        """
+        try:
+            return self.api_server_client_pool.getAllUsersInGateway(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_users_in_gateway, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_all_users_in_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_users_in_gateway, probably due to server side error ",
+                             )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_users_in_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_gateway(self, authz_token, gateway_id, updated_gateway):
+        """
+        update  the gateway with gateway_id with provided information
+        :param authz_token:
+        :param gateway_id:
+        :param updated_gateway:
+        :return:
+        """
+        try:
+            return self.api_server_client_pool.updateGateway(authz_token, gateway_id, updated_gateway)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_gateway, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_gateway, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_gateway(self, authz_token, gateway_id):
+        """
+        return gateway provided by the gateway_id
+        :param authz_token:
+        :param gateway_id:
+        :param updated_gateway:
+        :return: gateway
+        """
+        try:
+            return self.api_server_client_pool.getGateway(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_gateway, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_gateway, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_gateway(self, authz_token, gateway_id):
+        """
+        delete the given gateway
+        :param authz_token:
+        :param gateway_id:
+        :return: true/false
+        """
+        try:
+            return self.api_server_client_pool.deleteGateway(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_gateway, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_gateway, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_gateway, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_gateway, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_gateways(self, authz_token):
+        """
+        get all gateways
+        :param authz_token:
+        :return: gateways
+        """
+        try:
+            return self.api_server_client_pool.getAllGateways(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_gateways, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_all_gateways, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_gateways, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_gateways, probably due to invalid authz token ",
+                             )
+            raise
+
+    def is_gateway_exist(self, authz_token, gateway_id):
+        """
+        return gateway exists
+        :param authz_token:
+        :param gateway_id:
+        :return: true/false
+        """
+        try:
+            return self.api_server_client_pool.isGatewayExist(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in is_gateway_exist, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in is_gateway_exist, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in is_gateway_exist, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in is_gateway_exist, probably due to invalid authz token ")
+            raise
+
+    def create_notification(self, authz_token, notification):
+        """
+        create notification
+        :param authz_token:
+        :param notification:
+        :return: notification id
+        """
+        try:
+            return self.api_server_client_pool.createNotification(authz_token, notification)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_notification, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in create_notification, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_notification, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_notification, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_notification(self, authz_token, notification):
+        """
+        update notification
+        :param authz_token:
+        :param notification:
+        :return: true /false
+        """
+        try:
+            return self.api_server_client_pool.updateNotification(authz_token, notification)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_notification, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_notification, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_notification, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_notification, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_notification(self, authz_token, gateway_id, notification_id):
+        """
+        delete notification
+        :param authz_token:
+        :param gateway_id:
+        :param notification_id:
+        :return: true/false
+        """
+        try:
+            return self.api_server_client_pool.deleteNotification(authz_token, gateway_id, notification_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_notification, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_notification, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_notification, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_notification, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_notification(self, authz_token, gateway_id, notification_id):
+        """
+        get notification
+        :param authz_token:
+        :param gateway_id:
+        :param notification_id:
+        :return: notification
+        """
+        try:
+            return self.api_server_client_pool.getNotification(authz_token, gateway_id, notification_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_notification, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_notification, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_notification, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_notification, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_notifications(self, authz_token, gateway_id):
+        """
+        get all notifications
+        :param authz_token:
+        :param gateway_id:
+        :param notification_id:
+        :return: notifications
+        """
+        try:
+            return self.api_server_client_pool.getAllNotifications(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_notifications, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_all_notifications, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_notifications, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_notifications, probably due to invalid authz token ",
+                             )
+            raise
+
+    def generate_and_register_ssh_keys(self, authz_token, description):
+        """
+        Generate and Register SSH Key Pair with Airavata Credential Store.
+
+        @param description
+           The description field for a credential type, all type of credential can have a description.
+
+        @return airavataCredStoreToken
+          An SSH Key pair is generated and stored in the credential store and associated with users or community account
+          belonging to a Gateway.
+
+
+
+        Parameters:
+         - authz_token
+         - description
+        """
+        try:
+            return self.api_server_client_pool.generateAndRegisterSSHKeys(authz_token, description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in generate_and_register_ssh_keys, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in generate_and_register_ssh_keys, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in generate_and_register_ssh_keys, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in generate_and_register_ssh_keys, probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_pwd_credential(self, authz_token, login_user_name, password, description):
+        """
+        Generate and Register Username PWD Pair with Airavata Credential Store.
+
+        @param loginUserName
+
+        @param password
+
+        @return airavataCredStoreToken
+          An SSH Key pair is generated and stored in the credential store and associated with users or community account
+          belonging to a Gateway.
+        Parameters:
+         :param description:
+         :param authz_token:
+         :param login_user_name:
+         :param authz_token:
+        """
+        try:
+            return self.api_server_client_pool.registerPwdCredential(authz_token, login_user_name, password,
+                                                                     description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_pwd_credential, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in register_pwd_credential, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_pwd_credential, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_pwd_credential, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_credential_summary(self, authz_token, token_id):
+        """
+        get credential summary
+        Parameters:
+         - authz_token
+         - tokenId
+        """
+        try:
+            return self.api_server_client_pool.getCredentialSummary(authz_token, token_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_credential_summary, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_credential_summary, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_credential_summary, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_credential_summary, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_credential_summaries(self, authz_token, type):
+        """
+        Parameters:
+         - authz_token
+         - type
+        """
+        try:
+            return self.api_server_client_pool.getAllCredentialSummaries(authz_token, type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_credential_summaries, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_credential_summaries, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_credential_summaries, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_credential_summaries, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_ssh_pub_key(self, authz_token, airavata_cred_store_token):
+        """
+        Parameters:
+         - authz_token
+         - airavataCredStoreToken
+        """
+        try:
+            return self.api_server_client_pool.delete_ssh_pub_key(authz_token, airavata_cred_store_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_ssh_pub_key, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_ssh_pub_key, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_ssh_pub_key, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_ssh_pub_key, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_pwd_credential(self, authz_token, airavata_cred_store_token):
+        """
+        Parameters:
+         - authz_token
+         - airavataCredStoreToken
+        """
+        try:
+            return self.api_server_client_pool.deletePWDCredential(authz_token, airavata_cred_store_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_pwd_credential, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_pwd_credential, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_pwd_credential, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_pwd_credential, probably due to invalid authz token ",
+                             )
+            raise
+
+    def create_project(self, authz_token, gateway_id, project):
+        """
+
+        Creates a Project with basic metadata.
+           A Project is a container of experiments.
+
+        @param gatewayId
+           The identifier for the requested gateway.
+
+        @param Project
+           The Project Object described in the workspace_model.
+
+
+
+        Parameters:
+         - authz_token
+         - gatewayId
+         - project
+        """
+        try:
+            return self.api_server_client_pool.createProject(authz_token, gateway_id, project)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in create_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_project(self, authz_token, project_id, updated_project):
+        """
+
+        Update an Existing Project
+
+        @param projectId
+           The projectId of the project needed an update.
+
+        @return void
+           Currently this does not return any value.
+
+
+
+        Parameters:
+         - authz_token
+         - projectId
+         - updatedProject
+        """
+        try:
+            return self.api_server_client_pool.updateProject(authz_token, project_id, updated_project)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_project(self, authz_token, project_id):
+        """
+
+        Get a Project by ID
+           This method is to obtain a project by providing a projectId.
+
+        @param projectId
+           projectId of the project you require.
+
+        @return project
+           project data model will be returned.
+
+
+
+        Parameters:
+         - authz_token
+         - projectId
+        """
+        try:
+            return self.api_server_client_pool.getProject(authz_token, project_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_project(self, authz_token, project_id):
+        """
+
+        Delete a Project
+           This method is used to delete an existing Project.
+
+        @param projectId
+           projectId of the project you want to delete.
+
+        @return boolean
+           Boolean identifier for the success or failure of the deletion operation.
+
+           NOTE: This method is not used within gateways connected with Airavata.
+
+
+
+        Parameters:
+         - authz_token
+         - projectId
+        """
+        try:
+            return self.api_server_client_pool.deleteProject(authz_token, project_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_user_projects(self, authz_token, gateway_id, user_name, limit, offset):
+        """
+
+        Get All User Projects
+        Get all Project for the user with pagination. Results will be ordered based on creation time DESC.
+
+        @param gateway_id
+           The identifier for the requested gateway.
+
+        @param user_name
+           The identifier of the user.
+
+        @param limit
+           The amount results to be fetched.
+
+        @param offset
+           The starting point of the results to be fetched.
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - userName
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.getUserProjects(authz_token, gateway_id, user_name, limit, offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def search_projects(self, authz_token, gateway_id, user_name, filters, limit, offset):
+        """
+
+        Search User Projects
+        Search and get all Projects for user by project description or/and project name  with pagination.
+        Results will be ordered based on creation time DESC.
+
+        @param gatewayId
+           The unique identifier of the gateway making the request.
+
+        @param userName
+           The identifier of the user.
+
+        @param filters
+           Map of multiple filter criteria. Currenlt search filters includes Project Name and Project Description
+
+        @param limit
+           The amount results to be fetched.
+
+        @param offset
+           The starting point of the results to be fetched.
+
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - user_name
+         - filters
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.searchProjects(authz_token, gateway_id, user_name, filters, limit,
+                                                              offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in search_projects, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in search_projects, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in search_projects, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in search_projects, probably due to invalid authz token ",
+                             )
+            raise
+
+    def search_experiments(self, authz_token, gateway_id, user_name, filters, limit, offset):
+        """
+        Search Experiments.
+        Search Experiments by using multiple filter criteria with pagination. Results will be sorted based on creation time DESC.
+
+        @param gatewayId
+              Identifier of the requested gateway.
+
+        @param userName
+              Username of the user requesting the search function.
+
+        @param filters
+              Map of multiple filter criteria. Currenlt search filters includes Experiment Name, Description, Application, etc....
+
+        @param limit
+              Amount of results to be fetched.
+
+        @param offset
+              The starting point of the results to be fetched.
+
+        @return ExperimentSummaryModel
+           List of experiments for the given search filter. Here only the Experiment summary will be returned.
+
+
+
+        Parameters:
+         - authz_token
+         - gatewayId
+         - userName
+         - filters
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.searchExperiments(authz_token, gateway_id, user_name, filters, limit,
+                                                                 offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in search_experiments, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in search_experiments, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in search_experiments, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in search_experiments, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment_statistics(self, authz_token, gateway_id, from_time, to_time, user_name, application_name,
+                                  resource_host_name):
+        """
+
+        Get Experiment Statistics
+        Get Experiment Statisitics for a given gateway for a specific time period. This feature is available only for admins of a particular gateway. Gateway admin access is managed by the user roles.
+
+        @param gateway_id
+              Unique identifier of the gateway making the request to fetch statistics.
+
+        @param from_time
+              Starting date time.
+
+        @param to_time
+              Ending data time.
+
+        @param user_name
+              Gateway username substring with which to further filter statistics.
+
+        @param application_name
+              Application id substring with which to further filter statistics.
+
+        @param resource_host_name
+              Hostname id substring with which to further filter statistics.
+
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - from_time
+         - to_time
+         - user_name
+         - application_name
+         - resource_host_name
+        """
+        try:
+            return self.api_server_client_pool.getExperimentStatistics(authz_token, gateway_id, from_time, to_time,
+                                                                       user_name, application_name, resource_host_name)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment_statistics, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment_statistics, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment_statistics, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment_statistics, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiments_in_project(self, authz_token, project_id, limit, offset):
+        """
+
+        Get All Experiments of the Project
+        Get Experiments within project with pagination. Results will be sorted based on creation time DESC.
+
+        @param project_id
+              Uniqie identifier of the project.
+
+        @param limit
+              Amount of results to be fetched.
+
+        @param offset
+              The starting point of the results to be fetched.
+
+
+
+        Parameters:
+         - authz_token
+         - project_id
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.getExperimentsInProject(authz_token, project_id, limit, offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiments_in_project, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiments_in_project, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiments_in_project, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiments_in_project, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_user_experiments(self, authz_token, gateway_id, user_name, limit, offset):
+        """
+
+        Get All Experiments of the User
+        Get experiments by user with pagination. Results will be sorted based on creation time DESC.
+
+        @param gatewayId
+              Identifier of the requesting gateway.
+
+        @param userName
+              Username of the requested end user.
+
+        @param limit
+              Amount of results to be fetched.
+
+        @param offset
+              The starting point of the results to be fetched.
+
+
+
+        Parameters:
+         - authz_token
+         - gatewayId
+         - userName
+         - limit
+         - offset
+        """
+        try:
+            return self.api_server_client_pool.getUserExperiments(authz_token, gateway_id, user_name, limit, offset)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_user_experiments, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_user_experiments, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_user_experiments, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_user_experiments, probably due to invalid authz token ",
+                             )
+            raise
+
+    def create_experiment(self, authz_token, gateway_id, experiment):
+        """
+          *
+          * Create New Experiment
+          * Create an experiment for the specified user belonging to the gateway. The gateway identity is not explicitly passed
+          *   but inferred from the sshKeyAuthentication header. This experiment is just a persistent place holder. The client
+          *   has to subsequently configure and launch the created experiment. No action is taken on Airavata Server except
+          *   registering the experiment in a persistent store.
+          *
+          * @param gatewayId
+          *    The unique ID of the gateway where the experiment is been created.
+          *
+          * @param ExperimentModel
+          *    The create experiment will require the basic experiment metadata like the name and description, intended user,
+          *      the gateway identifer and if the experiment should be shared public by defualt. During the creation of an experiment
+          *      the ExperimentMetadata is a required field.
+          *
+          * @return
+          *   The server-side generated.airavata.registry.core.experiment.globally unique identifier.
+          *
+          * @throws org.apache.airavata.model.error.InvalidRequestException
+          *    For any incorrect forming of the request itself.
+          *
+          * @throws org.apache.airavata.model.error.AiravataClientException
+          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+          *
+          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
+          *         gateway registration steps and retry this request.
+          *
+          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+          *         For now this is a place holder.
+          *
+          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+          *         is implemented, the authorization will be more substantial.
+          *
+          * @throws org.apache.airavata.model.error.AiravataSystemException
+          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+          *       rather an Airavata Administrator will be notified to take corrective action.
+          *
+        *
+
+        Parameters:
+         - authz_token
+         - gatewayId
+         - experiment
+        """
+        try:
+            return self.api_server_client_pool.createExperiment(authz_token, gateway_id, experiment)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_experiment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in create_experiment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_experiment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_experiment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_experiment(self, authz_token, experiment_id):
+        """
+
+        Delete an Experiment
+        If the experiment is not already launched experiment can be deleted.
+
+        @param authz_token
+
+        @param experiment_id
+            Experiment ID of the experimnet you want to delete.
+
+        @return boolean
+            Identifier for the success or failure of the deletion operation.
+
+
+
+        Parameters:
+         - authz_token
+         - experimentId
+        """
+        try:
+            return self.api_server_client_pool.deleteExperiment(authz_token, experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_experiment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in create_experiment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_experiment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_experiment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment(self, authz_token, airavata_experiment_id):
+        """
+          *
+          * Get Experiment
+          * Fetch previously created experiment metadata.
+          *
+          * @param airavataExperimentId
+          *    The unique identifier of the requested experiment. This ID is returned during the create experiment step.
+          *
+          * @return ExperimentModel
+          *   This method will return the previously stored experiment metadata.
+          *
+          * @throws org.apache.airavata.model.error.InvalidRequestException
+          *    For any incorrect forming of the request itself.
+          *
+          * @throws org.apache.airavata.model.error.ExperimentNotFoundException
+          *    If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+          *
+          * @throws org.apache.airavata.model.error.AiravataClientException
+          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+          *
+          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
+          *         gateway registration steps and retry this request.
+          *
+          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+          *         For now this is a place holder.
+          *
+          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+          *         is implemented, the authorization will be more substantial.
+          *
+          * @throws org.apache.airavata.model.error.AiravataSystemException
+          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+          *       rather an Airavata Administrator will be notified to take corrective action.
+          *
+        *
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.getExperiment(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment_by_admin(self, authz_token, airavata_experiment_id):
+        """
+          *
+          * Get Experiment by an admin user
+          *
+          * Used by an admin user to fetch previously created experiment metadata.
+          *
+          * @param airavataExperimentId
+          *    The unique identifier of the requested experiment. This ID is returned during the create experiment step.
+          *
+          * @return ExperimentModel
+          *   This method will return the previously stored experiment metadata.
+          *
+          * @throws org.apache.airavata.model.error.InvalidRequestException
+          *    For any incorrect forming of the request itself.
+          *
+          * @throws org.apache.airavata.model.error.ExperimentNotFoundException
+          *    If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+          *
+          * @throws org.apache.airavata.model.error.AiravataClientException
+          *    The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+          *
+          *      UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+          *         step, then Airavata Registry will not have a provenance area setup. The client has to follow
+          *         gateway registration steps and retry this request.
+          *
+          *      AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+          *         For now this is a place holder.
+          *
+          *      INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+          *         is implemented, the authorization will be more substantial.
+          *
+          * @throws org.apache.airavata.model.error.AiravataSystemException
+          *    This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+          *       rather an Airavata Administrator will be notified to take corrective action.
+          *
+        *
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.get_experiment_by_admin(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment_by_admin, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment_by_admin, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment_by_admin, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment_by_admin, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_detailed_experiment_tree(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Complete Experiment Details
+        Fetch the completed nested tree structue of previously created experiment metadata which includes processes ->
+        tasks -> jobs information.
+
+        @param airavataExperimentId
+           The identifier for the requested experiment. This is returned during the create experiment step.
+
+        @return ExperimentModel
+          This method will return the previously stored experiment metadata including application input parameters, computational resource scheduling
+          information, special input output handling and additional quality of service parameters.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.getDetailedExperimentTree(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_detailed_experiment_tree, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_experiment(self, authz_token, airavata_experiment_id, experiment):
+        """
+
+        Update a Previously Created Experiment
+        Configure the CREATED experiment with required inputs, scheduling and other quality of service parameters. This method only updates the experiment object within the registry.
+        The experiment has to be launched to make it actionable by the server.
+
+        @param airavataExperimentId
+           The identifier for the requested experiment. This is returned during the create experiment step.
+
+        @param ExperimentModel
+           The configuration information of the experiment with application input parameters, computational resource scheduling
+             information, special input output handling and additional quality of service parameters.
+
+        @return
+          This method call does not have a return value.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+         - experiment
+        """
+        try:
+            return self.api_server_client_pool.updateExperiment(authz_token, airavata_experiment_id, experiment)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_detailed_experiment_tree, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_experiment_configuration(self, authz_token, airavata_experiment_id, user_configuration):
+        """
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+         - user_configuration
+        """
+        try:
+            return self.api_server_client_pool.updateExperimentConfiguration(authz_token, airavata_experiment_id,
+                                                                             user_configuration)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_detailed_experiment_tree, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_detailed_experiment_tree, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_resource_scheduling(self, authz_token, airavata_experiment_id, resource_scheduling):
+        """
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+         - resource_scheduling
+        """
+        try:
+            return self.api_server_client_pool.updateResourceScheduleing(authz_token, airavata_experiment_id,
+                                                                         resource_scheduling)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to invalid authz token ",
+                             )
+            raise
+
+    def validate_experiment(self, authz_token, airavata_experiment_id):
+        """
+         *
+         * Validate experiment configuration.
+         * A true in general indicates, the experiment is ready to be launched.
+         *
+         * @param airavataExperimentId
+         *    Unique identifier of the experiment (Experimnent ID) of the experiment which need to be validated.
+         *
+         * @return boolean
+         *      Identifier for the success or failure of the validation operation.
+         *
+        *
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+        """
+        try:
+            return self.api_server_client_pool.validateExperiment(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_resource_scheduling, probably due to invalid authz token ",
+                             )
+            raise
+
+    def launch_experiment(self, authz_token, airavata_experiment_id, gateway_id):
+        """
+
+        Launch a Previously Created & Configured Experiment.
+        Airavata Server will then start processing the request and appropriate notifications and intermediate and output data will be subsequently available for this experiment.
+
+        @gateway_id
+           ID of the gateway which will launch the experiment.
+
+        @param airavata_experiment_id
+           The identifier for the requested experiment. This is returned during the create experiment step.
+
+        @return
+          This method call does not have a return value.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.launchExperiment(authz_token, airavata_experiment_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in launch_experiment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in launch_experiment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in launch_experiment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in launch_experiment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment_status(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Experiment Status
+
+        Obtain the status of an experiment by providing the Experiment Id
+
+        @param authz_token
+
+        @param airavata_experiment_id
+            Experiment ID of the experimnet you require the status.
+
+        @return ExperimentStatus
+            ExperimentStatus model with the current status will be returned.
+
+
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.getExperimentStatus(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment_status, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment_status, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment_status, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment_status, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_experiment_outputs(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Experiment Outputs
+        This method to be used when need to obtain final outputs of a certain Experiment
+
+        @param authz_token
+
+        @param airavata_experiment_id
+            Experiment ID of the experimnet you need the outputs.
+
+        @return list
+            List of experiment outputs will be returned. They will be returned as a list of OutputDataObjectType for the experiment.
+
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+        """
+        try:
+            return self.api_server_client_pool.getExperimentOutputs(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_experiment_outputs, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_experiment_outputs, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_experiment_outputs, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_experiment_outputs, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_intermediate_outputs(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Intermediate Experiment Outputs
+        This method to be used when need to obtain intermediate outputs of a certain Experiment
+
+        @param authz_token
+
+        @param airavataExperimentId
+            Experiment ID of the experimnet you need intermediate outputs.
+
+        @return list
+            List of intermediate experiment outputs will be returned. They will be returned as a list of OutputDataObjectType for the experiment.
+
+
+
+        Parameters:
+         - authz_token
+         - airavataExperimentId
+        """
+        try:
+            return self.api_server_client_pool.getIntermediateOutputs(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_job_statuses(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Job Statuses for an Experiment
+        This method to be used when need to get the job status of an Experiment. An experiment may have one or many jobs; there for one or many job statuses may turnup
+
+        @param authz_token
+
+        @param airavata_experiment_id
+            Experiment ID of the experimnet you need the job statuses.
+
+        @return JobStatus
+            Job status (string) for all all the existing jobs for the experiment will be returned in the form of a map
+
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+        """
+        try:
+            return self.api_server_client_pool.getJobStatuses(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_intermediate_outputs, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_job_details(self, authz_token, airavata_experiment_id):
+        """
+
+        Get Job Details for all the jobs within an Experiment.
+        This method to be used when need to get the job details for one or many jobs of an Experiment.
+
+        @param authz_token
+
+        @param airavata_experiment_id
+            Experiment ID of the experimnet you need job details.
+
+        @return list of JobDetails
+            Job details.
+
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+        """
+        try:
+            return self.api_server_client_pool.getJobDetails(authz_token, airavata_experiment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def clone_experiment(self, authz_token, existing_experiment_id, new_experiment_name, new_experiment_projectId):
+        """
+
+        Clone an Existing Experiment
+        Existing specified experiment is cloned and a new name is provided. A copy of the experiment configuration is made and is persisted with new metadata.
+          The client has to subsequently update this configuration if needed and launch the cloned experiment.
+
+        @param existing_experiment_id
+           experiment name that should be used in the cloned experiment
+
+        @param new_experiment_name
+           Once an experiment is cloned, to disambiguate, the users are suggested to provide new metadata. This will again require
+             the basic experiment metadata like the name and description, intended user, the gateway identifier and if the experiment
+             should be shared public by default.
+        @param new_experiment_projectId
+           The project in which to create the cloned experiment. This is optional and if null the experiment will be created
+             in the same project as the existing experiment.
+
+        @return
+          The server-side generated.airavata.registry.core.experiment.globally unique identifier (Experiment ID) for the newly cloned experiment.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - existing_experiment_id
+         - new_experiment_name
+         - new_experiment_projectId
+        """
+        try:
+            return self.api_server_client_pool.cloneExperiment(authz_token, existing_experiment_id, new_experiment_name,
+                                                               new_experiment_projectId)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def clone_experiment_by_admin(self, authz_token, existing_experiment_id, new_experiment_name,
+                                  new_experiment_projectId):
+        """
+
+        Clone an Existing Experiment by an admin user
+        Existing specified experiment is cloned and a new name is provided. A copy of the experiment configuration is made and is persisted with new metadata.
+          The client has to subsequently update this configuration if needed and launch the cloned experiment.
+
+        @param new_experiment_name
+           experiment name that should be used in the cloned experiment
+
+        @param existing_experiment_id
+           Once an experiment is cloned, to disambiguate, the users are suggested to provide new metadata. This will again require
+             the basic experiment metadata like the name and description, intended user, the gateway identifier and if the experiment
+             should be shared public by default.
+        @param new_experiment_projectId
+           The project in which to create the cloned experiment. This is optional and if null the experiment will be created
+             in the same project as the existing experiment.
+
+        @return
+          The server-side generated.airavata.registry.core.experiment.globally unique identifier (Experiment ID) for the newly cloned experiment.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - existing_experiment_id
+         - new_experiment_name
+         - new_experiment_projectId
+        """
+        try:
+            return self.api_server_client_pool.cloneExperimentByAdmin(authz_token, existing_experiment_id,
+                                                                      new_experiment_name,
+                                                                      new_experiment_projectId)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def terminate_experiment(self, authz_token, airavata_experiment_id, gateway_id):
+        """
+
+        Terminate a running Experiment.
+
+        @gateway_id
+           ID of the gateway which will terminate the running Experiment.
+
+        @param airavata_experiment_id
+           The identifier of the experiment required termination. This ID is returned during the create experiment step.
+
+        @return status
+          This method call does not have a return value.
+
+        @throws org.apache.airavata.model.error.InvalidRequestException
+           For any incorrect forming of the request itself.
+
+        @throws org.apache.airavata.model.error.ExperimentNotFoundException
+           If the specified experiment is not previously created, then an Experiment Not Found Exception is thrown.
+
+        @throws org.apache.airavata.model.error.AiravataClientException
+           The following list of exceptions are thrown which Airavata Client can take corrective actions to resolve:
+
+             UNKNOWN_GATEWAY_ID - If a Gateway is not registered with Airavata as a one time administrative
+                step, then Airavata Registry will not have a provenance area setup. The client has to follow
+                gateway registration steps and retry this request.
+
+             AUTHENTICATION_FAILURE - How Authentication will be implemented is yet to be determined.
+                For now this is a place holder.
+
+             INVALID_AUTHORIZATION - This will throw an authorization exception. When a more robust security hand-shake
+                is implemented, the authorization will be more substantial.
+
+        @throws org.apache.airavata.model.error.AiravataSystemException
+           This exception will be thrown for any Airavata Server side issues and if the problem cannot be corrected by the client
+              rather an Airavata Administrator will be notified to take corrective action.
+
+
+        Parameters:
+         - authz_token
+         - airavata_experiment_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.terminateExperiment(authz_token, airavata_experiment_id,
+                                                                   gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_application_module(self, authz_token, gateway_id, application_module):
+        """
+
+        Register a Application Module.
+
+        @gatewayId
+           ID of the gateway which is registering the new Application Module.
+
+        @param applicationModule
+           Application Module Object created from the datamodel.
+
+        @return appModuleId
+          Returns the server-side generated airavata appModule globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - application_module
+        """
+        try:
+            return self.api_server_client_pool.registerApplicationModule(authz_token, gateway_id,
+                                                                         application_module)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_job_details, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_job_details, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_job_details, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_application_module(self, authz_token, app_module_id):
+        """
+
+        Fetch a Application Module.
+
+        @param app_module_id
+          The unique identifier of the application module required
+
+        @return applicationModule
+          Returns an Application Module Object.
+
+
+        Parameters:
+         - authz_token
+         - app_module_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationModule(authz_token, app_module_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_module, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_module, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_module, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_module, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_application_module(self, authz_token, app_module_id, application_module):
+        """
+
+        Update a Application Module.
+
+        @param app_module_id
+          The identifier for the requested application module to be updated.
+
+        @param application_module
+           Application Module Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - appModuleId
+         - applicationModule
+        """
+        try:
+            return self.api_server_client_pool.updateApplicationModule(authz_token, app_module_id, application_module)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_application_module, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in update_application_module, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_application_module, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_application_module, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_app_modules(self, authz_token, gateway_id):
+        """
+
+        Fetch all Application Module Descriptions.
+
+        @param gateway_id
+           ID of the gateway which need to list all available application deployment documentation.
+
+        @return list
+           Returns the list of all Application Module Objects.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllAppModules(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_app_modules, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_all_app_modules, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_app_modules, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_app_modules, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_accessible_app_modules(self, authz_token, gateway_id):
+        """
+
+        Fetch all accessible Application Module Descriptions.
+
+        @param gateway_id
+           ID of the gateway which need to list all accessible application deployment documentation.
+
+        @return list
+           Returns the list of all Application Module Objects that are accessible to the user.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAccessibleAppModules(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_accessible_app_modules, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_accessible_app_modules, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_accessible_app_modules, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_accessible_app_modules, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_application_module(self, authz_token, app_module_id):
+        """
+
+        Delete an Application Module.
+
+        @param appModuleId
+          The identifier of the Application Module to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - appModuleId
+        """
+        try:
+            return self.api_server_client_pool.deleteApplicationModule(authz_token, app_module_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_application_module, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in delete_application_module, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_application_module, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_application_module, probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_application_deployment(self, authz_token, gateway_id, application_deployment):
+        """
+
+        Register an Application Deployment.
+
+        @param gateway_id
+           ID of the gateway which is registering the new Application Deployment.
+
+        @param application_deployment
+           Application Module Object created from the datamodel.
+
+        @return appDeploymentId
+          Returns a server-side generated airavata appDeployment globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - application_deployment
+        """
+        try:
+            return self.api_server_client_pool.registerApplicationDeployment(authz_token, gateway_id,
+                                                                             application_deployment)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_application_deployment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_application_deployment, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_application_deployment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_application_deployment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_application_deployment(self, authz_token, app_deployment_id):
+        """
+
+        Fetch a Application Deployment.
+
+        @param app_deployment_id
+          The identifier for the requested application module
+
+        @return applicationDeployment
+          Returns a application Deployment Object.
+
+
+        Parameters:
+         - authz_token
+         - app_deployment_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationDeployment(authz_token, app_deployment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_deployment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_deployment, probably due to  client misconfiguration ",
+                             )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_deployment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_deployment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_application_deployment(self, authz_token, app_deployment_id, application_deployment):
+        """
+
+        Update an Application Deployment.
+
+        @param app_deployment_id
+          The identifier of the requested application deployment to be updated.
+
+        @param application_deployment
+           Application Deployment Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - app_deployment_id
+         - application_deployment
+        """
+        try:
+            return self.api_server_client_pool.updateApplicationDeployment(authz_token, app_deployment_id,
+                                                                           application_deployment)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_application_deployment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_application_deployment, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_application_deployment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_application_deployment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_application_deployment(self, authz_token, app_deployment_id):
+        """
+
+        Delete an Application Deployment.
+
+        @param app_deployment_id
+          The unique identifier of application deployment to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - app_deployment_id
+        """
+        try:
+            return self.api_server_client_pool.deleteApplicationDeployment(authz_token, app_deployment_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_application_deployment, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_application_deployment, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_application_deployment, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_application_deployment, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_application_deployments(self, authz_token, gateway_id):
+        """
+
+        Fetch all Application Deployment Descriptions.
+
+        @param gatewayId
+           ID of the gateway which need to list all available application deployment documentation.
+
+        @return list<applicationDeployment.
+           Returns the list of all application Deployment Objects.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllApplicationDeployments(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_application_deployments, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_application_deployments, probably due to  client misconfiguration ",
+                )
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_application_deployments, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_application_deployments, probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_accessible_application_deployments(self, authz_token, gateway_id, permission_type):
+        """
+
+        Fetch all accessible Application Deployment Descriptions.
+
+        @param gateway_id
+           ID of the gateway which need to list all accessible application deployment documentation.
+        @param permission_type
+           ResourcePermissionType to check for this user
+
+        @return list<applicationDeployment.
+           Returns the list of all application Deployment Objects that are accessible to the user.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.get_accessible_application_deployments(authz_token, gateway_id,
+                                                                                      permission_type)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_accessible_application_deployments, probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_accessible_application_deployments,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_accessible_application_deployments, probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_accessible_application_deployments, probably due to invalid authz token ",
+                )
+            raise
+
+    def get_app_module_deployed_resources(self, authz_token, app_module_id):
+        """
+        Fetch a list of Deployed Compute Hosts.
+
+        @param app_module_id
+          The identifier for the requested application module
+
+        @return list<string>
+          Returns a list of Deployed Resources.
+
+
+        Parameters:
+         - authz_token
+         - app_module_id
+        """
+        try:
+            return self.api_server_client_pool.getAppModuleDeployedResources(authz_token, app_module_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_app_module_deployed_resources, probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_app_module_deployed_resources,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_app_module_deployed_resources, probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_app_module_deployed_resources, probably due to invalid authz token ",
+                )
+            raise
+
+    def get_application_deployments_for_app_module_and_group_resource_profile(self, authz_token, app_module_id,
+                                                                              group_resource_profileId):
+        """
+        Fetch a list of Application Deployments that this user can use for executing the given Application Module using the given Group Resource Profile.
+        The user must have at least READ access to the Group Resource Profile.
+
+        @param app_module_id
+           The identifier for the Application Module
+
+        @param group_resource_profileId
+           The identifier for the Group Resource Profile
+
+        @return list<ApplicationDeploymentDescription>
+           Returns a list of Application Deployments
+
+        Parameters:
+         - authz_token
+         - app_module_id
+         - group_resource_profileId
+        """
+        try:
+            return self.api_server_client_pool.getApplicationDeploymentsForAppModuleAndGroupResourceProfile(authz_token,
+                                                                                                            app_module_id,
+                                                                                                            group_resource_profileId)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_application_interface(self, authz_token, gateway_id, application_interface):
+        """
+
+        Register a Application Interface.
+
+        @param applicationInterface
+           Application Module Object created from the datamodel.
+
+        @return appInterfaceId
+          Returns a server-side generated airavata application interface globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - application_interface
+        """
+        try:
+            return self.api_server_client_pool.registerApplicationInterface(authz_token, gateway_id,
+                                                                            application_interface)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to invalid authz token ",
+                             )
+            raise
+
+    def clone_application_interface(self, authz_token, existing_app_interface_id, new_application_name, gateway_id):
+        """
+
+        Clone an Application Interface.
+
+        @gateway_id
+           The identifier for the gateway profile to be requested
+
+        @param existing_app_interface_id
+           Identifier of the existing Application interface you wich to clone.
+
+        @param new_application_name
+           Name for the new application interface.
+
+        @return appInterfaceId
+           Returns a server-side generated globally unique identifier for the newly cloned application interface.
+
+
+        Parameters:
+         - authz_token
+         - existing_app_interface_id
+         - new_application_name
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.cloneApplicationInterface(authz_token, existing_app_interface_id,
+                                                                         new_application_name, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile,"
+                             "                                                  probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_deployments_for_app_module_and_group_resource_profile, "
+                             "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_application_interface(self, authz_token, app_interface_id):
+        """
+
+        Fetch an Application Interface.
+
+        @param app_interface_id
+          The identifier for the requested application interface.
+
+        @return applicationInterface
+          Returns an application Interface Object.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInterface(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_interface," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception("Error occurred in get_application_interface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_interface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_interface, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_application_interface(self, authz_token, app_interface_id, application_interface):
+        """
+
+        Update a Application Interface.
+
+        @param app_interface_id
+          The identifier of the requested application deployment to be updated.
+
+        @param application_interface
+           Application Interface Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - appInterfaceId
+         - applicationInterface
+        """
+        try:
+            return self.api_server_client_pool.updateApplicationInterface(authz_token, app_interface_id,
+                                                                          application_interface)
+        except InvalidRequestException:
+            logger.exception("Error occurred in updateApplicationInterface," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in updateApplicationInterface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in updateApplicationInterface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in updateApplicationInterface, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_application_interface(self, authz_token, app_interface_id):
+        """
+
+        Delete an Application Interface.
+
+        @param app_interface_id
+          The identifier for the requested application interface to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.deleteApplicationInterface(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_application_interface," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_application_interface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_application_interface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_application_interface, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_application_interface_names(self, authz_token, gateway_id):
+        """
+
+        Fetch name and ID of  Application Interface documents.
+
+
+        @return map<applicationId, applicationInterfaceNames>
+          Returns a list of application interfaces with corresponsing ID's
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllApplicationInterfaceNames(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_application_interfaces(self, authz_token, gateway_id):
+        """
+
+        Fetch all Application Interface documents.
+
+
+        @return map<applicationId, applicationInterfaceNames>
+          Returns a list of application interfaces documents (Application Interface ID, name, description, Inputs and Outputs objects).
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllApplicationInterfaces(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_application_interface_names, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_application_inputs(self, authz_token, app_interface_id):
+        """
+
+        Fetch the list of Application Inputs.
+
+        @param app_interface_id
+          The identifier of the application interface which need inputs to be fetched.
+
+        @return list<application_interface_model.InputDataObjectType>
+          Returns a list of application inputs.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInputs(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_application_outputs(self, authz_token, app_interface_id):
+        """
+
+        Fetch list of Application Outputs.
+
+        @param appInterfaceId
+          The identifier of the application interface which need outputs to be fetched.
+
+        @return list<application_interface_model.OutputDataObjectType>
+          Returns a list of application outputs.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationOutputs(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_outputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_outputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_outputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_outputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_available_app_interface_compute_resources(self, authz_token, app_interface_id):
+        """
+
+        Fetch a list of all deployed Compute Hosts for a given application interfaces.
+
+        @param app_interface_id
+          The identifier for the requested application interface.
+
+        @return map<computeResourceId, computeResourceName>
+          A map of registered compute resource id's and their corresponding hostnames.
+          Deployments of each modules listed within the interfaces will be listed.
+
+
+        Parameters:
+         - authz_token
+         - app_interface_id
+        """
+        try:
+            return self.api_server_client_pool.getAvailableAppInterfaceComputeResources(authz_token, app_interface_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_compute_resource(self, authz_token, compute_resource_description):
+        """
+        Register a Compute Resource.
+
+        @param compute_resource_description
+           Compute Resource Object created from the datamodel.
+
+        @return computeResourceId
+          Returns a server-side generated airavata compute resource globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_description
+        """
+        try:
+            return self.api_server_client_pool.registerComputeResource(authz_token, compute_resource_description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_compute_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_compute_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_compute_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_compute_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_compute_resource(self, authz_token, compute_resource_id):
+        """
+        Fetch the given Compute Resource.
+
+        @param compute_resource_id
+          The identifier for the requested compute resource
+
+        @return computeResourceDescription
+           Compute Resource Object created from the datamodel..
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.getComputeResource(authz_token, compute_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_compute_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_compute_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_compute_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_compute_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_compute_resource_names(self, authz_token):
+        """
+
+        Fetch all registered Compute Resources.
+
+        @return A map of registered compute resource id's and thier corresponding hostnames.
+           Compute Resource Object created from the datamodel..
+
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getAllComputeResourceNames(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_compute_resource_names," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_compute_resource_names," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_compute_resource_names, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_compute_resource_names, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_compute_resource(self, authz_token, compute_resource_id, compute_resource_description):
+        """
+        Update a Compute Resource.
+
+        @param compute_resource_id
+          The identifier for the requested compute resource to be updated.
+
+        @param compute_resource_description
+           Compute Resource Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - compute_resource_description
+        """
+        try:
+            return self.api_server_client_pool.updateComputeResource(authz_token, compute_resource_id,
+                                                                     compute_resource_description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_compute_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_compute_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_compute_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_compute_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_compute_resource(self, authz_token, compute_resource_id):
+        """
+        Delete a Compute Resource.
+
+        @param compute_resource_id
+          The identifier for the requested compute resource to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.deleteComputeResource(authz_token, compute_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_compute_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_compute_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_compute_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_compute_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_storage_resource(self, authz_token, storage_resource_description):
+        """
+        Register a Storage Resource.
+
+        @param storage_resource_description
+           Storge Resource Object created from the datamodel.
+
+        @return storageResourceId
+          Returns a server-side generated airavata storage resource globally unique identifier.
+
+
+        Parameters:
+         - authz_token
+         - storage_resource_description
+        """
+        try:
+            return self.api_server_client_pool.registerStorageResource(authz_token, storage_resource_description)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_storage_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_storage_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_storage_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_storage_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_storage_resource(self, authz_token, storage_resource_id):
+        """
+        Fetch the given Storage Resource.
+
+        @param storageResourceId
+          The identifier for the requested storage resource
+
+        @return storageResourceDescription
+           Storage Resource Object created from the datamodel..
+
+
+        Parameters:
+         - authz_token
+         - storage_resource_id
+        """
+        try:
+            return self.api_server_client_pool.getStorageResource(authz_token, storage_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_storage_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_storage_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_storage_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_storage_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_storage_resource_names(self, authz_token):
+        """
+        Fetch all registered Storage Resources.
+
+        @return A map of registered compute resource id's and thier corresponding hostnames.
+           Compute Resource Object created from the datamodel..
+
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getAllStorageResourceNames(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_storage_resource_names," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_storage_resource_names," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_storage_resource_names, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_storage_resource_names, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_storage_resource(self, authz_token, storage_resource_id, storage_resource_description):
+        """
+        Update a Storage Resource.
+
+        @param storage_resource_id
+          The identifier for the requested compute resource to be updated.
+
+        @param storage_resource_description
+           Storage Resource Object created from the datamodel.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - storage_resource_id
+         - storage_resource_description
+        """
+        try:
+            return self.api_server_client_pool.updateStorageResource(authz_token, storage_resource_id,
+                                                                     storage_resource_description)
+            logger.exception("Error occurred in update_storage_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_storage_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_storage_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_storage_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_storage_resource(self, authz_token, storage_resource_id):
+        """
+        Delete a Storage Resource.
+
+        @param storage_resource_id
+          The identifier of the requested compute resource to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - storageResourceId
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInputs(authz_token, storage_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_storage_resource," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_storage_resource," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_storage_resource, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_storage_resource, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_local_submission_details(self, authz_token, compute_resource_id, priority_order, local_submission):
+        """
+        Add a Local Job Submission details to a compute resource
+         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+
+        @param compute_resource_id
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param local_submission
+          The LOCALSubmission object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - local_submission
+        """
+        try:
+            return self.api_server_client_pool.addLocalSubmissionDetails(authz_token, compute_resource_id,
+                                                                         priority_order, local_submission)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_local_submission_details," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_local_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_local_submission_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in add_local_submission_details, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_local_submission_details(self, authz_token, job_submission_interface_id, local_submission):
+        """
+        Update the given Local Job Submission details
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be updated.
+
+        @param local_submission
+          The LOCALSubmission object to be updated.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - local_submission
+        """
+        try:
+            return self.api_server_client_pool.updateLocalSubmissionDetails(authz_token, authz_token,
+                                                                            job_submission_interface_id,
+                                                                            local_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_local_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_local_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_local_submission_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_local_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_local_job_submission(self, authz_token, job_submission_id):
+        """
+        This method returns localJobSubmission object
+        @param job_submission_id
+          The identifier of the JobSubmission Interface to be retrieved.
+         @return LOCALSubmission instance
+
+
+        Parameters:
+         - authz_token
+         - job_submission_id
+        """
+        try:
+            return self.api_server_client_pool.getLocalJobSubmission(authz_token, job_submission_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_local_job_submission," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_local_job_submission," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_local_job_submission, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_local_job_submission, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_ssh_job_submission_details(self, authz_token, compute_resource_id, priority_order, ssh_job_submission):
+        """
+        Add a SSH Job Submission details to a compute resource
+         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+
+        @param compute_resource_id
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param ssh_job_submission
+          The SSHJobSubmission object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - ssh_job_submission
+        """
+        try:
+            return self.api_server_client_pool.addSSHJobSubmissionDetails(authz_token, compute_resource_id,
+                                                                          priority_order, ssh_job_submission)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_ssh_job_submission_details," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_ssh_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_ssh_job_submission_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_ssh_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_ssh_fork_job_submission_details(self, authz_token, compute_resource_id, priority_order, ssh_job_submission):
+        """
+        Add a SSH_FORK Job Submission details to a compute resource
+         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+
+        @param compute_resource_id
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param ssh_job_submission
+          The SSHJobSubmission object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - ssh_job_submission
+        """
+        try:
+            return self.api_server_client_pool.addSSHForkJobSubmissionDetails(authz_token, compute_resource_id,
+                                                                              priority_order, ssh_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_ssh_fork_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_ssh_fork_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_ssh_fork_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_ssh_fork_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_ssh_job_submission(self, authz_token, job_submission_id):
+        """
+        This method returns SSHJobSubmission object
+        @param job_submission_id
+          The identifier of the JobSubmission Interface to be retrieved.
+         @return SSHJobSubmission instance
+
+
+        Parameters:
+         - authz_token
+         - job_submission_id
+        """
+        try:
+            return self.api_server_client_pool.getSSHJobSubmission(authz_token, job_submission_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_ssh_job_submission," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_ssh_job_submission," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_ssh_job_submission, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_ssh_job_submission, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_unicore_job_submission_details(self, authz_token, compute_resource_id, priority_order,
+                                           unicore_job_submission):
+        """
+
+        Add a UNICORE Job Submission details to a compute resource
+         App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+
+        @param compute_resource_id
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param unicore_job_submission
+          The UnicoreJobSubmission object to be added to the resource.
+
+        @return status
+         Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - unicore_job_submission
+        """
+        try:
+            return self.api_server_client_pool.addUNICOREJobSubmissionDetails(authz_token, compute_resource_id,
+                                                                              priority_order, unicore_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_unicore_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_unicore_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_unicore_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_unicore_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_unicore_job_submission(self, authz_token, job_submission_id):
+        """
+          *
+          * This method returns UnicoreJobSubmission object
+          *
+          * @param job_submission_id
+          *   The identifier of the JobSubmission Interface to be retrieved.
+          *  @return UnicoreJobSubmission instance
+          *
+        *
+
+        Parameters:
+         - authz_token
+         - job_submission_id
+        """
+        try:
+            return self.api_server_client_pool.getUnicoreJobSubmission(authz_token, job_submission_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_unicore_job_submission," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_unicore_job_submission," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_unicore_job_submission, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_unicore_job_submission, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_cloud_job_submission_details(self, authz_token, compute_resource_id, priority_order, cloud_submission):
+        """
+           *
+           * Add a Cloud Job Submission details to a compute resource
+           *  App catalog will return a jobSubmissionInterfaceId which will be added to the jobSubmissionInterfaces.
+           *
+           * @param compute_resource_id
+           *   The identifier of the compute resource to which JobSubmission protocol to be added
+           *
+           * @param priority_order
+           *   Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+           *
+           * @param cloud_submission
+           *   The SSHJobSubmission object to be added to the resource.
+           *
+           * @return status
+           *   Returns the unique job submission id.
+           *
+        *
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - priority_order
+         - cloud_submission
+        """
+        try:
+            return self.api_server_client_pool.addCloudJobSubmissionDetails(authz_token, compute_resource_id,
+                                                                            priority_order, cloud_submission)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_cloud_job_submission(self, authz_token, job_submission_id):
+        """
+           *
+           * This method returns cloudJobSubmission object
+           * @param jobSubmissionInterfaceI
+               *   The identifier of the JobSubmission Interface to be retrieved.
+           *  @return CloudJobSubmission instance
+        *
+
+        Parameters:
+         - authz_token
+         - job_submission_id
+        """
+        try:
+            return self.api_server_client_pool.getCloudJobSubmission(authz_token, job_submission_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_cloud_job_submission," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_cloud_job_submission," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_cloud_job_submission, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_cloud_job_submission, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_ssh_job_submission_details(self, authz_token, job_submission_interface_id, ssh_job_submission):
+        """
+
+        Update the given SSH Job Submission details
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be updated.
+
+        @param ssh_job_submission
+          The SSHJobSubmission object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - ssh_job_submission
+        """
+        try:
+            return self.api_server_client_pool.updateSSHJobSubmissionDetails(authz_token, job_submission_interface_id,
+                                                                             ssh_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_ssh_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_ssh_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_ssh_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_ssh_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_cloud_job_submission_details(self, authz_token, job_submission_interface_id, ssh_job_submission):
+        """
+
+        Update the cloud Job Submission details
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be updated.
+
+        @param ssh_job_submission
+          The CloudJobSubmission object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - ssh_job_submission
+        """
+        try:
+            return self.api_server_client_pool.updateCloudJobSubmissionDetails(authz_token, job_submission_interface_id,
+                                                                               ssh_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_cloud_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_cloud_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_cloud_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_cloud_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_unicore_job_submission_details(self, authz_token, job_submission_interface_id, unicore_job_submission):
+        """
+
+        Update the UNIOCRE Job Submission details
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be updated.
+
+        @param unicore_job_submission
+          The UnicoreJobSubmission object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - unicore_job_submission
+        """
+        try:
+            return self.api_server_client_pool.updateUnicoreJobSubmissionDetails(authz_token,
+                                                                                 job_submission_interface_id,
+                                                                                 unicore_job_submission)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_unicore_job_submission_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_unicore_job_submission_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_unicore_job_submission_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_unicore_job_submission_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_local_data_movement_details(self, authz_token, product_uri, data_move_type, priority_order,
+                                        local_data_movement):
+        """
+
+        Add a Local data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param product_uri
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param data_move_type
+          DMType object to be added to the resource.
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param local_data_movement
+          The LOCALDataMovement object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_move_type
+         - priority_order
+         - local_data_movement
+        """
+        try:
+            return self.api_server_client_pool.addLocalDataMovementDetails(authz_token, product_uri, data_move_type,
+                                                                           priority_order, local_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_local_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_local_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_local_data_movement_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_local_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_local_data_movement_details(self, authz_token, data_movementInterface_id, local_data_movement):
+        """
+
+        Update the given Local data movement details
+
+        @param data_movementInterface_id
+          The identifier of the data movement Interface to be updated.
+
+        @param local_data_movement
+          The LOCALDataMovement object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movementInterface_id
+         - local_data_movement
+        """
+        try:
+            return self.api_server_client_pool.updateLocalDataMovementDetails(authz_token, data_movementInterface_id,
+                                                                              local_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_local_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_local_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_local_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_local_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_local_data_movement(self, authz_token, data_movement_id):
+        """
+
+        This method returns local datamovement object.
+
+        @param data_movement_id
+          The identifier of the datamovement Interface to be retrieved.
+
+         @return LOCALDataMovement instance
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_id
+        """
+        try:
+            return self.api_server_client_pool.getLocalDataMovement(authz_token, data_movement_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_local_data_movement," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_local_data_movement," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_local_data_movement, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_local_data_movement, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_scp_data_movement_details(self, authz_token, product_uri, data_move_type, priority_order,
+                                      scp_data_movement):
+        """
+
+        Add a SCP data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param productUri
+          The identifier of the compute resource to which JobSubmission protocol to be added
+
+        @param priorityOrder
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param scpDataMovement
+          The SCPDataMovement object to be added to the resource.
+
+        @return status
+          Returns the unique job submission id.
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_move_type
+         - priority_order
+         - scp_data_movement
+        """
+        try:
+            return self.api_server_client_pool.addSCPDataMovementDetails(authz_token, product_uri, data_move_type,
+                                                                         priority_order, scp_data_movement)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_scp_data_movement_details," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_scp_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_scp_data_movement_details, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in add_scp_data_movement_details, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_scp_data_movement_details(self, authz_token, data_movement_interface_id, scp_data_movement):
+        """
+
+        Update the given scp data movement details
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param data_movement_interface_id
+          The identifier of the data movement Interface to be updated.
+
+        @param scp_data_movement
+          The SCPDataMovement object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - data_movement_interface_id
+         - scp_data_movement
+        """
+        try:
+            return self.api_server_client_pool.updateSCPDataMovementDetails(authz_token, data_movement_interface_id,
+                                                                            scp_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_scp_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_scp_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_scp_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_scp_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_scp_data_movement(self, authz_token, data_movement_id):
+        """
+        This method returns SCP datamovement object
+
+        @param dataMovementId
+          The identifier of the datamovement Interface to be retrieved.
+
+        @return SCPDataMovement instance
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_id
+        """
+        try:
+            return self.api_server_client_pool.getSCPDataMovement(authz_token, data_movement_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_scp_data_movement," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_scp_data_movement," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_scp_data_movement, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_scp_data_movement, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_unicore_data_movement_details(self, authz_token, product_uri, data_move_type, priority_order,
+                                          unicore_data_movement):
+        """
+
+        Add a UNICORE data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param product_uri
+          The identifier of the compute resource to which data movement protocol to be added
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param unicore_data_movement
+          The UnicoreDataMovement object to be added to the resource.
+
+        @return status
+          Returns the unique data movement id.
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_move_type
+         - priority_order
+         - unicore_data_movement
+        """
+        try:
+            return self.api_server_client_pool.addUnicoreDataMovementDetails(authz_token, product_uri, data_move_type,
+                                                                             priority_order, unicore_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_unicore_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_unicore_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_unicore_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_unicore_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_unicore_data_movement_details(self, authz_token, data_movement_interface_id, unicore_data_movement):
+        """
+
+        Update a selected UNICORE data movement details
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param data_movement_interface_id
+          The identifier of the data movement Interface to be updated.
+
+        @param unicore_data_movement
+          The UnicoreDataMovement object to be updated.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_interface_id
+         - unicore_data_movement
+        """
+        try:
+            return self.api_server_client_pool.updateUnicoreDataMovementDetails(authz_token, data_movement_interface_id,
+                                                                                unicore_data_movement)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_unicore_data_movement(self, authz_token, data_movement_id):
+        """
+
+        This method returns UNICORE datamovement object
+
+        @param data_movement_id
+          The identifier of the datamovement Interface to be retrieved.
+
+        @return UnicoreDataMovement instance
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_id
+        """
+        try:
+            return self.api_server_client_pool.getUnicoreDataMovement(authz_token, data_movement_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_unicore_data_movement," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_unicore_data_movement," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_unicore_data_movement, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_unicore_data_movement, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_grid_ftp_data_movement_details(self, authz_token, product_uri, data_move_type, priority_order,
+                                           grid_ftp_data_movement):
+        """
+
+        Add a GridFTP data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param product_uri
+          The identifier of the compute resource to which dataMovement protocol to be added
+
+        @param data_move_type
+           The DMType object to be added to the resource.
+
+        @param priority_order
+          Specify the priority of this job manager. If this is the only jobmanager, the priority can be zero.
+
+        @param grid_ftp_data_movement
+          The GridFTPDataMovement object to be added to the resource.
+
+        @return status
+          Returns the unique data movement id.
+
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_move_type
+         - priority_order
+         - grid_ftp_data_movement
+        """
+        try:
+            return self.api_server_client_pool.addGridFTPDataMovementDetails(authz_token, product_uri, data_move_type,
+                                                                             priority_order, grid_ftp_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_grid_ftp_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_grid_ftp_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_grid_ftp_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_grid_ftp_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_grid_ftp_data_movement_details(self, authz_token, data_movement_interface_id, grid_ftp_data_movement):
+        """
+        Update the given GridFTP data movement details to a compute resource
+         App catalog will return a dataMovementInterfaceId which will be added to the dataMovementInterfaces.
+
+        @param data_movement_interface_id
+          The identifier of the data movement Interface to be updated.
+
+        @param grid_ftp_data_movement
+          The GridFTPDataMovement object to be updated.
+
+        @return boolean
+          Returns a success/failure of the update.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_interface_id
+         - grid_ftp_data_movement
+        """
+        try:
+            return self.api_server_client_pool.updateGridFTPDataMovementDetails(authz_token, data_movement_interface_id,
+                                                                                grid_ftp_data_movement)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_grid_ftp_data_movement_details," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_grid_ftp_data_movement_details," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_grid_ftp_data_movement_details, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_grid_ftp_data_movement_details, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_grid_ftp_data_movement(self, authz_token, data_movement_id):
+        """
+        This method returns GridFTP datamovement object
+
+        @param data_movement_id
+          The identifier of the datamovement Interface to be retrieved.
+
+         @return GridFTPDataMovement instance
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_id
+        """
+        try:
+            return self.api_server_client_pool.getGridFTPDataMovement(authz_token, data_movement_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_grid_ftp_data_movement," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_grid_ftp_data_movement," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_grid_ftp_data_movement, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_grid_ftp_data_movement, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def change_job_submission_priority(self, authz_token, job_submission_interface_id, new_priority_order):
+        """
+        Change the priority of a given job submisison interface
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be changed
+
+        @param new_priority_order
+          The new priority of the job manager interface.
+
+        @return status
+          Returns a success/failure of the change.
+
+
+
+        Parameters:
+         - authz_token
+         - job_submission_interface_id
+         - new_priority_order
+        """
+        try:
+            return self.api_server_client_pool.changeJobSubmissionPriority(authz_token, job_submission_interface_id,
+                                                                           new_priority_order)
+        except InvalidRequestException:
+            logger.exception("Error occurred in change_job_submission_priority," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in change_job_submission_priority," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in change_job_submission_priority, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in change_job_submission_priority, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def change_data_movement_priority(self, authz_token, data_movement_interface_id, new_priority_order):
+        """
+        Change the priority of a given data movement interface
+
+        @param data_movement_interface_id
+          The identifier of the DataMovement Interface to be changed
+
+        @param new_priority_order
+          The new priority of the data movement interface.
+
+        @return status
+          Returns a success/failure of the change.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_interface_id
+         - new_priority_order
+        """
+        try:
+            return self.api_server_client_pool.changeDataMovementPriority(authz_token, data_movement_interface_id,
+                                                                          new_priority_order)
+        except InvalidRequestException:
+            logger.exception("Error occurred in change_data_movement_priority," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in change_data_movement_priority," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in change_data_movement_priority, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in change_data_movement_priority, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def change_job_submission_priorities(self, authz_token, job_submission_priority_map):
+        """
+        Change the priorities of a given set of job submission interfaces
+
+        @param job_submission_priority_map
+          A Map of identifiers of the JobSubmission Interfaces and thier associated priorities to be set.
+
+        @return status
+          Returns a success/failure of the changes.
+
+
+        Parameters:
+         - authz_token
+         - job_submission_priority_map
+        """
+        try:
+            return self.api_server_client_pool.changeJobSubmissionPriorities(authz_token, job_submission_priority_map)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in change_job_submission_priorities," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in change_job_submission_priorities," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in change_job_submission_priorities, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in change_job_submission_priorities, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def change_data_movement_priorities(self, authz_token, data_movement_priority_map):
+        """
+        Change the priorities of a given set of data movement interfaces
+
+        @param data_movement_priority_map
+          A Map of identifiers of the DataMovement Interfaces and thier associated priorities to be set.
+
+        @return status
+          Returns a success/failure of the changes.
+
+
+
+        Parameters:
+         - authz_token
+         - data_movement_priority_map
+        """
+        try:
+            return self.api_server_client_pool.changeDataMovementPriorities(authz_token, data_movement_priority_map)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in change_data_movement_priorities," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in change_data_movement_priorities," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in change_data_movement_priorities, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in change_data_movement_priorities, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_job_submission_interface(self, authz_token, compute_resource_id, job_submission_interface_id):
+        """
+        Delete a given job submisison interface
+
+        @param job_submission_interface_id
+          The identifier of the JobSubmission Interface to be changed
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - jobSubmissionInterfaceId
+        """
+        try:
+            return self.api_server_client_pool.deleteJobSubmissionInterface(authz_token, compute_resource_id,
+                                                                            job_submission_interface_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_job_submission_interface," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_job_submission_interface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_job_submission_interface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_job_submission_interface, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_data_movement_interface(self, authz_token, product_uri, data_movement_interface_id, data_move_type):
+        """
+        Delete a given data movement interface
+
+        @param data_movement_interface_id
+          The identifier of the DataMovement Interface to be changed
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+
+        Parameters:
+         - authz_token
+         - product_uri
+         - data_movement_interface_id
+         - data_move_type
+        """
+        try:
+            return self.api_server_client_pool.deleteDataMovementInterface(authz_token, product_uri,
+                                                                           data_movement_interface_id, data_move_type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_data_movement_interface," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_data_movement_interface," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_data_movement_interface, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_data_movement_interface, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def register_resource_job_manager(self, authz_token, resource_job_manager):
+        """
+        Parameters:
+         - authz_token
+         - resource_job_manager
+        """
+        try:
+            return self.api_server_client_pool.registerResourceJobManager(authz_token, resource_job_manager)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_resource_job_manager," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_resource_job_manager," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_resource_job_manager, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_resource_job_manager, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_resource_job_manager(self, authz_token, resource_job_manager_id, updated_resource_job_manager):
+        """
+        Parameters:
+         - authz_token
+         - resourceJobManagerId
+         - updatedResourceJobManager
+        """
+        try:
+            return self.api_server_client_pool.updateResourceJobManager(authz_token,
+                                                                        resource_job_manager_id,
+                                                                        updated_resource_job_manager)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_resource_job_manager," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_resource_job_manager," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_resource_job_manager, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_resource_job_manager, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_resource_job_manager(self, authz_token, resource_job_manager_id):
+        """
+        Parameters:
+         - authz_token
+         - resourceJobManagerId
+        """
+        try:
+            return self.api_server_client_pool.getResourceJobManager(authz_token, resource_job_manager_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_resource_job_manager," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_resource_job_manager," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_resource_job_manager, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_resource_job_manager, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_resource_job_manager(self, authz_token, resource_job_manager_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_job_manager_id
+        """
+        try:
+            return self.api_server_client_pool.deleteResourceJobManager(authz_token, resource_job_manager_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_resource_job_manager," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_resource_job_manager," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_resource_job_manager, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_resource_job_manager, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_batch_queue(self, authz_token, compute_resource_id, queue_name):
+        """
+        Delete a Compute Resource Queue
+
+        @param compute_resource_id
+          The identifier of the compute resource which has the queue to be deleted
+
+        @param queue_name
+          Name of the queue need to be deleted. Name is the uniqueue identifier for the queue within a compute resource
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - queue_name
+        """
+        try:
+            return self.api_server_client_pool.deleteBatchQueue(authz_token, compute_resource_id, queue_name)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_batch_queue," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_batch_queue," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_batch_queue, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_batch_queue, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_gateway_resource_profile(self, authz_token, gateway_resource_profile):
+        """
+        Register a Gateway Resource Profile.
+
+        @param gateway_resource_profile
+           Gateway Resource Profile Object.
+           The GatewayID should be obtained from Airavata gateway registration and passed to register a corresponding
+             resource profile.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - gateway_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.registerGatewayResourceProfile(authz_token, gateway_resource_profile)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in register_gateway_resource_profile," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_gateway_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in register_gateway_resource_profile, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in register_gateway_resource_profile, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_gateway_resource_profile(self, authz_token, gateway_id):
+        """
+        Fetch the given Gateway Resource Profile.
+
+        @param gateway_id
+          The identifier for the requested gateway resource.
+
+        @return gatewayResourceProfile
+           Gateway Resource Profile Object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getGatewayResourceProfile(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_gateway_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_gateway_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_gateway_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_gateway_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_gateway_resource_profile(self, authz_token, gateway_id, gateway_resource_profile):
+        """
+        Update a Gateway Resource Profile.
+
+        @param gateway_id
+          The identifier for the requested gateway resource to be updated.
+
+        @param gateway_resource_profile
+           Gateway Resource Profile Object.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - gateway_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.updateGatewayResourceProfile(authz_token, gateway_id,
+                                                                            gateway_resource_profile)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_gateway_resource_profile," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_gateway_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_gateway_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_gateway_resource_profile, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_gateway_resource_profile(self, authz_token, gateway_id):
+        """
+        Delete the given Gateway Resource Profile.
+
+        @param gateway_id
+          The identifier for the requested gateway resource to be deleted.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.deleteGatewayResourceProfile(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_gateway_resource_profile," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_gateway_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_gateway_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_gateway_resource_profile, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_gateway_compute_resource_preference(self, authz_token, gateway_id, compute_resource_id,
+                                                compute_resource_preferance):
+        """
+        Add a Compute Resource Preference to a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be added.
+
+        @param compute_resource_id
+          Preferences related to a particular compute resource
+
+        @param compute_resource_preferance
+          The ComputeResourcePreference object to be added to the resource profile.
+
+        @return status
+          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
+           Instead an update should be used.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - compute_resource_id
+         - compute_resource_preferance
+        """
+        try:
+            return self.api_server_client_pool.addGatewayComputeResourcePreference(authz_token, gateway_id,
+                                                                                   compute_resource_id,
+                                                                                   compute_resource_preferance)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_gateway_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_gateway_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_gateway_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_gateway_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_gateway_storage_preference(self, authz_token, gateway_id, storage_resource_id, storage_preference):
+        """
+        Add a Storage Resource Preference to a registered gateway profile.
+
+        @param gateway_id
+          The identifier of the gateway profile to be added.
+
+        @param storage_resource_id
+          Preferences related to a particular compute resource
+
+        @param storage_preference
+          The ComputeResourcePreference object to be added to the resource profile.
+
+        @return status
+          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
+           Instead an update should be used.
+
+
+        Parameters:
+         - authz_token
+         - gatewayID
+         - storageResourceId
+         - storagePreference
+        """
+        try:
+            return self.api_server_client_pool.addGatewayStoragePreference(authz_token, authz_token, gateway_id,
+                                                                           storage_resource_id, storage_preference)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_gateway_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_gateway_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_gateway_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_gateway_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_gateway_compute_resource_preference(self, authz_token, gateway_id, compute_resource_id):
+        """
+
+        Fetch a Compute Resource Preference of a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @param compute_resource_id
+          Preferences related to a particular compute resource
+
+        @return computeResourcePreference
+          Returns the ComputeResourcePreference object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.getGatewayComputeResourcePreference(authz_token, gateway_id,
+                                                                                   compute_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_gateway_storage_preference(self, authz_token, gateway_id, storage_resourceId):
+        """
+
+        Fetch a Storage Resource Preference of a registered gateway profile.
+
+        @param gatewayID
+          The identifier of the gateway profile to request to fetch the particular storage resource preference.
+
+        @param storageResourceId
+          Identifier of the Stprage Preference required to be fetched.
+
+        @return StoragePreference
+          Returns the StoragePreference object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - storage_resourceId
+        """
+        try:
+            return self.api_server_client_pool.getGatewayStoragePreference(authz_token, gateway_id, storage_resourceId)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_gateway_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_gateway_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_gateway_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_gateway_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_gateway_compute_resource_preferences(self, authz_token, gateway_id):
+        """
+
+        Fetch all Compute Resource Preferences of a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @return computeResourcePreference
+          Returns the ComputeResourcePreference object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllGatewayComputeResourcePreferences(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_gateway_compute_resource_preferences," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_gateway_compute_resource_preferences," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_gateway_compute_resource_preferences, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_gateway_compute_resource_preferences, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_gateway_storage_preferences(self, authz_token, gateway_id):
+        """
+        Fetch all Storage Resource Preferences of a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @return StoragePreference
+          Returns the StoragePreference object.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllGatewayStoragePreferences(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_gateway_storage_preferences," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_gateway_storage_preferences," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_gateway_storage_preferences, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_gateway_storage_preferences, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_gateway_resource_profiles(self, authz_token):
+        """
+
+        Fetch all Gateway Profiles registered
+
+        @return GatewayResourceProfile
+          Returns all the GatewayResourcePrifle list object.
+
+
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getAllGatewayResourceProfiles(authz_token)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_gateway_resource_profiles," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_gateway_resource_profiles," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_gateway_resource_profiles, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_gateway_resource_profiles, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_gateway_compute_resource_preference(self, authz_token, gateway_id, compute_resource_id,
+                                                   compute_resource_preference):
+        """
+        Update a Compute Resource Preference to a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be updated.
+
+        @param compute_resource_id
+          Preferences related to a particular compute resource
+
+        @param compute_resource_preference
+          The ComputeResourcePreference object to be updated to the resource profile.
+
+        @return status
+          Returns a success/failure of the updation.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - compute_resource_id
+         - compute_resource_preference
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInputs(authz_token, gateway_id, compute_resource_id,
+                                                                    compute_resource_preference)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_gateway_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_gateway_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_gateway_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_gateway_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_gateway_storage_preference(self, authz_token, gateway_id, storage_id, storage_preference):
+        """
+        Update a Storage Resource Preference of a registered gateway profile.
+
+        @param gateway_id
+          The identifier of the gateway profile to be updated.
+
+        @param storage_id
+          The Storage resource identifier of the one that you want to update
+
+        @param storage_preference
+          The storagePreference object to be updated to the resource profile.
+
+        @return status
+          Returns a success/failure of the updation.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - storage_id
+         - storage_preference
+        """
+        try:
+            return self.api_server_client_pool.updateGatewayStoragePreference(authz_token, gateway_id, storage_id,
+                                                                              storage_preference)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_gateway_storage_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_gateway_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_gateway_storage_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_gateway_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_gateway_compute_resource_preference(self, authz_token, gateway_id, compute_resource_id):
+        """
+        Delete the Compute Resource Preference of a registered gateway profile.
+
+        @param gateway_id
+          The identifier for the gateway profile to be deleted.
+
+        @param compute_resource_id
+          Preferences related to a particular compute resource
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.deleteGatewayComputeResourcePreference(authz_token, gateway_id,
+                                                                                      compute_resource_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_gateway_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_gateway_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in delete_gateway_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_gateway_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_gateway_storage_preference(self, authz_token, gateway_id, storage_id):
+        """
+        Delete the Storage Resource Preference of a registered gateway profile.
+
+        @param gateway_id
+          The identifier of the gateway profile to be deleted.
+
+        @param storage_id
+          ID of the storage preference you want to delete.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - gateway_id
+         - storage_id
+        """
+        try:
+            return self.api_server_client_pool.deleteGatewayStoragePreference(authz_token, gateway_id, storage_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_gateway_storage_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_gateway_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in delete_gateway_storage_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_gateway_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_ssh_account_provisioners(self, authz_token):
+        """
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getSSHAccountProvisioners(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_ssh_account_provisioners," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_ssh_account_provisioners," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_ssh_account_provisioners, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_ssh_account_provisioners, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def does_user_have_ssh_account(self, authz_token, compute_resource_id, user_id):
+        """
+        Check if user has an SSH account on the given compute resource. This
+        method will only work if the compute resource has an SSHAccountProvisioner configured for it.
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - user_id
+        """
+        try:
+            return self.api_server_client_pool.doesUserHaveSSHAccount(authz_token, compute_resource_id, user_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def is_ssh_setup_complete_for_user_compute_resource_preference(self, authz_token, compute_resource_id,
+                                                                   airavata_cred_store_token):
+        """
+        Check if SSH account setup is complete for this user on the given compute resource.
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - airavata_cred_store_token
+        """
+        try:
+            return self.api_server_client_pool.isSSHSetupCompleteForUserComputeResourcePreference(authz_token,
+                                                                                                  compute_resource_id,
+                                                                                                  airavata_cred_store_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_application_inputs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_application_inputs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_application_inputs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def setup_user_compute_resource_preferences_for_ssh(self, authz_token, compute_resource_id, user_id,
+                                                        airavata_cred_store_token):
+        """
+        Setup and return a UserComputeResourcePreference object for this user to SSH into the given compute resource with
+        the given SSH credential. This method will only work if the compute resource has an SSHAccountProvisioner
+        configured for it. The returned UserComputeResourcePreference object is not saved; it is up to the client to
+        call addUserComputeResourcePreference to persist it.
+
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - user_id
+         - airavata_cred_store_token
+        """
+        try:
+            return self.api_server_client_pool.setupUserComputeResourcePreferencesForSSH(authz_token,
+                                                                                         compute_resource_id, user_id,
+                                                                                         airavata_cred_store_token)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in setup_user_compute_resource_preferences_for_ssh," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in setup_user_compute_resource_preferences_for_ssh," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in setup_user_compute_resource_preferences_for_ssh, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in setup_user_compute_resource_preferences_for_ssh, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def register_user_resource_profile(self, authz_token, user_resource_profile):
+        """
+        Register User Resource Profile.
+
+        @param user_resource_profile
+           User Resource Profile Object.
+           The userId should be obtained from Airavata user profile data model and passed to register a corresponding
+             resource profile.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - user_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.registerUserResourceProfile(authz_token, user_resource_profile)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_user_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_user_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_user_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in register_user_resource_profile, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def is_user_resource_profile_exists(self, authz_token, user_id, gateway_id):
+        """
+        Check if User Resource Profile exists.
+
+        @param user_id
+          The identifier for the requested user resource profile.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @return bool
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.isUserResourceProfileExists(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in is_user_resource_profile_exists," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in is_user_resource_profile_exists," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in is_user_resource_profile_exists, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in is_user_resource_profile_exists, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_user_resource_profile(self, authz_token, user_id, gateway_id):
+        """
+        Fetch the given User Resource Profile.
+
+        @param userId
+          The identifier for the requested user resource profile.
+
+        @param gatewayID
+          The identifier to link a gateway for the requested user resource profile.
+
+        @return UserResourceProfile
+           User Resource Profile Object.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getUserResourceProfile(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_user_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_user_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_user_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_user_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_user_resource_profile(self, authz_token, user_id, gateway_id, user_resource_profile):
+        """
+        Update a User Resource Profile.
+
+        @param user_id
+          The identifier for the requested user resource to be updated.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_resource_profile
+           User Resource Profile Object.
+
+        @return status
+          Returns a success/failure of the update.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.updateUserResourceProfile(authz_token, user_id, gateway_id,
+                                                                         user_resource_profile)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_user_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_user_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_user_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_user_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def delete_user_resource_profile(self, authz_token, user_id, gateway_id):
+        """
+        Delete the given User Resource Profile.
+
+        @param user_id
+          The identifier for the requested user resource to be deleted.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.deleteUserResourceProfile(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_user_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_user_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_user_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in delete_user_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def add_user_compute_resource_preference(self, authz_token, user_id, gateway_id, user_compute_resource_id,
+                                             user_compute_resource_preference):
+        """
+        Add a Compute Resource Preference to a registered User profile.
+
+        @param user_id
+          The identifier for the User resource profile to be added.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_compute_resource_id
+          Preferences related to a particular compute resource
+
+        @param user_compute_resource_preference
+          The ComputeResourcePreference object to be added to the resource profile.
+
+        @return status
+          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
+           Instead an update should be used.
+
+
+        Parameters:
+         - authz_token
+         - userId
+         - gatewayID
+         - userComputeResourceId
+         - userComputeResourcePreference
+        """
+        try:
+            return self.api_server_client_pool.addUserComputeResourcePreference(authz_token, user_id, gateway_id,
+                                                                                user_compute_resource_id,
+                                                                                user_compute_resource_preference)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in add_user_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_user_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in add_user_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in add_user_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def add_user_storage_preference(self, authz_token, user_id, gateway_id, user_storage_resource_id,
+                                    user_storage_preference):
+        """
+        Add a Storage Resource Preference to a registered user resource profile.
+
+        @param user_id
+          The identifier of the user resource profile to be added.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_storage_resource_id
+          Preferences related to a particular compute resource
+
+        @param user_storage_preference
+          The ComputeResourcePreference object to be added to the resource profile.
+
+        @return status
+          Returns a success/failure of the addition. If a profile already exists, this operation will fail.
+           Instead an update should be used.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_storage_resource_id
+         - user_storage_preference
+        """
+        try:
+            return self.api_server_client_pool.addUserStoragePreference(authz_token, user_id, gateway_id,
+                                                                        user_storage_resource_id,
+                                                                        user_storage_preference)
+        except InvalidRequestException:
+            logger.exception("Error occurred in add_user_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in add_user_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in add_user_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in add_user_storage_preference, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_user_compute_resource_preference(self, authz_token, user_id, gateway_id, user_compute_resource_id):
+        """
+
+        Fetch a Compute Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier for the user profile to be requested
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_compute_resource_id
+          Preferences related to a particular compute resource
+
+        @return computeResourcePreference
+          Returns the ComputeResourcePreference object.
+
+
+        Parameters:
+         - authz_token
+         - userId
+         - gatewayID
+         - userComputeResourceId
+        """
+        try:
+            return self.api_server_client_pool.getUserComputeResourcePreference(authz_token, user_id, gateway_id,
+                                                                                user_compute_resource_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_user_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_user_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_user_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_user_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_user_storage_preference(self, authz_token, user_id, gateway_id, user_storage_resource_id):
+        """
+
+        Fetch a Storage Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier of the user resource profile to request to fetch the particular storage resource preference.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_storage_resource_id
+          Identifier of the Stprage Preference required to be fetched.
+
+        @return UserStoragePreference
+          Returns the StoragePreference object.
+
+
+        Parameters:
+         - authz_token
+         - userId
+         - gatewayID
+         - userStorageResourceId
+        """
+        try:
+            return self.api_server_client_pool.getUserStoragePreference(authz_token, user_id, gateway_id,
+                                                                        user_storage_resource_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_user_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_user_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_user_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_user_storage_preference, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_user_compute_resource_preferences(self, authz_token, user_id, gateway_id):
+        """
+
+        Fetch all Compute Resource Preferences of a registered gateway profile.
+
+        @param user_id
+          The identifier of the user resource profile to request to fetch the particular storage resource preference.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @return computeResourcePreference
+          Returns the ComputeResourcePreference object.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getAllUserComputeResourcePreferences(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_user_compute_resource_preferences," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_user_compute_resource_preferences," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_user_compute_resource_preferences, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_user_compute_resource_preferences, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_user_storage_preferences(self, authz_token, user_id, gateway_id):
+        """
+        Fetch all User Storage Resource Preferences of a registered user profile.
+
+        @param user_id
+          The identifier of the user resource profile to request to fetch the particular storage resource preference.
+
+        @param gateway_id
+          The identifier for the gateway profile to be requested
+
+        @return StoragePreference
+          Returns the StoragePreference object.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getApplicationInputs(authz_token, user_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_user_storage_preferences," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_user_storage_preferences," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_user_storage_preferences, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_user_storage_preferences, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_user_resource_profiles(self, authz_token):
+        """
+
+        Fetch all user resources Profiles registered
+
+        @return UserResourceProfile
+          Returns all the UserResourcePrifle list object.
+
+
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getAllUserResourceProfiles(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_user_resource_profiles," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_user_resource_profiles," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_user_resource_profiles, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_user_resource_profiles, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_user_compute_resource_preference(self, authz_token, user_id, gateway_id, user_compute_resourceId,
+                                                user_compute_resource_preference):
+        """
+        Update a Compute Resource Preference to a registered user resource profile.
+
+        @param user_id
+          The identifier for the user profile to be updated.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_compute_resourceId
+          Preferences related to a particular compute resource
+
+        @param user_compute_resource_preference
+          The ComputeResourcePreference object to be updated to the resource profile.
+
+        @return status
+          Returns a success/failure of the updation.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_compute_resourceId
+         - user_compute_resource_preference
+        """
+        try:
+            return self.api_server_client_pool.updateUserComputeResourcePreference(authz_token, user_id, gateway_id,
+                                                                                   user_compute_resourceId,
+                                                                                   user_compute_resource_preference)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in update_user_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_user_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in update_user_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_user_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def update_user_storage_preference(self, authz_token, user_id, gateway_id, user_storage_id,
+                                       user_storage_preference):
+        """
+        Update a Storage Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier of the user resource profile to be updated.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_storage_id
+          The Storage resource identifier of the one that you want to update
+
+        @param user_storage_preference
+          The storagePreference object to be updated to the resource profile.
+
+        @return status
+          Returns a success/failure of the updation.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_storage_id
+         - user_storage_preference
+        """
+        try:
+            return self.api_server_client_pool.updateUerStoragePreference(authz_token, user_id, gateway_id,
+                                                                          user_storage_id, user_storage_preference)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_user_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_user_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_user_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in update_user_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_user_compute_resource_preference(self, authz_token, user_id, gateway_id, user_compute_resource_id):
+        """
+        Delete the Compute Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier for the user resource profile to be deleted.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_compute_resource_id
+          Preferences related to a particular compute resource
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_compute_resource_id
+        """
+        try:
+            return self.api_server_client_pool.deleteUserComputeResourcePreference(authz_token, user_id, gateway_id,
+                                                                                   user_compute_resource_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in delete_user_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_user_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in delete_user_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_user_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def delete_user_storage_preference(self, authz_token, user_id, gateway_id, user_storage_id):
+        """
+        Delete the Storage Resource Preference of a registered user resource profile.
+
+        @param user_id
+          The identifier of the user profile to be deleted.
+
+        @param gateway_id
+          The identifier to link a gateway for the requested user resource profile.
+
+        @param user_storage_id
+          ID of the storage preference you want to delete.
+
+        @return status
+          Returns a success/failure of the deletion.
+
+
+        Parameters:
+         - authz_token
+         - user_id
+         - gateway_id
+         - user_storage_id
+        """
+        try:
+            return self.api_server_client_pool.deleteUserStoragePreference(authz_token, user_id, gateway_id,
+                                                                           user_storage_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in delete_user_storage_preference," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in delete_user_storage_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in delete_user_storage_preference, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in delete_user_storage_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_latest_queue_statuses(self, authz_token):
+        """
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getLatestQueueStatuses(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_latest_queue_statuses," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_latest_queue_statuses," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_latest_queue_statuses, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_latest_queue_statuses, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_data_product(self, authz_token, data_product_model):
+        """
+        API Methods related to replica catalog
+
+
+        Parameters:
+         - authz_token
+         - data_product_model
+        """
+        try:
+            return self.api_server_client_pool.registerDataProduct(authz_token, data_product_model)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_data_product," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_data_product," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_data_product, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_data_product, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_data_product(self, authz_token, data_product_uri):
+        """
+        Parameters:
+         - authz_token
+         - data_product_uri
+        """
+        try:
+            return self.api_server_client_pool.getDataProduct(authz_token, data_product_uri)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_data_product," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_data_product," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_data_product, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_data_product, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def register_replica_location(self, authz_token, replica_location_model):
+        """
+        Parameters:
+         - authz_token
+         - replica_location_model
+        """
+        try:
+            return self.api_server_client_pool.registerReplicaLocation(authz_token, replica_location_model)
+        except InvalidRequestException:
+            logger.exception("Error occurred in register_replica_location," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in register_replica_location," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in register_replica_location, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in register_replica_location, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_parent_data_product(self, authz_token, product_uri):
+        """
+        Parameters:
+         - authz_token
+         - product_uri
+        """
+        try:
+            return self.api_server_client_pool.getParentDataProduct(authz_token, product_uri)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_parent_data_product," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_parent_data_product," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_parent_data_product, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_parent_data_product, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_child_data_products(self, authz_token, product_uri):
+        """
+        Parameters:
+         - authz_token
+         - product_uri
+        """
+        try:
+            return self.api_server_client_pool.getChildDataProducts(authz_token, product_uri)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_child_data_products," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_child_data_products," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_child_data_products, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_child_data_products, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def share_resource_with_users(self, authz_token, resource_id, user_permission_list):
+        """
+        Group Manager and Data Sharing Related API methods
+
+
+        Parameters:
+         - authz_token
+         - resource_id
+         - user_permission_list
+        """
+        try:
+            return self.api_server_client_pool.shareResourceWithUsers(authz_token, resource_id, user_permission_list)
+        except InvalidRequestException:
+            logger.exception("Error occurred in share_resource_with_users," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in share_resource_with_users," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in share_resource_with_users, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in share_resource_with_users, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def share_resource_with_groups(self, authz_token, resource_id, group_permission_list):
+        """
+        Parameters:
+         - authz_token
+         - resourceId
+         - groupPermissionList
+        """
+        try:
+            return self.api_server_client_pool.shareResourceWithGroups(authz_token, resource_id, group_permission_list)
+        except InvalidRequestException:
+            logger.exception("Error occurred in share_resource_with_groups," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in share_resource_with_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in share_resource_with_groups, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in share_resource_with_groups, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def revoke_sharing_of_resource_from_users(self, authz_token, resource_id, user_permission_list):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - user_permission_list
+        """
+        try:
+            return self.api_server_client_pool.revokeSharingOfResourceFromUsers(authz_token, resource_id,
+                                                                                user_permission_list)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_users," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_users," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_users, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_users, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def revoke_sharing_of_resource_from_groups(self, authz_token, resource_id, group_permission_list):
+        """
+        Parameters:
+         - authz_token
+         - resourceId
+         - groupPermissionList
+        """
+        try:
+            return self.api_server_client_pool.revokeSharingOfResourceFromGroups(authz_token, resource_id,
+                                                                                 group_permission_list)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_groups," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_groups, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in revoke_sharing_of_resource_from_groups, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_accessible_users(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.getAllAccessibleUsers(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_accessible_users," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_accessible_users," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_accessible_users, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_accessible_users, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_accessible_groups(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.getAllAccessibleGroups(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_all_accessible_groups," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_accessible_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_all_accessible_groups, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_all_accessible_groups, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_all_directly_accessible_users(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.getAllDirectlyAccessibleUsers(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_users," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_users," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_users, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_users, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_all_directly_accessible_groups(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resource_id
+         - permission_type
+        """
+        try:
+            return self.api_server_client_pool.getAllDirectlyAccessibleGroups(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_groups," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_groups, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_all_directly_accessible_groups, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def user_has_access(self, authz_token, resource_id, permission_type):
+        """
+        Parameters:
+         - authz_token
+         - resourceId
+         - permissionType
+        """
+        try:
+            return self.api_server_client_pool.userHasAccess(authz_token, resource_id, permission_type)
+        except InvalidRequestException:
+            logger.exception("Error occurred in user_has_access," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in user_has_access," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in user_has_access, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in user_has_access, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def create_group_resource_profile(self, authz_token, group_resource_profile):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.createGroupResourceProfile(authz_token, group_resource_profile)
+        except InvalidRequestException:
+            logger.exception("Error occurred in create_group_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in create_group_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in create_group_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in create_group_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def update_group_resource_profile(self, authz_token, group_resource_profile):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile
+        """
+        try:
+            return self.api_server_client_pool.updateGroupResourceProfile(authz_token, group_resource_profile)
+        except InvalidRequestException:
+            logger.exception("Error occurred in update_group_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in update_group_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in update_group_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in update_group_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_group_resource_profile(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupResourceProfile(authz_token, group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_group_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_group_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_group_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_group_resource_profile(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.removeGroupResourceProfile(authz_token, group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in remove_group_resource_profile," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_group_resource_profile," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in remove_group_resource_profile, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in remove_group_resource_profile, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_group_resource_list(self, authz_token, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupResourceList(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_group_resource_list," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_resource_list," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_group_resource_list, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_group_resource_list, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_group_compute_prefs(self, authz_token, compute_resource_id, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.removeGroupComputePrefs(authz_token, compute_resource_id,
+                                                                       group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in remove_group_compute_prefs," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_group_compute_prefs," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in remove_group_compute_prefs, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in remove_group_compute_prefs, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_group_compute_resource_policy(self, authz_token, resource_policy_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_policy_id
+        """
+        try:
+            return self.api_server_client_pool.removeGroupComputeResourcePolicy(authz_token, resource_policy_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in remove_group_compute_resource_policy," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_group_compute_resource_policy," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in remove_group_compute_resource_policy, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in remove_group_compute_resource_policy, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def remove_group_batch_queue_resource_policy(self, authz_token, resource_policy_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_policy_id
+        """
+        try:
+            return self.api_server_client_pool.removeGroupBatchQueueResourcePolicy(authz_token, resource_policy_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in remove_group_batch_queue_resource_policy," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_group_batch_queue_resource_policy," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in remove_group_batch_queue_resource_policy, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in remove_group_batch_queue_resource_policy, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_compute_resource_preference(self, authz_token, compute_resource_id, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - compute_resource_id
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupComputeResourcePreference(authz_token, compute_resource_id,
+                                                                                 group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_preference," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_preference," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_preference, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_preference, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_compute_resource_policy(self, authz_token, resource_policy_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_policy_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupComputeResourcePolicy(authz_token, resource_policy_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_batch_queue_resource_policy(self, authz_token, resource_policy_id):
+        """
+        Parameters:
+         - authz_token
+         - resource_policy_id
+        """
+        try:
+            return self.api_server_client_pool.getBatchQueueResourcePolicy(authz_token, resource_policy_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_batch_queue_resource_policy," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_batch_queue_resource_policy," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_batch_queue_resource_policy, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_batch_queue_resource_policy, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_compute_resource_pref_list(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupComputeResourcePrefList(authz_token, group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_pref_list," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_pref_list," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_pref_list, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_pref_list, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_batch_queue_resource_policy_list(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupBatchQueueResourcePolicyList(authz_token,
+                                                                                    group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_batch_queue_resource_policy_list," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_batch_queue_resource_policy_list," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_batch_queue_resource_policy_list, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_batch_queue_resource_policy_list, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_group_compute_resource_policy_list(self, authz_token, group_resource_profile_id):
+        """
+        Parameters:
+         - authz_token
+         - group_resource_profile_id
+        """
+        try:
+            return self.api_server_client_pool.getGroupComputeResourcePolicyList(authz_token, group_resource_profile_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy_list," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy_list," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy_list, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_group_compute_resource_policy_list, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def get_gateway_groups(self, authz_token):
+        """
+        GatewayGroups API methods
+
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.api_server_client_pool.getGatewayGroups(authz_token)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_gateway_groups," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_gateway_groups," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_gateway_groups, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_gateway_groups, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_parser(self, authz_token, parser_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - parserId
+         - gatewayId
+        """
+        try:
+            return self.api_server_client_pool.getParser(authz_token, parser_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_parser," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_parser," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_parser, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_parser, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def save_parser(self, authz_token, parser):
+        """
+        Parameters:
+         - authz_token
+         - parser
+        """
+        try:
+            return self.api_server_client_pool.saveParser(authz_token, parser)
+        except InvalidRequestException:
+            logger.exception("Error occurred in save_parser," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in save_parser," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in save_parser, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in save_parser, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def list_all_parsers(self, authz_token, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.listAllParsers(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in list_all_parsers," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in list_all_parsers," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in list_all_parsers, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in list_all_parsers, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_parser(self, authz_token, parser_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - parser_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.removeParser(authz_token, parser_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in remove_parser," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_parser," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in remove_parser, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in remove_parser, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_parsing_template(self, authz_token, template_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - template_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.getParsingTemplate(authz_token, template_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in get_parsing_template," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_parsing_template," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in get_parsing_template, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in get_parsing_template, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def get_parsing_templates_for_experiment(self, authz_token, experiment_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - experimentId
+         - gatewayId
+        """
+        try:
+            return self.api_server_client_pool.getParsingTemplatesForExperiment(authz_token, experiment_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception(
+                "Error occurred in get_parsing_templates_for_experiment," " probably due to invalid parameters ",
+                )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in get_parsing_templates_for_experiment," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception(
+                "Error occurred in get_parsing_templates_for_experiment, " "probably due to server side error ",
+               )
+            raise
+        except AuthorizationException:
+            logger.exception(
+                "Error occurred in get_parsing_templates_for_experiment, " "probably due to invalid authz token ",
+                )
+            raise
+
+    def save_parsing_template(self, authz_token, parsing_template):
+        """
+        Parameters:
+         - authz_token
+         - parsing_template
+        """
+        try:
+            return self.api_server_client_pool.saveParsingTemplate(authz_token, parsing_template)
+        except InvalidRequestException:
+            logger.exception("Error occurred in save_parsing_template," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in save_parsing_template," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in save_parsing_template, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in save_parsing_template, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def remove_parsing_template(self, authz_token, template_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - template_id
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.removeParsingTemplate(authz_token, template_id, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in remove_parsing_template," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in remove_parsing_template," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in remove_parsing_template, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in remove_parsing_template, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def list_all_parsing_templates(self, authz_token, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.api_server_client_pool.listAllParsingTemplates(authz_token, gateway_id)
+        except InvalidRequestException:
+            logger.exception("Error occurred in list_all_parsing_templates," " probably due to invalid parameters ",
+                             )
+            raise
+        except AiravataClientException:
+            logger.exception(
+                "Error occurred in list_all_parsing_templates," "probably due to  client mis configuration")
+            raise
+        except AiravataSystemException:
+            logger.exception("Error occurred in list_all_parsing_templates, " "probably due to server side error ",
+                            )
+            raise
+        except AuthorizationException:
+            logger.exception("Error occurred in list_all_parsing_templates, " "probably due to invalid authz token ",
+                             )
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.api_server_settings.API_SERVER_HOST = config.get('APIServer', 'API_HOST')
+            self.api_server_settings.API_SERVER_PORT = config.getint('APIServer', 'API_PORT')
+            self.api_server_settings.API_SERVER_SECURE = config.getboolean('APIServer', 'API_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/credential_store_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/credential_store_client.py
new file mode 100644
index 0000000..8b4c2cb
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/credential_store_client.py
@@ -0,0 +1,60 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import CredentialStoreAPIClientSettings
+from transport import utils
+from airavata.api.credential.store.error.ttypes import CredentialStoreException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class CredentialStoreClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.credential_store_server_settings = CredentialStoreAPIClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.credential_store_client_pool = utils.initialize_credential_store_client(
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_HOST,
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_PORT,
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_SECURE)
+
+    def get_SSH_credential(self, token_id, gateway_id):
+        """
+        :param token_id:
+        :param gateway_id
+        :return: credential
+        """
+        try:
+            return self.credential_store_client_pool.getSSHCredential(token_id, gateway_id)
+        except CredentialStoreException:
+            logger.exception("Error occurred in get_SSH_credential, probably due to invalid parameters ")
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_HOST = config.get('CredentialStoreServer',
+                                                                                         'CREDENTIAL_STORE_API_HOST')
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_PORT = config.getint('CredentialStoreServer',
+                                                                                            'CREDENTIAL_STORE_API_PORT')
+            self.credential_store_server_settings.CREDENTIAL_STORE_API_SECURE = config.getboolean(
+                'CredentialStoreServer',
+                'CREDENTIAL_STORE_API_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/file_handling_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/file_handling_client.py
new file mode 100644
index 0000000..cf2b5a1
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/file_handling_client.py
@@ -0,0 +1,61 @@
+#  Licrecursive=Nonepache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import paramiko
+from paramiko import SSHClient
+from scp import SCPClient
+
+ssh = SSHClient()
+ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ssh.load_system_host_keys()
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class FileHandler(object):
+
+    def __init__(self, host, port, username, passphrase, privateKeyFilePath):
+        self.host = host
+        self.port = port
+        self.username = username
+        self.password = passphrase
+        self.filePath = privateKeyFilePath
+
+    def upload_file(self, files, remote_path, recursive, preserve_item):
+        try:
+            ssh.connect(self.host, self.port, self.username, passphrase=self.password, pkey=self.filePath)
+            with SCPClient(ssh.get_transport()) as scp:
+                scp.put(files, remote_path, recursive, preserve_item)
+        finally:
+            scp.close()
+
+    def download_file(self, remote_path, local_path, recursive, preserve_item):
+        try:
+            ssh.connect(self.host, self.port, self.username, passphrase=self.password, pkey=self.filePath)
+            with SCPClient(ssh.get_transport()) as scp:
+                scp.get(remote_path, local_path, recursive, preserve_item)
+        finally:
+            scp.close()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/group_manager_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/group_manager_client.py
new file mode 100644
index 0000000..86de6e1
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/group_manager_client.py
@@ -0,0 +1,224 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import GroupManagerClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class GroupManagerClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.group_manager_settings = GroupManagerClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.group_manager_client_pool = utils.initialize_group_manager_client(
+            self.group_manager_settings.PROFILE_SERVICE_HOST,
+            self.group_manager_settings.PROFILE_SERVICE_PORT,
+            self.group_manager_settings.PROFILE_SERVICE_SECURE)
+
+    def get_api_version(self):
+        try:
+            return self.group_manager_client_pool.getAPIVersion()
+        except TException:
+            logger.exception("Error occurred in get_api_version, ")
+            raise
+
+    def create_group(self, authz_token, group_model):
+        """
+        Parameters:
+         - authz_token
+         - group_model
+        """
+        try:
+            return self.group_manager_client_pool.createGroup(authz_token, group_model)
+        except TException:
+            logger.exception("Error occurred in create_group, ")
+            raise
+
+    def update_group(self, authz_token, group_model):
+        """
+        Parameters:
+         - authz_token
+         - group_model
+        """
+        try:
+            return self.group_manager_client_pool.updateGroup(authz_token, group_model)
+        except TException:
+            logger.exception("Error occurred in update_group, ")
+            raise
+
+    def delete_group(self, authz_token, group_id, owner_id):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+         - owner_id
+        """
+        try:
+            return self.group_manager_client_pool.deleteGroup(authz_token, group_id, owner_id)
+        except TException:
+            logger.exception("Error occurred in delete_group,")
+            raise
+
+    def get_group(self, authz_token, group_id):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+        """
+        try:
+            return self.group_manager_client_pool.getGroup(authz_token, group_id)
+        except TException:
+            logger.exception("Error occurred in get_group, ")
+            raise
+
+    def get_groups(self, authz_token):
+        """
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.group_manager_client_pool.getGroups(authz_token)
+        except TException:
+            logger.exception("Error occurred in get_groups, ")
+            raise
+
+    def get_all_groups_user_belongs(self, authz_token, user_name):
+        """
+        Parameters:
+         - authz_token
+         - user_name
+        """
+        try:
+            return self.group_manager_client_pool.getAllGroupsUserBelongs(authz_token, user_name)
+        except TException:
+            logger.exception("Error occurred in get_all_groups_user_belongs, ")
+            raise
+
+    def add_users_to_group(self, authz_token, user_ids, group_id):
+        """
+        Parameters:
+         - authz_token
+         - user_ids
+         - group_id
+        """
+        try:
+            return self.group_manager_client_pool.addUsersToGroup(authz_token, user_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in add_users_to_group, ")
+            raise
+
+    def remove_users_from_group(self, authz_token, user_ids, group_id):
+        """
+        Parameters:
+         - authz_token
+         - user_ids
+         - group_id
+        """
+        try:
+            return self.group_manager_client_pool.removeUsersFromGroup(authz_token, user_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in remove_users_from_group, ")
+            raise
+
+    def transfer_group_ownership(self, authz_token, group_id, new_owner_id):
+        """
+        Parameters:
+         - authzToken
+         - groupId
+         - newOwnerId
+        """
+        try:
+            return self.group_manager_client_pool.transferGroupOwnership(authz_token, group_id, new_owner_id)
+        except TException:
+            logger.exception("Error occurred in transfer_group_ownership, ")
+            raise
+
+    def add_group_admins(self, authz_token, group_id, admin_ids):
+        """
+        Parameters:
+         - authzToken
+         - group_id
+         - admin_ids
+        """
+        try:
+            return self.group_manager_client_pool.addGroupAdmins(authz_token, group_id, admin_ids)
+        except TException:
+            logger.exception("Error occurred in add_group_admins, ")
+            raise
+
+    def remove_group_admins(self, authz_token, group_id, admin_ids):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+         - admin_ids
+        """
+        try:
+            return self.group_manager_client_pool.removeGroupAdmins(authz_token, group_id, admin_ids)
+        except TException:
+            logger.exception("Error occurred in remove_group_admins, ")
+            raise
+
+    def has_admin_access(self, authz_token, group_id, admin_id):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+         - admin_id
+        """
+        try:
+            return self.group_manager_client_pool.hasAdminAccess(authz_token, group_id, admin_id)
+        except TException:
+            logger.exception("Error occurred in has_admin_access, ")
+            raise
+
+    def has_owner_access(self, authz_token, group_id, owner_id):
+        """
+        Parameters:
+         - authz_token
+         - group_id
+         - owner_id
+        """
+        try:
+            return self.group_manager_client_pool.hasOwnerAccess(authz_token, group_id, owner_id)
+        except TException:
+            logger.exception("Error occurred in has_owner_access, ")
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.group_manager_settings.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+            self.group_manager_settings.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+            self.group_manager_settings.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer',
+                                                                                   'PROFILE_SERVICE_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/iam_admin_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/iam_admin_client.py
new file mode 100644
index 0000000..9c75f4c
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/iam_admin_client.py
@@ -0,0 +1,246 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import IAMAdminClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class IAMAdminClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.iam_admin_settings = IAMAdminClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.iam_admin_client_pool = utils.initialize_iam_admin_client(
+            self.iam_admin_settings.PROFILE_SERVICE_HOST,
+            self.iam_admin_settings.PROFILE_SERVICE_PORT,
+            self.iam_admin_settings.PROFILE_SERVICE_SECURE)
+
+    def set_up_gateway(self, authz_token, gateway):
+        """
+        Parameters:
+         - authz_token
+         - gateway
+        """
+        try:
+            return self.iam_admin_client_pool.setUpGateway(authz_token, gateway)
+        except TException:
+            logger.exception("Error occurred in set_up_gateway, ", TException)
+            raise
+
+    def is_username_available(self, authz_token, username):
+        """
+        Parameters:
+         - authz_token
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.isUsernameAvailable(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in is_username_available, ", TException)
+            raise
+
+    def register_user(self, authz_token, username, email_address, first_name, last_name, new_password):
+        """
+        Parameters:
+         - authz_token
+         - username
+         - email_address
+         - first_name
+         - last_name
+         - new_password
+        """
+        try:
+            return self.iam_admin_client_pool.registerUser(authz_token, username, email_address,
+                                                              first_name, last_name, new_password)
+        except TException:
+            logger.exception("Error occurred in register_user, ", TException)
+            raise
+
+    def enable_user(self, authz_token, username):
+        """
+        Parameters:
+         - authz_token
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.enableUser(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in enable_user, ", TException)
+            raise
+
+    def is_user_enabled(self, authz_token, username):
+        """
+        Parameters:
+         - authzToken
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.isUserEnabled(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in is_user_enabled, ", TException)
+            raise
+
+    def is_user_exist(self, authz_token, username):
+        """
+        Parameters:
+         - authzToken
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.isUserExist(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in is_user_exist, ", TException)
+            raise
+
+    def get_user(self, authz_token, username):
+        """
+        Parameters:
+         - authzToken
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.getUser(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in get_user, ", TException)
+            raise
+
+    def get_users(self, authz_token, offset, limit, search):
+        """
+        Parameters:
+         - authzToken
+         - offset
+         - limit
+         - search
+        """
+        try:
+            return self.iam_admin_client_pool.getUsers(authz_token, offset, limit, search)
+        except TException:
+            logger.exception("Error occurred in get_users, ", TException)
+            raise
+
+    def reset_user_password(self, authz_token, username, new_password):
+        """
+        Parameters:
+         - authzToken
+         - username
+         - newPassword
+        """
+        try:
+            return self.iam_admin_client_pool.resetUserPassword( authz_token, username, new_password)
+        except TException:
+            logger.exception("Error occurred in reset_user_password, ", TException)
+            raise
+
+    def find_users(self, authz_token, email, user_id):
+        """
+        Parameters:
+         - authzToken
+         - email
+         - userId
+        """
+        try:
+            return self.iam_admin_client_pool.findUsers(authz_token, email, user_id)
+        except TException:
+            logger.exception("Error occurred in find_users, ", TException)
+            raise
+
+    def update_user_profile(self, authz_token, user_details):
+        """
+        Parameters:
+         - authzToken
+         - userDetails
+        """
+        try:
+            return self.iam_admin_client_pool.updateUserProfile(authz_token, user_details)
+        except TException:
+            logger.exception("Error occurred in update_user_profile, ", TException)
+            raise
+
+    def delete_user(self, authz_token, username):
+        """
+        Parameters:
+         - authzToken
+         - username
+        """
+        try:
+            return self.iam_admin_client_pool.deleteUser(authz_token, username)
+        except TException:
+            logger.exception("Error occurred in delete_user, ", TException)
+            raise
+
+    def add_role_to_user(self, authz_token, username, role_name):
+        """
+        Parameters:
+         - authzToken
+         - username
+         - roleName
+        """
+        try:
+            return self.iam_admin_client_pool.addRoleToUser(authz_token, username, role_name)
+        except TException:
+            logger.exception("Error occurred in add_role_to_user, ", TException)
+            raise
+
+    def remove_role_from_user(self, authz_token, username, role_name):
+        """
+        Parameters:
+         - authzToken
+         - username
+         - roleName
+        """
+        try:
+            return self.iam_admin_client_pool.removeRoleFromUser(authz_token, username, role_name)
+        except TException:
+            logger.exception("Error occurred in remove_role_from_user, ", TException)
+            raise
+
+    def get_users_with_role(self, authz_token, role_name):
+        """
+        Parameters:
+         - authzToken
+         - roleName
+        """
+        try:
+            return self.iam_admin_client_pool.getUsersWithRole(authz_token, role_name)
+        except TException:
+            logger.exception("Error occurred in create_group, ", TException)
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.iam_admin_settings.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+            self.iam_admin_settings.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+            self.iam_admin_settings.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer',
+                                                                                   'PROFILE_SERVICE_SECURE')
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/keycloak_token_fetcher.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/keycloak_token_fetcher.py
new file mode 100644
index 0000000..8234b26
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/keycloak_token_fetcher.py
@@ -0,0 +1,66 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 configparser
+
+from requests_oauthlib import OAuth2Session
+from oauthlib.oauth2 import LegacyApplicationClient
+from airavata.model.security.ttypes import AuthzToken
+
+from transport.settings import KeycloakConfiguration
+import os
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+
+class Authenticator(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.keycloak_settings = KeycloakConfiguration(configuration_file_location)
+        self._load_settings(configuration_file_location)
+
+    def get_token_and_user_info_password_flow(self, username, password, gateway_id):
+        client_id = self.keycloak_settings.CLIENT_ID
+        client_secret = self.keycloak_settings.CLIENT_SECRET
+        token_url = self.keycloak_settings.TOKEN_URL
+        userinfo_url = self.keycloak_settings.USER_INFO_URL
+        verify_ssl = self.keycloak_settings.VERIFY_SSL
+        oauth2_session = OAuth2Session(client=LegacyApplicationClient(
+            client_id=client_id))
+        token = oauth2_session.fetch_token(token_url=token_url,
+                                           username=username,
+                                           password=password,
+                                           client_id=client_id,
+                                           client_secret=client_secret,
+                                           verify=verify_ssl)
+
+        claimsMap = {
+            "userName": username,
+            "gatewayID": gateway_id
+        }
+        return AuthzToken(accessToken=token['access_token'], claimsMap=claimsMap)
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.keycloak_settings.KEYCLOAK_CA_CERTIFICATE = config.get("KeycloakServer",'CERTIFICATE_FILE_PATH')
+            self.keycloak_settings.CLIENT_ID = config.get('KeycloakServer', 'CLIENT_ID')
+            self.keycloak_settings.CLIENT_SECRET = config.get('KeycloakServer', 'CLIENT_SECRET')
+            self.keycloak_settings.TOKEN_URL = config.get('KeycloakServer', 'TOKEN_URL')
+            self.keycloak_settings.USER_INFO_URL = config.get('KeycloakServer', 'USER_INFO_URL')
+            self.keycloak_settings.VERIFY_SSL = config.getboolean('KeycloakServer', 'VERIFY_SSL')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/sftp_file_handling_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/sftp_file_handling_client.py
new file mode 100644
index 0000000..217a407
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/sftp_file_handling_client.py
@@ -0,0 +1,67 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import os
+import paramiko
+from scp import SCPClient
+
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class SFTPConnector(object):
+
+    def __init__(self, host, port, username, password):
+        self.host = host
+        self.port = port
+        self.username = username
+        self.password = password
+
+        ssh = paramiko.SSHClient()
+        self.ssh = ssh
+        # Trust all key policy on remote host
+
+        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+
+
+    def upload_files(self, local_path, project_name, exprement_id):
+        remote_path = "/" + project_name + "/" + exprement_id + "/"
+
+        self.ssh.connect(self.host, self.port, self.username, password = self.password)
+        with SCPClient(self.ssh.get_transport()) as conn:
+            conn.put(local_path, remote_path, recursive=True)
+        self.ssh.close()
+
+        pathsuffix = "/" + self.username + remote_path
+        return pathsuffix
+
+    def download_files(self, local_path, project_name, exprement_id):
+        remote_path = "/" + project_name + "/" + exprement_id + "/"
+
+        self.ssh.connect(self.host, self.port, self.username, password = self.password)
+        with SCPClient(self.ssh.get_transport()) as conn:
+            conn.get(remote_path=remote_path, local_path= local_path, recursive= True)
+        self.ssh.close()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/sharing_registry_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/sharing_registry_client.py
new file mode 100644
index 0000000..27ed805
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/sharing_registry_client.py
@@ -0,0 +1,880 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import SharingAPIClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class SharingRegistryClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.sharing_registry_client_settings = SharingAPIClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.sharing_registry_client_pool = utils.initialize_sharing_registry_client(
+            self.sharing_registry_client_settings.SHARING_API_HOST,
+            self.sharing_registry_client_settings.SHARING_API_PORT,
+            self.sharing_registry_client_settings.SHARING_API_SECURE)
+
+    def create_domain(self, domain):
+        """
+        <p>API method to create a new domain</p>
+
+        Parameters:
+         - domain
+        """
+        try:
+            return self.sharing_registry_client_pool.createDomain(domain)
+        except TException:
+            logger.exception("Error occurred in create_domain, ", )
+            raise
+
+    def update_domain(self, domain):
+        """
+        <p>API method to update a domain</p>
+
+        Parameters:
+         - domain
+        """
+        try:
+            return self.sharing_registry_client_pool.updateDomain(domain)
+        except TException:
+            logger.exception("Error occurred in update_domain, ", )
+            raise
+
+    def is_domain_exists(self, domain_id):
+        """
+        <p>API method to check Domain Exists</p>
+
+        Parameters:
+         - domainId
+        """
+        try:
+            return self.sharing_registry_client_pool.isDomainExists(domain_id)
+        except TException:
+            logger.exception("Error occurred in is_domain_exists, ", )
+            raise
+
+    def delete_domain(self, domain_id):
+        """
+        <p>API method to delete domain</p>
+
+        Parameters:
+         - domainId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteDomain(domain_id)
+        except TException:
+            logger.exception("Error occurred in delete_domain, ", )
+            raise
+
+    def get_domain(self, domain_id):
+        """
+        <p>API method to retrieve a domain</p>
+
+        Parameters:
+         - domainId
+        """
+        try:
+            return self.sharing_registry_client_pool.getDomain(domain_id)
+        except TException:
+            logger.exception("Error occurred in get_domain, ", )
+            raise
+
+    def get_domains(self, offset, limit):
+        """
+        <p>API method to get all domain.</p>
+
+        Parameters:
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getDomains(offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_domains, ", )
+            raise
+
+    def create_user(self, user):
+        """
+        <p>API method to register a user in the system</p>
+
+        Parameters:
+         - user
+        """
+        try:
+            return self.sharing_registry_client_pool.createUser(user)
+        except TException:
+            logger.exception("Error occurred in create_user, ", )
+            raise
+
+    def updated_user(self, user):
+        """
+        <p>API method to update existing user</p>
+
+        Parameters:
+         - user
+        """
+        try:
+            return self.sharing_registry_client_pool.updatedUser(user)
+        except TException:
+            logger.exception("Error occurred in updated_user, ", )
+            raise
+
+    def is_user_exists(self, domain_id, user_id):
+        """
+        <p>API method to check User Exists</p>
+
+        Parameters:
+         - domainId
+         - userId
+        """
+        try:
+            return self.sharing_registry_client_pool.isUserExists(domain_id, user_id)
+        except TException:
+            logger.exception("Error occurred in is_user_exists, ", )
+            raise
+
+    def delete_user(self, domain_id, user_id):
+        """
+        <p>API method to delete user</p>
+
+        Parameters:
+         - domainId
+         - userId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteUser(domain_id, user_id)
+        except TException:
+            logger.exception("Error occurred in delete_user, ", )
+            raise
+
+    def get_user(self, domain_id, user_id):
+        """
+        <p>API method to get a user</p>
+
+        Parameters:
+         - domainId
+         - userId
+        """
+        try:
+            return self.sharing_registry_client_pool.getUser(domain_id, user_id)
+        except TException:
+            logger.exception("Error occurred in get_user, ", )
+            raise
+
+    def get_users(self, domain_id, offset, limit):
+        """
+        <p>API method to get a list of users in a specific domain.</p>
+        <li>domainId : Domain id</li>
+        <li>offset : Starting result number</li>
+        <li>limit : Number of max results to be sent</li>
+
+        Parameters:
+         - domainId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getUsers(domain_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_users, ", )
+            raise
+
+    def create_group(self, group):
+        """
+        <p>API method to create a new group</p>
+
+        Parameters:
+         - group
+        """
+        try:
+            return self.sharing_registry_client_pool.createGroup(group)
+        except TException:
+            logger.exception("Error occurred in create_group, ", )
+            raise
+
+    def update_group(self, group):
+        """
+        <p>API method to update a group</p>
+
+        Parameters:
+         - group
+        """
+        try:
+            return self.sharing_registry_client_pool.updateGroup(group)
+        except TException:
+            logger.exception("Error occurred in update_group, ", )
+            raise
+
+    def is_group_exists(self, domain_id, group_id):
+        """
+        <p>API method to check Group Exists</p>
+
+        Parameters:
+         - domainId
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.isGroupExists(domain_id, group_id)
+        except TException:
+            logger.exception("Error occurred in is_group_exists, ", )
+            raise
+
+    def delete_group(self, domain_id, group_id):
+        """
+        <p>API method to delete a group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteGroup(domain_id, group_id)
+        except TException:
+            logger.exception("Error occurred in delete_group, ", )
+            raise
+
+    def get_group(self, domain_id, group_id):
+        """
+        <p>API method to get a group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.getGroup(domain_id, group_id)
+        except TException:
+            logger.exception("Error occurred in get_group, ", )
+            raise
+
+    def get_groups(self, domain_id, offset, limit):
+        """
+        <p>API method to get groups in a domainId.</p>
+
+        Parameters:
+         - domainId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getGroups(domain_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_groups, ", )
+            raise
+
+    def add_users_to_group(self, domain_id, user_ids, group_id):
+        """
+        <p>API method to add list of users to a group</p>
+
+        Parameters:
+         - domainId
+         - userIds
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.addUsersToGroup(domain_id, user_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in add_users_to_group, ", )
+            raise
+
+    def remove_users_from_group(self, domain_id, user_ids, group_id):
+        """
+        <p>API method to remove users from a group</p>
+
+        Parameters:
+         - domainId
+         - userIds
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.removeUsersFromGroup(domain_id, user_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in remove_users_from_group, ", )
+            raise
+
+    def transfer_group_ownership(self, domain_id, group_id, new_owner_id):
+        """
+        <p>API method to transfer group ownership</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - newOwnerId
+        """
+        try:
+            return self.sharing_registry_client_pool.transferGroupOwnership(domain_id, group_id, new_owner_id)
+        except TException:
+            logger.exception("Error occurred in transfer_group_ownership, ", )
+            raise
+
+    def add_group_admins(self, domain_id, group_id, admin_ids):
+        """
+        <p>API method to add Admin for a group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - adminIds
+        """
+        try:
+            return self.sharing_registry_client_pool.addGroupAdmins(domain_id, group_id, admin_ids)
+        except TException:
+            logger.exception("Error occurred in add_group_admins, ", )
+            raise
+
+    def remove_group_admins(self, domain_id, group_id, admin_ids):
+        """
+        <p>API method to remove Admin for a group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - adminIds
+        """
+        try:
+            return self.sharing_registry_client_pool.removeGroupAdmins(domain_id, group_id, admin_ids)
+        except TException:
+            logger.exception("Error occurred in remove_group_admins, ", )
+            raise
+
+    def has_admin_access(self, domain_id, group_id, admin_id):
+        """
+        <p>API method to check whether the user has Admin access for the group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - adminId
+        """
+        try:
+            return self.sharing_registry_client_pool.hasAdminAccess(domain_id, group_id, admin_id)
+        except TException:
+            logger.exception("Error occurred in has_admin_access, ", )
+            raise
+
+    def has_owner_access(self, domain_id, group_id, owner_id):
+        """
+        <p>API method to check whether the user has Admin access for the group</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - ownerId
+        """
+        try:
+            return self.sharing_registry_client_pool.hasOwnerAccess(domain_id, group_id, owner_id)
+        except TException:
+            logger.exception("Error occurred in has_owner_access, ", )
+            raise
+
+    def get_group_members_of_type_user(self, domain_id, group_id, offset, limit):
+        """
+        <p>API method to get list of child users in a group. Only the direct members will be returned.</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getGroupMembersOfTypeUser(domain_id, group_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_group_members_of_type_user, ", )
+            raise
+
+    def get_group_members_of_type_group(self, domain_id, group_id, offset, limit):
+        """
+        <p>API method to get list of child groups in a group. Only the direct members will be returned.</p>
+
+        Parameters:
+         - domainId
+         - groupId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getGroupMembersOfTypeGroup(domain_id, group_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_group_members_of_type_group, ", )
+            raise
+
+    def add_child_groups_to_parent_group(self, domain_id, child_ids, group_id):
+        """
+        <p>API method to add a child group to a parent group.</p>
+
+        Parameters:
+         - domainId
+         - childIds
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.addChildGroupsToParentGroup(domain_id, child_ids, group_id)
+        except TException:
+            logger.exception("Error occurred in add_child_groups_to_parent_group, ", )
+            raise
+
+    def remove_child_group_from_parent_group(self, domain_id, child_id, group_id):
+        """
+        <p>API method to remove a child group from parent group.</p>
+
+        Parameters:
+         - domainId
+         - childId
+         - groupId
+        """
+        try:
+            return self.sharing_registry_client_pool.removeChildGroupFromParentGroup(domain_id, child_id, group_id)
+        except TException:
+            logger.exception("Error occurred in remove_child_group_from_parent_group, ", )
+            raise
+
+    def get_all_member_groups_for_user(self, domain_id, user_id):
+        """
+        Parameters:
+         - domainId
+         - userId
+        """
+        try:
+            return self.sharing_registry_client_pool.getAllMemberGroupsForUser(domain_id, user_id)
+        except TException:
+            logger.exception("Error occurred in get_all_member_groups_for_user, ", )
+            raise
+
+    def create_entity_type(self, entity_type):
+        """
+        <p>API method to create a new entity type</p>
+
+        Parameters:
+         - entityType
+        """
+        try:
+            return self.sharing_registry_client_pool.createEntityType(entity_type)
+        except TException:
+            logger.exception("Error occurred in create_entity_type, ", )
+            raise
+
+    def update_entity_type(self, entity_type):
+        """
+        <p>API method to update entity type</p>
+
+        Parameters:
+         - entityType
+        """
+        try:
+            return self.sharing_registry_client_pool.updateEntityType(entity_type)
+        except TException:
+            logger.exception("Error occurred in update_entity_type, ", )
+            raise
+
+    def is_entity_type_exists(self, domain_id, entity_type_id):
+        """
+        <p>API method to check EntityType Exists</p>
+
+        Parameters:
+         - domainId
+         - entityTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.isEntityTypeExists(domain_id, entity_type_id)
+        except TException:
+            logger.exception("Error occurred in is_entity_type_exists, ", )
+            raise
+
+    def delete_entity_type(self, domain_id, entity_type_id):
+        """
+        <p>API method to delete entity type</p>
+
+        Parameters:
+         - domainId
+         - entityTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteEntityType(domain_id, entity_type_id)
+        except TException:
+            logger.exception("Error occurred in delete_entity_type, ", )
+            raise
+
+    def get_entity_type(self, domain_id, entity_type_id):
+        """
+        <p>API method to get an entity type</p>
+
+        Parameters:
+         - domainId
+         - entityTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getEntityType(domain_id, entity_type_id)
+        except TException:
+            logger.exception("Error occurred in get_entity_type, ", )
+            raise
+
+    def get_entity_types(self, domain_id, offset, limit):
+        """
+        <p>API method to get entity types in a domainId.</p>
+
+        Parameters:
+         - domainId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getEntityTypes(domain_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_entity_types, ", )
+            raise
+
+    def create_entity(self, entity):
+        """
+        <p>API method to register new entity</p>
+
+        Parameters:
+         - entity
+        """
+        try:
+            return self.sharing_registry_client_pool.createEntity(entity)
+        except TException:
+            logger.exception("Error occurred in create_entity, ", )
+            raise
+
+    def update_entity(self, entity):
+        """
+        <p>API method to update entity</p>
+
+        Parameters:
+         - entity
+        """
+        try:
+            return self.sharing_registry_client_pool.updateEntity(entity)
+        except TException:
+            logger.exception("Error occurred in update_entity, ", )
+            raise
+
+    def is_entity_exists(self, domain_id, entity_id):
+        """
+        <p>API method to check Entity Exists</p>
+
+        Parameters:
+         - domainId
+         - entityId
+        """
+        try:
+            return self.sharing_registry_client_pool.isEntityExists(domain_id, entity_id)
+        except TException:
+            logger.exception("Error occurred in is_entity_exists, ", )
+            raise
+
+    def delete_entity(self, domain_id, entity_id):
+        """
+        <p>API method to delete entity</p>
+
+        Parameters:
+         - domainId
+         - entityId
+        """
+        try:
+            return self.sharing_registry_client_pool.deleteEntity(domain_id, entity_id)
+        except TException:
+            logger.exception("Error occurred in delete_entity, ", )
+            raise
+
+    def get_entity(self, domain_id, entity_id):
+        """
+        <p>API method to get entity</p>
+
+        Parameters:
+         - domainId
+         - entityId
+        """
+        try:
+            return self.sharing_registry_client_pool.getEntity(domain_id, entity_id)
+        except TException:
+            logger.exception("Error occurred in get_entity, ", )
+            raise
+
+    def search_entities(self, domain_id, user_id, filters, offset, limit):
+        """
+        <p>API method to search entities</p>
+
+        Parameters:
+         - domainId
+         - userId
+         - filters
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.searchEntities(domain_id, user_id, filters, offset, limit)
+        except TException:
+            logger.exception("Error occurred in search_entities, ", )
+            raise
+
+    def get_list_of_shared_users(self, domain_id, entity_id, permission_type_id):
+        """
+        <p>API method to get a list of shared users given the entity id</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getListOfSharedUsers(domain_id, entity_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_list_of_shared_users, ", )
+            raise
+
+    def get_list_of_directly_shared_users(self, domain_id, entity_id, permission_type_id):
+        """
+        <p>API method to get a list of shared users given the entity id where the sharing type is directly applied</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getListOfDirectlySharedUsers(domain_id, entity_id,
+                                                                                  permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_list_of_directly_shared_users, ", )
+            raise
+
+    def get_list_of_shared_groups(self, domain_id, entity_id, permission_type_id):
+        """
+        <p>API method to get a list of shared groups given the entity id</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getListOfSharedGroups(domain_id, entity_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_list_of_shared_groups, ", )
+            raise
+
+    def get_list_of_directly_shared_groups(self, domain_id, entity_id, permission_type_id):
+        """
+        <p>API method to get a list of directly shared groups given the entity id where the sharing type is directly applied</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getListOfDirectlySharedGroups(domain_id, entity_id,
+                                                                                   permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_list_of_directly_shared_groups, ", )
+            raise
+
+    def create_permission_type(self, permission_type):
+        """
+        <p>API method to create permission type</p>
+
+        Parameters:
+         - permissionType
+        """
+        try:
+            return self.sharing_registry_client_pool.createPermissionType(permission_type)
+        except TException:
+            logger.exception("Error occurred in create_permission_type, ", )
+            raise
+
+    def update_permission_type(self, permission_type):
+        """
+        <p>API method to update permission type</p>
+
+        Parameters:
+         - permissionType
+        """
+        try:
+            return self.sharing_registry_client_pool.updatePermissionType(permission_type)
+        except TException:
+            logger.exception("Error occurred in update_permission_type, ", )
+            raise
+
+    def is_permission_exists(self, domain_id, permission_id):
+        """
+        <p>API method to check Permission Exists</p>
+
+        Parameters:
+         - dimainId
+         - permissionId
+        """
+        try:
+            return self.sharing_registry_client_pool.isPermissionExists(domain_id, permission_id)
+        except TException:
+            logger.exception("Error occurred in is_permission_exists, ", )
+            raise
+
+    def delete_permission_type(self, domain_id, permission_type_id):
+        """
+        <p>API method to delete permission type</p>
+
+        Parameters:
+         - domainId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.deletePermissionType(domain_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in delete_permission_type, ", )
+            raise
+
+    def get_permission_type(self, domain_id, permission_type_id):
+        """
+        <p>API method to get permission type</p>
+
+        Parameters:
+         - domainId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.getPermissionType(domain_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in get_permission_type, ", )
+            raise
+
+    def get_permission_types(self, domain_id, offset, limit):
+        """
+        <p>API method to get list of permission types in a given domainId.</p>
+
+        Parameters:
+         - domainId
+         - offset
+         - limit
+        """
+        try:
+            return self.sharing_registry_client_pool.getPermissionTypes(domain_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in get_permission_types, ", )
+            raise
+
+    def share_entity_with_users(self, domain_id, entity_id, user_list, permission_type_id, cascade_permission):
+        """
+        <p>API method to share an entity with users</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - userList
+         - permissionTypeId
+         - cascadePermission
+        """
+        try:
+            return self.sharing_registry_client_pool.shareEntityWithUsers(domain_id, entity_id, user_list,
+                                                                          permission_type_id, cascade_permission)
+        except TException:
+            logger.exception("Error occurred in share_entity_with_users, ", )
+            raise
+
+    def revoke_entity_sharing_from_users(self, domain_id, entity_id, user_list, permission_type_id):
+        """
+        <p>API method to revoke sharing from a list of users</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - userList
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.revokeEntitySharingFromUsers(domain_id, entity_id, user_list,
+                                                                                  permission_type_id)
+        except TException:
+            logger.exception("Error occurred in revoke_entity_sharing_from_users, ", )
+            raise
+
+    def share_entity_with_groups(self, domain_id, entity_id, group_list, permission_type_id, cascade_permission):
+        """
+        <p>API method to share an entity with list of groups</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - groupList
+         - permissionTypeId
+         - cascadePermission
+        """
+        try:
+            return self.sharing_registry_client_pool.shareEntityWithGroups(domain_id, entity_id, group_list,
+                                                                           permission_type_id, cascade_permission)
+        except TException:
+            logger.exception("Error occurred in share_entity_with_groups, ", )
+            raise
+
+    def revoke_entity_sharing_from_groups(self, domain_id, entity_id, group_list, permission_type_id):
+        """
+        <p>API method to revoke sharing from list of users</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - groupList
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.revokeEntitySharingFromGroups(domain_id, entity_id, group_list,
+                                                                                   permission_type_id)
+        except TException:
+            logger.exception("Error occurred in revoke_entity_sharing_from_groups, ", )
+            raise
+
+    def user_has_access(self, domain_id, user_id, entity_id, permission_type_id):
+        """
+        <p>API method to check whether a user has access to a specific entity</p>
+
+        Parameters:
+         - domainId
+         - userId
+         - entityId
+         - permissionTypeId
+        """
+        try:
+            return self.sharing_registry_client_pool.userHasAccess(domain_id, user_id, entity_id, permission_type_id)
+        except TException:
+            logger.exception("Error occurred in user_has_access, ", )
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.sharing_registry_client_settings.SHARING_API_HOST = config.get('SharingServer', 'SHARING_API_HOST')
+            self.sharing_registry_client_settings.SHARING_API_PORT = config.getint('SharingServer', 'SHARING_API_PORT')
+            self.sharing_registry_client_settings.SHARING_API_SECURE = config.getboolean('SharingServer',
+                                                                                         'SHARING_API_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/tenant_profile_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/tenant_profile_client.py
new file mode 100644
index 0000000..878f728
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/tenant_profile_client.py
@@ -0,0 +1,140 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import TenantProfileServerClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class TenantProfileClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.tenant_profile_settings = TenantProfileServerClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.tenant_profile_client_pool = utils.initialize_tenant_profile_client(
+            self.tenant_profile_settings.PROFILE_SERVICE_HOST,
+            self.tenant_profile_settings.PROFILE_SERVICE_PORT,
+            self.tenant_profile_settings.PROFILE_SERVICE_SECURE)
+
+    def add_gateway(self, authz_token, gateway):
+        """
+        Return the airavataInternalGatewayId assigned to given gateway.
+
+        Parameters:
+         - authz_token
+         - gateway
+        """
+        try:
+            return self.tenant_profile_client_pool.addGateway(authz_token, gateway)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def update_gateway(self, authz_token, updated_gateway):
+        """
+        Parameters:
+         - authz_token
+         - updated_gateway
+        """
+        try:
+            return self.tenant_profile_client_pool.updateGateway(authz_token, updated_gateway)
+        except TException:
+            logger.exception("Error occurred in update_gateway, ", TException)
+            raise
+
+    def get_gateway(self, authz_token, airavata_internal_gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - airavata_internal_gateway_id
+        """
+        try:
+            return self.tenant_profile_client_pool.getGateway(authz_token, airavata_internal_gateway_id)
+        except TException:
+            logger.exception("Error occurred in get_gateway, ", TException)
+            raise
+
+    def delete_gateway(self, authz_token, airavata_internal_gateway_id, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - airavata_internal_gateway_id
+         - gateway_id
+        """
+        try:
+            return self.tenant_profile_client_pool.deleteGateway(authz_token, airavata_internal_gateway_id, gateway_id)
+        except TException:
+            logger.exception("Error occurred in delete_gateway, ", TException)
+            raise
+
+    def get_all_gateways(self, authz_token):
+        """
+        Parameters:
+         - authz_token
+        """
+        try:
+            return self.tenant_profile_client_pool.getAllGateways(authz_token)
+        except TException:
+            logger.exception("Error occurred in get_all_gateways, ", TException)
+            raise
+
+    def is_gateway_exist(self, authz_token, gateway_id):
+        """
+        Parameters:
+         - authz_token
+         - gateway_id
+        """
+        try:
+            return self.tenant_profile_client_pool.isGatewayExist(authz_token, gateway_id)
+        except TException:
+            logger.exception("Error occurred in is_gateway_exist, ", TException)
+            raise
+
+    def get_all_gateways_for_user(self, authz_token, requester_username):
+        """
+        Parameters:
+         - authz_token
+         - requester_username
+        """
+        try:
+            return self.tenant_profile_client_pool.getAllGatewaysForUser(authz_token, requester_username)
+        except TException:
+            logger.exception("Error occurred in get_all_gateways_for_user, ", TException)
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            settings = config['ProfileServer']
+            self.tenant_profile_settings.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+            self.tenant_profile_settings.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+            self.tenant_profile_settings.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/user_profile_client.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/user_profile_client.py
new file mode 100644
index 0000000..5762f22
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/user_profile_client.py
@@ -0,0 +1,150 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import configparser
+
+from transport.settings import UserProfileClientSettings
+from transport import utils
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+# create formatter and add it to the handler
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+# add the handler to the logger
+logger.addHandler(handler)
+
+
+class UserProfileClient(object):
+
+    def __init__(self, configuration_file_location=None):
+        self.user_profile_client_settings = UserProfileClientSettings(configuration_file_location)
+        self._load_settings(configuration_file_location)
+        self.user_profile_client_pool = utils.initialize_user_profile_client(
+            self.user_profile_client_settings.PROFILE_SERVICE_HOST,
+            self.user_profile_client_settings.PROFILE_SERVICE_PORT,
+            self.user_profile_client_settings.PROFILE_SERVICE_SECURE)
+
+    def get_api_version(self):
+        try:
+            return self.user_profile_client_pool.getAPIVersion()
+        except TException:
+            logger.exception("Error occurred in get_api_version, ", TException)
+            raise
+
+    def initialize_user_profile(self, authz_token):
+        """
+        Create an initial UserProfile based on information in the IAM service for this user.
+
+        Parameters:
+         - authzToken
+        """
+        try:
+            return self.user_profile_client_pool.initializeUserProfile(authz_token)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def add_user_profile(self, authz_token, user_profile):
+        """
+        Parameters:
+         - authzToken
+         - userProfile
+        """
+        try:
+            return self.user_profile_client_pool.addUserProfile(authz_token, user_profile)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def update_user_profile(self, authz_token, user_profile):
+        """
+        Parameters:
+         - authzToken
+         - userProfile
+        """
+        try:
+            return self.user_profile_client_pool.updateUserProfile(authz_token, user_profile)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def get_user_profile_by_id(self, authz_token, user_id, gateway_id):
+        """
+        Parameters:
+         - authzToken
+         - userId
+         - gatewayId
+        """
+        try:
+            return self.user_profile_client_pool.getUserProfileById(authz_token, user_id, gateway_id)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def delete_user_profile(self, authz_token, user_id, gateway_id):
+        """
+        Parameters:
+         - authzToken
+         - userId
+         - gatewayId
+        """
+        try:
+            return self.user_profile_client_pool.deleteUserProfile(authz_token, user_id, gateway_id)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def get_all_user_profiles_in_gateway(self, authz_token, gateway_id, offset, limit):
+        """
+        Parameters:
+         - authzToken
+         - gatewayId
+         - offset
+         - limit
+        """
+        try:
+            return self.user_profile_client_pool.getAllUserProfilesInGateway(authz_token, gateway_id, offset, limit)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def does_user_exist(self, authz_token, user_id, gateway_id):
+        """
+        Parameters:
+         - authzToken
+         - userId
+         - gatewayId
+        """
+        try:
+            return self.user_profile_client_pool.doesUserExist(authz_token, user_id, gateway_id)
+        except TException:
+            logger.exception("Error occurred in add_gateway, ", TException)
+            raise
+
+    def _load_settings(self, configuration_file_location):
+        if configuration_file_location is not None:
+            config = configparser.ConfigParser()
+            config.read(configuration_file_location)
+            self.user_profile_client_settings.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+            self.user_profile_client_settings.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+            self.user_profile_client_settings.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/utils/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/utils/__init__.py
new file mode 100644
index 0000000..92883a4
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/utils/__init__.py
@@ -0,0 +1,16 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/utils/api_server_client_util.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/utils/api_server_client_util.py
new file mode 100644
index 0000000..bb6751d
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/utils/api_server_client_util.py
@@ -0,0 +1,74 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import time
+import logging
+import samples.file_utils as fb
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from clients.api_server_client import APIServerClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class APIServerClientUtil(object):
+
+    def __init__(self, configuration_file_location, username, password, gateway_id):
+        self.authenticator = Authenticator(configuration_file_location)
+        self.token = self.authenticator.get_token_and_user_info_password_flow(username=username,
+                                                                              password=password, gateway_id=gateway_id)
+        self.gateway_id = gateway_id
+        self.username = username
+        self.password = password
+        self.api_server_client = APIServerClient(configuration_file_location)
+
+    def get_project_id(self, project_name):
+        response = self.api_server_client.get_user_projects(self.token, self.gateway_id, self.username, 10, 0)
+        for project in response:
+            if project.name == project_name:
+                return project.projectID
+        return None
+
+    def get_execution_id(self, application_name):
+        response = self.api_server_client.get_all_application_interfaces(self.token, self.gateway_id)
+        for app in response:
+            if app.applicationName == application_name:
+                return app.applicationInterfaceId
+        return None
+
+    def get_resource_host_id(self, resource_name):
+        response = self.api_server_client.get_all_compute_resource_names(self.token)
+        for k in response.keys():
+            if response[k] == resource_name:
+                return k
+        return None
+
+    def get_group_resource_profile_id(self, group_resource_profile_name):
+        response = self.api_server_client.get_group_resource_list(self.token, self.gateway_id)
+        for x in response:
+            if x.groupResourceProfileName == group_resource_profile_name:
+                return x.groupResourceProfileId
+        return None
+
+    def get_storage_resource_id(self, storage_name):
+        response = self.api_server_client.get_all_storage_resource_names(self.token)
+        for k in response.keys():
+            if response[k] == storage_name:
+                return k
+        return None
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/utils/data_model_creation_util.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/utils/data_model_creation_util.py
new file mode 100644
index 0000000..2af7ea7
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/clients/utils/data_model_creation_util.py
@@ -0,0 +1,126 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import time
+import logging
+import samples.file_utils as fb
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from clients.api_server_client import APIServerClient
+from clients.utils.api_server_client_util import APIServerClientUtil
+
+from airavata.model.experiment.ttypes import ExperimentModel, ExperimentType, UserConfigurationDataModel
+from airavata.model.scheduling.ttypes import ComputationalResourceSchedulingModel
+from airavata.model.data.replica.ttypes import DataProductModel, DataProductType, DataReplicaLocationModel, \
+    ReplicaLocationCategory, ReplicaPersistentType
+
+from airavata.model.application.io.ttypes import InputDataObjectType
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class DataModelCreationUtil(object):
+
+    def __init__(self, configuration_file_location, username, password, gateway_id):
+        self.authenticator = Authenticator(configuration_file_location)
+        self.token = self.authenticator.get_token_and_user_info_password_flow(username=username,
+                                                                              password=password, gateway_id=gateway_id)
+        self.gateway_id = gateway_id
+        self.username = username
+        self.password = password
+        self.api_server_client = APIServerClient(configuration_file_location)
+        self.airavata_util = APIServerClientUtil(configuration_file_location, self.username, self.password,
+                                                 self.gateway_id)
+
+    def get_experiment_data_model_for_single_application(self, project_name, application_name, experiment_name,
+                                                         description):
+        execution_id = self.airavata_util.get_execution_id(application_name)
+        project_id = self.airavata_util.get_project_id(project_name)
+        experiment = ExperimentModel()
+        experiment.experimentName = experiment_name
+        experiment.gatewayId = self.gateway_id
+        experiment.userName = self.username
+        experiment.description = description
+        experiment.projectId = project_id
+        experiment.experimentType = ExperimentType.SINGLE_APPLICATION
+        experiment.executionId = execution_id
+        return experiment
+
+    def configure_computation_resource_scheduling(self,
+                                                  experiment_model, computation_resource_name,
+                                                  group_resource_profile_name,
+                                                  storageId,
+                                                  node_count, total_cpu_count, queue_name, wall_time_limit,
+                                                  experiment_dir_path):
+        resource_host_id = self.airavata_util.get_resource_host_id(computation_resource_name)
+        groupResourceProfileId = self.airavata_util.get_group_resource_profile_id(group_resource_profile_name)
+        computRes = ComputationalResourceSchedulingModel()
+        computRes.resourceHostId = resource_host_id
+        computRes.nodeCount = node_count
+        computRes.totalCPUCount = total_cpu_count
+        computRes.queueName = queue_name
+        computRes.wallTimeLimit = wall_time_limit
+
+        userConfigData = UserConfigurationDataModel()
+        userConfigData.computationalResourceScheduling = computRes
+
+        userConfigData.groupResourceProfileId = groupResourceProfileId
+        userConfigData.storageId = storageId
+
+        userConfigData.experimentDataDir = experiment_dir_path
+
+        experiment_model.userConfigurationData = userConfigData
+
+        return experiment_model
+
+    def register_input_file(self, file_identifier, storage_name, storageId, input_file_name, uploaded_storage_path):
+        dataProductModel = DataProductModel()
+        dataProductModel.gatewayId = self.gateway_id
+        dataProductModel.ownerName = self.username
+        dataProductModel.productName = file_identifier
+        dataProductModel.dataProductType = DataProductType.FILE
+
+        replicaLocation = DataReplicaLocationModel()
+        replicaLocation.storageResourceId = storageId
+        replicaLocation.replicaName = "{} gateway data store copy".format(input_file_name)
+        replicaLocation.replicaLocationCategory = ReplicaLocationCategory.GATEWAY_DATA_STORE
+        replicaLocation.filePath = "file://{}:{}".format(storage_name,
+                                                         uploaded_storage_path + input_file_name)
+        dataProductModel.replicaLocations = [replicaLocation]
+
+        return self.api_server_client.register_data_product(self.token, dataProductModel)
+
+    def configure_input_and_outputs(self, experiment_model, input_files, application_name):
+        execution_id = self.airavata_util.get_execution_id(application_name)
+
+        inputs = self.api_server_client.get_application_inputs(self.token, execution_id)
+
+        count = 0
+        for obj in inputs:
+            if isinstance(inputs[count], InputDataObjectType):
+                inputs[count].value = input_files[count]
+            count = count + 1
+
+        experiment_model.experimentInputs = inputs
+
+        outputs = self.api_server_client.get_application_outputs(self.token, execution_id)
+
+        experiment_model.experimentOutputs = outputs
+
+        return experiment_model
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/pom.xml b/airavata-api/airavata-client-sdks/airavata-python-sdk/pom.xml
deleted file mode 100644
index 21f7aa5..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/pom.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you 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.
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <parent>
-        <groupId>org.apache.airavata</groupId>
-        <artifactId>airavata-client-sdks</artifactId>
-        <version>0.19-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>apache-airavata-client-python-sdk</artifactId>
-    <name>Airavata Client Python SDK</name>
-    <packaging>pom</packaging>
-    <url>http://airavata.apache.org/</url>
-
-    <build>
-        <plugins>
-	    <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <version>2.8</version>
-                <executions>
-                    <execution>
-                        <id>unpack</id>
-                        <phase>compile</phase>
-                        <goals>
-                            <goal>unpack</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>org.apache.airavata</groupId>
-                                    <artifactId>airavata-client-configuration</artifactId>
-                                    <version>${project.version}</version>
-                                    <type>jar</type>
-                                </artifactItem>
-                            </artifactItems>
-                            <outputDirectory>${project.build.directory}/conf</outputDirectory>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>distribution-package</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <tarLongFileMode>posix</tarLongFileMode>
-                            <finalName>${archive.name}-${project.version}</finalName>
-                            <descriptors>
-                                <descriptor>src/main/assembly/bin-assembly.xml</descriptor>
-                            </descriptors>
-                            <attach>false</attach>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <version>1.7</version>
-                <executions>
-                    <execution>
-                        <id>attach-artifacts</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>attach-artifact</goal>
-                        </goals>
-                        <configuration>
-                            <artifacts>
-                                <artifact>
-                                    <file>${airavata.client-bin.zip}</file>
-                                    <type>zip</type>
-                                    <classifier>bin</classifier>
-                                </artifact>
-                                <artifact>
-                                    <file>${airavata.client-bin.tar.gz}</file>
-                                    <type>tar.gz</type>
-                                    <classifier>bin</classifier>
-                                </artifact>
-                            </artifacts>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <archive.name>apache-airavata-client-python-sdk</archive.name>
-        <airavata.client-dist.name>${archive.name}-${project.version}</airavata.client-dist.name>
-        <airavata.client-bin.zip>${project.build.directory}/${airavata.client-dist.name}-bin.zip</airavata.client-bin.zip>
-        <airavata.client-bin.tar.gz>${project.build.directory}/${airavata.client-dist.name}-bin.tar.gz</airavata.client-bin.tar.gz>
-    </properties>
-</project>
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/requirements.txt b/airavata-api/airavata-client-sdks/airavata-python-sdk/requirements.txt
new file mode 100644
index 0000000..f953ab3
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/requirements.txt
@@ -0,0 +1,8 @@
+oauthlib
+requests==2.13.0
+requests-oauthlib==0.7.0
+thrift==0.10.0
+thrift_connector==0.24
+paramiko
+scp
+pysftp
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/__init__.py
new file mode 100644
index 0000000..1983496
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/__init__.py
@@ -0,0 +1,15 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/api_server_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/api_server_client_samples.py
new file mode 100644
index 0000000..345fda4
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/api_server_client_samples.py
@@ -0,0 +1,201 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.api_server_client import APIServerClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.model.workspace.ttypes import Gateway, Notification, Project
+from airavata.model.experiment.ttypes import ExperimentModel, ExperimentType, UserConfigurationDataModel
+from airavata.model.appcatalog.groupresourceprofile.ttypes import GroupResourceProfile
+
+from airavata.api.error.ttypes import TException, InvalidRequestException, AiravataSystemException, \
+    AiravataClientException, AuthorizationException
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load APIServerClient with default configuration
+client = APIServerClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+
+# client = APIServerClient('../transport/settings.ini')
+
+
+# check for given gateway exists
+def is_gateway_exists():
+    try:
+        is_exists = client.is_gateway_exist(token, "default")
+        print("Gateway exist: " + str(is_exists))
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+# check if given user exists in given gateway
+def is_user_exists():
+    try:
+        is_exists = client.is_user_exists(token, "default", "default-admin")
+        print("User exist: " + str(is_exists))
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+# adding a new gateway
+def add_gateway():
+    try:
+        gateway = Gateway()
+        gateway.gatewayId = "test-gw"
+        gateway.domain = "airavata.org"
+        gateway.gatewayAdminEmail = "gw@gmail.com"
+        gateway.gatewayAdminFirstName = "isuru"
+        gateway.gatewayAdminLastName = "ranawaka"
+        gateway.gatewayName = "test-gw"
+        gateway.gatewayApprovalStatus = 0
+        gateway_id = client.add_gateway(token, gateway)
+        print("Gateway Id :" + gateway_id)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+# delete gateway
+def delete_gateway():
+    try:
+        gateway = client.delete_gateway(token, "test-gw")
+        print("Gateway deleted ", gateway)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+# get all exisisting gateways
+def get_all_gateways():
+    try:
+        gateway = client.get_all_gateways(token)
+        print("Get all gateways :", gateway)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def create_notification():
+    try:
+        notification = Notification()
+        notification.gatewayId = "default"
+        notification.title = "default-gateway-notification"
+        notification.notificationMessage = "Hello gateway"
+        created_notification = client.create_notification(token, notification)
+        print("Notification Created ", created_notification)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def get_all_notifications():
+    try:
+        notifications = client.get_all_notifications(token, "default")
+        print("Notifications ", notifications)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def create_project():
+    try:
+        project = Project()
+        project.projectID = "def1234"
+        project.owner = "default-admin"
+        project.gatewayId = "default"
+        project.name = "defaultProject"
+
+        pro = client.create_project(token, "default", project)
+        print("Project created ", pro)
+
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def search_projects():
+    try:
+        filter = {1: 'defaultProject'}
+        projects = client.search_projects(token, "default-gateway", "default-admin", filter, limit=0, offset=10)
+        print(projects)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def create_experiment():
+    try:
+        experiment_model = ExperimentModel()
+        experiment_model.experimentId = "exp123"
+        experiment_model.projectId = "def1234"
+        experiment_model.gatewayId = "default"
+        experiment_model.experimentType = ExperimentType.SINGLE_APPLICATION
+        experiment_model.userName = "default-admin"
+        experiment_model.experimentName = "test_exp"
+        exp = client.create_experiment(token, "default", experiment_model)
+    
+        print("Experiment created ", exp)
+
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def get_experiment():
+    try:
+        experiment = client.get_experiment(token, 'test_exp_26302f87-c8eb-4d44-8b6b-4a5c7b1ff014')
+        print("Experiment ", experiment);
+
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def create_group_resource_profile():
+    try:
+        group_resource = GroupResourceProfile()
+        group_resource.gatewayId = "default"
+        group_resource.groupResourceProfileId = "default_profile"
+        group_resource.groupResourceProfileName = "default_profile_1"
+        resource = client.create_group_resource_profile(token, group_resource)
+        print("Group resource created ", group_resource)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
+
+
+def update_experiment():
+    try:
+        data_model = UserConfigurationDataModel()
+        data_model.groupResourceProfileId = "default_profile"
+        data_model.airavataAutoSchedule = True
+        data_model.overrideManualScheduledParams = True
+        experiment = client.get_experiment(token, 'test_exp_26302f87-c8eb-4d44-8b6b-4a5c7b1ff014')
+        experiment.userConfigurationData = data_model
+        exp = client.update_experiment(token, 'test_exp_26302f87-c8eb-4d44-8b6b-4a5c7b1ff014', experiment)
+        print("Updated Experiment ", exp)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+         logger.exception("Error occurred")
+
+
+def launch_experiment():
+    try:
+        status = client.launch_experiment(token, 'test_exp_26302f87-c8eb-4d44-8b6b-4a5c7b1ff014', 'default')
+        print("Experiment Status ", status)
+    except (InvalidRequestException, AiravataClientException, AuthorizationException, AiravataSystemException):
+        logger.exception("Error occurred")
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/create_launch_echo_experiment.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/create_launch_echo_experiment.py
new file mode 100644
index 0000000..965182b
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/create_launch_echo_experiment.py
@@ -0,0 +1,119 @@
+import logging
+import time
+import json
+import samples.file_utils as fb
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from clients.api_server_client import APIServerClient
+
+from clients.credential_store_client import CredentialStoreClient
+
+from airavata.model.experiment.ttypes import ExperimentModel, ExperimentType, UserConfigurationDataModel
+from airavata.model.scheduling.ttypes import ComputationalResourceSchedulingModel
+
+from clients.utils.data_model_creation_util import DataModelCreationUtil
+
+from clients.utils.api_server_client_util import APIServerClientUtil
+
+from clients.sftp_file_handling_client import SFTPConnector
+
+from transport.settings import GatewaySettings
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+configFile = "settings.ini"
+
+authenticator = Authenticator(configFile)
+username = "username"
+password = "password"
+gateway_id = "cyberwater"
+token = authenticator.get_token_and_user_info_password_flow(username=username, password=password, gateway_id=gateway_id)
+
+api_server_client = APIServerClient(configFile)
+
+data_model_client = DataModelCreationUtil(configFile,
+                                          username=username,
+                                          password=password,
+                                          gateway_id=gateway_id)
+
+credential_store_client = CredentialStoreClient(configFile)
+
+airavata_util = APIServerClientUtil(configFile,
+                                    username=username,
+                                    password=password,
+                                    gateway_id=gateway_id)
+
+executionId = airavata_util.get_execution_id("Echo")
+
+projectId = airavata_util.get_project_id("Default Project")
+
+resourceHostId = airavata_util.get_resource_host_id("karst.uits.iu.edu")
+
+groupResourceProfileId = airavata_util.get_group_resource_profile_id("Default Gateway Profile")
+
+storageId = airavata_util.get_storage_resource_id("pgadev.scigap.org")
+
+# create experiment data model
+experiment = data_model_client.get_experiment_data_model_for_single_application(
+    project_name="Default Project",
+    application_name="Echo",
+    experiment_name="Testing_ECHO_SDK 2",
+    description="Testing")
+
+sftp_connector = SFTPConnector(host="cyberwater.scigap.org", port=9000, username="isuru_janith",
+                               password=token.accessToken)
+path_suffix = sftp_connector.upload_files("/Users/isururanawaka/Documents/Cyberwater/poc2/resources/storage",
+                                          "Default_Project",
+                                          experiment.experimentName)
+
+sftp_connector = SFTPConnector(host="cyberwater.scigap.org", port=9000, username="isuru_janith",
+                               password=token.accessToken)
+path_suffix = sftp_connector.upload_files("/Users/isururanawaka/Documents/Cyberwater/poc2/resources/storage",
+                                          "Default_Project",
+                                          experiment.experimentName)
+
+gateway_settings = GatewaySettings(configFile)
+path = gateway_settings.GATEWAY_DATA_STORE_DIR + path_suffix
+
+# configure computational resources
+experiment = data_model_client.configure_computation_resource_scheduling(experiment_model=experiment,
+                                                                         computation_resource_name="karst.uits.iu.edu",
+                                                                         group_resource_profile_name="Default Gateway Profile",
+                                                                         storage_name="pgadev.scigap.org",
+                                                                         node_count=1,
+                                                                         total_cpu_count=16,
+                                                                         wall_time_limit=15,
+                                                                         queue_name="batch",
+                                                                         experiment_dir_path=path)
+
+inputs = api_server_client.get_application_inputs(token, executionId)
+
+experiment.experimentInputs = inputs
+
+outputs = api_server_client.get_application_outputs(token, executionId)
+
+experiment.experimentOutputs = outputs
+
+# create experiment
+ex_id = api_server_client.create_experiment(token, gateway_id, experiment)
+print(ex_id)
+# launch experiment
+api_server_client.launch_experiment(token, ex_id,
+                                    gateway_id)
+
+status = api_server_client.get_experiment_status(token, ex_id);
+
+if status is not None:
+    print("Initial state " + str(status.state))
+while status.state <= 6:
+    status = api_server_client.get_experiment_status(token,
+                                                     ex_id);
+    time.sleep(30)
+    print("State " + str(status.state))
+
+print("Completed")
+
+sftp_connector.download_files(".", "Default_Project", experiment.experimentName)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/create_launch_gaussian_experiment.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/create_launch_gaussian_experiment.py
new file mode 100644
index 0000000..d16eb2e
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/create_launch_gaussian_experiment.py
@@ -0,0 +1,135 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+import time
+import json
+import samples.file_utils as fb
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from clients.api_server_client import APIServerClient
+
+from clients.utils.api_server_client_util import APIServerClientUtil
+
+from clients.credential_store_client import CredentialStoreClient
+
+from clients.utils.data_model_creation_util import DataModelCreationUtil
+
+from airavata.model.workspace.ttypes import Gateway, Notification, Project
+from airavata.model.experiment.ttypes import ExperimentModel, ExperimentType, UserConfigurationDataModel
+from airavata.model.scheduling.ttypes import ComputationalResourceSchedulingModel
+from airavata.model.data.replica.ttypes import DataProductModel, DataProductType, DataReplicaLocationModel, \
+    ReplicaLocationCategory, ReplicaPersistentType
+
+from airavata.model.application.io.ttypes import InputDataObjectType
+
+from airavata.model.appcatalog.groupresourceprofile.ttypes import GroupResourceProfile
+
+from airavata.api.error.ttypes import TException, InvalidRequestException, AiravataSystemException, \
+    AiravataClientException, AuthorizationException
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+configFile = "/Users/isururanawaka/Documents/Cyberwater/poc/resources/settings.ini"
+
+authenticator = Authenticator(configFile)
+
+user_name = "username"
+password = "password"
+gateway_id = "cyberwater"
+
+token = authenticator.get_token_and_user_info_password_flow(username=user_name, password=password,
+                                                            gateway_id=gateway_id)
+
+api_server_client = APIServerClient(configFile)
+
+airavata_util = APIServerClientUtil(configFile, username=user_name, password=password, gateway_id=gateway_id)
+data_model_client = DataModelCreationUtil(configFile,
+                                          username=user_name,
+                                          password=password,
+                                          gateway_id=gateway_id)
+
+credential_store_client = CredentialStoreClient(configFile)
+
+executionId = airavata_util.get_execution_id("Gaussian")
+projectId = airavata_util.get_project_id("Default Project")
+
+resourceHostId = airavata_util.get_resource_host_id("karst.uits.iu.edu")
+
+groupResourceProfileId = airavata_util.get_group_resource_profile_id("Default Gateway Profile")
+
+storageId = airavata_util.get_storage_resource_id("pgadev.scigap.org")
+
+# create Experiment data Model
+
+experiment = data_model_client.get_experiment_data_model_for_single_application(
+    project_name="Default Project",
+    application_name="Gaussian",
+    experiment_name="Gaussian_16",
+    description="Testing")
+
+folder_name = "storage"
+
+path = fb.upload_files(api_server_client, credential_store_client, token, gateway_id,
+                       storageId,
+                       "pgadev.scigap.org", user_name, "Default_Project", executionId,
+                       "/Users/isururanawaka/Documents/Cyberwater/poc/resources/storage/")
+
+experiment = data_model_client.configure_computation_resource_scheduling(experiment_model=experiment,
+                                                                         computation_resource_name="karst.uits.iu.edu",
+                                                                         group_resource_profile_name="Default Gateway Profile",
+                                                                         storage_name="pgadev.scigap.org",
+                                                                         node_count=1,
+                                                                         total_cpu_count=16,
+                                                                         wall_time_limit=15,
+                                                                         queue_name="batch",
+                                                                         experiment_dir_path=path)
+
+data_uri = data_model_client.register_input_file(file_identifier="npentane12diol.inp",
+                                                 storage_name='pgadev.scigap.org',
+                                                 storageId='pgadev.scigap.org_asdasdad',
+                                                 input_file_name="npentane12diol.inp",
+                                                 uploaded_storage_path=path)
+
+input_files = [data_uri]
+
+experiment = data_model_client.configure_input_and_outputs(experiment, input_files=input_files,
+                                                           application_name="Gaussian")
+
+# create experiment
+ex_id = api_server_client.create_experiment(token, "cyberwater", experiment)
+
+# launch experiment
+api_server_client.launch_experiment(token, ex_id, "cyberwater")
+
+status = api_server_client.get_experiment_status(token, ex_id);
+
+if status is not None:
+    print("Initial state " + str(status.state))
+while status.state <= 6:
+    status = api_server_client.get_experiment_status(token,
+                                                     ex_id);
+    time.sleep(30)
+    print("State " + str(status.state))
+
+print("Completed")
+
+fb.download_files(api_server_client, credential_store_client, token, "cyberwater",
+                  storageId,
+                  "pgadev.scigap.org", user_name, "Default_Project", executionId, ".")
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/file_utils.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/file_utils.py
new file mode 100644
index 0000000..45ba3b2
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/file_utils.py
@@ -0,0 +1,46 @@
+import io
+import paramiko
+
+from clients.file_handling_client import FileHandler
+
+
+def upload_files(api_server_client, credential_store_client, token, gateway_id, storage_id, storage_host,
+                 username, project_name, experiment_id, local_folder_path, ):
+    gateway_storage_preferance = api_server_client.get_gateway_storage_preference(token, gateway_id,
+                                                                                  storage_id)
+
+    credential = credential_store_client.get_SSH_credential(
+        gateway_storage_preferance.resourceSpecificCredentialStoreToken,
+        gateway_id);
+    private_key_file = io.StringIO()
+    private_key_file.write(credential.privateKey)
+    private_key_file.seek(0)
+    private_key = paramiko.RSAKey.from_private_key(private_key_file, credential.passphrase)
+
+    file_handler = FileHandler(storage_host, 22, gateway_storage_preferance.loginUserName, credential.passphrase,
+                               private_key)
+    remotePath = gateway_storage_preferance.fileSystemRootLocation + "/" + username + "/" + project_name + "/" + experiment_id + "/"
+    file_handler.upload_file(local_folder_path,
+                             remotePath,
+                             True, True)
+    return remotePath
+
+
+def download_files(api_server_client, credential_store_client, token, gateway_id, storage_id, storage_host,
+                   username, project_name, experiment_id, local_folder_path):
+    gateway_storage_preferance = api_server_client.get_gateway_storage_preference(token, gateway_id,
+                                                                                  storage_id)
+
+    credential = credential_store_client.get_SSH_credential(
+        gateway_storage_preferance.resourceSpecificCredentialStoreToken,
+        gateway_id);
+
+    private_key_file = io.StringIO()
+    private_key_file.write(credential.privateKey)
+    private_key_file.seek(0)
+    private_key = paramiko.RSAKey.from_private_key(private_key_file, credential.passphrase)
+
+    file_handler = FileHandler(storage_host, 22, gateway_storage_preferance.loginUserName, credential.passphrase,
+                               private_key)
+    remotePath = gateway_storage_preferance.fileSystemRootLocation + "/" + username + "/" + project_name + "/" + experiment_id + "/"
+    file_handler.download_file(remotePath, local_folder_path, True, True)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/group_manager_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/group_manager_client_samples.py
new file mode 100644
index 0000000..14e656f
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/group_manager_client_samples.py
@@ -0,0 +1,86 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.group_manager_client import GroupManagerClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+from airavata.model.group.ttypes import GroupModel
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+client = GroupManagerClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+
+#client = GroupManagerClient('../transport/settings.ini')
+
+
+# create group in airavata
+def create_group():
+    try:
+        group_model = GroupModel()
+        group_model.id = "testing_group"
+        group_model.name = "testing_group_name"
+        group_model.ownerId = "default-admin"
+        group_model.description = "This group is used for testing users"
+
+        users = ['default-admin']
+
+        group_model.members = users
+        group_model.admins = users
+
+        created_group = client.create_group(token, group_model)
+        print(created_group)
+    except TException:
+        logger.exception("Exception occurred")
+
+
+# get all groups
+def get_groups():
+    try:
+        created_group = client.get_groups(token)
+        print("Groups :", created_group)
+    except TException:
+        logger.exception("Exception occurred")
+
+
+def add_group_admin():
+    try:
+        created_group = client.add_group_admins(token, "testing_group", "default-admin")
+        print("Groups :", created_group)
+    except TException:
+        logger.exception("Exception occurred")
+
+
+def has_owner_access():
+    try:
+        has_access = client.has_owner_access(token, "testing_group", "default-admin")
+        print("Is have accesss ", has_access)
+    except TException:
+        logger.exception("Exception occurred")
+
+get_groups()
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/iam_admin_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/iam_admin_client_samples.py
new file mode 100644
index 0000000..02f0932
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/iam_admin_client_samples.py
@@ -0,0 +1,61 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.iam_admin_client import IAMAdminClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+client = IAMAdminClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+# client = IAMAdminClient('../transport/settings.ini')
+
+
+def is_user_exisits():
+    try:
+        user = client.is_user_exist(token, "default-admin")
+        print("Is user exists :", user)
+    except TException:
+        logger.exception("Error occurred")
+
+
+def get_user():
+    try:
+        user = client.get_user(token, "default-admin")
+        print("User :", user)
+    except TException:
+        logger.exception("Error occurred")
+
+
+def get_users_with_role():
+    try:
+        user = client.get_users_with_role(token, "admin")
+        print("Users :", user)
+    except TException:
+        logger.exception("Error occurred")
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/metadata_fetcher.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/metadata_fetcher.py
new file mode 100644
index 0000000..c89359c
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/metadata_fetcher.py
@@ -0,0 +1,67 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from clients.api_server_client import APIServerClient
+
+from airavata.model.workspace.ttypes import Gateway, Notification, Project
+from airavata.model.experiment.ttypes import ExperimentModel, ExperimentType, UserConfigurationDataModel
+from airavata.model.scheduling.ttypes import ComputationalResourceSchedulingModel
+from airavata.model.data.replica.ttypes import DataProductModel, DataProductType, DataReplicaLocationModel, \
+    ReplicaLocationCategory, ReplicaPersistentType
+
+from airavata.model.application.io.ttypes import InputDataObjectType
+
+from airavata.model.appcatalog.groupresourceprofile.ttypes import GroupResourceProfile
+
+from airavata.api.error.ttypes import TException, InvalidRequestException, AiravataSystemException, \
+    AiravataClientException, AuthorizationException
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+configFile = "/Users/isururanawaka/Documents/Cyberwater/poc/resources/settings.ini"
+
+authenticator = Authenticator(configFile)
+token = authenticator.get_token_and_user_info_password_flow("username", "password", "cyberwater")
+
+api_server_client = APIServerClient(configFile)
+
+# fetch all application deployments
+deployments = api_server_client.get_all_application_deployments(token, "cyberwater");
+print(deployments);
+# appModuleId  for execution Id
+
+
+# compute resource names and Ids
+compute_resoure_name = api_server_client.get_all_compute_resource_names(token);
+print(compute_resoure_name);
+
+# get  resource profiles
+resource_profile = api_server_client.get_all_gateway_resource_profiles(token);
+print(resource_profile);
+
+# get resource profiles
+group_resource_list = api_server_client.get_group_resource_list(token, "cyberwater");
+print(group_resource_list);
+
+# provides storage resources
+storage_resource = api_server_client.get_all_storage_resource_names(token)
+print(storage_resource);
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/resources/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/resources/__init__.py
new file mode 100644
index 0000000..1983496
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/resources/__init__.py
@@ -0,0 +1,15 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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.
+#
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/resources/incommon_rsa_server_ca.pem b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/resources/incommon_rsa_server_ca.pem
new file mode 100644
index 0000000..63c6bae
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/resources/incommon_rsa_server_ca.pem
@@ -0,0 +1,68 @@
+-----BEGIN CERTIFICATE-----
+MIIF+TCCA+GgAwIBAgIQRyDQ+oVGGn4XoWQCkYRjdDANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQx
+MDA2MDAwMDAwWhcNMjQxMDA1MjM1OTU5WjB2MQswCQYDVQQGEwJVUzELMAkGA1UE
+CBMCTUkxEjAQBgNVBAcTCUFubiBBcmJvcjESMBAGA1UEChMJSW50ZXJuZXQyMREw
+DwYDVQQLEwhJbkNvbW1vbjEfMB0GA1UEAxMWSW5Db21tb24gUlNBIFNlcnZlciBD
+QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJwb8bsvf2MYFVFRVA+e
+xU5NEFj6MJsXKZDmMwysE1N8VJG06thum4ltuzM+j9INpun5uukNDBqeso7JcC7v
+HgV9lestjaKpTbOc5/MZNrun8XzmCB5hJ0R6lvSoNNviQsil2zfVtefkQnI/tBPP
+iwckRR6MkYNGuQmm/BijBgLsNI0yZpUn6uGX6Ns1oytW61fo8BBZ321wDGZq0GTl
+qKOYMa0dYtX6kuOaQ80tNfvZnjNbRX3EhigsZhLI2w8ZMA0/6fDqSl5AB8f2IHpT
+eIFken5FahZv9JNYyWL7KSd9oX8hzudPR9aKVuDjZvjs3YncJowZaDuNi+L7RyML
+fzcCAwEAAaOCAW4wggFqMB8GA1UdIwQYMBaAFFN5v1qqK0rPVIDh2JvAnfKyA2bL
+MB0GA1UdDgQWBBQeBaN3j2yW4luHS6a0hqxxAAznODAOBgNVHQ8BAf8EBAMCAYYw
+EgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
+AwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgGBmeBDAECAjBQBgNVHR8ESTBHMEWgQ6BB
+hj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVNFUlRydXN0UlNBQ2VydGlmaWNh
+dGlvbkF1dGhvcml0eS5jcmwwdgYIKwYBBQUHAQEEajBoMD8GCCsGAQUFBzAChjNo
+dHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVNFUlRydXN0UlNBQWRkVHJ1c3RDQS5j
+cnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZI
+hvcNAQEMBQADggIBAC0RBjjW29dYaK+qOGcXjeIT16MUJNkGE+vrkS/fT2ctyNMU
+11ZlUp5uH5gIjppIG8GLWZqjV5vbhvhZQPwZsHURKsISNrqOcooGTie3jVgU0W+0
++Wj8mN2knCVANt69F2YrA394gbGAdJ5fOrQmL2pIhDY0jqco74fzYefbZ/VS29fR
+5jBxu4uj1P+5ZImem4Gbj1e4ZEzVBhmO55GFfBjRidj26h1oFBHZ7heDH1Bjzw72
+hipu47Gkyfr2NEx3KoCGMLCj3Btx7ASn5Ji8FoU+hCazwOU1VX55mKPU1I2250Lo
+RCASN18JyfsD5PVldJbtyrmz9gn/TKbRXTr80U2q5JhyvjhLf4lOJo/UzL5WCXED
+Smyj4jWG3R7Z8TED9xNNCxGBMXnMete+3PvzdhssvbORDwBZByogQ9xL2LUZFI/i
+eoQp0UM/L8zfP527vWjEzuDN5xwxMnhi+vCToh7J159o5ah29mP+aJnvujbXEnGa
+nrNxHzu+AGOePV8hwrGGG7hOIcPDQwkuYwzN/xT29iLp/cqf9ZhEtkGcQcIImH3b
+oJ8ifsCnSbu0GB9L06Yqh7lcyvKDTEADslIaeSEINxhO2Y1fmcYFX/Fqrrp1WnhH
+OjplXuXE0OPa0utaKC25Aplgom88L2Z8mEWcyfoB7zKOfD759AN7JKZWCYwk
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
+MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
+3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
+tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
+Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
+VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
+79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
+c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
+Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
+c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
+UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
+Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
+Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
+VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
+ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
+8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
+iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
+Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
+XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
+qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
+VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
+L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
+jjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/sharing_registry_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/sharing_registry_client_samples.py
new file mode 100644
index 0000000..fbbb8c1
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/sharing_registry_client_samples.py
@@ -0,0 +1,92 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.sharing_registry_client import SharingRegistryClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+from airavata.model.sharing.ttypes import Domain, Entity, EntityType
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+client = SharingRegistryClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+
+# client = SharingRegistryClient('../transport/settings.ini')
+
+# create domian
+def create_domain():
+    try:
+        domain = Domain()
+        domain.domainId = "gw@scigap.org"
+        domain.name = "gw"
+        domain.description = "this domain is used by testing server"
+
+        domain = client.create_domain(domain)
+        print("Domian created :", domain)
+
+    except TException:
+        logger.exception("Error occurred")
+
+
+# get domain
+def get_domain():
+    try:
+
+        domains = client.get_domain("gw")
+        print("Domians created :", domains)
+
+    except TException:
+        logger.exception("Error occurred")
+
+
+def create_entity_type():
+    try:
+        entity_type = EntityType()
+        entity_type.domainId = "gw@scigap.org"
+        entity_type.description = "project entity type"
+        entity_type.name = "PROJECT"
+        entity_type.entityTypeId = "gw@scigap.org:PROJECT"
+        en_type = client.create_entity_type(entity_type)
+        print("Entity Type ", en_type)
+    except TException:
+        logger.exception("Error occurred")
+
+
+def create_entity():
+    try:
+        entity = Entity()
+        entity.entityTypeId = "gw@scigap.org:PROJECT"
+        entity.name = "PROJECT_ENTITY"
+        entity.domainId = "gw"
+        entity.ownerId = "default-admin"
+        en_type = client.create_entity(entity)
+        print("Entity Type ", en_type)
+    except TException:
+        logger.exception("Error occurred")
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/tenant_profile_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/tenant_profile_client_samples.py
new file mode 100644
index 0000000..a6db6df
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/tenant_profile_client_samples.py
@@ -0,0 +1,53 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.tenant_profile_client import TenantProfileClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+#client = TenantProfileClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+client = TenantProfileClient('../transport/settings.ini')
+
+
+def get_all_gateways():
+    try:
+        gws = client.get_all_gateways(token)
+        print("Gateways ", gws)
+    except TException:
+        logger.exception("Error occurred")
+
+
+def is_gateway_exsist():
+    try:
+        gw_exisist = client.is_gateway_exist(token, "default")
+        print("Gateways ", gw_exisist)
+    except TException:
+        logger.exception("Error occurred")
+
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/user_profile_client_samples.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/user_profile_client_samples.py
new file mode 100644
index 0000000..d14bb58
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/samples/user_profile_client_samples.py
@@ -0,0 +1,66 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+from clients.user_profile_client import UserProfileClient
+
+from clients.keycloak_token_fetcher import Authenticator
+
+from airavata.api.error.ttypes import TException
+
+from airavata.model.user.ttypes import UserProfile, Status
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+
+authenticator = Authenticator();
+token = authenticator.get_token_and_user_info_password_flow("default-admin", "123456", "default")
+
+# load GroupManagerClient with default configuration
+client = UserProfileClient()
+
+
+# load client with given configuration file (e.g customized_settings.ini)
+# client = UserProfileClient('../transport/settings.ini')
+
+
+def add_user_profile():
+    try:
+        profile = UserProfile()
+        profile.gatewayId = "default"
+        profile.userId = "default-admin"
+        profile.emails = ['gw@scigap.org']
+        profile.airavataInternalUserId = "default-admin"
+        profile.userModelVersion = "1.0.0"
+        profile.firstName = "Isuru"
+        profile.lastName = "Ranawaka"
+        profile.creationTime = 1576103354
+        profile.lastAccessTime = 1576103296
+        profile.validUntil = 1607725696
+        profile.State = Status.ACTIVE
+        added_profile = client.add_user_profile(token, profile)
+        print("Add user proflile", added_profile)
+    except TException:
+        logger.exception("Error Occurred")
+
+
+def get_all_user_profiles_in_gateway():
+    try:
+        profiles = client.get_all_user_profiles_in_gateway(token, "default", 0, -1)
+        print("User Profiles ", profiles)
+    except TException:
+        logger.exception("Error Occurred")
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/setup.cfg b/airavata-api/airavata-client-sdks/airavata-python-sdk/setup.cfg
new file mode 100644
index 0000000..3397c30
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/setup.cfg
@@ -0,0 +1,26 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+[bdist_wheel]
+universal = 1
+
+[metadata]
+description-file = README.md
+license_file = LICENSE
+
+[aliases]
+test = pytest
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/setup.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/setup.py
new file mode 100644
index 0000000..d190881
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/setup.py
@@ -0,0 +1,21 @@
+import os
+
+from setuptools import setup, find_packages
+
+
+def read(fname):
+    with open(os.path.join(os.path.dirname(__file__), fname)) as f:
+        return f.read()
+
+
+setup(
+    name='airavata-python-sdk',
+    version='1.0.0',
+    packages=find_packages(),
+    package_data={'transport': ['*.ini'], 'sample': ['*.pem']},
+    url='http://airavata.com',
+    license='Apache License 2.0',
+    author='Airavata Developers',
+    author_email='dev@airavata.apache.org',
+    description='Apache Airavata Python  SDK'
+)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/INSTALL b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/INSTALL
deleted file mode 100644
index 957614f..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/INSTALL
+++ /dev/null
@@ -1,7 +0,0 @@
-Installing  Apache Airavata Client 0.15
---------------------------------------
-
-Tutorials 
-----------
-The airavata website has instructions for basic tutorials:
-* For basic understanding on how to use Airavata API please look at the samples shipped with the distribution
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/LICENSE b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/LICENSE
deleted file mode 100644
index 24cb886..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/LICENSE
+++ /dev/null
@@ -1,2272 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   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.
-
-===================================================================================
-The Apache Airavata distribution includes a number of run time 
-dependencies with separate copyright notices and license terms. Your use of the
-Apache Airavata code is subject to the terms and conditions of the following licenses.
-===================================================================================
-
-===============================================================================
-The following components come under Apache Software License 2.0
-===============================================================================
-
-apache axiom, apache axis2, apache commons, apache derby, apache geronimo,
-apache httpcore components, apache log4j, apache xmlbeans, apache xmlschema,
-aws-java-sdk-1.1.8.jar, bcel-5.1.jar, Codehaus Jackson (jackson-core-asl-1.9.2.jar,
-jackson-jaxrs-1.9.2.jar, jackson-mapper-asl-1.9.2.jar, jackson-xc-1.9.2.jar, 
-jets3t-0.8.0.jar, jettison-1.0-RC2.jar, neethi-2.0.4.jar, PDFBox libraries 
-(pdfbox, jempbox, fontbox), wstx-asl-3.2.4.jar
-
-===============================================================================
-The following components use Apache based Licenses
-===============================================================================
-
-===============================================================================
-For: jdom-1.0.jar
-    Containing Project URL: http://www.jdom.org/
-/*-- 
-
- $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $
-
- Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin.
- All rights reserved.
- 
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 
- 1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions, and the following disclaimer.
- 
- 2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions, and the disclaimer that follows 
-    these conditions in the documentation and/or other materials 
-    provided with the distribution.
-
- 3. The name "JDOM" must not be used to endorse or promote products
-    derived from this software without prior written permission.  For
-    written permission, please contact <request_AT_jdom_DOT_org>.
- 
- 4. Products derived from this software may not be called "JDOM", nor
-    may "JDOM" appear in their name, without prior written permission
-    from the JDOM Project Management <request_AT_jdom_DOT_org>.
- 
- In addition, we request (but do not require) that you include in the 
- end-user documentation provided with the redistribution and/or in the 
- software itself an acknowledgement equivalent to the following:
-     "This product includes software developed by the
-      JDOM Project (http://www.jdom.org/)."
- Alternatively, the acknowledgment may be graphical using the logos 
- available at http://www.jdom.org/images/logos.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED.  IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- This software consists of voluntary contributions made by many 
- individuals on behalf of the JDOM Project and was originally 
- created by Jason Hunter <jhunter_AT_jdom_DOT_org> and
- Brett McLaughlin <brett_AT_jdom_DOT_org>.  For more information
- on the JDOM Project, please see <http://www.jdom.org/>. 
-
- */
-
-===============================================================================
-
-ASM bytecode manipulation library (asm)
-    Containing Project URL: http://asm.ow2.org/
-
-    Copyright (c) 2000-2005 INRIA, France Telecom
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions
-    are met:
-
-    1. Redistributions of source code must retain the above copyright
-       notice, this list of conditions and the following disclaimer.
-
-    2. Redistributions in binary form must reproduce the above copyright
-       notice, this list of conditions and the following disclaimer in the
-       documentation and/or other materials provided with the distribution.
-
-    3. Neither the name of the copyright holders nor the names of its
-       contributors may be used to endorse or promote products derived from
-       this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-    THE POSSIBILITY OF SUCH DAMAGE.
-
-===============================================================================
-
-For: cryptix-asn1-versionless.jar, cryptix32-versionless.jar
-    Containing Project URL: http://www.cryptix.org/
-
-Cryptix General License
-
-Copyright (c) 1995-2005 The Cryptix Foundation Limited.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-  1. Redistributions of source code must retain the copyright notice,
-     this list of conditions and the following disclaimer.
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND
-CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-===============================================================================
-The following components come under Extreme! Lab Software License
-===============================================================================
-
-XPP3
-    Containing Project URL: http://www.extreme.indiana.edu/xgws/xsoap/xpp/
-xsul, xsul5, xutil
-    Containing Project URL: http://www.extreme.indiana.edu/xgws/xsul/
-wsmg
-    Containing Project URL: http://www.extreme.indiana.edu/xgws/messenger/index.html
-gpel, weps-beans, pegasuswebservice, mapReduce-service-client, atomixmiser
-    Containing Project URL: http://www.extreme.indiana.edu/xgws/
-    
-Indiana University Extreme! Lab Software License
-
-Version 1.1.1
-
-Copyright (c) 2002 Extreme! Lab, Indiana University. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright notice,
-   this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in
-   the documentation and/or other materials provided with the distribution.
-
-3. The end-user documentation included with the redistribution, if any,
-   must include the following acknowledgment:
-
-  "This product includes software developed by the Indiana University
-  Extreme! Lab (http://www.extreme.indiana.edu/)."
-
-Alternately, this acknowledgment may appear in the software itself,
-if and wherever such third-party acknowledgments normally appear.
-
-4. The names "Indiana Univeristy" and "Indiana Univeristy Extreme! Lab"
-must not be used to endorse or promote products derived from this
-software without prior written permission. For written permission,
-please contact http://www.extreme.indiana.edu/.
-
-5. Products derived from this software may not use "Indiana Univeristy"
-name nor may "Indiana Univeristy" appear in their name, without prior
-written permission of the Indiana University.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHORS, COPYRIGHT HOLDERS OR ITS CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-======================================================================== 
-The following components are MIT Licensed 
-========================================================================
-
-SLF4J,log4j-over-slf4j, jcl-over-slf4j, slf4j-api,mockito-all-1.8.5,jopt-simple-3.2.jar
-    Containing Project URL: http://www.slf4j.org/
-
-Copyright (c) 2004-2008 QOS.ch
- All rights reserved.
-
- Permission is hereby granted, free  of charge, to any person obtaining
- a  copy  of this  software  and  associated  documentation files  (the
- "Software"), to  deal in  the Software without  restriction, including
- without limitation  the rights to  use, copy, modify,  merge, publish,
- distribute,  sublicense, and/or sell  copies of  the Software,  and to
- permit persons to whom the Software  is furnished to do so, subject to
- the following conditions:
-
- The  above  copyright  notice  and  this permission  notice  shall  be
- included in all copies or substantial portions of the Software.
-
- THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
- EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
- MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-========================================================================
-
-For dom4j-1.6.1.jar:
-    Containing Project URL: http://dom4j.sourceforge.net/
-Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
-
-Redistribution and use of this software and associated documentation
-("Software"), with or without modification, are permitted provided
-that the following conditions are met:
-
-1. Redistributions of source code must retain copyright
-   statements and notices.  Redistributions must also contain a
-   copy of this document.
- 
-2. Redistributions in binary form must reproduce the
-   above copyright notice, this list of conditions and the
-   following disclaimer in the documentation and/or other
-   materials provided with the distribution.
- 
-3. The name "DOM4J" must not be used to endorse or promote
-   products derived from this Software without prior written
-   permission of MetaStuff, Ltd.  For written permission,
-   please contact dom4j-info@metastuff.com.
- 
-4. Products derived from this Software may not be called "DOM4J"
-   nor may "DOM4J" appear in their names without prior written
-   permission of MetaStuff, Ltd. DOM4J is a registered
-   trademark of MetaStuff, Ltd.
- 
-5. Due credit should be given to the DOM4J Project - 
-   http://www.dom4j.org
- 
-THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS
-``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
-NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
-METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-OF THE POSSIBILITY OF SUCH DAMAGE.
-
-====================================================================================================
-
-For Bouncy Castle:
-    Containing Project URL: http://www.bouncycastle.org/
-
-Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
-
-Permission iss software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions hereby granted, free of charge, to any person obtaining a copy of this software
-and associated documentation files (the "Software"), to deal in the Software without restriction,
-including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial
-portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-=======================================================================================================
-
-For: The International Components for Unicode (icu4j-2.6.1.jar)
-    Containing Project URL: http://site.icu-project.org/
-
-    Copyright (c) 1995-2009 International Business Machines Corporation
-    and others
-
-    All rights reserved.
-
-    Permission is hereby granted, free of charge, to any person obtaining
-    a copy of this software and associated documentation files (the
-    "Software"), to deal in the Software without restriction, including
-    without limitation the rights to use, copy, modify, merge, publish,
-    distribute, and/or sell copies of the Software, and to permit persons
-    to whom the Software is furnished to do so, provided that the above
-    copyright notice(s) and this permission notice appear in all copies
-    of the Software and that both the above copyright notice(s) and this
-    permission notice appear in supporting documentation.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-    IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
-    BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
-    OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-    ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-    SOFTWARE.
-
-    Except as contained in this notice, the name of a copyright holder shall
-    not be used in advertising or otherwise to promote the sale, use or other
-    dealings in this Software without prior written authorization of the
-    copyright holder.
-    
-====================================================================== 
-The following components are CDDL based License 
-======================================================================
-
-For activation-1.1.jar, jaxb-api-2.1.jar, mail-1.4.jar, junit, 
-Servlet Specification 2.5 API (servlet-api-2.5-6.1.14.jar),
-Classfish Jasper API (jsp-api-2.1-6.1.14.jar), and
-JSP2.1 Jasper implementation from Glassfish (jsp-2.1-6.1.14.jar), 
-Jersey from Glassfish (jersey-client-1.13.jar, jersey-core-1.13.jar,
-jersey-json-1.13.jar, jersey-multipart-1.13.jar) and JSP2.1 Jasper 
-implementation from Glassfish (jsp-2.1-6.1.14.jar),whirr-core-0.7.1.jar, whirr-hadoop-0.7.1.jar:
- 
-NOTE: jersey is dual licensed (http://jersey.java.net/CDDL+GPL.html), 
-Apahce Airavata elects to include jersey in this distribution under the
-[CDDLv_1.0] license.
-
-    COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-
-    1. Definitions.
-
-    1.1. Contributor means each individual or entity that creates or
-    contributes to the creation of Modifications.
-
-    1.2. Contributor Version means the combination of the Original Software,
-    prior Modifications used by a Contributor (if any), and the Modifications
-    made by that particular Contributor.
-
-    1.3. Covered Software means (a) the Original Software, or
-    (b) Modifications, or (c) the combination of files containing Original
-    Software with files containing Modifications, in each case including
-    portions thereof.
-
-    1.4. Executable means the Covered Software in any form other than Source
-    Code.
-
-    1.5. Initial Developer means the individual or entity that first makes
-    Original Software available under this License.
-
-    1.6. Larger Work means a work which combines Covered Software or portions
-    thereof with code not governed by the terms of this License.
-
-    1.7. License means this document.
-
-    1.8. Licensable means having the right to grant, to the maximum extent
-    possible, whether at the time of the initial grant or subsequently
-    acquired, any and all of the rights conveyed herein.
-
-    1.9. Modifications means the Source Code and Executable form of any of
-    the following: A. Any file that results from an addition to, deletion
-    from or modification of the contents of a file containing Original
-    Software or previous Modifications; B. Any new file that contains any
-    part of the Original Software or previous Modification; or C. Any new
-    file that is contributed or otherwise made available under the terms of
-    this License.
-
-    1.10. Original Software means the Source Code and Executable form of
-    computer software code that is originally released under this License.
-
-    1.11. Patent Claims means any patent claim(s), now owned or hereafter
-    acquired, including without limitation, method, process, and apparatus
-    claims, in any patent Licensable by grantor.
-
-    1.12. Source Code means (a) the common form of computer software code in
-    which modifications are made and (b) associated documentation included in
-    or with such code.
-
-    1.13. You (or Your) means an individual or a legal entity exercising
-    rights under, and complying with all of the terms of, this License. For
-    legal entities, You includes any entity which controls, is controlled by,
-    or is under common control with You. For purposes of this definition,
-    control means (a) the power, direct or indirect, to cause the direction
-    or management of such entity, whether by contract or otherwise, or
-    (b) ownership of more than fifty percent (50%) of the outstanding shares
-    or beneficial ownership of such entity.
-
-    2. License Grants.
-
-    2.1. The Initial Developer Grant. Conditioned upon Your compliance with
-    Section 3.1 below and subject to third party intellectual property
-    claims, the Initial Developer hereby grants You a world-wide,
-    royalty-free, non-exclusive license:
-
-    (a) under intellectual property rights (other than patent or trademark)
-        Licensable by Initial Developer, to use, reproduce, modify, display,
-        perform, sublicense and distribute the Original Software (or portions
-        thereof), with or without Modifications, and/or as part of a Larger
-        Work; and
-
-    (b) under Patent Claims infringed by the making, using or selling of
-        Original Software, to make, have made, use, practice, sell, and offer
-        for sale, and/or otherwise dispose of the Original Software (or
-        portions thereof);
-
-    (c) The licenses granted in Sections 2.1(a) and (b) are effective on the
-        date Initial Developer first distributes or otherwise makes the
-        Original Software available to a third party under the terms of
-        this License;
-
-    (d) Notwithstanding Section 2.1(b) above, no patent license is granted:
-        (1) for code that You delete from the Original Software, or (2) for
-        infringements caused by: (i) the modification of the Original
-        Software, or (ii) the combination of the Original Software with other
-        software or devices.
-
-    2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1
-    below and subject to third party intellectual property claims, each
-    Contributor hereby grants You a world-wide, royalty-free, non-exclusive
-    license:
-
-    (a) under intellectual property rights (other than patent or trademark)
-        Licensable by Contributor to use, reproduce, modify, display, perform,
-        sublicense and distribute the Modifications created by such
-        Contributor (or portions thereof), either on an unmodified basis,
-        with other Modifications, as Covered Software and/or as part of a
-        Larger Work; and
-
-    (b) under Patent Claims infringed by the making, using, or selling of
-        Modifications made by that Contributor either alone and/or in
-        combination with its Contributor Version (or portions of such
-        combination), to make, use, sell, offer for sale, have made, and/or
-        otherwise dispose of: (1) Modifications made by that Contributor (or
-        portions thereof); and (2) the combination of Modifications made by
-        that Contributor with its Contributor Version (or portions of such
-        combination).
-
-    (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on
-        the date Contributor first distributes or otherwise makes the
-        Modifications available to a third party.
-
-    (d) Notwithstanding Section 2.2(b) above, no patent license is granted:
-        (1) for any code that Contributor has deleted from the Contributor
-        Version; (2) for infringements caused by: (i) third party
-        modifications of Contributor Version, or (ii) the combination of
-        Modifications made by that Contributor with other software (except
-        as part of the Contributor Version) or other devices; or (3) under
-        Patent Claims infringed by Covered Software in the absence of
-        Modifications made by that Contributor.
-
-    3. Distribution Obligations.
-
-    3.1. Availability of Source Code. Any Covered Software that You distribute
-    or otherwise make available in Executable form must also be made available
-    in Source Code form and that Source Code form must be distributed only
-    under the terms of this License. You must include a copy of this License
-    with every copy of the Source Code form of the Covered Software You
-    distribute or otherwise make available. You must inform recipients of any
-    such Covered Software in Executable form as to how they can obtain such
-    Covered Software in Source Code form in a reasonable manner on or through
-    a medium customarily used for software exchange.
-
-    3.2. Modifications. The Modifications that You create or to which You
-    contribute are governed by the terms of this License. You represent that
-    You believe Your Modifications are Your original creation(s) and/or You
-    have sufficient rights to grant the rights conveyed by this License.
-
-    3.3. Required Notices. You must include a notice in each of Your
-    Modifications that identifies You as the Contributor of the Modification.
-    You may not remove or alter any copyright, patent or trademark notices
-    contained within the Covered Software, or any notices of licensing or any
-    descriptive text giving attribution to any Contributor or the Initial
-    Developer.
-
-    3.4. Application of Additional Terms. You may not offer or impose any
-    terms on any Covered Software in Source Code form that alters or restricts
-    the applicable version of this License or the recipients rights hereunder.
-    You may choose to offer, and to charge a fee for, warranty, support,
-    indemnity or liability obligations to one or more recipients of Covered
-    Software. However, you may do so only on Your own behalf, and not on
-    behalf of the Initial Developer or any Contributor. You must make it
-    absolutely clear that any such warranty, support, indemnity or liability
-    obligation is offered by You alone, and You hereby agree to indemnify the
-    Initial Developer and every Contributor for any liability incurred by the
-    Initial Developer or such Contributor as a result of warranty, support,
-    indemnity or liability terms You offer.
-
-    3.5. Distribution of Executable Versions. You may distribute the
-    Executable form of the Covered Software under the terms of this License or
-    under the terms of a license of Your choice, which may contain terms
-    different from this License, provided that You are in compliance with the
-    terms of this License and that the license for the Executable form does
-    not attempt to limit or alter the recipients rights in the Source Code
-    form from the rights set forth in this License. If You distribute the
-    Covered Software in Executable form under a different license, You must
-    make it absolutely clear that any terms which differ from this License
-    are offered by You alone, not by the Initial Developer or Contributor.
-    You hereby agree to indemnify the Initial Developer and every Contributor
-    for any liability incurred by the Initial Developer or such Contributor as
-    a result of any such terms You offer.
-
-    3.6. Larger Works. You may create a Larger Work by combining Covered
-    Software with other code not governed by the terms of this License and
-    distribute the Larger Work as a single product. In such a case, You must
-    make sure the requirements of this License are fulfilled for the Covered
-    Software.
-
-    4. Versions of the License.
-
-    4.1. New Versions. Sun Microsystems, Inc. is the initial license steward
-    and may publish revised and/or new versions of this License from time to
-    time. Each version will be given a distinguishing version number. Except
-    as provided in Section 4.3, no one other than the license steward has the
-    right to modify this License.
-
-    4.2. Effect of New Versions. You may always continue to use, distribute
-    or otherwise make the Covered Software available under the terms of the
-    version of the License under which You originally received the Covered
-    Software. If the Initial Developer includes a notice in the Original
-    Software prohibiting it from being distributed or otherwise made
-    available under any subsequent version of the License, You must
-    distribute and make the Covered Software available under the terms of
-    the version of the License under which You originally received the
-    Covered Software. Otherwise, You may also choose to use, distribute or
-    otherwise make the Covered Software available under the terms of any
-    subsequent version of the License published by the license steward.
-
-    4.3. Modified Versions. When You are an Initial Developer and You want
-    to create a new license for Your Original Software, You may create and
-    use a modified version of this License if You: (a) rename the license and
-    remove any references to the name of the license steward (except to note
-    that the license differs from this License); and (b) otherwise make it
-    clear that the license contains terms which differ from this License.
-
-    5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE
-    ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
-    IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED
-    SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
-    OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
-    THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE
-    DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER
-    CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR
-    CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF
-    THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER
-    EXCEPT UNDER THIS DISCLAIMER.
-
-    6. TERMINATION.
-
-    6.1. This License and the rights granted hereunder will terminate
-    automatically if You fail to comply with terms herein and fail to cure
-    such breach within 30 days of becoming aware of the breach. Provisions
-    which, by their nature, must remain in effect beyond the termination of
-    this License shall survive.
-
-    6.2. If You assert a patent infringement claim (excluding declaratory
-    judgment actions) against Initial Developer or a Contributor (the Initial
-    Developer or Contributor against whom You assert such claim is referred
-    to as Participant) alleging that the Participant Software (meaning the
-    Contributor Version where the Participant is a Contributor or the
-    Original Software where the Participant is the Initial Developer)
-    directly or indirectly infringes any patent, then any and all rights
-    granted directly or indirectly to You by such Participant, the Initial
-    Developer (if the Initial Developer is not the Participant) and all
-    Contributors under Sections 2.1 and/or 2.2 of this License shall, upon
-    60 days notice from Participant terminate prospectively and automatically
-    at the expiration of such 60 day notice period, unless if within such
-    60 day period You withdraw Your claim with respect to the Participant
-    Software against such Participant either unilaterally or pursuant to a
-    written agreement with Participant.
-
-    6.3. In the event of termination under Sections 6.1 or 6.2 above, all end
-    user licenses that have been validly granted by You or any distributor
-    hereunder prior to termination (excluding licenses granted to You by any
-    distributor) shall survive termination.
-
-    7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL
-    THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL
-    YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
-    COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY
-    PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF
-    ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS,
-    LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY
-    AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE
-    BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
-    LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
-    RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW
-    PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
-    OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION
-    AND LIMITATION MAY NOT APPLY TO YOU.
-
-    8. U.S. GOVERNMENT END USERS. The Covered Software is a commercial item,
-    as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of
-    commercial computer software (as that term is defined at 48 C.F.R.
-    252.227-7014(a)(1)) and commercial computer software documentation as such
-    terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R.
-    12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S.
-    Government End Users acquire Covered Software with only those rights set
-    forth herein. This U.S. Government Rights clause is in lieu of, and
-    supersedes, any other FAR, DFAR, or other clause or provision that
-    addresses Government rights in computer software under this License.
-
-    9. MISCELLANEOUS. This License represents the complete agreement
-    concerning subject matter hereof. If any provision of this License is
-    held to be unenforceable, such provision shall be reformed only to the
-    extent necessary to make it enforceable. This License shall be governed
-    by the law of the jurisdiction specified in a notice contained within
-    the Original Software (except to the extent applicable law, if any,
-    provides otherwise), excluding such jurisdictions conflict-of-law
-    provisions. Any litigation relating to this License shall be subject to
-    the jurisdiction of the courts located in the jurisdiction and venue
-    specified in a notice contained within the Original Software, with the
-    losing party responsible for costs, including, without limitation, court
-    costs and reasonable attorneys fees and expenses. The application of the
-    United Nations Convention on Contracts for the International Sale of
-    Goods is expressly excluded. Any law or regulation which provides that
-    the language of a contract shall be construed against the drafter shall
-    not apply to this License. You agree that You alone are responsible for
-    compliance with the United States export administration regulations (and
-    the export control laws and regulation of any other countries) when You
-    use, distribute or otherwise make available any Covered Software.
-
-    10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the
-    Contributors, each party is responsible for claims and damages arising,
-    directly or indirectly, out of its utilization of rights under this
-    License and You agree to work with Initial Developer and Contributors
-    to distribute such responsibility on an equitable basis. Nothing herein
-    is intended or shall be deemed to constitute any admission of liability.
-
-    NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION
-    LICENSE (CDDL) The code released under the CDDL shall be governed by the
-    laws of the State of California (excluding conflict-of-law provisions).
-    Any litigation relating to this License shall be subject to the
-    jurisdiction of the Federal Courts of the Northern District of California
-    and the state courts of the State of California, with venue lying in
-    Santa Clara County, California.
-
-
-==============================================================================
-
-For: jaxb-xjc-2.1.7.jar
-    Containing Project URL: 
-
-Copyright (c) 2004 Kohsuke Kawaguchi
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom
-the Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall
-be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
-OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-=============================================================================== 
-The following components are BSD Licensed 
-=============================================================================== 
-
-For jibx-bind-1.2.1.jar,jibx-run-1.2.1.jar, antlr-2.7.7.jar,hamcrest-all-1.1.jar,whirr-core-0.7.1.jar, whirr-hadoop-0.7.1.jar:
-    Containing Project URL: http://jibx.sourceforge.net, http://www.antlr.org/
-
-Copyright (c) 2003-2007, Dennis M. Sosnoski
-All rights reserved.
-
-Copyright (c) 2010 Terence Parr
-All rights reserved.
-
-[The BSD License]
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
- * Neither the name of JiBX nor the names of its contributors may be used
-   to endorse or promote products derived from this software without specific
-   prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-==============================================================================
-
-For YFilter:
-    Containing Project URL: http://yfilter.cs.umass.edu/
-
-YFilter 1.0 COPYRIGHT, LICENSE and DISCLAIMER
-
-Copyright (c) 2002, 2004, Regents of the University of California All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are
-permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice, this
-    list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice, this
-    list of conditions and the following disclaimer in the documentation and/or other
-    materials provided with the distribution.
-    * Neither the name of the University of California at Berkeley nor the names of
-    its contributors may be used to endorse or promote products derived from this
-    software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
-SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
-OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-==========================================================================================
-For jaxen-1.1.1.jar:
-    Containing Project URL: http://jaxen.codehaus.org/
-
- Copyright 2003-2006 The Werken Company. All Rights Reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
-  * Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-
-  * Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-
-  * Neither the name of the Jaxen Project nor the names of its
-    contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-=============================================================================== 
-The following components are CPL Licensed 
-=============================================================================== 
-
-For wsdl4j-1.6.2.jar:
-    Containing Project URL: http://sourceforge.net/projects/wsdl4j/
-
-Common Public License Version 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-1. DEFINITIONS
-"Contribution" means:
-a) in the case of the initial Contributor, the initial code and
documentation distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-i) changes to the Program, and
-ii) additions to the Program;
-where such changes and/or additions to the Program originate from and are
distributed by that particular Contributor. A Contribution 'originates' from a
Contributor if it was added to the Program by such Contributor itself or anyone
acting on such Contributor's behalf. Contributions do not include additions to
the Program which: (i) are separate modules of software distributed in
conjunction with the Program under their own license agreement, and (ii) are not
derivative works of the Program.
-"Contributor" means any person or entity that distributes the Program.
-"Licensed Patents " mean patent claims licensable by a Contributor which are
necessarily infringed by the use or sale of its Contribution alone or when
combined with the Program.
-"Program" means the Contributions distributed in accordance with this Agreement.
-"Recipient" means anyone who receives the Program under this Agreement,
including all Contributors.
-2. GRANT OF RIGHTS
-a) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free copyright license to
reproduce, prepare derivative works of, publicly display, publicly perform,
distribute and sublicense the Contribution of such Contributor, if any, and such
derivative works, in source code and object code form.
-b) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
Patents to make, use, sell, offer to sell, import and otherwise transfer the
Contribution of such Contributor, if any, in source code and object code form.
This patent license shall apply to the combination of the Contribution and the
Program if, at the time the Contribution is added by the Contributor, such
addition of the Contribution causes such combination to be covered by the
Licensed Patents. The patent license shall not apply to any other combinations
which include the Contribution. No hardware per se is licensed hereunder.
-c) Recipient understands that although each Contributor grants the licenses
to its Contributions set forth herein, no assurances are provided by any
Contributor that the Program does not infringe the patent or other intellectual
property rights of any other entity. Each Contributor disclaims any liability to
Recipient for claims brought by any other entity based on infringement of
intellectual property rights or otherwise. As a condition to exercising the
rights and licenses granted hereunder, each Recipient hereby assumes sole
responsibility to secure any other intellectual property rights needed, if any.
For example, if a third party patent license is required to allow Recipient to
distribute the Program, it is Recipient's responsibility to acquire that license
before distributing the Program.
-d) Each Contributor represents that to its knowledge it has sufficient
copyright rights in its Contribution, if any, to grant the copyright license set
forth in this Agreement.
-3. REQUIREMENTS
-A Contributor may choose to distribute the Program in object code form under its
own license agreement, provided that:
-a) it complies with the terms and conditions of this Agreement; and
-b) its license agreement:
-i) effectively disclaims on behalf of all Contributors all warranties and
conditions, express and implied, including warranties or conditions of title and
non-infringement, and implied warranties or conditions of merchantability and
fitness for a particular purpose;
-ii) effectively excludes on behalf of all Contributors all liability for
damages, including direct, indirect, special, incidental and consequential
damages, such as lost profits;
-iii) states that any provisions which differ from this Agreement are offered
by that Contributor alone and not by any other party; and
-iv) states that source code for the Program is available from such
Contributor, and informs licensees how to obtain it in a reasonable manner on or
through a medium customarily used for software exchange.
-When the Program is made available in source code form:
-a) it must be made available under this Agreement; and
-b) a copy of this Agreement must be included with each copy of the Program.
-Contributors may not remove or alter any copyright notices contained within the
Program.
-Each Contributor must identify itself as the originator of its Contribution, if
any, in a manner that reasonably allows subsequent Recipients to identify the
originator of the Contribution.
-4. COMMERCIAL DISTRIBUTION
-Commercial distributors of software may accept certain responsibilities with
respect to end users, business partners and the like. While this license is
intended to facilitate the commercial use of the Program, the Contributor who
includes the Program in a commercial product offering should do so in a manner
which does not create potential liability for other Contributors. Therefore, if
a Contributor includes the Program in a commercial product offering, such
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
every other Contributor ("Indemnified Contributor") against any losses, damages
and costs (collectively "Losses") arising from claims, lawsuits and other legal
actions brought by a third party against the Indemnified Contributor to the
extent caused by the acts or omissions of such Commercial Contributor in
connection with its distribution of the Program in a commercial product
offering. The obligations in this section do not apply to any claims or Losses
relating to any actual or alleged intellectual property infringement. In order
to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
Contributor in writing of such claim, and b) allow the Commercial Contributor to
control, and cooperate with the Commercial Contributor in, the defense and any
related settlement negotiations. The Indemnified Contributor may participate in
any such claim at its own expense.
-For example, a Contributor might include the Program in a commercial product
offering, Product X. That Contributor is then a Commercial Contributor. If that
Commercial Contributor then makes performance claims, or offers warranties
related to Product X, those performance claims and warranties are such
Commercial Contributor's responsibility alone. Under this section, the
Commercial Contributor would have to defend claims against the other
Contributors related to those performance claims and warranties, and if a court
requires any other Contributor to pay any damages as a result, the Commercial
Contributor must pay those damages.
-5. NO WARRANTY
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
Recipient is solely responsible for determining the appropriateness of using and
distributing the Program and assumes all risks associated with its exercise of
rights under this Agreement, including but not limited to the risks and costs of
program errors, compliance with applicable laws, damage to or loss of data,
programs or equipment, and unavailability or interruption of operations.
-6. DISCLAIMER OF LIABILITY
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-7. GENERAL
-If any provision of this Agreement is invalid or unenforceable under applicable
law, it shall not affect the validity or enforceability of the remainder of the
terms of this Agreement, and without further action by the parties hereto, such
provision shall be reformed to the minimum extent necessary to make such
provision valid and enforceable.
-If Recipient institutes patent litigation against a Contributor with respect to
a patent applicable to software (including a cross-claim or counterclaim in a
lawsuit), then any patent licenses granted by that Contributor to such Recipient
under this Agreement shall terminate as of the date such litigation is filed. In
addition, if Recipient institutes patent litigation against any entity
(including a cross-claim or counterclaim in a lawsuit) alleging that the Program
itself (excluding combinations of the Program with other software or hardware)
infringes such Recipient's patent(s), then such Recipient's rights granted under
Section 2(b) shall terminate as of the date such litigation is filed.
-All Recipient's rights under this Agreement shall terminate if it fails to
comply with any of the material terms or conditions of this Agreement and does
not cure such failure in a reasonable period of time after becoming aware of
such noncompliance. If all Recipient's rights under this Agreement terminate,
Recipient agrees to cease use and distribution of the Program as soon as
reasonably practicable. However, Recipient's obligations under this Agreement
and any licenses granted by Recipient relating to the Program shall continue and
survive.
-Everyone is permitted to copy and distribute copies of this Agreement, but in
order to avoid inconsistency the Agreement is copyrighted and may only be
modified in the following manner. The Agreement Steward reserves the right to
publish new versions (including revisions) of this Agreement from time to time.
No one other than the Agreement Steward has the right to modify this Agreement.
IBM is the initial Agreement Steward. IBM may assign the responsibility to serve
as the Agreement Steward to a suitable separate entity. Each new version of the
Agreement will be given a distinguishing version number. The Program (including
Contributions) may always be distributed subject to the version of the Agreement
under which it was received. In addition, after a new version of the Agreement
is published, Contributor may elect to distribute the Program (including its
Contributions) under the new version. Except as expressly stated in Sections
2(a) and 2(b) above, Recipient receives no rights or licenses to the
intellectual property of any Contributor under this Agreement, whether
expressly, by implication, estoppel or otherwise. All rights in the Program not
expressly granted under this Agreement are reserved.
-This Agreement is governed by the laws of the State of New York and the
intellectual property laws of the United States of America. No party to this
Agreement will bring a legal action under this Agreement more than one year
after the cause of action arose. Each party waives its rights to a jury trial in
any resulting litigation.
-
-==========================================================================================
-==========================================================================================
-
-For puretls:
-    Containing Project URL: 
-
-  This package is a SSLv3/TLS implementation written by Eric Rescorla
-   <ekr\@rtfm.com> and licensed by Claymore Systems, Inc.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions
-   are met:
-   1. Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-   2. Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-   3. Neither the name of Claymore Systems, Inc. nor the name of Eric
-      Rescorla may be used to endorse or promote products derived from this
-      software without specific prior written permission.
-   THIS SOFTWARE IS PROVIDED BY CLAYMORE SYSTEMS AND CONTRIBUTORS ``AS IS'' AND
-   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-   ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-   SUCH DAMAGE.
-
-==============================================================================
-
-For xml-api,woden-api-1.0M8.jar,woden-impl-dom-1.0M8.jar:
-    Containing Project URL: 
-
-For the W3C schema and DTD files in the org.apache.woden.resolver package:
-
-W3C® DOCUMENT LICENSE
-http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231
-
-Public documents on the W3C site are provided by the copyright holders under
-the following license. By using and/or copying this document, or the W3C
-document from which this statement is linked, you (the licensee) agree that
-you have read, understood, and will comply with the following terms and
-conditions:
-
-Permission to copy, and distribute the contents of this document, or the W3C
-document from which this statement is linked, in any medium for any purpose
-and without fee or royalty is hereby granted, provided that you include the
-following on ALL copies of the document, or portions thereof, that you use:
-
-  1. A link or URL to the original W3C document.
-  2. The pre-existing copyright notice of the original author, or if it
-     doesn't exist, a notice (hypertext is preferred, but a textual
-     representation is permitted) of the form: "Copyright © [$date-of-document]
-     World Wide Web Consortium, (Massachusetts Institute of Technology,
-     European Research Consortium for Informatics and Mathematics, Keio
-     University). All Rights Reserved.
-     http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231"
-  3. If it exists, the STATUS of the W3C document.
-
-When space permits, inclusion of the full text of this NOTICE should be
-provided. We request that authorship attribution be provided in any software,
-documents, or other items or products that you create pursuant to the
-implementation of the contents of this document, or any portion thereof.
-
-No right to create modifications or derivatives of W3C documents is granted
-pursuant to this license. However, if additional requirements (documented in
-the Copyright FAQ) are satisfied, the right to create modifications or
-derivatives is sometimes granted by the W3C to individuals complying with
-those requirements.
-
-THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO
-REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT
-LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
-NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE
-FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT
-INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE
-PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS THEREOF.
-
-The name and trademarks of copyright holders may NOT be used in advertising
-or publicity pertaining to this document or its contents without specific,
-written prior permission. Title to copyright in this document will at all
-times remain with copyright holders.
-
-This formulation of W3C's notice and license became active on December 31 2002. 
-This version removes the copyright ownership notice such that this license can 
-be used with materials other than those owned by the W3C, reflects that ERCIM is 
-now a host of the W3C, includes references to this specific dated version of the 
-license, and removes the ambiguous grant of "use". Otherwise, this version is the 
-same as the previous version and is written so as to preserve the Free Software 
-Foundation's assessment of GPL compatibility and OSI's certification under the 
-Open Source Definition. Please see our Copyright FAQ for common questions about 
-using materials from our site, including specific terms and conditions for packages 
-like libwww, Amaya, and Jigsaw. Other questions about this notice can be directed 
-o site-policy@w3.org.
-
-Joseph Reagle <site-policy@w3.org>
- 
-Last revised $Id: copyright-software-20021231.html,v 1.11 2004/07/06 16:02:49 slesch Exp $ 
-
-==========================================================================================
-
-XML API library, org.w3c classes (xml-apis)
-    Containing Project URL: 
-
-    DOM Java Language Binding:
-    http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/java-binding.html
-
-    W3C IPR SOFTWARE NOTICE
-    Copyright (C) 2000 World Wide Web Consortium, (Massachusetts Institute of
-    Technology, Institut National de Recherche en Informatique et en
-    Automatique, Keio University). All Rights Reserved.
-
-    The DOM bindings are published under the W3C Software Copyright Notice
-    and License. The software license requires "Notice of any changes or
-    modifications to the W3C files, including the date changes were made."
-    Consequently, modified versions of the DOM bindings must document that
-    they do not conform to the W3C standard; in the case of the IDL binding,
-    the pragma prefix can no longer be 'w3c.org'; in the case of the Java
-    binding, the package names can no longer be in the 'org.w3c' package.
-
-    Note: The original version of the W3C Software Copyright Notice and
-    License could be found at
-    http://www.w3.org/Consortium/Legal/copyright-software-19980720
-
-    Copyright (C) 1994-2000 World Wide Web Consortium, (Massachusetts
-    Institute of Technology, Institut National de Recherche en Informatique
-    et en Automatique, Keio University). All Rights Reserved.
-    http://www.w3.org/Consortium/Legal/
-
-    This W3C work (including software, documents, or other related items) is
-    being provided by the copyright holders under the following license. By
-    obtaining, using and/or copying this work, you (the licensee) agree that
-    you have read, understood, and will comply with the following terms and
-    conditions:
-
-    Permission to use, copy, and modify this software and its documentation,
-    with or without modification, for any purpose and without fee or royalty
-    is hereby granted, provided that you include the following on ALL copies
-    of the software and documentation or portions thereof, including
-    modifications, that you make:
-
-      1. The full text of this NOTICE in a location viewable to users of the
-         redistributed or derivative work.
-
-      2. Any pre-existing intellectual property disclaimers, notices, or
-         terms and conditions. If none exist, a short notice of the following
-         form (hypertext is preferred, text is permitted) should be used
-         within the body of any redistributed or derivative code:
-         "Copyright (C) [$date-of-software] World Wide Web Consortium,
-         (Massachusetts Institute of Technology, Institut National de
-         Recherche en Informatique et en Automatique, Keio University).
-         All Rights Reserved. http://www.w3.org/Consortium/Legal/"
-
-      3. Notice of any changes or modifications to the W3C files, including
-         the date changes were made. (We recommend you provide URIs to the
-         location from which the code is derived.)
-
-    THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
-    MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
-    NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
-    PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
-    ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-
-    COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL
-    OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
-    DOCUMENTATION.
-
-    The name and trademarks of copyright holders may NOT be used in
-    advertising or publicity pertaining to the software without specific,
-    written prior permission. Title to copyright in this software and any
-    associated documentation will at all times remain with copyright holders.
-
-=============================================================================== 
-The following components come under the Eclipse Public 1.0 License 
-=============================================================================== 
-Eclipse JDT Core (core-3.1.1.jar)
-
-  Eclipse Public License - v 1.0
-
-    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
-    PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
-    THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-    1. DEFINITIONS
-
-    "Contribution" means:
-
-    a) in the case of the initial Contributor, the initial code and
-       documentation distributed under this Agreement, and
-
-    b) in the case of each subsequent Contributor:
-
-       i) changes to the Program, and
-
-       ii) additions to the Program;
-
-       where such changes and/or additions to the Program originate from and
-       are distributed by that particular Contributor. A Contribution
-       'originates' from a Contributor if it was added to the Program by
-       such Contributor itself or anyone acting on such Contributor's behalf.
-       Contributions do not include additions to the Program which: (i) are
-       separate modules of software distributed in conjunction with the
-       Program under their own license agreement, and (ii) are not derivative
-       works of the Program.
-
-    "Contributor" means any person or entity that distributes the Program.
-
-    "Licensed Patents " mean patent claims licensable by a Contributor which
-    are necessarily infringed by the use or sale of its Contribution alone or
-    when combined with the Program.
-
-    "Program" means the Contributions distributed in accordance with this
-    Agreement.
-
-    "Recipient" means anyone who receives the Program under this Agreement,
-    including all Contributors.
-
-    2. GRANT OF RIGHTS
-
-    a) Subject to the terms of this Agreement, each Contributor hereby grants
-       Recipient a non-exclusive, worldwide, royalty-free copyright license to
-       reproduce, prepare derivative works of, publicly display, publicly
-       perform, distribute and sublicense the Contribution of such
-       Contributor, if any, and such derivative works, in source code and
-       object code form.
-
-    b) Subject to the terms of this Agreement, each Contributor hereby grants
-       Recipient a non-exclusive, worldwide, royalty-free patent license under
-       Licensed Patents to make, use, sell, offer to sell, import and
-       otherwise transfer the Contribution of such Contributor, if any, in
-       source code and object code form. This patent license shall apply to
-       the combination of the Contribution and the Program if, at the time
-       the Contribution is added by the Contributor, such addition of the
-       Contribution causes such combination to be covered by the Licensed
-       Patents. The patent license shall not apply to any other combinations
-       which include the Contribution. No hardware per se is licensed hereunder.
-
-    c) Recipient understands that although each Contributor grants the
-       licenses to its Contributions set forth herein, no assurances are
-       provided by any Contributor that the Program does not infringe the
-       patent or other intellectual property rights of any other entity. Each
-       Contributor disclaims any liability to Recipient for claims brought by
-       any other entity based on infringement of intellectual property rights
-       or otherwise. As a condition to exercising the rights and licenses
-       granted hereunder, each Recipient hereby assumes sole responsibility
-       to secure any other intellectual property rights needed, if any. For
-       example, if a third party patent license is required to allow Recipient
-       to distribute the Program, it is Recipient's responsibility to acquire
-       that license before distributing the Program.
-
-    d) Each Contributor represents that to its knowledge it has sufficient
-       copyright rights in its Contribution, if any, to grant the copyright
-       license set forth in this Agreement.
-
-    3. REQUIREMENTS
-
-    A Contributor may choose to distribute the Program in object code form
-    under its own license agreement, provided that:
-
-    a) it complies with the terms and conditions of this Agreement; and
-
-    b) its license agreement:
-
-       i)   effectively disclaims on behalf of all Contributors all warranties
-            and conditions, express and implied, including warranties or
-            conditions of title and non-infringement, and implied warranties
-            or conditions of merchantability and fitness for a particular
-            purpose;
-
-       ii)  effectively excludes on behalf of all Contributors all liability
-            for damages, including direct, indirect, special, incidental and
-            consequential damages, such as lost profits;
-
-       iii) states that any provisions which differ from this Agreement are
-            offered by that Contributor alone and not by any other party; and
-
-       iv)  states that source code for the Program is available from such
-            Contributor, and informs licensees how to obtain it in a
-            reasonable manner on or through a medium customarily used for
-            software exchange.
-
-    When the Program is made available in source code form:
-
-    a) it must be made available under this Agreement; and
-
-    b) a copy of this Agreement must be included with each copy of the
-       Program.
-
-    Contributors may not remove or alter any copyright notices contained
-    within the Program.
-
-    Each Contributor must identify itself as the originator of its
-    Contribution, if any, in a manner that reasonably allows subsequent
-    Recipients to identify the originator of the Contribution.
-
-    4. COMMERCIAL DISTRIBUTION
-
-    Commercial distributors of software may accept certain responsibilities
-    with respect to end users, business partners and the like. While this
-    license is intended to facilitate the commercial use of the Program,
-    the Contributor who includes the Program in a commercial product offering
-    should do so in a manner which does not create potential liability for
-    other Contributors. Therefore, if a Contributor includes the Program in
-    a commercial product offering, such Contributor ("Commercial Contributor")
-    hereby agrees to defend and indemnify every other Contributor
-    ("Indemnified Contributor") against any losses, damages and costs
-    (collectively "Losses") arising from claims, lawsuits and other legal
-    actions brought by a third party against the Indemnified Contributor to
-    the extent caused by the acts or omissions of such Commercial Contributor
-    in connection with its distribution of the Program in a commercial
-    product offering. The obligations in this section do not apply to any
-    claims or Losses relating to any actual or alleged intellectual property
-    infringement. In order to qualify, an Indemnified Contributor must:
-    a) promptly notify the Commercial Contributor in writing of such claim,
-    and b) allow the Commercial Contributor to control, and cooperate with
-    the Commercial Contributor in, the defense and any related settlement
-    negotiations. The Indemnified Contributor may participate in any such
-    claim at its own expense.
-
-    For example, a Contributor might include the Program in a commercial
-    product offering, Product X. That Contributor is then a Commercial
-    Contributor. If that Commercial Contributor then makes performance claims,
-    or offers warranties related to Product X, those performance claims and
-    warranties are such Commercial Contributor's responsibility alone. Under
-    this section, the Commercial Contributor would have to defend claims
-    against the other Contributors related to those performance claims and
-    warranties, and if a court requires any other Contributor to pay any
-    damages as a result, the Commercial Contributor must pay those damages.
-
-    5. NO WARRANTY
-
-    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
-    ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
-    EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
-    CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A
-    PARTICULAR PURPOSE. Each Recipient is solely responsible for determining
-    the appropriateness of using and distributing the Program and assumes all
-    risks associated with its exercise of rights under this Agreement ,
-    including but not limited to the risks and costs of program errors,
-    compliance with applicable laws, damage to or loss of data, programs or
-    equipment, and unavailability or interruption of operations.
-
-    6. DISCLAIMER OF LIABILITY
-
-    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
-    ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
-    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
-    WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
-    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
-    DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
-    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-    7. GENERAL
-
-    If any provision of this Agreement is invalid or unenforceable under
-    applicable law, it shall not affect the validity or enforceability of
-    the remainder of the terms of this Agreement, and without further action
-    by the parties hereto, such provision shall be reformed to the minimum
-    extent necessary to make such provision valid and enforceable.
-
-    If Recipient institutes patent litigation against any entity (including
-    a cross-claim or counterclaim in a lawsuit) alleging that the Program
-    itself (excluding combinations of the Program with other software or
-    hardware) infringes such Recipient's patent(s), then such Recipient's
-    rights granted under Section 2(b) shall terminate as of the date such
-    litigation is filed.
-
-    All Recipient's rights under this Agreement shall terminate if it fails
-    to comply with any of the material terms or conditions of this Agreement
-    and does not cure such failure in a reasonable period of time after
-    becoming aware of such noncompliance. If all Recipient's rights under
-    this Agreement terminate, Recipient agrees to cease use and distribution
-    of the Program as soon as reasonably practicable. However, Recipient's
-    obligations under this Agreement and any licenses granted by Recipient
-    relating to the Program shall continue and survive.
-
-    Everyone is permitted to copy and distribute copies of this Agreement,
-    but in order to avoid inconsistency the Agreement is copyrighted and may
-    only be modified in the following manner. The Agreement Steward reserves
-    the right to publish new versions (including revisions) of this Agreement
-    from time to time. No one other than the Agreement Steward has the right
-    to modify this Agreement. The Eclipse Foundation is the initial Agreement
-    Steward. The Eclipse Foundation may assign the responsibility to serve as
-    the Agreement Steward to a suitable separate entity. Each new version of
-    the Agreement will be given a distinguishing version number. The Program
-    (including Contributions) may always be distributed subject to the version
-    of the Agreement under which it was received. In addition, after a new
-    version of the Agreement is published, Contributor may elect to distribute
-    the Program (including its Contributions) under the new version. Except as
-    expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
-    rights or licenses to the intellectual property of any Contributor under
-    this Agreement, whether expressly, by implication, estoppel or otherwise.
-    All rights in the Program not expressly granted under this Agreement
-    are reserved.
-
-    This Agreement is governed by the laws of the State of New York and the
-    intellectual property laws of the United States of America. No party to
-    this Agreement will bring a legal action under this Agreement more than
-    one year after the cause of action arose. Each party waives its rights to
-    a jury trial in any resulting litigation.
-    
-===============================================================================
-
-Logback library (logback-core, logback-classic)
-    Containing Project URL: http://logback.qos.ch/
-
-    Logback: the reliable, generic, fast and flexible logging framework.
-    Copyright (C) 1999-2009, QOS.ch. All rights reserved. 
-
-    This program and the accompanying materials are dual-licensed under
-    either the terms of the Eclipse Public License v1.0 as published by
-    the Eclipse Foundation
-
-      or (per the licensee's choosing)
-
-    under the terms of the GNU Lesser General Public License version 2.1
-    as published by the Free Software Foundation.
-
-=============================================================================== 
-The following components are in the public domain 
-=============================================================================== 
-
-For Sax: http://www.saxproject.org/
-    Containing Project URL: http://www.megginson.com/SAX/
-
-This license came from: http://www.megginson.com/SAX/copying.html
-  However please note future versions of SAX may be covered
-  under http://saxproject.org/?selected=pd
-
-
-This page is now out of date -- see the new SAX site at
-http://www.saxproject.org/ for more up-to-date
-releases and other information. Please change your bookmarks.
-
-
-SAX2 is Free!
-
-I hereby abandon any property rights to SAX 2.0 (the Simple API for
-XML), and release all of the SAX 2.0 source code, compiled code, and
-documentation contained in this distribution into the Public Domain.
-SAX comes with NO WARRANTY or guarantee of fitness for any
-purpose.
-
-David Megginson, david@megginson.com
-2000-05-05
-
-==========================================================================
- 
-Metadata extractor library (metadata-extractor)
-    Containing Project URL: http://www.drewnoakes.com/code/exif/
-
-    This is public domain software - that is, you can do whatever you want
-    with it, and include it software that is licensed under the GNU or the
-    BSD license, or whatever other licence you choose, including proprietary
-    closed source licenses.  I do ask that you leave this header in tact.
-
-    If you make modifications to this code that you think would benefit the
-    wider community, please send me a copy and I'll post it on my site.
-
-    If you make use of this code, I'd appreciate hearing about it.
-      metadata_extractor [at] drewnoakes [dot] com
-    Latest version of this software kept at
-      http://drewnoakes.com/
-
-===============================================================================
-
-Adobe Font Metrics (AFM) for PDF Core 14 Fonts
-    Containing Project URL: 
-
-    This file and the 14 PostScript(R) AFM files it accompanies may be used,
-    copied, and distributed for any purpose and without charge, with or without
-    modification, provided that all copyright notices are retained; that the
-    AFM files are not distributed without this file; that all modifications
-    to this file or any of the AFM files are prominently noted in the modified
-    file(s); and that this paragraph is not modified. Adobe Systems has no
-    responsibility or obligation to support the use of the AFM files. 
-
-CMaps for PDF Fonts (http://www.adobe.com/devnet/font/#pcfi and
-ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/)
-
-    Copyright 1990-2001 Adobe Systems Incorporated.
-    All Rights Reserved.
-
-    Patents Pending
-
-    NOTICE: All information contained herein is the property
-    of Adobe Systems Incorporated.
-
-    Permission is granted for redistribution of this file
-    provided this copyright notice is maintained intact and
-    that the contents of this file are not altered in any
-    way from its original form.
-
-    PostScript and Display PostScript are trademarks of
-    Adobe Systems Incorporated which may be registered in
-    certain jurisdictions.
-
-================================================================================
-
-Glyphlist (http://www.adobe.com/devnet/opentype/archives/glyph.html)
-    Containing Project URL: 
-
-    Copyright (c) 1997,1998,2002,2007 Adobe Systems Incorporated
-
-    Permission is hereby granted, free of charge, to any person obtaining a
-    copy of this documentation file to use, copy, publish, distribute,
-    sublicense, and/or sell copies of the documentation, and to permit
-    others to do the same, provided that:
-    - No modification, editing or other alteration of this document is
-    allowed; and
-    - The above copyright notice and this permission notice shall be
-    included in all copies of the documentation.
- 
-    Permission is hereby granted, free of charge, to any person obtaining a
-    copy of this documentation file, to create their own derivative works
-    from the content of this document to use, copy, publish, distribute,
-    sublicense, and/or sell the derivative works, and to permit others to do
-    the same, provided that the derived work is not represented as being a
-    copy or version of this document.
- 
-    Adobe shall not be liable to any party for any loss of revenue or profit
-    or for indirect, incidental, special, consequential, or other similar
-    damages, whether based on tort (including without limitation negligence
-    or strict liability), contract or other legal or equitable grounds even
-    if Adobe has been advised or had reason to know of the possibility of
-    such damages. The Adobe materials are provided on an "AS IS" basis.
-    Adobe specifically disclaims all express, statutory, or implied
-    warranties relating to the Adobe materials, including but not limited to
-    those concerning merchantability or fitness for a particular purpose or
-    non-infringement of any third party rights regarding the Adobe
-    materials.
-
-================================================================================
-
-MIME type information from file-4.26.tar.gz (http://www.darwinsys.com/file/)
-    Containing Project URL: 
-
-    Copyright (c) Ian F. Darwin 1986, 1987, 1989, 1990, 1991, 1992, 1994, 1995.
-    Software written by Ian F. Darwin and others;
-    maintained 1994- Christos Zoulas.
-
-    This software is not subject to any export provision of the United States
-    Department of Commerce, and may be exported to any country or planet.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions
-    are met:
-    1. Redistributions of source code must retain the above copyright
-       notice immediately at the beginning of the file, without modification,
-       this list of conditions, and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-       notice, this list of conditions and the following disclaimer in the
-       documentation and/or other materials provided with the distribution.
-
-    THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-    ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
-    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-    SUCH DAMAGE.
-
-================================================================================
-
-Concurrent library (concurrent-1.3.4.jar)
-    Containing Project URL: 
-    http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html 
-
-    All classes are released to the public domain and may be used for any
-    purpose whatsoever without permission or acknowledgment. Portions of
-    the CopyOnWriteArrayList and ConcurrentReaderHashMap classes are adapted
-    from Sun JDK source code. These are copyright of Sun Microsystems, Inc,
-    and are used with their kind permission, as described in this license:
-
-    TECHNOLOGY LICENSE FROM SUN MICROSYSTEMS, INC. TO DOUG LEA
-
-    Whereas Doug Lea desires to utlized certain Java Software technologies
-    in the util.concurrent technology; and Whereas Sun Microsystems, Inc.
-    ("Sun") desires that Doug Lea utilize certain Java Software technologies
-    in the util.concurrent technology;
-
-    Therefore the parties agree as follows, effective May 31, 2002:
-
-    "Java Software technologies" means
-
-        classes/java/util/ArrayList.java, and
-        classes/java/util/HashMap.java.
-
-    The Java Software technologies are Copyright (c) 1994-2000 Sun
-    Microsystems, Inc. All rights reserved.
-
-    Sun hereby grants Doug Lea a non-exclusive, worldwide, non-transferrable
-    license to use, reproduce, create derivate works of, and distribute the
-    Java Software and derivative works thereof in source and binary forms
-    as part of a larger work, and to sublicense the right to use, reproduce
-    and distribute the Java Software and Doug Lea's derivative works as the
-    part of larger works through multiple tiers of sublicensees provided that
-    the following conditions are met:
-
-    -Neither the name of or trademarks of Sun may be used to endorse or
-    promote products including or derived from the Java Software technology
-    without specific prior written permission; and
-    -Redistributions of source or binary code must contain the above
-    copyright notice, this notice and and the following disclaimers:
-
-    This software is provided "AS IS," without a warranty of any kind.
-    ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
-    INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
-    MICROSYSTEMS, INC. AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
-    SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
-    THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN MICROSYSTEMS, INC.
-    OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
-    DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
-    HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
-    THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN MICROSYSTEMS, INC.
-    HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-    You acknowledge that Software is not designed,licensed or intended for
-    use in the design, construction, operation or maintenance of any nuclear
-    facility.
-
-=============================================================================
-
-Office Open XML schemas (ooxml-schemas-1.0.jar)
-    Containing Project URL: 
-
-    The Office Open XML schema definitions used by Apache POI are
-    a part of the Office Open XML ECMA Specification (ECMA-376, [1]).
-    As defined in section 9.4 of the ECMA bylaws [2], this specification
-    is available to all interested parties without restriction:
-
-        9.4 All documents when approved shall be made available to
-            all interested parties without restriction.
-
-    Furthermore, both Microsoft and Adobe have granted patent licenses
-    to this work [3,4,5].
-
-    [1] http://www.ecma-international.org/publications/standards/Ecma-376.htm
-    [2] http://www.ecma-international.org/memento/Ecmabylaws.htm
-    [3] http://www.microsoft.com/interop/osp/
-    [4] http://www.ecma-international.org/publications/files/ECMA-ST/Ecma%20PATENT/ECMA-376%20Edition%201%20Microsoft%20Patent%20Declaration.pdf
-    [5] http://www.ecma-international.org/publications/files/ECMA-ST/Ecma%20PATENT/ga-2006-191.pdf
-
-==========================================================================================
-
-Unicode conversion code in Lucene Java (lucene-core)
-
-    Copyright 2001-2004 Unicode, Inc.
-
-    Disclaimer
-
-    This source code is provided as is by Unicode, Inc. No claims are
-    made as to fitness for any particular purpose. No warranties of any
-    kind are expressed or implied. The recipient agrees to determine
-    applicability of information provided. If this file has been
-    purchased on magnetic or optical media from Unicode, Inc., the
-    sole remedy for any claim will be exchange of defective media
-    within 90 days of receipt.
-
-    Limitations on Rights to Redistribute This Code
-
-    Unicode, Inc. hereby grants the right to freely use the information
-    supplied in this file in the creation of products supporting the
-    Unicode Standard, and to make copies of this file in any form
-    for internal or external distribution as long as this notice
-    remains attached.
-
-==========================================================================================
-For jython-2.5.1.jar, Array utility code in Lucene Java (lucene-core):
-    Containing Project URL: http://www.jython.org
-
-    PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
-    --------------------------------------------
-
-1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual
- or Organization ("Licensee") accessing and otherwise using this software ("Jython") in source
-  or binary form and its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a 
-nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display 
-publicly, prepare derivative works, distribute, and otherwise use Jython alone or in any derivative 
-version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., 
-"Copyright (c) 2007 Python Software Foundation; All Rights Reserved" are retained in Jython alone 
-or in any derivative version prepared by Licensee.
-
-3. In the event Licensee prepares a derivative work that is based on or incorporates Jython or any part 
-thereof, and wants to make the derivative work available to others as provided herein, then Licensee 
-hereby agrees to include in any such work a brief summary of the changes made to Jython.
-
-4. PSF is making Jython available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR 
-WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS 
-ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT 
-THE USE OF JYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF JYTHON FOR ANY INCIDENTAL, SPECIAL, 
-OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING JYTHON, 
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
-
-7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, 
-or joint venture between PSF and Licensee. This License Agreement does not grant permission to use
- PSF trademarks or trade name in a trademark sense to endorse or promote products or services of 
- Licensee, or any third party.
-
-8. By copying, installing or otherwise using Jython, Licensee agrees to be bound by the 
-terms and conditions of this License Agreement.
-
-Redistribution and use in source and binary forms, with or without modification, 
-are permitted provided that the following conditions are met:
-
-Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Jython Developers All rights reserved.
-
-Redistributions of source code must retain the above copyright notice, 
-this list of conditions and the following disclaimer.
-Redistributions in binary form must reproduce the above copyright notice, this 
-list of conditions and the following disclaimer in the documentation and/or other 
-materials provided with the distribution.
-Neither the name of the Jython Developers nor the names of its contributors 
-may be used to endorse or promote products derived from this software 
-without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'' 
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY 
-WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-============================================================================
-    
-    BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-    -------------------------------------------
-
-    BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
-
-    1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
-    office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
-    Individual or Organization ("Licensee") accessing and otherwise using
-    this software in source or binary form and its associated
-    documentation ("the Software").
-
-    2. Subject to the terms and conditions of this BeOpen Python License
-    Agreement, BeOpen hereby grants Licensee a non-exclusive,
-    royalty-free, world-wide license to reproduce, analyze, test, perform
-    and/or display publicly, prepare derivative works, distribute, and
-    otherwise use the Software alone or in any derivative version,
-    provided, however, that the BeOpen Python License is retained in the
-    Software, alone or in any derivative version prepared by Licensee.
-
-    3. BeOpen is making the Software available to Licensee on an "AS IS"
-    basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-    IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
-    DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-    FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
-    INFRINGE ANY THIRD PARTY RIGHTS.
-
-    4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
-    SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
-    AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
-    DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-    5. This License Agreement will automatically terminate upon a material
-    breach of its terms and conditions.
-
-    6. This License Agreement shall be governed by and interpreted in all
-    respects by the law of the State of California, excluding conflict of
-    law provisions.  Nothing in this License Agreement shall be deemed to
-    create any relationship of agency, partnership, or joint venture
-    between BeOpen and Licensee.  This License Agreement does not grant
-    permission to use BeOpen trademarks or trade names in a trademark
-    sense to endorse or promote products or services of Licensee, or any
-    third party.  As an exception, the "BeOpen Python" logos available at
-    http://www.pythonlabs.com/logos.html may be used according to the
-    permissions granted on that web page.
-
-    7. By copying, installing or otherwise using the software, Licensee
-    agrees to be bound by the terms and conditions of this License
-    Agreement.
-
-===========================================================================
-    
-    CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
-    ---------------------------------------
-
-    1. This LICENSE AGREEMENT is between the Corporation for National
-    Research Initiatives, having an office at 1895 Preston White Drive,
-    Reston, VA 20191 ("CNRI"), and the Individual or Organization
-    ("Licensee") accessing and otherwise using Python 1.6.1 software in
-    source or binary form and its associated documentation.
-
-    2. Subject to the terms and conditions of this License Agreement, CNRI
-    hereby grants Licensee a nonexclusive, royalty-free, world-wide
-    license to reproduce, analyze, test, perform and/or display publicly,
-    prepare derivative works, distribute, and otherwise use Python 1.6.1
-    alone or in any derivative version, provided, however, that CNRI's
-    License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
-    1995-2001 Corporation for National Research Initiatives; All Rights
-    Reserved" are retained in Python 1.6.1 alone or in any derivative
-    version prepared by Licensee.  Alternately, in lieu of CNRI's License
-    Agreement, Licensee may substitute the following text (omitting the
-    quotes): "Python 1.6.1 is made available subject to the terms and
-    conditions in CNRI's License Agreement.  This Agreement together with
-    Python 1.6.1 may be located on the Internet using the following
-    unique, persistent identifier (known as a handle): 1895.22/1013.  This
-    Agreement may also be obtained from a proxy server on the Internet
-    using the following URL: http://hdl.handle.net/1895.22/1013".
-
-    3. In the event Licensee prepares a derivative work that is based on
-    or incorporates Python 1.6.1 or any part thereof, and wants to make
-    the derivative work available to others as provided herein, then
-    Licensee hereby agrees to include in any such work a brief summary of
-    the changes made to Python 1.6.1.
-
-    4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
-    basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-    IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
-    DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-    FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
-    INFRINGE ANY THIRD PARTY RIGHTS.
-
-    5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-    1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-    A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
-    OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-    6. This License Agreement will automatically terminate upon a material
-    breach of its terms and conditions.
-
-    7. This License Agreement shall be governed by the federal
-    intellectual property law of the United States, including without
-    limitation the federal copyright law, and, to the extent such
-    U.S. federal law does not apply, by the law of the Commonwealth of
-    Virginia, excluding Virginia's conflict of law provisions.
-    Notwithstanding the foregoing, with regard to derivative works based
-    on Python 1.6.1 that incorporate non-separable material that was
-    previously distributed under the GNU General Public License (GPL), the
-    law of the Commonwealth of Virginia shall govern this License
-    Agreement only as to issues arising under or with respect to
-    Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
-    License Agreement shall be deemed to create any relationship of
-    agency, partnership, or joint venture between CNRI and Licensee.  This
-    License Agreement does not grant permission to use CNRI trademarks or
-    trade name in a trademark sense to endorse or promote products or
-    services of Licensee, or any third party.
-
-    8. By clicking on the "ACCEPT" button where indicated, or by copying,
-    installing or otherwise using Python 1.6.1, Licensee agrees to be
-    bound by the terms and conditions of this License Agreement.
-
-            ACCEPT
-
-============================================================================
-    
-    CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
-    --------------------------------------------------
-
-    Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
-    The Netherlands.  All rights reserved.
-
-    Permission to use, copy, modify, and distribute this software and its
-    documentation for any purpose and without fee is hereby granted,
-    provided that the above copyright notice appear in all copies and that
-    both that copyright notice and this permission notice appear in
-    supporting documentation, and that the name of Stichting Mathematisch
-    Centrum or CWI not be used in advertising or publicity pertaining to
-    distribution of the software without specific, written prior
-    permission.
-
-    STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-    THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-    FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-    FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-    OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-==============================================================================
-
-JCR 2.0 API (jcr-2.0.jar)
-
-    [Day Specification License]
-
-    Day Management AG ("Licensor") is willing to license this specification
-    to you ONLY UPON THE CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED
-    IN THIS LICENSE AGREEMENT ("Agreement"). Please read the terms and
-    conditions of this Agreement carefully.
-
-    Content Repository for JavaTM Technology API Specification ("Specification")
-    Version: 2.0
-    Status: FCS
-    Release: 10 August 2009
-
-    Copyright 2009 Day Management AG
-    Barfüsserplatz 6, 4001 Basel, Switzerland.
-    All rights reserved.
-
-    NOTICE; LIMITED LICENSE GRANTS
-
-    1. License for Purposes of Evaluation and Developing Applications.
-    Licensor hereby grants you a fully-paid, non-exclusive, non-transferable,
-    worldwide, limited license (without the right to sublicense), under
-    Licensor's applicable intellectual property rights to view, download,
-    use and reproduce the Specification only for the purpose of internal
-    evaluation. This includes developing applications intended to run on an
-    implementation of the Specification provided that such applications do
-    not themselves implement any portion(s) of the Specification.
-
-    2. License for the Distribution of Compliant Implementations. Licensor
-    also grants you a perpetual, non-exclusive, non-transferable, worldwide,
-    fully paid-up, royalty free, limited license (without the right to
-    sublicense) under any applicable copyrights or, subject to the provisions
-    of subsection 4 below, patent rights it may have covering the
-    Specification to create and/or distribute an Independent Implementation
-    of the Specification that: (a) fully implements the Specification
-    including all its required interfaces and functionality; (b) does not
-    modify, subset, superset or otherwise extend the Licensor Name Space, or
-    include any public or protected packages, classes, Java interfaces, fields
-    or methods within the Licensor Name Space other than those
-    required/authorized by the Specification or Specifications being
-    implemented; and (c) passes the Technology Compatibility Kit (including
-    satisfying the requirements of the applicable TCK Users Guide) for such
-    Specification ("Compliant Implementation"). In addition, the foregoing
-    license is expressly conditioned on your not acting outside its scope.
-    No license is granted hereunder for any other purpose (including, for
-    example, modifying the Specification, other than to the extent of your
-    fair use rights, or distributing the Specification to third parties).
-
-    3. Pass-through Conditions. You need not include limitations (a)-(c) from
-    the previous paragraph or any other particular "pass through" requirements
-    in any license You grant concerning the use of your Independent
-    Implementation or products derived from it. However, except with respect
-    to Independent Implementations (and products derived from them) that
-    satisfy limitations (a)-(c) from the previous paragraph, You may neither:
-    (a) grant or otherwise pass through to your licensees any licenses under
-    Licensor's applicable intellectual property rights; nor (b) authorize your
-    licensees to make any claims concerning their implementation's compliance
-    with the Specification.
-
-    4. Reciprocity Concerning Patent Licenses. With respect to any patent
-    claims covered by the license granted under subparagraph 2 above that
-    would be infringed by all technically feasible implementations of the
-    Specification, such license is conditioned upon your offering on fair,
-    reasonable and non-discriminatory terms, to any party seeking it from
-    You, a perpetual, non-exclusive, non-transferable, worldwide license
-    under Your patent rights that are or would be infringed by all technically
-    feasible implementations of the Specification to develop, distribute and
-    use a Compliant Implementation.
-
-    5. Definitions. For the purposes of this Agreement: "Independent
-    Implementation" shall mean an implementation of the Specification that
-    neither derives from any of Licensor's source code or binary code
-    materials nor, except with an appropriate and separate license from
-    Licensor, includes any of Licensor's source code or binary code materials;
-    "Licensor Name Space" shall mean the public class or interface
-    declarations whose names begin with "java", "javax", "javax.jcr" or their
-    equivalents in any subsequent naming convention adopted by Licensor
-    through the Java Community Process, or any recognized successors or
-    replacements thereof; and "Technology Compatibility Kit" or "TCK" shall
-    mean the test suite and accompanying TCK User's Guide provided by
-    Licensor which corresponds to the particular version of the Specification
-    being tested.
-
-    6. Termination. This Agreement will terminate immediately without notice
-    from Licensor if you fail to comply with any material provision of or act
-    outside the scope of the licenses granted above.
-
-    7. Trademarks. No right, title, or interest in or to any trademarks,
-    service marks, or trade names of Licensor is granted hereunder. Java is
-    a registered trademark of Sun Microsystems, Inc. in the United States and
-    other countries.
-
-    8. Disclaimer of Warranties. The Specification is provided "AS IS".
-    LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT (INCLUDING AS A
-    CONSEQUENCE OF ANY PRACTICE OR IMPLEMENTATION OF THE SPECIFICATION), OR
-    THAT THE CONTENTS OF THE SPECIFICATION ARE SUITABLE FOR ANY PURPOSE.
-    This document does not represent any commitment to release or implement
-    any portion of the Specification in any product.
-
-    The Specification could include technical inaccuracies or typographical
-    errors. Changes are periodically added to the information therein; these
-    changes will be incorporated into new versions of the Specification, if
-    any. Licensor may make improvements and/or changes to the product(s)
-    and/or the program(s) described in the Specification at any time. Any
-    use of such changes in the Specification will be governed by the
-    then-current license for the applicable version of the Specification.
-
-    9. Limitation of Liability. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO
-    EVENT WILL LICENSOR BE LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT
-    LIMITATION, LOST REVENUE, PROFITS OR DATA, OR FOR SPECIAL, INDIRECT,
-    CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
-    REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF OR RELATED TO ANY
-    FURNISHING, PRACTICING, MODIFYING OR ANY USE OF THE SPECIFICATION, EVEN
-    IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-    10. Report. If you provide Licensor with any comments or suggestions in
-    connection with your use of the Specification ("Feedback"), you hereby:
-    (i) agree that such Feedback is provided on a non-proprietary and
-    non-confidential basis, and (ii) grant Licensor a perpetual,
-    non-exclusive, worldwide, fully paid-up, irrevocable license, with the
-    right to sublicense through multiple levels of sublicensees, to
-    incorporate, disclose, and use without limitation the Feedback for any
-    purpose related to the Specification and future versions,
-    implementations, and test suites thereof.
-
-    [Addendum to the Day Specification License]
-
-    In addition to the permissions granted under the Specification
-    License, Day Management AG hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    license to reproduce, publicly display, publicly perform,
-    sublicense, and distribute unmodified copies of the Content
-    Repository for Java Technology API (JCR 2.0) Java Archive (JAR)
-    file ("jcr-2.0.jar") and to make, have made, use, offer to sell,
-    sell, import, and otherwise transfer said file on its own or
-    as part of a larger work that makes use of the JCR API.
-
-    With respect to any patent claims covered by this license
-    that would be infringed by all technically feasible implementations
-    of the Specification, such license is conditioned upon your
-    offering on fair, reasonable and non-discriminatory terms,
-    to any party seeking it from You, a perpetual, non-exclusive,
-    non-transferable, worldwide license under Your patent rights
-    that are or would be infringed by all technically feasible
-    implementations of the Specification to develop, distribute
-    and use a Compliant Implementation.
-================================================================================
-
-APACHE HADOOP SUBCOMPONENTS:
-
-The Apache Hadoop project contains subcomponents with separate copyright
-notices and license terms. Your use of the source code for the these
-subcomponents is subject to the terms and conditions of the following
-licenses. 
-
-For the org.apache.hadoop.util.bloom.* classes:
-
-/**
- *
- * Copyright (c) 2005, European Commission project OneLab under contract
- * 034819 (http://www.one-lab.org)
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or 
- * without modification, are permitted provided that the following 
- * conditions are met:
- *  - Redistributions of source code must retain the above copyright 
- *    notice, this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright 
- *    notice, this list of conditions and the following disclaimer in 
- *    the documentation and/or other materials provided with the distribution.
- *  - Neither the name of the University Catholique de Louvain - UCL
- *    nor the names of its contributors may be used to endorse or 
- *    promote products derived from this software without specific prior 
- *    written permission.
- *    
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- */
-=================================================================================
-
-==========================================================================
-The following license applies to the whirr-core-0.7.1.jar, whirr-hadoop-0.7.1.jar 
---------------------------------------------------------------------------
-
-Copyright (C) <year> by <copyright holders>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-================================================================================
-whirr-core-0.7.1.jar, whirr-hadoop-0.7.1.jar, jsch-0.1.44.jar
-================================================================================
-Copyright (c) 2002,2003,2004,2005,2006,2007,2008,2009 Atsuhiko Yamanaka, JCraft,Inc. 
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-  1. Redistributions of source code must retain the above copyright notice,
-     this list of conditions and the following disclaimer.
-
-  2. Redistributions in binary form must reproduce the above copyright 
-     notice, this list of conditions and the following disclaimer in 
-     the documentation and/or other materials provided with the distribution.
-
-  3. The names of the authors may not be used to endorse or promote products
-     derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
-INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-================================================================================
-
-The following license applies to the whirr-core-0.7.1.jar whirr-hadoop-0.7.1.jar 
---------------------------------------------------------------------------
-
-Copyright (c) 2007-2009, JSR305 expert group
-All rights reserved.
-
-http://www.opensource.org/licenses/bsd-license.php
-
-Redistribution and use in source and binary forms, with or without 
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice, 
-      this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice, 
-      this list of conditions and the following disclaimer in the documentation 
-      and/or other materials provided with the distribution.
-    * Neither the name of the JSR305 expert group nor the names of its 
-      contributors may be used to endorse or promote products derived from 
-      this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-POSSIBILITY OF SUCH DAMAGE.
-
-================================================================================
-
-gsabes-client-1.6.0.jar
-
-================================================================================
-Copyright (c) 2004-2010
-CINECA, Fujitsu Labs Europe, ICM Warsaw, Intel Corporation, 
-Research Centre Juelich, University of Manchester, T-Systems,
-and other contributors to UNICORE: http://www.unicore.eu
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-(1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the disclaimer at the end.
-    Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in
-    the documentation and/or other materials provided with the
-    distribution.
-
-(2) Neither the name of the copyright holders nor the names of their
-    contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-DISCLAIMER
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/NOTICE b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/NOTICE
deleted file mode 100644
index fa7cba5..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/NOTICE
+++ /dev/null
@@ -1,163 +0,0 @@
-Apache Airavata
-Copyright 2014 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-===============================================================================
-Apache Xerces Java Notice:
-
-   Portions of this software were originally based on the following:
-     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
-     - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
-     - voluntary contributions made by Paul Eng on behalf of the
-       Apache Software Foundation that were originally developed at iClick, Inc.,
-       software copyright (c) 1999.
-
-================================================================================
-Apache XmlBeans Notice: 
-
-   Portions of this software were originally based on the following:
-     - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.
-
-   Aside from contributions to the Apache XMLBeans project, this
-   software also includes:
-
-    - one or more source files from the Apache Xerces-J and Apache Axis
-      products, Copyright (c) 1999-2003 Apache Software Foundation
-
-    - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
-      Consortium (Massachusetts Institute of Technology, European Research
-      Consortium for Informatics and Mathematics, Keio University)
-
-    - resolver.jar from Apache Xml Commons project,
-      Copyright (c) 2001-2003 Apache Software Foundation
-
-    - Piccolo XML Parser for Java from http://piccolo.sourceforge.net/,
-      Copyright 2002 Yuval Oren under the terms of the Apache Software License 2.0
-
-    - JSR-173 Streaming API for XML from http://sourceforge.net/projects/xmlpullparser/,
-      Copyright 2005 BEA under the terms of the Apache Software License 2.0
-      
-=========================================================================================
-Apache Axis2 Notice: (axis2-*, mex-1.5.1-impl)
-
-Portions Copyright 2006 International Business Machines Corp.
-Portions Copyright 2005-2007 WSO2, Inc.
-
-This product also includes schemas and specification developed by:
-- the W3C consortium (http://www.w3c.org)
-
-This product also includes WS-* schemas developed by International
-Business Machines Corporation, Microsoft Corporation, BEA Systems, 
-TIBCO Software, SAP AG, Sonic Software, and VeriSign
-
-This product also includes a WSDL developed by salesforce.com
-- Copyright 1999-2006 salesforce.com, inc.
-Portions of the included xmlbeans library were originally based on the following:
-- software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.
-
-====================================================================================
-Apache Derby Notice:
-
-Portions of Derby were originally developed by
-International Business Machines Corporation and are
-licensed to the Apache Software Foundation under the
-"Software Grant and Corporate Contribution License Agreement",
-informally known as the "Derby CLA".
-The following copyright notice(s) were affixed to portions of the code
-with which this file is now or was at one time distributed
-and are placed here unaltered.
-
-(C) Copyright 1997,2004 International Business Machines Corporation.  All rights reserved.
-
-(C) Copyright IBM Corp. 2003. 
-
-=======================
-
-The portion of the functionTests under 'nist' was originally 
-developed by the National Institute of Standards and Technology (NIST), 
-an agency of the United States Department of Commerce, and adapted by
-International Business Machines Corporation in accordance with the NIST
-Software Acknowledgment and Redistribution document at
-http://www.itl.nist.gov/div897/ctg/sql_form.htm
-
-========================
-
-The JDBC apis for small devices and JDBC3 (under java/stubs/jsr169 and
-java/stubs/jdbc3) were produced by trimming sources supplied by the
-Apache Harmony project. In addition, the Harmony SerialBlob and
-SerialClob implementations are used. The following notice covers the Harmony sources:
-
-Portions of Harmony were originally developed by
-Intel Corporation and are licensed to the Apache Software
-Foundation under the "Software Grant and Corporate Contribution
-License Agreement", informally known as the "Intel Harmony CLA".
-
-=============================================================================
-Apache Woden Notice:
-
-   This product also includes software developed by :
-   
-     - IBM Corporation (http://www.ibm.com),
-         WSDL4J was the initial code contribution for the Apache Woden
-         project and some of the WSDL4J design and code has been reused.
-     - The W3C Consortium (http://www.w3c.org),
-         Common W3C XML Schema and DTD files are packaged with Apache Woden.
-
-   Please read the different LICENSE files present in the root directory of
-   this distribution.
-
-=========================================================================
-Woodstox Notice: 
-
-This product includes software developed by the Woodstox Project 
-(http://woodstox.codehaus.org/)
-
-This product currently only contains code developed by authors
-of specific components, as identified by the source code files.
-
-Since product implements StAX API, it has dependencies to StAX API
-classes.
-
-For additional credits (generally to people who reported problems)
-see CREDITS file.
-
-===========================================================================
-Apache xml-commons xml-apis Notice:
-
-   Portions of this software were originally based on the following:
-     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
-     - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
-     - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org
-
-================================================================================================
-Apache  Xalan Notice: 
-
-Portions of this software was originally based on the following:
-     - software copyright (c) 1999-2002, Lotus Development Corporation., http://www.lotus.com.
-     - software copyright (c) 2001-2002, Sun Microsystems., http://www.sun.com.
-     - software copyright (c) 2003, IBM Corporation., http://www.ibm.com.
-     - voluntary contributions made by Ovidiu Predescu (ovidiu@cup.hp.com) on behalf of the 
-       Apache Software Foundation and was originally developed at Hewlett Packard Company. 
-================================================================================================
-Apache  OpenJPA Notice: 
-
-OpenJPA includes software developed by the SERP project
-Copyright (c) 2002-2006, A. Abram White. All rights reserved.
-
-OpenJPA includes the persistence and orm schemas from the JPA specifications.
-Copyright 2005-2009 Sun Microsystems, Inc. All rights reserved.
-OpenJPA elects to include this software in this distribution under the
-CDDL license.  You can obtain a copy of the License at:
-    https://glassfish.dev.java.net/public/CDDL+GPL.html
-The source code is available at:
-    https://glassfish.dev.java.net/source/browse/glassfish/
-
-OpenJPA includes software written by Miroslav Nachev
-OpenJPA uses test code written by Charles Tillman.
-================================================================================================
-Apache XmlSchema Notice:
-
-Portions Copyright 2006 International Business Machines Corp.
-================================================================================================
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/README b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/README
deleted file mode 100644
index 750e48d..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/README
+++ /dev/null
@@ -1,4 +0,0 @@
-Apache Airavata Thrift Python Software Development Kit.
-
-Convenience Binaries:
-Airavata will bundle convenience binaries, but again we encourage to build from source.
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/assembly/bin-assembly.xml b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/assembly/bin-assembly.xml
deleted file mode 100644
index dfec1cd..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/assembly/bin-assembly.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-
-
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you 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.
-
--->
-<!DOCTYPE assembly [
-        <!ELEMENT assembly (id|includeBaseDirectory|baseDirectory|formats|fileSets|dependencySets)*>
-        <!ELEMENT id (#PCDATA)>
-        <!ELEMENT includeBaseDirectory (#PCDATA)>
-        <!ELEMENT baseDirectory (#PCDATA)>
-        <!ELEMENT formats (format)*>
-        <!ELEMENT format (#PCDATA)>
-        <!ELEMENT fileSets (fileSet)*>
-        <!ELEMENT fileSet (directory|outputDirectory|includes)*>
-        <!ELEMENT directory (#PCDATA)>
-        <!ELEMENT outputDirectory (#PCDATA)>
-        <!ELEMENT includes (include)*>
-        <!ELEMENT include (#PCDATA)>
-        <!ELEMENT dependencySets (dependencySet)*>
-        <!ELEMENT dependencySet (outputDirectory|includes)*>
-        ]>
-<assembly>
-    <id>bin</id>
-    <includeBaseDirectory>false</includeBaseDirectory>
-    <baseDirectory>${archieve.name}-${version}</baseDirectory>
-    <formats>
-        <format>tar.gz</format>
-        <format>zip</format>
-    </formats>
-    <fileSets>
-        <!-- ********************** copy release notes files ********************** -->
-        <fileSet>
-            <directory>../../../</directory>
-            <outputDirectory>.</outputDirectory>
-            <includes>
-                <include>RELEASE_NOTES</include>
-            </includes>
-        </fileSet>
-        <!-- ********************** copy licenses, readme etc. ********************** -->
-        <fileSet>
-            <directory>src/main/resources/</directory>
-            <outputDirectory>.</outputDirectory>
-            <includes>
-                <include>conf/*</include>
-		<include>lib/*</include>
-                <include>LICENSE</include>
-                <include>NOTICE</include>
-                <include>README</include>
-                <include>INSTALL</include>
-            </includes>
-        </fileSet>
-	<fileSet>
-            <directory>${project.build.directory}/conf</directory>
-            <outputDirectory>conf</outputDirectory>
-	    <includes>
-                <include>*.properties</include>
-            </includes>
-        </fileSet>
-    </fileSets>
-</assembly>
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/conf/airavata-client.properties b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/conf/airavata-client.properties
deleted file mode 100644
index f02a5d0..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/conf/airavata-client.properties
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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.
-#
-
-###########################################################################
-#
-#  This properties file provides configuration for Airavata Clients:
-#
-###########################################################################
-
-## Airavata API Thrift Server configurations
-[AiravataServer]
-# Default Local Installation
-#host=localhost
-#port=8930
-
-# SciGaP Development Server
-host=gw56.iu.xsede.org
-port=8930
-
-## Gateway Specific Properties
-[GatewayProperties]
-gateway_id=default
-cred_token_id=47507a08-1579-4883-be03-3c8e3b7da061
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/TSCons.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/TSCons.py
deleted file mode 100644
index da8d283..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/TSCons.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from os import path
-from SCons.Builder import Builder
-
-
-def scons_env(env, add=''):
-  opath = path.dirname(path.abspath('$TARGET'))
-  lstr = 'thrift --gen cpp -o ' + opath + ' ' + add + ' $SOURCE'
-  cppbuild = Builder(action=lstr)
-  env.Append(BUILDERS={'ThriftCpp': cppbuild})
-
-
-def gen_cpp(env, dir, file):
-  scons_env(env)
-  suffixes = ['_types.h', '_types.cpp']
-  targets = map(lambda s: 'gen-cpp/' + file + s, suffixes)
-  return env.ThriftCpp(targets, dir + file + '.thrift')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/TSerialization.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/TSerialization.py
deleted file mode 100644
index 54f10e2..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/TSerialization.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from lib.thrift.protocol import TBinaryProtocol
-from lib.thrift.transport import TTransport
-
-
-def serialize(thrift_object,
-              protocol_factory=TBinaryProtocol.TBinaryProtocolFactory()):
-    transport = TTransport.TMemoryBuffer()
-    protocol = protocol_factory.getProtocol(transport)
-    thrift_object.write(protocol)
-    return transport.getvalue()
-
-
-def deserialize(base,
-                buf,
-                protocol_factory=TBinaryProtocol.TBinaryProtocolFactory()):
-    transport = TTransport.TMemoryBuffer(buf)
-    protocol = protocol_factory.getProtocol(transport)
-    base.read(protocol)
-    return base
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/TTornado.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/TTornado.py
deleted file mode 100644
index af309c3..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/TTornado.py
+++ /dev/null
@@ -1,153 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from cStringIO import StringIO
-import logging
-import socket
-import struct
-
-from thrift.transport import TTransport
-from thrift.transport.TTransport import TTransportException
-
-from tornado import gen
-from tornado import iostream
-from tornado import netutil
-
-
-class TTornadoStreamTransport(TTransport.TTransportBase):
-    """a framed, buffered transport over a Tornado stream"""
-    def __init__(self, host, port, stream=None):
-        self.host = host
-        self.port = port
-        self.is_queuing_reads = False
-        self.read_queue = []
-        self.__wbuf = StringIO()
-
-        # servers provide a ready-to-go stream
-        self.stream = stream
-        if self.stream is not None:
-            self._set_close_callback()
-
-    # not the same number of parameters as TTransportBase.open
-    def open(self, callback):
-        logging.debug('socket connecting')
-        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
-        self.stream = iostream.IOStream(sock)
-
-        def on_close_in_connect(*_):
-            message = 'could not connect to {}:{}'.format(self.host, self.port)
-            raise TTransportException(
-                type=TTransportException.NOT_OPEN,
-                message=message)
-        self.stream.set_close_callback(on_close_in_connect)
-
-        def finish(*_):
-            self._set_close_callback()
-            callback()
-
-        self.stream.connect((self.host, self.port), callback=finish)
-
-    def _set_close_callback(self):
-        def on_close():
-            raise TTransportException(
-                type=TTransportException.END_OF_FILE,
-                message='socket closed')
-        self.stream.set_close_callback(self.close)
-
-    def close(self):
-        # don't raise if we intend to close
-        self.stream.set_close_callback(None)
-        self.stream.close()
-
-    def read(self, _):
-        # The generated code for Tornado shouldn't do individual reads -- only
-        # frames at a time
-        assert "you're doing it wrong" is True
-
-    @gen.engine
-    def readFrame(self, callback):
-        self.read_queue.append(callback)
-        logging.debug('read queue: %s', self.read_queue)
-
-        if self.is_queuing_reads:
-            # If a read is already in flight, then the while loop below should
-            # pull it from self.read_queue
-            return
-
-        self.is_queuing_reads = True
-        while self.read_queue:
-            next_callback = self.read_queue.pop()
-            result = yield gen.Task(self._readFrameFromStream)
-            next_callback(result)
-        self.is_queuing_reads = False
-
-    @gen.engine
-    def _readFrameFromStream(self, callback):
-        logging.debug('_readFrameFromStream')
-        frame_header = yield gen.Task(self.stream.read_bytes, 4)
-        frame_length, = struct.unpack('!i', frame_header)
-        logging.debug('received frame header, frame length = %i', frame_length)
-        frame = yield gen.Task(self.stream.read_bytes, frame_length)
-        logging.debug('received frame payload')
-        callback(frame)
-
-    def write(self, buf):
-        self.__wbuf.write(buf)
-
-    def flush(self, callback=None):
-        wout = self.__wbuf.getvalue()
-        wsz = len(wout)
-        # reset wbuf before write/flush to preserve state on underlying failure
-        self.__wbuf = StringIO()
-        # N.B.: Doing this string concatenation is WAY cheaper than making
-        # two separate calls to the underlying socket object. Socket writes in
-        # Python turn out to be REALLY expensive, but it seems to do a pretty
-        # good job of managing string buffer operations without excessive copies
-        buf = struct.pack("!i", wsz) + wout
-
-        logging.debug('writing frame length = %i', wsz)
-        self.stream.write(buf, callback)
-
-
-class TTornadoServer(netutil.TCPServer):
-    def __init__(self, processor, iprot_factory, oprot_factory=None,
-                 *args, **kwargs):
-        super(TTornadoServer, self).__init__(*args, **kwargs)
-
-        self._processor = processor
-        self._iprot_factory = iprot_factory
-        self._oprot_factory = (oprot_factory if oprot_factory is not None
-                               else iprot_factory)
-
-    def handle_stream(self, stream, address):
-        try:
-            host, port = address
-            trans = TTornadoStreamTransport(host=host, port=port, stream=stream)
-            oprot = self._oprot_factory.getProtocol(trans)
-
-            def next_pass():
-                if not trans.stream.closed():
-                    self._processor.process(trans, self._iprot_factory, oprot,
-                                            callback=next_pass)
-
-            next_pass()
-
-        except Exception:
-            logging.exception('thrift exception in handle_stream')
-            trans.close()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/Thrift.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/Thrift.py
deleted file mode 100644
index 9890af7..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/Thrift.py
+++ /dev/null
@@ -1,170 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 sys
-
-
-class TType:
-  STOP   = 0
-  VOID   = 1
-  BOOL   = 2
-  BYTE   = 3
-  I08    = 3
-  DOUBLE = 4
-  I16    = 6
-  I32    = 8
-  I64    = 10
-  STRING = 11
-  UTF7   = 11
-  STRUCT = 12
-  MAP    = 13
-  SET    = 14
-  LIST   = 15
-  UTF8   = 16
-  UTF16  = 17
-
-  _VALUES_TO_NAMES = ('STOP',
-                      'VOID',
-                      'BOOL',
-                      'BYTE',
-                      'DOUBLE',
-                      None,
-                      'I16',
-                      None,
-                      'I32',
-                      None,
-                     'I64',
-                     'STRING',
-                     'STRUCT',
-                     'MAP',
-                     'SET',
-                     'LIST',
-                     'UTF8',
-                     'UTF16')
-
-
-class TMessageType:
-  CALL = 1
-  REPLY = 2
-  EXCEPTION = 3
-  ONEWAY = 4
-
-
-class TProcessor:
-  """Base class for procsessor, which works on two streams."""
-
-  def process(iprot, oprot):
-    pass
-
-
-class TException(Exception):
-  """Base class for all thrift exceptions."""
-
-  # BaseException.message is deprecated in Python v[2.6,3.0)
-  if (2, 6, 0) <= sys.version_info < (3, 0):
-    def _get_message(self):
-      return self._message
-
-    def _set_message(self, message):
-      self._message = message
-    message = property(_get_message, _set_message)
-
-  def __init__(self, message=None):
-    Exception.__init__(self, message)
-    self.message = message
-
-
-class TApplicationException(TException):
-  """Application level thrift exceptions."""
-
-  UNKNOWN = 0
-  UNKNOWN_METHOD = 1
-  INVALID_MESSAGE_TYPE = 2
-  WRONG_METHOD_NAME = 3
-  BAD_SEQUENCE_ID = 4
-  MISSING_RESULT = 5
-  INTERNAL_ERROR = 6
-  PROTOCOL_ERROR = 7
-  INVALID_TRANSFORM = 8
-  INVALID_PROTOCOL = 9
-  UNSUPPORTED_CLIENT_TYPE = 10
-
-  def __init__(self, type=UNKNOWN, message=None):
-    TException.__init__(self, message)
-    self.type = type
-
-  def __str__(self):
-    if self.message:
-      return self.message
-    elif self.type == self.UNKNOWN_METHOD:
-      return 'Unknown method'
-    elif self.type == self.INVALID_MESSAGE_TYPE:
-      return 'Invalid message type'
-    elif self.type == self.WRONG_METHOD_NAME:
-      return 'Wrong method name'
-    elif self.type == self.BAD_SEQUENCE_ID:
-      return 'Bad sequence ID'
-    elif self.type == self.MISSING_RESULT:
-      return 'Missing result'
-    elif self.type == self.INTERNAL_ERROR:
-      return 'Internal error'
-    elif self.type == self.PROTOCOL_ERROR:
-      return 'Protocol error'
-    elif self.type == self.INVALID_TRANSFORM:
-      return 'Invalid transform'
-    elif self.type == self.INVALID_PROTOCOL:
-      return 'Invalid protocol'
-    elif self.type == self.UNSUPPORTED_CLIENT_TYPE:
-      return 'Unsupported client type'
-    else:
-      return 'Default (unknown) TApplicationException'
-
-  def read(self, iprot):
-    iprot.readStructBegin()
-    while True:
-      (fname, ftype, fid) = iprot.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      if fid == 1:
-        if ftype == TType.STRING:
-          self.message = iprot.readString()
-        else:
-          iprot.skip(ftype)
-      elif fid == 2:
-        if ftype == TType.I32:
-          self.type = iprot.readI32()
-        else:
-          iprot.skip(ftype)
-      else:
-        iprot.skip(ftype)
-      iprot.readFieldEnd()
-    iprot.readStructEnd()
-
-  def write(self, oprot):
-    oprot.writeStructBegin('TApplicationException')
-    if self.message is not None:
-      oprot.writeFieldBegin('message', TType.STRING, 1)
-      oprot.writeString(self.message)
-      oprot.writeFieldEnd()
-    if self.type is not None:
-      oprot.writeFieldBegin('type', TType.I32, 2)
-      oprot.writeI32(self.type)
-      oprot.writeFieldEnd()
-    oprot.writeFieldStop()
-    oprot.writeStructEnd()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/__init__.py
deleted file mode 100644
index 48d659c..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-__all__ = ['Thrift', 'TSCons']
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TBase.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TBase.py
deleted file mode 100644
index 6cbd5f3..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TBase.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from thrift.Thrift import *
-from thrift.protocol import TBinaryProtocol
-from thrift.transport import TTransport
-
-try:
-  from thrift.protocol import fastbinary
-except:
-  fastbinary = None
-
-
-class TBase(object):
-  __slots__ = []
-
-  def __repr__(self):
-    L = ['%s=%r' % (key, getattr(self, key))
-              for key in self.__slots__]
-    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
-
-  def __eq__(self, other):
-    if not isinstance(other, self.__class__):
-      return False
-    for attr in self.__slots__:
-      my_val = getattr(self, attr)
-      other_val = getattr(other, attr)
-      if my_val != other_val:
-        return False
-    return True
-
-  def __ne__(self, other):
-    return not (self == other)
-
-  def read(self, iprot):
-    if (iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and
-        isinstance(iprot.trans, TTransport.CReadableTransport) and
-        self.thrift_spec is not None and
-        fastbinary is not None):
-      fastbinary.decode_binary(self,
-                               iprot.trans,
-                               (self.__class__, self.thrift_spec))
-      return
-    iprot.readStruct(self, self.thrift_spec)
-
-  def write(self, oprot):
-    if (oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and
-        self.thrift_spec is not None and
-        fastbinary is not None):
-      oprot.trans.write(
-        fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
-      return
-    oprot.writeStruct(self, self.thrift_spec)
-
-
-class TExceptionBase(Exception):
-  # old style class so python2.4 can raise exceptions derived from this
-  #  This can't inherit from TBase because of that limitation.
-  __slots__ = []
-
-  __repr__ = TBase.__repr__.im_func
-  __eq__ = TBase.__eq__.im_func
-  __ne__ = TBase.__ne__.im_func
-  read = TBase.read.im_func
-  write = TBase.write.im_func
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TBinaryProtocol.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TBinaryProtocol.py
deleted file mode 100644
index 35b6d05..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TBinaryProtocol.py
+++ /dev/null
@@ -1,261 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from struct import pack, unpack
-
-from lib.thrift.protocol.TProtocol import *
-
-
-class TBinaryProtocol(TProtocolBase):
-  """Binary implementation of the Thrift protocol driver."""
-
-  # NastyHaxx. Python 2.4+ on 32-bit machines forces hex constants to be
-  # positive, converting this into a long. If we hardcode the int value
-  # instead it'll stay in 32 bit-land.
-
-  # VERSION_MASK = 0xffff0000
-  VERSION_MASK = -65536
-
-  # VERSION_1 = 0x80010000
-  VERSION_1 = -2147418112
-
-  TYPE_MASK = 0x000000ff
-
-  def __init__(self, trans, strictRead=False, strictWrite=True):
-    TProtocolBase.__init__(self, trans)
-    self.strictRead = strictRead
-    self.strictWrite = strictWrite
-
-  def writeMessageBegin(self, name, type, seqid):
-    if self.strictWrite:
-      self.writeI32(TBinaryProtocol.VERSION_1 | type)
-      self.writeString(name)
-      self.writeI32(seqid)
-    else:
-      self.writeString(name)
-      self.writeByte(type)
-      self.writeI32(seqid)
-
-  def writeMessageEnd(self):
-    pass
-
-  def writeStructBegin(self, name):
-    pass
-
-  def writeStructEnd(self):
-    pass
-
-  def writeFieldBegin(self, name, type, id):
-    self.writeByte(type)
-    self.writeI16(id)
-
-  def writeFieldEnd(self):
-    pass
-
-  def writeFieldStop(self):
-    self.writeByte(TType.STOP)
-
-  def writeMapBegin(self, ktype, vtype, size):
-    self.writeByte(ktype)
-    self.writeByte(vtype)
-    self.writeI32(size)
-
-  def writeMapEnd(self):
-    pass
-
-  def writeListBegin(self, etype, size):
-    self.writeByte(etype)
-    self.writeI32(size)
-
-  def writeListEnd(self):
-    pass
-
-  def writeSetBegin(self, etype, size):
-    self.writeByte(etype)
-    self.writeI32(size)
-
-  def writeSetEnd(self):
-    pass
-
-  def writeBool(self, bool):
-    if bool:
-      self.writeByte(1)
-    else:
-      self.writeByte(0)
-
-  def writeByte(self, byte):
-    buff = pack("!b", byte)
-    self.trans.write(buff)
-
-  def writeI16(self, i16):
-    buff = pack("!h", i16)
-    self.trans.write(buff)
-
-  def writeI32(self, i32):
-    buff = pack("!i", i32)
-    self.trans.write(buff)
-
-  def writeI64(self, i64):
-    buff = pack("!q", i64)
-    self.trans.write(buff)
-
-  def writeDouble(self, dub):
-    buff = pack("!d", dub)
-    self.trans.write(buff)
-
-  def writeString(self, str):
-    self.writeI32(len(str))
-    self.trans.write(str)
-
-  def readMessageBegin(self):
-    sz = self.readI32()
-    if sz < 0:
-      version = sz & TBinaryProtocol.VERSION_MASK
-      if version != TBinaryProtocol.VERSION_1:
-        raise TProtocolException(
-          type=TProtocolException.BAD_VERSION,
-          message='Bad version in readMessageBegin: %d' % (sz))
-      type = sz & TBinaryProtocol.TYPE_MASK
-      name = self.readString()
-      seqid = self.readI32()
-    else:
-      if self.strictRead:
-        raise TProtocolException(type=TProtocolException.BAD_VERSION,
-                                 message='No protocol version header')
-      name = self.trans.readAll(sz)
-      type = self.readByte()
-      seqid = self.readI32()
-    return (name, type, seqid)
-
-  def readMessageEnd(self):
-    pass
-
-  def readStructBegin(self):
-    pass
-
-  def readStructEnd(self):
-    pass
-
-  def readFieldBegin(self):
-    type = self.readByte()
-    if type == TType.STOP:
-      return (None, type, 0)
-    id = self.readI16()
-    return (None, type, id)
-
-  def readFieldEnd(self):
-    pass
-
-  def readMapBegin(self):
-    ktype = self.readByte()
-    vtype = self.readByte()
-    size = self.readI32()
-    return (ktype, vtype, size)
-
-  def readMapEnd(self):
-    pass
-
-  def readListBegin(self):
-    etype = self.readByte()
-    size = self.readI32()
-    return (etype, size)
-
-  def readListEnd(self):
-    pass
-
-  def readSetBegin(self):
-    etype = self.readByte()
-    size = self.readI32()
-    return (etype, size)
-
-  def readSetEnd(self):
-    pass
-
-  def readBool(self):
-    byte = self.readByte()
-    if byte == 0:
-      return False
-    return True
-
-  def readByte(self):
-    buff = self.trans.readAll(1)
-    val, = unpack('!b', buff)
-    return val
-
-  def readI16(self):
-    buff = self.trans.readAll(2)
-    val, = unpack('!h', buff)
-    return val
-
-  def readI32(self):
-    buff = self.trans.readAll(4)
-    val, = unpack('!i', buff)
-    return val
-
-  def readI64(self):
-    buff = self.trans.readAll(8)
-    val, = unpack('!q', buff)
-    return val
-
-  def readDouble(self):
-    buff = self.trans.readAll(8)
-    val, = unpack('!d', buff)
-    return val
-
-  def readString(self):
-    len = self.readI32()
-    str = self.trans.readAll(len)
-    return str
-
-
-class TBinaryProtocolFactory:
-  def __init__(self, strictRead=False, strictWrite=True):
-    self.strictRead = strictRead
-    self.strictWrite = strictWrite
-
-  def getProtocol(self, trans):
-    prot = TBinaryProtocol(trans, self.strictRead, self.strictWrite)
-    return prot
-
-
-class TBinaryProtocolAccelerated(TBinaryProtocol):
-  """C-Accelerated version of TBinaryProtocol.
-
-  This class does not override any of TBinaryProtocol's methods,
-  but the generated code recognizes it directly and will call into
-  our C module to do the encoding, bypassing this object entirely.
-  We inherit from TBinaryProtocol so that the normal TBinaryProtocol
-  encoding can happen if the fastbinary module doesn't work for some
-  reason.  (TODO(dreiss): Make this happen sanely in more cases.)
-
-  In order to take advantage of the C module, just use
-  TBinaryProtocolAccelerated instead of TBinaryProtocol.
-
-  NOTE:  This code was contributed by an external developer.
-         The internal Thrift team has reviewed and tested it,
-         but we cannot guarantee that it is production-ready.
-         Please feel free to report bugs and/or success stories
-         to the public mailing list.
-  """
-  pass
-
-
-class TBinaryProtocolAcceleratedFactory:
-  def getProtocol(self, trans):
-    return TBinaryProtocolAccelerated(trans)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TCompactProtocol.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TCompactProtocol.py
deleted file mode 100644
index 09ca6ad..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TCompactProtocol.py
+++ /dev/null
@@ -1,405 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from struct import pack, unpack
-
-from lib.thrift.protocol.TProtocol import *
-
-
-__all__ = ['TCompactProtocol', 'TCompactProtocolFactory']
-
-CLEAR = 0
-FIELD_WRITE = 1
-VALUE_WRITE = 2
-CONTAINER_WRITE = 3
-BOOL_WRITE = 4
-FIELD_READ = 5
-CONTAINER_READ = 6
-VALUE_READ = 7
-BOOL_READ = 8
-
-
-def make_helper(v_from, container):
-  def helper(func):
-    def nested(self, *args, **kwargs):
-      assert self.state in (v_from, container), (self.state, v_from, container)
-      return func(self, *args, **kwargs)
-    return nested
-  return helper
-writer = make_helper(VALUE_WRITE, CONTAINER_WRITE)
-reader = make_helper(VALUE_READ, CONTAINER_READ)
-
-
-def makeZigZag(n, bits):
-  return (n << 1) ^ (n >> (bits - 1))
-
-
-def fromZigZag(n):
-  return (n >> 1) ^ -(n & 1)
-
-
-def writeVarint(trans, n):
-  out = []
-  while True:
-    if n & ~0x7f == 0:
-      out.append(n)
-      break
-    else:
-      out.append((n & 0xff) | 0x80)
-      n = n >> 7
-  trans.write(''.join(map(chr, out)))
-
-
-def readVarint(trans):
-  result = 0
-  shift = 0
-  while True:
-    x = trans.readAll(1)
-    byte = ord(x)
-    result |= (byte & 0x7f) << shift
-    if byte >> 7 == 0:
-      return result
-    shift += 7
-
-
-class CompactType:
-  STOP = 0x00
-  TRUE = 0x01
-  FALSE = 0x02
-  BYTE = 0x03
-  I16 = 0x04
-  I32 = 0x05
-  I64 = 0x06
-  DOUBLE = 0x07
-  BINARY = 0x08
-  LIST = 0x09
-  SET = 0x0A
-  MAP = 0x0B
-  STRUCT = 0x0C
-
-CTYPES = {TType.STOP: CompactType.STOP,
-          TType.BOOL: CompactType.TRUE,  # used for collection
-          TType.BYTE: CompactType.BYTE,
-          TType.I16: CompactType.I16,
-          TType.I32: CompactType.I32,
-          TType.I64: CompactType.I64,
-          TType.DOUBLE: CompactType.DOUBLE,
-          TType.STRING: CompactType.BINARY,
-          TType.STRUCT: CompactType.STRUCT,
-          TType.LIST: CompactType.LIST,
-          TType.SET: CompactType.SET,
-          TType.MAP: CompactType.MAP
-          }
-
-TTYPES = {}
-for k, v in CTYPES.items():
-  TTYPES[v] = k
-TTYPES[CompactType.FALSE] = TType.BOOL
-del k
-del v
-
-
-class TCompactProtocol(TProtocolBase):
-  """Compact implementation of the Thrift protocol driver."""
-
-  PROTOCOL_ID = 0x82
-  VERSION = 1
-  VERSION_MASK = 0x1f
-  TYPE_MASK = 0xe0
-  TYPE_SHIFT_AMOUNT = 5
-
-  def __init__(self, trans):
-    TProtocolBase.__init__(self, trans)
-    self.state = CLEAR
-    self.__last_fid = 0
-    self.__bool_fid = None
-    self.__bool_value = None
-    self.__structs = []
-    self.__containers = []
-
-  def __writeVarint(self, n):
-    writeVarint(self.trans, n)
-
-  def writeMessageBegin(self, name, type, seqid):
-    assert self.state == CLEAR
-    self.__writeUByte(self.PROTOCOL_ID)
-    self.__writeUByte(self.VERSION | (type << self.TYPE_SHIFT_AMOUNT))
-    self.__writeVarint(seqid)
-    self.__writeString(name)
-    self.state = VALUE_WRITE
-
-  def writeMessageEnd(self):
-    assert self.state == VALUE_WRITE
-    self.state = CLEAR
-
-  def writeStructBegin(self, name):
-    assert self.state in (CLEAR, CONTAINER_WRITE, VALUE_WRITE), self.state
-    self.__structs.append((self.state, self.__last_fid))
-    self.state = FIELD_WRITE
-    self.__last_fid = 0
-
-  def writeStructEnd(self):
-    assert self.state == FIELD_WRITE
-    self.state, self.__last_fid = self.__structs.pop()
-
-  def writeFieldStop(self):
-    self.__writeByte(0)
-
-  def __writeFieldHeader(self, type, fid):
-    delta = fid - self.__last_fid
-    if 0 < delta <= 15:
-      self.__writeUByte(delta << 4 | type)
-    else:
-      self.__writeByte(type)
-      self.__writeI16(fid)
-    self.__last_fid = fid
-
-  def writeFieldBegin(self, name, type, fid):
-    assert self.state == FIELD_WRITE, self.state
-    if type == TType.BOOL:
-      self.state = BOOL_WRITE
-      self.__bool_fid = fid
-    else:
-      self.state = VALUE_WRITE
-      self.__writeFieldHeader(CTYPES[type], fid)
-
-  def writeFieldEnd(self):
-    assert self.state in (VALUE_WRITE, BOOL_WRITE), self.state
-    self.state = FIELD_WRITE
-
-  def __writeUByte(self, byte):
-    self.trans.write(pack('!B', byte))
-
-  def __writeByte(self, byte):
-    self.trans.write(pack('!b', byte))
-
-  def __writeI16(self, i16):
-    self.__writeVarint(makeZigZag(i16, 16))
-
-  def __writeSize(self, i32):
-    self.__writeVarint(i32)
-
-  def writeCollectionBegin(self, etype, size):
-    assert self.state in (VALUE_WRITE, CONTAINER_WRITE), self.state
-    if size <= 14:
-      self.__writeUByte(size << 4 | CTYPES[etype])
-    else:
-      self.__writeUByte(0xf0 | CTYPES[etype])
-      self.__writeSize(size)
-    self.__containers.append(self.state)
-    self.state = CONTAINER_WRITE
-  writeSetBegin = writeCollectionBegin
-  writeListBegin = writeCollectionBegin
-
-  def writeMapBegin(self, ktype, vtype, size):
-    assert self.state in (VALUE_WRITE, CONTAINER_WRITE), self.state
-    if size == 0:
-      self.__writeByte(0)
-    else:
-      self.__writeSize(size)
-      self.__writeUByte(CTYPES[ktype] << 4 | CTYPES[vtype])
-    self.__containers.append(self.state)
-    self.state = CONTAINER_WRITE
-
-  def writeCollectionEnd(self):
-    assert self.state == CONTAINER_WRITE, self.state
-    self.state = self.__containers.pop()
-  writeMapEnd = writeCollectionEnd
-  writeSetEnd = writeCollectionEnd
-  writeListEnd = writeCollectionEnd
-
-  def writeBool(self, bool):
-    if self.state == BOOL_WRITE:
-      if bool:
-        ctype = CompactType.TRUE
-      else:
-        ctype = CompactType.FALSE
-      self.__writeFieldHeader(ctype, self.__bool_fid)
-    elif self.state == CONTAINER_WRITE:
-      if bool:
-        self.__writeByte(CompactType.TRUE)
-      else:
-        self.__writeByte(CompactType.FALSE)
-    else:
-      raise AssertionError("Invalid state in compact protocol")
-
-  writeByte = writer(__writeByte)
-  writeI16 = writer(__writeI16)
-
-  @writer
-  def writeI32(self, i32):
-    self.__writeVarint(makeZigZag(i32, 32))
-
-  @writer
-  def writeI64(self, i64):
-    self.__writeVarint(makeZigZag(i64, 64))
-
-  @writer
-  def writeDouble(self, dub):
-    self.trans.write(pack('!d', dub))
-
-  def __writeString(self, s):
-    self.__writeSize(len(s))
-    self.trans.write(s)
-  writeString = writer(__writeString)
-
-  def readFieldBegin(self):
-    assert self.state == FIELD_READ, self.state
-    type = self.__readUByte()
-    if type & 0x0f == TType.STOP:
-      return (None, 0, 0)
-    delta = type >> 4
-    if delta == 0:
-      fid = self.__readI16()
-    else:
-      fid = self.__last_fid + delta
-    self.__last_fid = fid
-    type = type & 0x0f
-    if type == CompactType.TRUE:
-      self.state = BOOL_READ
-      self.__bool_value = True
-    elif type == CompactType.FALSE:
-      self.state = BOOL_READ
-      self.__bool_value = False
-    else:
-      self.state = VALUE_READ
-    return (None, self.__getTType(type), fid)
-
-  def readFieldEnd(self):
-    assert self.state in (VALUE_READ, BOOL_READ), self.state
-    self.state = FIELD_READ
-
-  def __readUByte(self):
-    result, = unpack('!B', self.trans.readAll(1))
-    return result
-
-  def __readByte(self):
-    result, = unpack('!b', self.trans.readAll(1))
-    return result
-
-  def __readVarint(self):
-    return readVarint(self.trans)
-
-  def __readZigZag(self):
-    return fromZigZag(self.__readVarint())
-
-  def __readSize(self):
-    result = self.__readVarint()
-    if result < 0:
-      raise TException("Length < 0")
-    return result
-
-  def readMessageBegin(self):
-    assert self.state == CLEAR
-    proto_id = self.__readUByte()
-    if proto_id != self.PROTOCOL_ID:
-      raise TProtocolException(TProtocolException.BAD_VERSION,
-          'Bad protocol id in the message: %d' % proto_id)
-    ver_type = self.__readUByte()
-    type = (ver_type & self.TYPE_MASK) >> self.TYPE_SHIFT_AMOUNT
-    version = ver_type & self.VERSION_MASK
-    if version != self.VERSION:
-      raise TProtocolException(TProtocolException.BAD_VERSION,
-          'Bad version: %d (expect %d)' % (version, self.VERSION))
-    seqid = self.__readVarint()
-    name = self.__readString()
-    return (name, type, seqid)
-
-  def readMessageEnd(self):
-    assert self.state == CLEAR
-    assert len(self.__structs) == 0
-
-  def readStructBegin(self):
-    assert self.state in (CLEAR, CONTAINER_READ, VALUE_READ), self.state
-    self.__structs.append((self.state, self.__last_fid))
-    self.state = FIELD_READ
-    self.__last_fid = 0
-
-  def readStructEnd(self):
-    assert self.state == FIELD_READ
-    self.state, self.__last_fid = self.__structs.pop()
-
-  def readCollectionBegin(self):
-    assert self.state in (VALUE_READ, CONTAINER_READ), self.state
-    size_type = self.__readUByte()
-    size = size_type >> 4
-    type = self.__getTType(size_type)
-    if size == 15:
-      size = self.__readSize()
-    self.__containers.append(self.state)
-    self.state = CONTAINER_READ
-    return type, size
-  readSetBegin = readCollectionBegin
-  readListBegin = readCollectionBegin
-
-  def readMapBegin(self):
-    assert self.state in (VALUE_READ, CONTAINER_READ), self.state
-    size = self.__readSize()
-    types = 0
-    if size > 0:
-      types = self.__readUByte()
-    vtype = self.__getTType(types)
-    ktype = self.__getTType(types >> 4)
-    self.__containers.append(self.state)
-    self.state = CONTAINER_READ
-    return (ktype, vtype, size)
-
-  def readCollectionEnd(self):
-    assert self.state == CONTAINER_READ, self.state
-    self.state = self.__containers.pop()
-  readSetEnd = readCollectionEnd
-  readListEnd = readCollectionEnd
-  readMapEnd = readCollectionEnd
-
-  def readBool(self):
-    if self.state == BOOL_READ:
-      return self.__bool_value == CompactType.TRUE
-    elif self.state == CONTAINER_READ:
-      return self.__readByte() == CompactType.TRUE
-    else:
-      raise AssertionError("Invalid state in compact protocol: %d" %
-                           self.state)
-
-  readByte = reader(__readByte)
-  __readI16 = __readZigZag
-  readI16 = reader(__readZigZag)
-  readI32 = reader(__readZigZag)
-  readI64 = reader(__readZigZag)
-
-  @reader
-  def readDouble(self):
-    buff = self.trans.readAll(8)
-    val, = unpack('!d', buff)
-    return val
-
-  def __readString(self):
-    len = self.__readSize()
-    return self.trans.readAll(len)
-  readString = reader(__readString)
-
-  def __getTType(self, byte):
-    return TTYPES[byte & 0x0f]
-
-
-class TCompactProtocolFactory:
-  def __init__(self):
-    pass
-
-  def getProtocol(self, trans):
-    return TCompactProtocol(trans)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TJSONProtocol.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TJSONProtocol.py
deleted file mode 100644
index 6f51523..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TJSONProtocol.py
+++ /dev/null
@@ -1,552 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 base64
-import json
-import math
-
-from lib.thrift.protocol.TProtocol import TType, TProtocolBase, TProtocolException
-
-
-__all__ = ['TJSONProtocol',
-           'TJSONProtocolFactory',
-           'TSimpleJSONProtocol',
-           'TSimpleJSONProtocolFactory']
-
-VERSION = 1
-
-COMMA = ','
-COLON = ':'
-LBRACE = '{'
-RBRACE = '}'
-LBRACKET = '['
-RBRACKET = ']'
-QUOTE = '"'
-BACKSLASH = '\\'
-ZERO = '0'
-
-ESCSEQ = '\\u00'
-ESCAPE_CHAR = '"\\bfnrt'
-ESCAPE_CHAR_VALS = ['"', '\\', '\b', '\f', '\n', '\r', '\t']
-NUMERIC_CHAR = '+-.0123456789Ee'
-
-CTYPES = {TType.BOOL:       'tf',
-          TType.BYTE:       'i8',
-          TType.I16:        'i16',
-          TType.I32:        'i32',
-          TType.I64:        'i64',
-          TType.DOUBLE:     'dbl',
-          TType.STRING:     'str',
-          TType.STRUCT:     'rec',
-          TType.LIST:       'lst',
-          TType.SET:        'set',
-          TType.MAP:        'map'}
-
-JTYPES = {}
-for key in CTYPES.keys():
-  JTYPES[CTYPES[key]] = key
-
-
-class JSONBaseContext(object):
-
-  def __init__(self, protocol):
-    self.protocol = protocol
-    self.first = True
-
-  def doIO(self, function):
-    pass
-  
-  def write(self):
-    pass
-
-  def read(self):
-    pass
-
-  def escapeNum(self):
-    return False
-
-  def __str__(self):
-    return self.__class__.__name__
-
-
-class JSONListContext(JSONBaseContext):
-    
-  def doIO(self, function):
-    if self.first is True:
-      self.first = False
-    else:
-      function(COMMA)
-
-  def write(self):
-    self.doIO(self.protocol.trans.write)
-
-  def read(self):
-    self.doIO(self.protocol.readJSONSyntaxChar)
-
-
-class JSONPairContext(JSONBaseContext):
-  
-  def __init__(self, protocol):
-    super(JSONPairContext, self).__init__(protocol)
-    self.colon = True
-
-  def doIO(self, function):
-    if self.first:
-      self.first = False
-      self.colon = True
-    else:
-      function(COLON if self.colon else COMMA)
-      self.colon = not self.colon
-
-  def write(self):
-    self.doIO(self.protocol.trans.write)
-
-  def read(self):
-    self.doIO(self.protocol.readJSONSyntaxChar)
-
-  def escapeNum(self):
-    return self.colon
-
-  def __str__(self):
-    return '%s, colon=%s' % (self.__class__.__name__, self.colon)
-
-
-class LookaheadReader():
-  hasData = False
-  data = ''
-
-  def __init__(self, protocol):
-    self.protocol = protocol
-
-  def read(self):
-    if self.hasData is True:
-      self.hasData = False
-    else:
-      self.data = self.protocol.trans.read(1)
-    return self.data
-
-  def peek(self):
-    if self.hasData is False:
-      self.data = self.protocol.trans.read(1)
-    self.hasData = True
-    return self.data
-
-class TJSONProtocolBase(TProtocolBase):
-
-  def __init__(self, trans):
-    TProtocolBase.__init__(self, trans)
-    self.resetWriteContext()
-    self.resetReadContext()
-
-  def resetWriteContext(self):
-    self.context = JSONBaseContext(self)
-    self.contextStack = [self.context]
-
-  def resetReadContext(self):
-    self.resetWriteContext()
-    self.reader = LookaheadReader(self)
-
-  def pushContext(self, ctx):
-    self.contextStack.append(ctx)
-    self.context = ctx
-
-  def popContext(self):
-    self.contextStack.pop()
-    if self.contextStack:
-      self.context = self.contextStack[-1]
-    else:
-      self.context = JSONBaseContext(self)
-
-  def writeJSONString(self, string):
-    self.context.write()
-    self.trans.write(json.dumps(string))
-
-  def writeJSONNumber(self, number):
-    self.context.write()
-    jsNumber = str(number)
-    if self.context.escapeNum():
-      jsNumber = "%s%s%s" % (QUOTE, jsNumber,  QUOTE)
-    self.trans.write(jsNumber)
-
-  def writeJSONBase64(self, binary):
-    self.context.write()
-    self.trans.write(QUOTE)
-    self.trans.write(base64.b64encode(binary))
-    self.trans.write(QUOTE)
-
-  def writeJSONObjectStart(self):
-    self.context.write()
-    self.trans.write(LBRACE)
-    self.pushContext(JSONPairContext(self))
-
-  def writeJSONObjectEnd(self):
-    self.popContext()
-    self.trans.write(RBRACE)
-
-  def writeJSONArrayStart(self):
-    self.context.write()
-    self.trans.write(LBRACKET)
-    self.pushContext(JSONListContext(self))
-
-  def writeJSONArrayEnd(self):
-    self.popContext()
-    self.trans.write(RBRACKET)
-
-  def readJSONSyntaxChar(self, character):
-    current = self.reader.read()
-    if character != current:
-      raise TProtocolException(TProtocolException.INVALID_DATA,
-                               "Unexpected character: %s" % current)
-
-  def readJSONString(self, skipContext):
-    string = []
-    if skipContext is False:
-      self.context.read()
-    self.readJSONSyntaxChar(QUOTE)
-    while True:
-      character = self.reader.read()
-      if character == QUOTE:
-        break
-      if character == ESCSEQ[0]:
-        character = self.reader.read()
-        if character == ESCSEQ[1]:
-          self.readJSONSyntaxChar(ZERO)
-          self.readJSONSyntaxChar(ZERO)
-          character = json.JSONDecoder().decode('"\u00%s"' % self.trans.read(2))
-        else:
-          off = ESCAPE_CHAR.find(character)
-          if off == -1:
-            raise TProtocolException(TProtocolException.INVALID_DATA,
-                                     "Expected control char")
-          character = ESCAPE_CHAR_VALS[off]
-      string.append(character)
-    return ''.join(string)
-
-  def isJSONNumeric(self, character):
-    return (True if NUMERIC_CHAR.find(character) != - 1 else False)
-
-  def readJSONQuotes(self):
-    if (self.context.escapeNum()):
-      self.readJSONSyntaxChar(QUOTE)
-
-  def readJSONNumericChars(self):
-    numeric = []
-    while True:
-      character = self.reader.peek()
-      if self.isJSONNumeric(character) is False:
-        break
-      numeric.append(self.reader.read())
-    return ''.join(numeric)
-
-  def readJSONInteger(self):
-    self.context.read()
-    self.readJSONQuotes()
-    numeric = self.readJSONNumericChars()
-    self.readJSONQuotes()
-    try:
-      return int(numeric)
-    except ValueError:
-      raise TProtocolException(TProtocolException.INVALID_DATA,
-                               "Bad data encounted in numeric data")
-
-  def readJSONDouble(self):
-    self.context.read()
-    if self.reader.peek() == QUOTE:
-      string  = self.readJSONString(True)
-      try:
-        double = float(string)
-        if (self.context.escapeNum is False and
-            not math.isinf(double) and
-            not math.isnan(double)):
-          raise TProtocolException(TProtocolException.INVALID_DATA,
-                                   "Numeric data unexpectedly quoted")
-        return double
-      except ValueError:
-        raise TProtocolException(TProtocolException.INVALID_DATA,
-                                 "Bad data encounted in numeric data")
-    else:
-      if self.context.escapeNum() is True:
-        self.readJSONSyntaxChar(QUOTE)
-      try:
-        return float(self.readJSONNumericChars())
-      except ValueError:
-        raise TProtocolException(TProtocolException.INVALID_DATA,
-                                 "Bad data encounted in numeric data")
-
-  def readJSONBase64(self):
-    string = self.readJSONString(False)
-    return base64.b64decode(string)
-
-  def readJSONObjectStart(self):
-    self.context.read()
-    self.readJSONSyntaxChar(LBRACE)
-    self.pushContext(JSONPairContext(self))
-
-  def readJSONObjectEnd(self):
-    self.readJSONSyntaxChar(RBRACE)
-    self.popContext()
-
-  def readJSONArrayStart(self):
-    self.context.read()
-    self.readJSONSyntaxChar(LBRACKET)
-    self.pushContext(JSONListContext(self))
-
-  def readJSONArrayEnd(self):
-    self.readJSONSyntaxChar(RBRACKET)
-    self.popContext()
-
-
-class TJSONProtocol(TJSONProtocolBase):
-
-  def readMessageBegin(self):
-    self.resetReadContext()
-    self.readJSONArrayStart()
-    if self.readJSONInteger() != VERSION:
-      raise TProtocolException(TProtocolException.BAD_VERSION,
-                               "Message contained bad version.")
-    name = self.readJSONString(False)
-    typen = self.readJSONInteger()
-    seqid = self.readJSONInteger()
-    return (name, typen, seqid)
-
-  def readMessageEnd(self):
-    self.readJSONArrayEnd()
-
-  def readStructBegin(self):
-    self.readJSONObjectStart()
-
-  def readStructEnd(self):
-    self.readJSONObjectEnd()
-
-  def readFieldBegin(self):
-    character = self.reader.peek()
-    ttype = 0
-    id = 0
-    if character == RBRACE:
-      ttype = TType.STOP
-    else:
-      id = self.readJSONInteger()
-      self.readJSONObjectStart()
-      ttype = JTYPES[self.readJSONString(False)]
-    return (None, ttype, id)
-
-  def readFieldEnd(self):
-    self.readJSONObjectEnd()
-
-  def readMapBegin(self):
-    self.readJSONArrayStart()
-    keyType = JTYPES[self.readJSONString(False)]
-    valueType = JTYPES[self.readJSONString(False)]
-    size = self.readJSONInteger()
-    self.readJSONObjectStart()
-    return (keyType, valueType, size)
-
-  def readMapEnd(self):
-    self.readJSONObjectEnd()
-    self.readJSONArrayEnd()
-
-  def readCollectionBegin(self):
-    self.readJSONArrayStart()
-    elemType = JTYPES[self.readJSONString(False)]
-    size = self.readJSONInteger()
-    return (elemType, size)
-  readListBegin = readCollectionBegin
-  readSetBegin = readCollectionBegin
-
-  def readCollectionEnd(self):
-    self.readJSONArrayEnd()
-  readSetEnd = readCollectionEnd
-  readListEnd = readCollectionEnd
-
-  def readBool(self):
-    return (False if self.readJSONInteger() == 0 else True)
-
-  def readNumber(self):
-    return self.readJSONInteger()
-  readByte = readNumber
-  readI16 = readNumber
-  readI32 = readNumber
-  readI64 = readNumber
-
-  def readDouble(self):
-    return self.readJSONDouble()
-
-  def readString(self):
-    return self.readJSONString(False)
-
-  def readBinary(self):
-    return self.readJSONBase64()
-
-  def writeMessageBegin(self, name, request_type, seqid):
-    self.resetWriteContext()
-    self.writeJSONArrayStart()
-    self.writeJSONNumber(VERSION)
-    self.writeJSONString(name)
-    self.writeJSONNumber(request_type)
-    self.writeJSONNumber(seqid)
-
-  def writeMessageEnd(self):
-    self.writeJSONArrayEnd()
-
-  def writeStructBegin(self, name):
-    self.writeJSONObjectStart()
-
-  def writeStructEnd(self):
-    self.writeJSONObjectEnd()
-
-  def writeFieldBegin(self, name, ttype, id):
-    self.writeJSONNumber(id)
-    self.writeJSONObjectStart()
-    self.writeJSONString(CTYPES[ttype])
-
-  def writeFieldEnd(self):
-    self.writeJSONObjectEnd()
-
-  def writeFieldStop(self):
-    pass
-
-  def writeMapBegin(self, ktype, vtype, size):
-    self.writeJSONArrayStart()
-    self.writeJSONString(CTYPES[ktype])
-    self.writeJSONString(CTYPES[vtype])
-    self.writeJSONNumber(size)
-    self.writeJSONObjectStart()
-
-  def writeMapEnd(self):
-    self.writeJSONObjectEnd()
-    self.writeJSONArrayEnd()
-    
-  def writeListBegin(self, etype, size):
-    self.writeJSONArrayStart()
-    self.writeJSONString(CTYPES[etype])
-    self.writeJSONNumber(size)
-    
-  def writeListEnd(self):
-    self.writeJSONArrayEnd()
-
-  def writeSetBegin(self, etype, size):
-    self.writeJSONArrayStart()
-    self.writeJSONString(CTYPES[etype])
-    self.writeJSONNumber(size)
-    
-  def writeSetEnd(self):
-    self.writeJSONArrayEnd()
-
-  def writeBool(self, boolean):
-    self.writeJSONNumber(1 if boolean is True else 0)
-
-  def writeInteger(self, integer):
-    self.writeJSONNumber(integer)
-  writeByte = writeInteger
-  writeI16 = writeInteger
-  writeI32 = writeInteger
-  writeI64 = writeInteger
-
-  def writeDouble(self, dbl):
-    self.writeJSONNumber(dbl)
-
-  def writeString(self, string):
-    self.writeJSONString(string)
-    
-  def writeBinary(self, binary):
-    self.writeJSONBase64(binary)
-
-
-class TJSONProtocolFactory:
-
-  def getProtocol(self, trans):
-    return TJSONProtocol(trans)
-
-
-class TSimpleJSONProtocol(TJSONProtocolBase):
-    """Simple, readable, write-only JSON protocol.
-    
-    Useful for interacting with scripting languages.
-    """
-
-    def readMessageBegin(self):
-        raise NotImplementedError()
-    
-    def readMessageEnd(self):
-        raise NotImplementedError()
-    
-    def readStructBegin(self):
-        raise NotImplementedError()
-    
-    def readStructEnd(self):
-        raise NotImplementedError()
-    
-    def writeMessageBegin(self, name, request_type, seqid):
-        self.resetWriteContext()
-    
-    def writeMessageEnd(self):
-        pass
-    
-    def writeStructBegin(self, name):
-        self.writeJSONObjectStart()
-    
-    def writeStructEnd(self):
-        self.writeJSONObjectEnd()
-      
-    def writeFieldBegin(self, name, ttype, fid):
-        self.writeJSONString(name)
-    
-    def writeFieldEnd(self):
-        pass
-    
-    def writeMapBegin(self, ktype, vtype, size):
-        self.writeJSONObjectStart()
-    
-    def writeMapEnd(self):
-        self.writeJSONObjectEnd()
-    
-    def _writeCollectionBegin(self, etype, size):
-        self.writeJSONArrayStart()
-    
-    def _writeCollectionEnd(self):
-        self.writeJSONArrayEnd()
-    writeListBegin = _writeCollectionBegin
-    writeListEnd = _writeCollectionEnd
-    writeSetBegin = _writeCollectionBegin
-    writeSetEnd = _writeCollectionEnd
-
-    def writeInteger(self, integer):
-        self.writeJSONNumber(integer)
-    writeByte = writeInteger
-    writeI16 = writeInteger
-    writeI32 = writeInteger
-    writeI64 = writeInteger
-    
-    def writeBool(self, boolean):
-        self.writeJSONNumber(1 if boolean is True else 0)
-
-    def writeDouble(self, dbl):
-        self.writeJSONNumber(dbl)
-    
-    def writeString(self, string):
-        self.writeJSONString(string)
-      
-    def writeBinary(self, binary):
-        self.writeJSONBase64(binary)
-
-
-class TSimpleJSONProtocolFactory(object):
-
-    def getProtocol(self, trans):
-        return TSimpleJSONProtocol(trans)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TProtocol.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TProtocol.py
deleted file mode 100644
index dc2b095..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/TProtocol.py
+++ /dev/null
@@ -1,406 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from thrift.Thrift import *
-
-
-class TProtocolException(TException):
-  """Custom Protocol Exception class"""
-
-  UNKNOWN = 0
-  INVALID_DATA = 1
-  NEGATIVE_SIZE = 2
-  SIZE_LIMIT = 3
-  BAD_VERSION = 4
-
-  def __init__(self, type=UNKNOWN, message=None):
-    TException.__init__(self, message)
-    self.type = type
-
-
-class TProtocolBase:
-  """Base class for Thrift protocol driver."""
-
-  def __init__(self, trans):
-    self.trans = trans
-
-  def writeMessageBegin(self, name, ttype, seqid):
-    pass
-
-  def writeMessageEnd(self):
-    pass
-
-  def writeStructBegin(self, name):
-    pass
-
-  def writeStructEnd(self):
-    pass
-
-  def writeFieldBegin(self, name, ttype, fid):
-    pass
-
-  def writeFieldEnd(self):
-    pass
-
-  def writeFieldStop(self):
-    pass
-
-  def writeMapBegin(self, ktype, vtype, size):
-    pass
-
-  def writeMapEnd(self):
-    pass
-
-  def writeListBegin(self, etype, size):
-    pass
-
-  def writeListEnd(self):
-    pass
-
-  def writeSetBegin(self, etype, size):
-    pass
-
-  def writeSetEnd(self):
-    pass
-
-  def writeBool(self, bool_val):
-    pass
-
-  def writeByte(self, byte):
-    pass
-
-  def writeI16(self, i16):
-    pass
-
-  def writeI32(self, i32):
-    pass
-
-  def writeI64(self, i64):
-    pass
-
-  def writeDouble(self, dub):
-    pass
-
-  def writeString(self, str_val):
-    pass
-
-  def readMessageBegin(self):
-    pass
-
-  def readMessageEnd(self):
-    pass
-
-  def readStructBegin(self):
-    pass
-
-  def readStructEnd(self):
-    pass
-
-  def readFieldBegin(self):
-    pass
-
-  def readFieldEnd(self):
-    pass
-
-  def readMapBegin(self):
-    pass
-
-  def readMapEnd(self):
-    pass
-
-  def readListBegin(self):
-    pass
-
-  def readListEnd(self):
-    pass
-
-  def readSetBegin(self):
-    pass
-
-  def readSetEnd(self):
-    pass
-
-  def readBool(self):
-    pass
-
-  def readByte(self):
-    pass
-
-  def readI16(self):
-    pass
-
-  def readI32(self):
-    pass
-
-  def readI64(self):
-    pass
-
-  def readDouble(self):
-    pass
-
-  def readString(self):
-    pass
-
-  def skip(self, ttype):
-    if ttype == TType.STOP:
-      return
-    elif ttype == TType.BOOL:
-      self.readBool()
-    elif ttype == TType.BYTE:
-      self.readByte()
-    elif ttype == TType.I16:
-      self.readI16()
-    elif ttype == TType.I32:
-      self.readI32()
-    elif ttype == TType.I64:
-      self.readI64()
-    elif ttype == TType.DOUBLE:
-      self.readDouble()
-    elif ttype == TType.STRING:
-      self.readString()
-    elif ttype == TType.STRUCT:
-      name = self.readStructBegin()
-      while True:
-        (name, ttype, id) = self.readFieldBegin()
-        if ttype == TType.STOP:
-          break
-        self.skip(ttype)
-        self.readFieldEnd()
-      self.readStructEnd()
-    elif ttype == TType.MAP:
-      (ktype, vtype, size) = self.readMapBegin()
-      for i in xrange(size):
-        self.skip(ktype)
-        self.skip(vtype)
-      self.readMapEnd()
-    elif ttype == TType.SET:
-      (etype, size) = self.readSetBegin()
-      for i in xrange(size):
-        self.skip(etype)
-      self.readSetEnd()
-    elif ttype == TType.LIST:
-      (etype, size) = self.readListBegin()
-      for i in xrange(size):
-        self.skip(etype)
-      self.readListEnd()
-
-  # tuple of: ( 'reader method' name, is_container bool, 'writer_method' name )
-  _TTYPE_HANDLERS = (
-       (None, None, False),  # 0 TType.STOP
-       (None, None, False),  # 1 TType.VOID # TODO: handle void?
-       ('readBool', 'writeBool', False),  # 2 TType.BOOL
-       ('readByte',  'writeByte', False),  # 3 TType.BYTE and I08
-       ('readDouble', 'writeDouble', False),  # 4 TType.DOUBLE
-       (None, None, False),  # 5 undefined
-       ('readI16', 'writeI16', False),  # 6 TType.I16
-       (None, None, False),  # 7 undefined
-       ('readI32', 'writeI32', False),  # 8 TType.I32
-       (None, None, False),  # 9 undefined
-       ('readI64', 'writeI64', False),  # 10 TType.I64
-       ('readString', 'writeString', False),  # 11 TType.STRING and UTF7
-       ('readContainerStruct', 'writeContainerStruct', True),  # 12 *.STRUCT
-       ('readContainerMap', 'writeContainerMap', True),  # 13 TType.MAP
-       ('readContainerSet', 'writeContainerSet', True),  # 14 TType.SET
-       ('readContainerList', 'writeContainerList', True),  # 15 TType.LIST
-       (None, None, False),  # 16 TType.UTF8 # TODO: handle utf8 types?
-       (None, None, False)  # 17 TType.UTF16 # TODO: handle utf16 types?
-      )
-
-  def readFieldByTType(self, ttype, spec):
-    try:
-      (r_handler, w_handler, is_container) = self._TTYPE_HANDLERS[ttype]
-    except IndexError:
-      raise TProtocolException(type=TProtocolException.INVALID_DATA,
-                               message='Invalid field type %d' % (ttype))
-    if r_handler is None:
-      raise TProtocolException(type=TProtocolException.INVALID_DATA,
-                               message='Invalid field type %d' % (ttype))
-    reader = getattr(self, r_handler)
-    if not is_container:
-      return reader()
-    return reader(spec)
-
-  def readContainerList(self, spec):
-    results = []
-    ttype, tspec = spec[0], spec[1]
-    r_handler = self._TTYPE_HANDLERS[ttype][0]
-    reader = getattr(self, r_handler)
-    (list_type, list_len) = self.readListBegin()
-    if tspec is None:
-      # list values are simple types
-      for idx in xrange(list_len):
-        results.append(reader())
-    else:
-      # this is like an inlined readFieldByTType
-      container_reader = self._TTYPE_HANDLERS[list_type][0]
-      val_reader = getattr(self, container_reader)
-      for idx in xrange(list_len):
-        val = val_reader(tspec)
-        results.append(val)
-    self.readListEnd()
-    return results
-
-  def readContainerSet(self, spec):
-    results = set()
-    ttype, tspec = spec[0], spec[1]
-    r_handler = self._TTYPE_HANDLERS[ttype][0]
-    reader = getattr(self, r_handler)
-    (set_type, set_len) = self.readSetBegin()
-    if tspec is None:
-      # set members are simple types
-      for idx in xrange(set_len):
-        results.add(reader())
-    else:
-      container_reader = self._TTYPE_HANDLERS[set_type][0]
-      val_reader = getattr(self, container_reader)
-      for idx in xrange(set_len):
-        results.add(val_reader(tspec))
-    self.readSetEnd()
-    return results
-
-  def readContainerStruct(self, spec):
-    (obj_class, obj_spec) = spec
-    obj = obj_class()
-    obj.read(self)
-    return obj
-
-  def readContainerMap(self, spec):
-    results = dict()
-    key_ttype, key_spec = spec[0], spec[1]
-    val_ttype, val_spec = spec[2], spec[3]
-    (map_ktype, map_vtype, map_len) = self.readMapBegin()
-    # TODO: compare types we just decoded with thrift_spec and
-    # abort/skip if types disagree
-    key_reader = getattr(self, self._TTYPE_HANDLERS[key_ttype][0])
-    val_reader = getattr(self, self._TTYPE_HANDLERS[val_ttype][0])
-    # list values are simple types
-    for idx in xrange(map_len):
-      if key_spec is None:
-        k_val = key_reader()
-      else:
-        k_val = self.readFieldByTType(key_ttype, key_spec)
-      if val_spec is None:
-        v_val = val_reader()
-      else:
-        v_val = self.readFieldByTType(val_ttype, val_spec)
-      # this raises a TypeError with unhashable keys types
-      # i.e. this fails: d=dict(); d[[0,1]] = 2
-      results[k_val] = v_val
-    self.readMapEnd()
-    return results
-
-  def readStruct(self, obj, thrift_spec):
-    self.readStructBegin()
-    while True:
-      (fname, ftype, fid) = self.readFieldBegin()
-      if ftype == TType.STOP:
-        break
-      try:
-        field = thrift_spec[fid]
-      except IndexError:
-        self.skip(ftype)
-      else:
-        if field is not None and ftype == field[1]:
-          fname = field[2]
-          fspec = field[3]
-          val = self.readFieldByTType(ftype, fspec)
-          setattr(obj, fname, val)
-        else:
-          self.skip(ftype)
-      self.readFieldEnd()
-    self.readStructEnd()
-
-  def writeContainerStruct(self, val, spec):
-    val.write(self)
-
-  def writeContainerList(self, val, spec):
-    self.writeListBegin(spec[0], len(val))
-    r_handler, w_handler, is_container = self._TTYPE_HANDLERS[spec[0]]
-    e_writer = getattr(self, w_handler)
-    if not is_container:
-      for elem in val:
-        e_writer(elem)
-    else:
-      for elem in val:
-        e_writer(elem, spec[1])
-    self.writeListEnd()
-
-  def writeContainerSet(self, val, spec):
-    self.writeSetBegin(spec[0], len(val))
-    r_handler, w_handler, is_container = self._TTYPE_HANDLERS[spec[0]]
-    e_writer = getattr(self, w_handler)
-    if not is_container:
-      for elem in val:
-        e_writer(elem)
-    else:
-      for elem in val:
-        e_writer(elem, spec[1])
-    self.writeSetEnd()
-
-  def writeContainerMap(self, val, spec):
-    k_type = spec[0]
-    v_type = spec[2]
-    ignore, ktype_name, k_is_container = self._TTYPE_HANDLERS[k_type]
-    ignore, vtype_name, v_is_container = self._TTYPE_HANDLERS[v_type]
-    k_writer = getattr(self, ktype_name)
-    v_writer = getattr(self, vtype_name)
-    self.writeMapBegin(k_type, v_type, len(val))
-    for m_key, m_val in val.iteritems():
-      if not k_is_container:
-        k_writer(m_key)
-      else:
-        k_writer(m_key, spec[1])
-      if not v_is_container:
-        v_writer(m_val)
-      else:
-        v_writer(m_val, spec[3])
-    self.writeMapEnd()
-
-  def writeStruct(self, obj, thrift_spec):
-    self.writeStructBegin(obj.__class__.__name__)
-    for field in thrift_spec:
-      if field is None:
-        continue
-      fname = field[2]
-      val = getattr(obj, fname)
-      if val is None:
-        # skip writing out unset fields
-        continue
-      fid = field[0]
-      ftype = field[1]
-      fspec = field[3]
-      # get the writer method for this value
-      self.writeFieldBegin(fname, ftype, fid)
-      self.writeFieldByTType(ftype, val, fspec)
-      self.writeFieldEnd()
-    self.writeFieldStop()
-    self.writeStructEnd()
-
-  def writeFieldByTType(self, ttype, val, spec):
-    r_handler, w_handler, is_container = self._TTYPE_HANDLERS[ttype]
-    writer = getattr(self, w_handler)
-    if is_container:
-      writer(val, spec)
-    else:
-      writer(val)
-
-
-class TProtocolFactory:
-  def getProtocol(self, trans):
-    pass
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/__init__.py
deleted file mode 100644
index 7eefb45..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-__all__ = ['fastbinary', 'TBase', 'TBinaryProtocol', 'TCompactProtocol', 'TJSONProtocol', 'TProtocol']
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/fastbinary.c b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/fastbinary.c
deleted file mode 100644
index 2ce5660..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/protocol/fastbinary.c
+++ /dev/null
@@ -1,1219 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- */
-
-#include <Python.h>
-#include "cStringIO.h"
-#include <stdint.h>
-#ifndef _WIN32
-# include <stdbool.h>
-# include <netinet/in.h>
-#else
-# include <WinSock2.h>
-# pragma comment (lib, "ws2_32.lib")
-# define BIG_ENDIAN (4321)
-# define LITTLE_ENDIAN (1234)
-# define BYTE_ORDER LITTLE_ENDIAN
-# if defined(_MSC_VER) && _MSC_VER < 1600
-   typedef int _Bool;
-#  define bool _Bool
-#  define false 0 
-#  define true 1
-# endif
-# define inline __inline
-#endif
-
-/* Fix endianness issues on Solaris */
-#if defined (__SVR4) && defined (__sun)
- #if defined(__i386) && !defined(__i386__)
-  #define __i386__
- #endif
-
- #ifndef BIG_ENDIAN
-  #define BIG_ENDIAN (4321)
- #endif
- #ifndef LITTLE_ENDIAN
-  #define LITTLE_ENDIAN (1234)
- #endif
-
- /* I386 is LE, even on Solaris */
- #if !defined(BYTE_ORDER) && defined(__i386__)
-  #define BYTE_ORDER LITTLE_ENDIAN
- #endif
-#endif
-
-// TODO(dreiss): defval appears to be unused.  Look into removing it.
-// TODO(dreiss): Make parse_spec_args recursive, and cache the output
-//               permanently in the object.  (Malloc and orphan.)
-// TODO(dreiss): Why do we need cStringIO for reading, why not just char*?
-//               Can cStringIO let us work with a BufferedTransport?
-// TODO(dreiss): Don't ignore the rv from cwrite (maybe).
-
-/* ====== BEGIN UTILITIES ====== */
-
-#define INIT_OUTBUF_SIZE 128
-
-// Stolen out of TProtocol.h.
-// It would be a huge pain to have both get this from one place.
-typedef enum TType {
-  T_STOP       = 0,
-  T_VOID       = 1,
-  T_BOOL       = 2,
-  T_BYTE       = 3,
-  T_I08        = 3,
-  T_I16        = 6,
-  T_I32        = 8,
-  T_U64        = 9,
-  T_I64        = 10,
-  T_DOUBLE     = 4,
-  T_STRING     = 11,
-  T_UTF7       = 11,
-  T_STRUCT     = 12,
-  T_MAP        = 13,
-  T_SET        = 14,
-  T_LIST       = 15,
-  T_UTF8       = 16,
-  T_UTF16      = 17
-} TType;
-
-#ifndef __BYTE_ORDER
-# if defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
-#  define __BYTE_ORDER BYTE_ORDER
-#  define __LITTLE_ENDIAN LITTLE_ENDIAN
-#  define __BIG_ENDIAN BIG_ENDIAN
-# else
-#  error "Cannot determine endianness"
-# endif
-#endif
-
-// Same comment as the enum.  Sorry.
-#if __BYTE_ORDER == __BIG_ENDIAN
-# define ntohll(n) (n)
-# define htonll(n) (n)
-#elif __BYTE_ORDER == __LITTLE_ENDIAN
-# if defined(__GNUC__) && defined(__GLIBC__)
-#  include <byteswap.h>
-#  define ntohll(n) bswap_64(n)
-#  define htonll(n) bswap_64(n)
-# else /* GNUC & GLIBC */
-#  define ntohll(n) ( (((unsigned long long)ntohl(n)) << 32) + ntohl(n >> 32) )
-#  define htonll(n) ( (((unsigned long long)htonl(n)) << 32) + htonl(n >> 32) )
-# endif /* GNUC & GLIBC */
-#else /* __BYTE_ORDER */
-# error "Can't define htonll or ntohll!"
-#endif
-
-// Doing a benchmark shows that interning actually makes a difference, amazingly.
-#define INTERN_STRING(value) _intern_ ## value
-
-#define INT_CONV_ERROR_OCCURRED(v) ( ((v) == -1) && PyErr_Occurred() )
-#define CHECK_RANGE(v, min, max) ( ((v) <= (max)) && ((v) >= (min)) )
-
-// Py_ssize_t was not defined before Python 2.5
-#if (PY_VERSION_HEX < 0x02050000)
-typedef int Py_ssize_t;
-#endif
-
-/**
- * A cache of the spec_args for a set or list,
- * so we don't have to keep calling PyTuple_GET_ITEM.
- */
-typedef struct {
-  TType element_type;
-  PyObject* typeargs;
-} SetListTypeArgs;
-
-/**
- * A cache of the spec_args for a map,
- * so we don't have to keep calling PyTuple_GET_ITEM.
- */
-typedef struct {
-  TType ktag;
-  TType vtag;
-  PyObject* ktypeargs;
-  PyObject* vtypeargs;
-} MapTypeArgs;
-
-/**
- * A cache of the spec_args for a struct,
- * so we don't have to keep calling PyTuple_GET_ITEM.
- */
-typedef struct {
-  PyObject* klass;
-  PyObject* spec;
-} StructTypeArgs;
-
-/**
- * A cache of the item spec from a struct specification,
- * so we don't have to keep calling PyTuple_GET_ITEM.
- */
-typedef struct {
-  int tag;
-  TType type;
-  PyObject* attrname;
-  PyObject* typeargs;
-  PyObject* defval;
-} StructItemSpec;
-
-/**
- * A cache of the two key attributes of a CReadableTransport,
- * so we don't have to keep calling PyObject_GetAttr.
- */
-typedef struct {
-  PyObject* stringiobuf;
-  PyObject* refill_callable;
-} DecodeBuffer;
-
-/** Pointer to interned string to speed up attribute lookup. */
-static PyObject* INTERN_STRING(cstringio_buf);
-/** Pointer to interned string to speed up attribute lookup. */
-static PyObject* INTERN_STRING(cstringio_refill);
-
-static inline bool
-check_ssize_t_32(Py_ssize_t len) {
-  // error from getting the int
-  if (INT_CONV_ERROR_OCCURRED(len)) {
-    return false;
-  }
-  if (!CHECK_RANGE(len, 0, INT32_MAX)) {
-    PyErr_SetString(PyExc_OverflowError, "string size out of range");
-    return false;
-  }
-  return true;
-}
-
-static inline bool
-parse_pyint(PyObject* o, int32_t* ret, int32_t min, int32_t max) {
-  long val = PyInt_AsLong(o);
-
-  if (INT_CONV_ERROR_OCCURRED(val)) {
-    return false;
-  }
-  if (!CHECK_RANGE(val, min, max)) {
-    PyErr_SetString(PyExc_OverflowError, "int out of range");
-    return false;
-  }
-
-  *ret = (int32_t) val;
-  return true;
-}
-
-
-/* --- FUNCTIONS TO PARSE STRUCT SPECIFICATOINS --- */
-
-static bool
-parse_set_list_args(SetListTypeArgs* dest, PyObject* typeargs) {
-  if (PyTuple_Size(typeargs) != 2) {
-    PyErr_SetString(PyExc_TypeError, "expecting tuple of size 2 for list/set type args");
-    return false;
-  }
-
-  dest->element_type = PyInt_AsLong(PyTuple_GET_ITEM(typeargs, 0));
-  if (INT_CONV_ERROR_OCCURRED(dest->element_type)) {
-    return false;
-  }
-
-  dest->typeargs = PyTuple_GET_ITEM(typeargs, 1);
-
-  return true;
-}
-
-static bool
-parse_map_args(MapTypeArgs* dest, PyObject* typeargs) {
-  if (PyTuple_Size(typeargs) != 4) {
-    PyErr_SetString(PyExc_TypeError, "expecting 4 arguments for typeargs to map");
-    return false;
-  }
-
-  dest->ktag = PyInt_AsLong(PyTuple_GET_ITEM(typeargs, 0));
-  if (INT_CONV_ERROR_OCCURRED(dest->ktag)) {
-    return false;
-  }
-
-  dest->vtag = PyInt_AsLong(PyTuple_GET_ITEM(typeargs, 2));
-  if (INT_CONV_ERROR_OCCURRED(dest->vtag)) {
-    return false;
-  }
-
-  dest->ktypeargs = PyTuple_GET_ITEM(typeargs, 1);
-  dest->vtypeargs = PyTuple_GET_ITEM(typeargs, 3);
-
-  return true;
-}
-
-static bool
-parse_struct_args(StructTypeArgs* dest, PyObject* typeargs) {
-  if (PyTuple_Size(typeargs) != 2) {
-    PyErr_SetString(PyExc_TypeError, "expecting tuple of size 2 for struct args");
-    return false;
-  }
-
-  dest->klass = PyTuple_GET_ITEM(typeargs, 0);
-  dest->spec = PyTuple_GET_ITEM(typeargs, 1);
-
-  return true;
-}
-
-static int
-parse_struct_item_spec(StructItemSpec* dest, PyObject* spec_tuple) {
-
-  // i'd like to use ParseArgs here, but it seems to be a bottleneck.
-  if (PyTuple_Size(spec_tuple) != 5) {
-    PyErr_SetString(PyExc_TypeError, "expecting 5 arguments for spec tuple");
-    return false;
-  }
-
-  dest->tag = PyInt_AsLong(PyTuple_GET_ITEM(spec_tuple, 0));
-  if (INT_CONV_ERROR_OCCURRED(dest->tag)) {
-    return false;
-  }
-
-  dest->type = PyInt_AsLong(PyTuple_GET_ITEM(spec_tuple, 1));
-  if (INT_CONV_ERROR_OCCURRED(dest->type)) {
-    return false;
-  }
-
-  dest->attrname = PyTuple_GET_ITEM(spec_tuple, 2);
-  dest->typeargs = PyTuple_GET_ITEM(spec_tuple, 3);
-  dest->defval = PyTuple_GET_ITEM(spec_tuple, 4);
-  return true;
-}
-
-/* ====== END UTILITIES ====== */
-
-
-/* ====== BEGIN WRITING FUNCTIONS ====== */
-
-/* --- LOW-LEVEL WRITING FUNCTIONS --- */
-
-static void writeByte(PyObject* outbuf, int8_t val) {
-  int8_t net = val;
-  PycStringIO->cwrite(outbuf, (char*)&net, sizeof(int8_t));
-}
-
-static void writeI16(PyObject* outbuf, int16_t val) {
-  int16_t net = (int16_t)htons(val);
-  PycStringIO->cwrite(outbuf, (char*)&net, sizeof(int16_t));
-}
-
-static void writeI32(PyObject* outbuf, int32_t val) {
-  int32_t net = (int32_t)htonl(val);
-  PycStringIO->cwrite(outbuf, (char*)&net, sizeof(int32_t));
-}
-
-static void writeI64(PyObject* outbuf, int64_t val) {
-  int64_t net = (int64_t)htonll(val);
-  PycStringIO->cwrite(outbuf, (char*)&net, sizeof(int64_t));
-}
-
-static void writeDouble(PyObject* outbuf, double dub) {
-  // Unfortunately, bitwise_cast doesn't work in C.  Bad C!
-  union {
-    double f;
-    int64_t t;
-  } transfer;
-  transfer.f = dub;
-  writeI64(outbuf, transfer.t);
-}
-
-
-/* --- MAIN RECURSIVE OUTPUT FUCNTION -- */
-
-static int
-output_val(PyObject* output, PyObject* value, TType type, PyObject* typeargs) {
-  /*
-   * Refcounting Strategy:
-   *
-   * We assume that elements of the thrift_spec tuple are not going to be
-   * mutated, so we don't ref count those at all. Other than that, we try to
-   * keep a reference to all the user-created objects while we work with them.
-   * output_val assumes that a reference is already held. The *caller* is
-   * responsible for handling references
-   */
-
-  switch (type) {
-
-  case T_BOOL: {
-    int v = PyObject_IsTrue(value);
-    if (v == -1) {
-      return false;
-    }
-
-    writeByte(output, (int8_t) v);
-    break;
-  }
-  case T_I08: {
-    int32_t val;
-
-    if (!parse_pyint(value, &val, INT8_MIN, INT8_MAX)) {
-      return false;
-    }
-
-    writeByte(output, (int8_t) val);
-    break;
-  }
-  case T_I16: {
-    int32_t val;
-
-    if (!parse_pyint(value, &val, INT16_MIN, INT16_MAX)) {
-      return false;
-    }
-
-    writeI16(output, (int16_t) val);
-    break;
-  }
-  case T_I32: {
-    int32_t val;
-
-    if (!parse_pyint(value, &val, INT32_MIN, INT32_MAX)) {
-      return false;
-    }
-
-    writeI32(output, val);
-    break;
-  }
-  case T_I64: {
-    int64_t nval = PyLong_AsLongLong(value);
-
-    if (INT_CONV_ERROR_OCCURRED(nval)) {
-      return false;
-    }
-
-    if (!CHECK_RANGE(nval, INT64_MIN, INT64_MAX)) {
-      PyErr_SetString(PyExc_OverflowError, "int out of range");
-      return false;
-    }
-
-    writeI64(output, nval);
-    break;
-  }
-
-  case T_DOUBLE: {
-    double nval = PyFloat_AsDouble(value);
-    if (nval == -1.0 && PyErr_Occurred()) {
-      return false;
-    }
-
-    writeDouble(output, nval);
-    break;
-  }
-
-  case T_STRING: {
-    Py_ssize_t len = PyString_Size(value);
-
-    if (!check_ssize_t_32(len)) {
-      return false;
-    }
-
-    writeI32(output, (int32_t) len);
-    PycStringIO->cwrite(output, PyString_AsString(value), (int32_t) len);
-    break;
-  }
-
-  case T_LIST:
-  case T_SET: {
-    Py_ssize_t len;
-    SetListTypeArgs parsedargs;
-    PyObject *item;
-    PyObject *iterator;
-
-    if (!parse_set_list_args(&parsedargs, typeargs)) {
-      return false;
-    }
-
-    len = PyObject_Length(value);
-
-    if (!check_ssize_t_32(len)) {
-      return false;
-    }
-
-    writeByte(output, parsedargs.element_type);
-    writeI32(output, (int32_t) len);
-
-    iterator =  PyObject_GetIter(value);
-    if (iterator == NULL) {
-      return false;
-    }
-
-    while ((item = PyIter_Next(iterator))) {
-      if (!output_val(output, item, parsedargs.element_type, parsedargs.typeargs)) {
-        Py_DECREF(item);
-        Py_DECREF(iterator);
-        return false;
-      }
-      Py_DECREF(item);
-    }
-
-    Py_DECREF(iterator);
-
-    if (PyErr_Occurred()) {
-      return false;
-    }
-
-    break;
-  }
-
-  case T_MAP: {
-    PyObject *k, *v;
-    Py_ssize_t pos = 0;
-    Py_ssize_t len;
-
-    MapTypeArgs parsedargs;
-
-    len = PyDict_Size(value);
-    if (!check_ssize_t_32(len)) {
-      return false;
-    }
-
-    if (!parse_map_args(&parsedargs, typeargs)) {
-      return false;
-    }
-
-    writeByte(output, parsedargs.ktag);
-    writeByte(output, parsedargs.vtag);
-    writeI32(output, len);
-
-    // TODO(bmaurer): should support any mapping, not just dicts
-    while (PyDict_Next(value, &pos, &k, &v)) {
-      // TODO(dreiss): Think hard about whether these INCREFs actually
-      //               turn any unsafe scenarios into safe scenarios.
-      Py_INCREF(k);
-      Py_INCREF(v);
-
-      if (!output_val(output, k, parsedargs.ktag, parsedargs.ktypeargs)
-          || !output_val(output, v, parsedargs.vtag, parsedargs.vtypeargs)) {
-        Py_DECREF(k);
-        Py_DECREF(v);
-        return false;
-      }
-      Py_DECREF(k);
-      Py_DECREF(v);
-    }
-    break;
-  }
-
-  // TODO(dreiss): Consider breaking this out as a function
-  //               the way we did for decode_struct.
-  case T_STRUCT: {
-    StructTypeArgs parsedargs;
-    Py_ssize_t nspec;
-    Py_ssize_t i;
-
-    if (!parse_struct_args(&parsedargs, typeargs)) {
-      return false;
-    }
-
-    nspec = PyTuple_Size(parsedargs.spec);
-
-    if (nspec == -1) {
-      return false;
-    }
-
-    for (i = 0; i < nspec; i++) {
-      StructItemSpec parsedspec;
-      PyObject* spec_tuple;
-      PyObject* instval = NULL;
-
-      spec_tuple = PyTuple_GET_ITEM(parsedargs.spec, i);
-      if (spec_tuple == Py_None) {
-        continue;
-      }
-
-      if (!parse_struct_item_spec (&parsedspec, spec_tuple)) {
-        return false;
-      }
-
-      instval = PyObject_GetAttr(value, parsedspec.attrname);
-
-      if (!instval) {
-        return false;
-      }
-
-      if (instval == Py_None) {
-        Py_DECREF(instval);
-        continue;
-      }
-
-      writeByte(output, (int8_t) parsedspec.type);
-      writeI16(output, parsedspec.tag);
-
-      if (!output_val(output, instval, parsedspec.type, parsedspec.typeargs)) {
-        Py_DECREF(instval);
-        return false;
-      }
-
-      Py_DECREF(instval);
-    }
-
-    writeByte(output, (int8_t)T_STOP);
-    break;
-  }
-
-  case T_STOP:
-  case T_VOID:
-  case T_UTF16:
-  case T_UTF8:
-  case T_U64:
-  default:
-    PyErr_SetString(PyExc_TypeError, "Unexpected TType");
-    return false;
-
-  }
-
-  return true;
-}
-
-
-/* --- TOP-LEVEL WRAPPER FOR OUTPUT -- */
-
-static PyObject *
-encode_binary(PyObject *self, PyObject *args) {
-  PyObject* enc_obj;
-  PyObject* type_args;
-  PyObject* buf;
-  PyObject* ret = NULL;
-
-  if (!PyArg_ParseTuple(args, "OO", &enc_obj, &type_args)) {
-    return NULL;
-  }
-
-  buf = PycStringIO->NewOutput(INIT_OUTBUF_SIZE);
-  if (output_val(buf, enc_obj, T_STRUCT, type_args)) {
-    ret = PycStringIO->cgetvalue(buf);
-  }
-
-  Py_DECREF(buf);
-  return ret;
-}
-
-/* ====== END WRITING FUNCTIONS ====== */
-
-
-/* ====== BEGIN READING FUNCTIONS ====== */
-
-/* --- LOW-LEVEL READING FUNCTIONS --- */
-
-static void
-free_decodebuf(DecodeBuffer* d) {
-  Py_XDECREF(d->stringiobuf);
-  Py_XDECREF(d->refill_callable);
-}
-
-static bool
-decode_buffer_from_obj(DecodeBuffer* dest, PyObject* obj) {
-  dest->stringiobuf = PyObject_GetAttr(obj, INTERN_STRING(cstringio_buf));
-  if (!dest->stringiobuf) {
-    return false;
-  }
-
-  if (!PycStringIO_InputCheck(dest->stringiobuf)) {
-    free_decodebuf(dest);
-    PyErr_SetString(PyExc_TypeError, "expecting stringio input");
-    return false;
-  }
-
-  dest->refill_callable = PyObject_GetAttr(obj, INTERN_STRING(cstringio_refill));
-
-  if(!dest->refill_callable) {
-    free_decodebuf(dest);
-    return false;
-  }
-
-  if (!PyCallable_Check(dest->refill_callable)) {
-    free_decodebuf(dest);
-    PyErr_SetString(PyExc_TypeError, "expecting callable");
-    return false;
-  }
-
-  return true;
-}
-
-static bool readBytes(DecodeBuffer* input, char** output, int len) {
-  int read;
-
-  // TODO(dreiss): Don't fear the malloc.  Think about taking a copy of
-  //               the partial read instead of forcing the transport
-  //               to prepend it to its buffer.
-
-  read = PycStringIO->cread(input->stringiobuf, output, len);
-
-  if (read == len) {
-    return true;
-  } else if (read == -1) {
-    return false;
-  } else {
-    PyObject* newiobuf;
-
-    // using building functions as this is a rare codepath
-    newiobuf = PyObject_CallFunction(
-        input->refill_callable, "s#i", *output, read, len, NULL);
-    if (newiobuf == NULL) {
-      return false;
-    }
-
-    // must do this *AFTER* the call so that we don't deref the io buffer
-    Py_CLEAR(input->stringiobuf);
-    input->stringiobuf = newiobuf;
-
-    read = PycStringIO->cread(input->stringiobuf, output, len);
-
-    if (read == len) {
-      return true;
-    } else if (read == -1) {
-      return false;
-    } else {
-      // TODO(dreiss): This could be a valid code path for big binary blobs.
-      PyErr_SetString(PyExc_TypeError,
-          "refill claimed to have refilled the buffer, but didn't!!");
-      return false;
-    }
-  }
-}
-
-static int8_t readByte(DecodeBuffer* input) {
-  char* buf;
-  if (!readBytes(input, &buf, sizeof(int8_t))) {
-    return -1;
-  }
-
-  return *(int8_t*) buf;
-}
-
-static int16_t readI16(DecodeBuffer* input) {
-  char* buf;
-  if (!readBytes(input, &buf, sizeof(int16_t))) {
-    return -1;
-  }
-
-  return (int16_t) ntohs(*(int16_t*) buf);
-}
-
-static int32_t readI32(DecodeBuffer* input) {
-  char* buf;
-  if (!readBytes(input, &buf, sizeof(int32_t))) {
-    return -1;
-  }
-  return (int32_t) ntohl(*(int32_t*) buf);
-}
-
-
-static int64_t readI64(DecodeBuffer* input) {
-  char* buf;
-  if (!readBytes(input, &buf, sizeof(int64_t))) {
-    return -1;
-  }
-
-  return (int64_t) ntohll(*(int64_t*) buf);
-}
-
-static double readDouble(DecodeBuffer* input) {
-  union {
-    int64_t f;
-    double t;
-  } transfer;
-
-  transfer.f = readI64(input);
-  if (transfer.f == -1) {
-    return -1;
-  }
-  return transfer.t;
-}
-
-static bool
-checkTypeByte(DecodeBuffer* input, TType expected) {
-  TType got = readByte(input);
-  if (INT_CONV_ERROR_OCCURRED(got)) {
-    return false;
-  }
-
-  if (expected != got) {
-    PyErr_SetString(PyExc_TypeError, "got wrong ttype while reading field");
-    return false;
-  }
-  return true;
-}
-
-static bool
-skip(DecodeBuffer* input, TType type) {
-#define SKIPBYTES(n) \
-  do { \
-    if (!readBytes(input, &dummy_buf, (n))) { \
-      return false; \
-    } \
-  } while(0)
-
-  char* dummy_buf;
-
-  switch (type) {
-
-  case T_BOOL:
-  case T_I08: SKIPBYTES(1); break;
-  case T_I16: SKIPBYTES(2); break;
-  case T_I32: SKIPBYTES(4); break;
-  case T_I64:
-  case T_DOUBLE: SKIPBYTES(8); break;
-
-  case T_STRING: {
-    // TODO(dreiss): Find out if these check_ssize_t32s are really necessary.
-    int len = readI32(input);
-    if (!check_ssize_t_32(len)) {
-      return false;
-    }
-    SKIPBYTES(len);
-    break;
-  }
-
-  case T_LIST:
-  case T_SET: {
-    TType etype;
-    int len, i;
-
-    etype = readByte(input);
-    if (etype == -1) {
-      return false;
-    }
-
-    len = readI32(input);
-    if (!check_ssize_t_32(len)) {
-      return false;
-    }
-
-    for (i = 0; i < len; i++) {
-      if (!skip(input, etype)) {
-        return false;
-      }
-    }
-    break;
-  }
-
-  case T_MAP: {
-    TType ktype, vtype;
-    int len, i;
-
-    ktype = readByte(input);
-    if (ktype == -1) {
-      return false;
-    }
-
-    vtype = readByte(input);
-    if (vtype == -1) {
-      return false;
-    }
-
-    len = readI32(input);
-    if (!check_ssize_t_32(len)) {
-      return false;
-    }
-
-    for (i = 0; i < len; i++) {
-      if (!(skip(input, ktype) && skip(input, vtype))) {
-        return false;
-      }
-    }
-    break;
-  }
-
-  case T_STRUCT: {
-    while (true) {
-      TType type;
-
-      type = readByte(input);
-      if (type == -1) {
-        return false;
-      }
-
-      if (type == T_STOP)
-        break;
-
-      SKIPBYTES(2); // tag
-      if (!skip(input, type)) {
-        return false;
-      }
-    }
-    break;
-  }
-
-  case T_STOP:
-  case T_VOID:
-  case T_UTF16:
-  case T_UTF8:
-  case T_U64:
-  default:
-    PyErr_SetString(PyExc_TypeError, "Unexpected TType");
-    return false;
-
-  }
-
-  return true;
-
-#undef SKIPBYTES
-}
-
-
-/* --- HELPER FUNCTION FOR DECODE_VAL --- */
-
-static PyObject*
-decode_val(DecodeBuffer* input, TType type, PyObject* typeargs);
-
-static bool
-decode_struct(DecodeBuffer* input, PyObject* output, PyObject* spec_seq) {
-  int spec_seq_len = PyTuple_Size(spec_seq);
-  if (spec_seq_len == -1) {
-    return false;
-  }
-
-  while (true) {
-    TType type;
-    int16_t tag;
-    PyObject* item_spec;
-    PyObject* fieldval = NULL;
-    StructItemSpec parsedspec;
-
-    type = readByte(input);
-    if (type == -1) {
-      return false;
-    }
-    if (type == T_STOP) {
-      break;
-    }
-    tag = readI16(input);
-    if (INT_CONV_ERROR_OCCURRED(tag)) {
-      return false;
-    }
-    if (tag >= 0 && tag < spec_seq_len) {
-      item_spec = PyTuple_GET_ITEM(spec_seq, tag);
-    } else {
-      item_spec = Py_None;
-    }
-
-    if (item_spec == Py_None) {
-      if (!skip(input, type)) {
-        return false;
-      } else {
-        continue;
-      }
-    }
-
-    if (!parse_struct_item_spec(&parsedspec, item_spec)) {
-      return false;
-    }
-    if (parsedspec.type != type) {
-      if (!skip(input, type)) {
-        PyErr_SetString(PyExc_TypeError, "struct field had wrong type while reading and can't be skipped");
-        return false;
-      } else {
-        continue;
-      }
-    }
-
-    fieldval = decode_val(input, parsedspec.type, parsedspec.typeargs);
-    if (fieldval == NULL) {
-      return false;
-    }
-
-    if (PyObject_SetAttr(output, parsedspec.attrname, fieldval) == -1) {
-      Py_DECREF(fieldval);
-      return false;
-    }
-    Py_DECREF(fieldval);
-  }
-  return true;
-}
-
-
-/* --- MAIN RECURSIVE INPUT FUCNTION --- */
-
-// Returns a new reference.
-static PyObject*
-decode_val(DecodeBuffer* input, TType type, PyObject* typeargs) {
-  switch (type) {
-
-  case T_BOOL: {
-    int8_t v = readByte(input);
-    if (INT_CONV_ERROR_OCCURRED(v)) {
-      return NULL;
-    }
-
-    switch (v) {
-    case 0: Py_RETURN_FALSE;
-    case 1: Py_RETURN_TRUE;
-    // Don't laugh.  This is a potentially serious issue.
-    default: PyErr_SetString(PyExc_TypeError, "boolean out of range"); return NULL;
-    }
-    break;
-  }
-  case T_I08: {
-    int8_t v = readByte(input);
-    if (INT_CONV_ERROR_OCCURRED(v)) {
-      return NULL;
-    }
-
-    return PyInt_FromLong(v);
-  }
-  case T_I16: {
-    int16_t v = readI16(input);
-    if (INT_CONV_ERROR_OCCURRED(v)) {
-      return NULL;
-    }
-    return PyInt_FromLong(v);
-  }
-  case T_I32: {
-    int32_t v = readI32(input);
-    if (INT_CONV_ERROR_OCCURRED(v)) {
-      return NULL;
-    }
-    return PyInt_FromLong(v);
-  }
-
-  case T_I64: {
-    int64_t v = readI64(input);
-    if (INT_CONV_ERROR_OCCURRED(v)) {
-      return NULL;
-    }
-    // TODO(dreiss): Find out if we can take this fastpath always when
-    //               sizeof(long) == sizeof(long long).
-    if (CHECK_RANGE(v, LONG_MIN, LONG_MAX)) {
-      return PyInt_FromLong((long) v);
-    }
-
-    return PyLong_FromLongLong(v);
-  }
-
-  case T_DOUBLE: {
-    double v = readDouble(input);
-    if (v == -1.0 && PyErr_Occurred()) {
-      return false;
-    }
-    return PyFloat_FromDouble(v);
-  }
-
-  case T_STRING: {
-    Py_ssize_t len = readI32(input);
-    char* buf;
-    if (!readBytes(input, &buf, len)) {
-      return NULL;
-    }
-
-    return PyString_FromStringAndSize(buf, len);
-  }
-
-  case T_LIST:
-  case T_SET: {
-    SetListTypeArgs parsedargs;
-    int32_t len;
-    PyObject* ret = NULL;
-    int i;
-
-    if (!parse_set_list_args(&parsedargs, typeargs)) {
-      return NULL;
-    }
-
-    if (!checkTypeByte(input, parsedargs.element_type)) {
-      return NULL;
-    }
-
-    len = readI32(input);
-    if (!check_ssize_t_32(len)) {
-      return NULL;
-    }
-
-    ret = PyList_New(len);
-    if (!ret) {
-      return NULL;
-    }
-
-    for (i = 0; i < len; i++) {
-      PyObject* item = decode_val(input, parsedargs.element_type, parsedargs.typeargs);
-      if (!item) {
-        Py_DECREF(ret);
-        return NULL;
-      }
-      PyList_SET_ITEM(ret, i, item);
-    }
-
-    // TODO(dreiss): Consider biting the bullet and making two separate cases
-    //               for list and set, avoiding this post facto conversion.
-    if (type == T_SET) {
-      PyObject* setret;
-#if (PY_VERSION_HEX < 0x02050000)
-      // hack needed for older versions
-      setret = PyObject_CallFunctionObjArgs((PyObject*)&PySet_Type, ret, NULL);
-#else
-      // official version
-      setret = PySet_New(ret);
-#endif
-      Py_DECREF(ret);
-      return setret;
-    }
-    return ret;
-  }
-
-  case T_MAP: {
-    int32_t len;
-    int i;
-    MapTypeArgs parsedargs;
-    PyObject* ret = NULL;
-
-    if (!parse_map_args(&parsedargs, typeargs)) {
-      return NULL;
-    }
-
-    if (!checkTypeByte(input, parsedargs.ktag)) {
-      return NULL;
-    }
-    if (!checkTypeByte(input, parsedargs.vtag)) {
-      return NULL;
-    }
-
-    len = readI32(input);
-    if (!check_ssize_t_32(len)) {
-      return false;
-    }
-
-    ret = PyDict_New();
-    if (!ret) {
-      goto error;
-    }
-
-    for (i = 0; i < len; i++) {
-      PyObject* k = NULL;
-      PyObject* v = NULL;
-      k = decode_val(input, parsedargs.ktag, parsedargs.ktypeargs);
-      if (k == NULL) {
-        goto loop_error;
-      }
-      v = decode_val(input, parsedargs.vtag, parsedargs.vtypeargs);
-      if (v == NULL) {
-        goto loop_error;
-      }
-      if (PyDict_SetItem(ret, k, v) == -1) {
-        goto loop_error;
-      }
-
-      Py_DECREF(k);
-      Py_DECREF(v);
-      continue;
-
-      // Yuck!  Destructors, anyone?
-      loop_error:
-      Py_XDECREF(k);
-      Py_XDECREF(v);
-      goto error;
-    }
-
-    return ret;
-
-    error:
-    Py_XDECREF(ret);
-    return NULL;
-  }
-
-  case T_STRUCT: {
-    StructTypeArgs parsedargs;
-	PyObject* ret;
-    if (!parse_struct_args(&parsedargs, typeargs)) {
-      return NULL;
-    }
-
-    ret = PyObject_CallObject(parsedargs.klass, NULL);
-    if (!ret) {
-      return NULL;
-    }
-
-    if (!decode_struct(input, ret, parsedargs.spec)) {
-      Py_DECREF(ret);
-      return NULL;
-    }
-
-    return ret;
-  }
-
-  case T_STOP:
-  case T_VOID:
-  case T_UTF16:
-  case T_UTF8:
-  case T_U64:
-  default:
-    PyErr_SetString(PyExc_TypeError, "Unexpected TType");
-    return NULL;
-  }
-}
-
-
-/* --- TOP-LEVEL WRAPPER FOR INPUT -- */
-
-static PyObject*
-decode_binary(PyObject *self, PyObject *args) {
-  PyObject* output_obj = NULL;
-  PyObject* transport = NULL;
-  PyObject* typeargs = NULL;
-  StructTypeArgs parsedargs;
-  DecodeBuffer input = {0, 0};
-  
-  if (!PyArg_ParseTuple(args, "OOO", &output_obj, &transport, &typeargs)) {
-    return NULL;
-  }
-
-  if (!parse_struct_args(&parsedargs, typeargs)) {
-    return NULL;
-  }
-
-  if (!decode_buffer_from_obj(&input, transport)) {
-    return NULL;
-  }
-
-  if (!decode_struct(&input, output_obj, parsedargs.spec)) {
-    free_decodebuf(&input);
-    return NULL;
-  }
-
-  free_decodebuf(&input);
-
-  Py_RETURN_NONE;
-}
-
-/* ====== END READING FUNCTIONS ====== */
-
-
-/* -- PYTHON MODULE SETUP STUFF --- */
-
-static PyMethodDef ThriftFastBinaryMethods[] = {
-
-  {"encode_binary",  encode_binary, METH_VARARGS, ""},
-  {"decode_binary",  decode_binary, METH_VARARGS, ""},
-
-  {NULL, NULL, 0, NULL}        /* Sentinel */
-};
-
-PyMODINIT_FUNC
-initfastbinary(void) {
-#define INIT_INTERN_STRING(value) \
-  do { \
-    INTERN_STRING(value) = PyString_InternFromString(#value); \
-    if(!INTERN_STRING(value)) return; \
-  } while(0)
-
-  INIT_INTERN_STRING(cstringio_buf);
-  INIT_INTERN_STRING(cstringio_refill);
-#undef INIT_INTERN_STRING
-
-  PycString_IMPORT;
-  if (PycStringIO == NULL) return;
-
-  (void) Py_InitModule("thrift.protocol.fastbinary", ThriftFastBinaryMethods);
-}
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/THttpServer.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/THttpServer.py
deleted file mode 100644
index be54bab..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/THttpServer.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 BaseHTTPServer
-
-from thrift.server import TServer
-from thrift.transport import TTransport
-
-
-class ResponseException(Exception):
-  """Allows handlers to override the HTTP response
-
-  Normally, THttpServer always sends a 200 response.  If a handler wants
-  to override this behavior (e.g., to simulate a misconfigured or
-  overloaded web server during testing), it can raise a ResponseException.
-  The function passed to the constructor will be called with the
-  RequestHandler as its only argument.
-  """
-  def __init__(self, handler):
-    self.handler = handler
-
-
-class THttpServer(TServer.TServer):
-  """A simple HTTP-based Thrift server
-
-  This class is not very performant, but it is useful (for example) for
-  acting as a mock version of an Apache-based PHP Thrift endpoint.
-  """
-  def __init__(self,
-               processor,
-               server_address,
-               inputProtocolFactory,
-               outputProtocolFactory=None,
-               server_class=BaseHTTPServer.HTTPServer):
-    """Set up protocol factories and HTTP server.
-
-    See BaseHTTPServer for server_address.
-    See TServer for protocol factories.
-    """
-    if outputProtocolFactory is None:
-      outputProtocolFactory = inputProtocolFactory
-
-    TServer.TServer.__init__(self, processor, None, None, None,
-        inputProtocolFactory, outputProtocolFactory)
-
-    thttpserver = self
-
-    class RequestHander(BaseHTTPServer.BaseHTTPRequestHandler):
-      def do_POST(self):
-        # Don't care about the request path.
-        itrans = TTransport.TFileObjectTransport(self.rfile)
-        otrans = TTransport.TFileObjectTransport(self.wfile)
-        itrans = TTransport.TBufferedTransport(
-          itrans, int(self.headers['Content-Length']))
-        otrans = TTransport.TMemoryBuffer()
-        iprot = thttpserver.inputProtocolFactory.getProtocol(itrans)
-        oprot = thttpserver.outputProtocolFactory.getProtocol(otrans)
-        try:
-          thttpserver.processor.process(iprot, oprot)
-        except ResponseException, exn:
-          exn.handler(self)
-        else:
-          self.send_response(200)
-          self.send_header("content-type", "application/x-thrift")
-          self.end_headers()
-          self.wfile.write(otrans.getvalue())
-
-    self.httpd = server_class(server_address, RequestHander)
-
-  def serve(self):
-    self.httpd.serve_forever()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/TNonblockingServer.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/TNonblockingServer.py
deleted file mode 100644
index fa478d0..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/TNonblockingServer.py
+++ /dev/null
@@ -1,346 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-"""Implementation of non-blocking server.
-
-The main idea of the server is to receive and send requests
-only from the main thread.
-
-The thread poool should be sized for concurrent tasks, not
-maximum connections
-"""
-import threading
-import socket
-import Queue
-import select
-import struct
-import logging
-
-from thrift.transport import TTransport
-from thrift.protocol.TBinaryProtocol import TBinaryProtocolFactory
-
-__all__ = ['TNonblockingServer']
-
-
-class Worker(threading.Thread):
-    """Worker is a small helper to process incoming connection."""
-
-    def __init__(self, queue):
-        threading.Thread.__init__(self)
-        self.queue = queue
-
-    def run(self):
-        """Process queries from task queue, stop if processor is None."""
-        while True:
-            try:
-                processor, iprot, oprot, otrans, callback = self.queue.get()
-                if processor is None:
-                    break
-                processor.process(iprot, oprot)
-                callback(True, otrans.getvalue())
-            except Exception:
-                logging.exception("Exception while processing request")
-                callback(False, '')
-
-WAIT_LEN = 0
-WAIT_MESSAGE = 1
-WAIT_PROCESS = 2
-SEND_ANSWER = 3
-CLOSED = 4
-
-
-def locked(func):
-    """Decorator which locks self.lock."""
-    def nested(self, *args, **kwargs):
-        self.lock.acquire()
-        try:
-            return func(self, *args, **kwargs)
-        finally:
-            self.lock.release()
-    return nested
-
-
-def socket_exception(func):
-    """Decorator close object on socket.error."""
-    def read(self, *args, **kwargs):
-        try:
-            return func(self, *args, **kwargs)
-        except socket.error:
-            self.close()
-    return read
-
-
-class Connection:
-    """Basic class is represented connection.
-
-    It can be in state:
-        WAIT_LEN --- connection is reading request len.
-        WAIT_MESSAGE --- connection is reading request.
-        WAIT_PROCESS --- connection has just read whole request and
-                         waits for call ready routine.
-        SEND_ANSWER --- connection is sending answer string (including length
-                        of answer).
-        CLOSED --- socket was closed and connection should be deleted.
-    """
-    def __init__(self, new_socket, wake_up):
-        self.socket = new_socket
-        self.socket.setblocking(False)
-        self.status = WAIT_LEN
-        self.len = 0
-        self.message = ''
-        self.lock = threading.Lock()
-        self.wake_up = wake_up
-
-    def _read_len(self):
-        """Reads length of request.
-
-        It's a safer alternative to self.socket.recv(4)
-        """
-        read = self.socket.recv(4 - len(self.message))
-        if len(read) == 0:
-            # if we read 0 bytes and self.message is empty, then
-            # the client closed the connection
-            if len(self.message) != 0:
-                logging.error("can't read frame size from socket")
-            self.close()
-            return
-        self.message += read
-        if len(self.message) == 4:
-            self.len, = struct.unpack('!i', self.message)
-            if self.len < 0:
-                logging.error("negative frame size, it seems client "
-                              "doesn't use FramedTransport")
-                self.close()
-            elif self.len == 0:
-                logging.error("empty frame, it's really strange")
-                self.close()
-            else:
-                self.message = ''
-                self.status = WAIT_MESSAGE
-
-    @socket_exception
-    def read(self):
-        """Reads data from stream and switch state."""
-        assert self.status in (WAIT_LEN, WAIT_MESSAGE)
-        if self.status == WAIT_LEN:
-            self._read_len()
-            # go back to the main loop here for simplicity instead of
-            # falling through, even though there is a good chance that
-            # the message is already available
-        elif self.status == WAIT_MESSAGE:
-            read = self.socket.recv(self.len - len(self.message))
-            if len(read) == 0:
-                logging.error("can't read frame from socket (get %d of "
-                              "%d bytes)" % (len(self.message), self.len))
-                self.close()
-                return
-            self.message += read
-            if len(self.message) == self.len:
-                self.status = WAIT_PROCESS
-
-    @socket_exception
-    def write(self):
-        """Writes data from socket and switch state."""
-        assert self.status == SEND_ANSWER
-        sent = self.socket.send(self.message)
-        if sent == len(self.message):
-            self.status = WAIT_LEN
-            self.message = ''
-            self.len = 0
-        else:
-            self.message = self.message[sent:]
-
-    @locked
-    def ready(self, all_ok, message):
-        """Callback function for switching state and waking up main thread.
-
-        This function is the only function witch can be called asynchronous.
-
-        The ready can switch Connection to three states:
-            WAIT_LEN if request was oneway.
-            SEND_ANSWER if request was processed in normal way.
-            CLOSED if request throws unexpected exception.
-
-        The one wakes up main thread.
-        """
-        assert self.status == WAIT_PROCESS
-        if not all_ok:
-            self.close()
-            self.wake_up()
-            return
-        self.len = ''
-        if len(message) == 0:
-            # it was a oneway request, do not write answer
-            self.message = ''
-            self.status = WAIT_LEN
-        else:
-            self.message = struct.pack('!i', len(message)) + message
-            self.status = SEND_ANSWER
-        self.wake_up()
-
-    @locked
-    def is_writeable(self):
-        """Return True if connection should be added to write list of select"""
-        return self.status == SEND_ANSWER
-
-    # it's not necessary, but...
-    @locked
-    def is_readable(self):
-        """Return True if connection should be added to read list of select"""
-        return self.status in (WAIT_LEN, WAIT_MESSAGE)
-
-    @locked
-    def is_closed(self):
-        """Returns True if connection is closed."""
-        return self.status == CLOSED
-
-    def fileno(self):
-        """Returns the file descriptor of the associated socket."""
-        return self.socket.fileno()
-
-    def close(self):
-        """Closes connection"""
-        self.status = CLOSED
-        self.socket.close()
-
-
-class TNonblockingServer:
-    """Non-blocking server."""
-
-    def __init__(self,
-                 processor,
-                 lsocket,
-                 inputProtocolFactory=None,
-                 outputProtocolFactory=None,
-                 threads=10):
-        self.processor = processor
-        self.socket = lsocket
-        self.in_protocol = inputProtocolFactory or TBinaryProtocolFactory()
-        self.out_protocol = outputProtocolFactory or self.in_protocol
-        self.threads = int(threads)
-        self.clients = {}
-        self.tasks = Queue.Queue()
-        self._read, self._write = socket.socketpair()
-        self.prepared = False
-        self._stop = False
-
-    def setNumThreads(self, num):
-        """Set the number of worker threads that should be created."""
-        # implement ThreadPool interface
-        assert not self.prepared, "Can't change number of threads after start"
-        self.threads = num
-
-    def prepare(self):
-        """Prepares server for serve requests."""
-        if self.prepared:
-            return
-        self.socket.listen()
-        for _ in xrange(self.threads):
-            thread = Worker(self.tasks)
-            thread.setDaemon(True)
-            thread.start()
-        self.prepared = True
-
-    def wake_up(self):
-        """Wake up main thread.
-
-        The server usualy waits in select call in we should terminate one.
-        The simplest way is using socketpair.
-
-        Select always wait to read from the first socket of socketpair.
-
-        In this case, we can just write anything to the second socket from
-        socketpair.
-        """
-        self._write.send('1')
-
-    def stop(self):
-        """Stop the server.
-
-        This method causes the serve() method to return.  stop() may be invoked
-        from within your handler, or from another thread.
-
-        After stop() is called, serve() will return but the server will still
-        be listening on the socket.  serve() may then be called again to resume
-        processing requests.  Alternatively, close() may be called after
-        serve() returns to close the server socket and shutdown all worker
-        threads.
-        """
-        self._stop = True
-        self.wake_up()
-
-    def _select(self):
-        """Does select on open connections."""
-        readable = [self.socket.handle.fileno(), self._read.fileno()]
-        writable = []
-        for i, connection in self.clients.items():
-            if connection.is_readable():
-                readable.append(connection.fileno())
-            if connection.is_writeable():
-                writable.append(connection.fileno())
-            if connection.is_closed():
-                del self.clients[i]
-        return select.select(readable, writable, readable)
-
-    def handle(self):
-        """Handle requests.
-
-        WARNING! You must call prepare() BEFORE calling handle()
-        """
-        assert self.prepared, "You have to call prepare before handle"
-        rset, wset, xset = self._select()
-        for readable in rset:
-            if readable == self._read.fileno():
-                # don't care i just need to clean readable flag
-                self._read.recv(1024)
-            elif readable == self.socket.handle.fileno():
-                client = self.socket.accept().handle
-                self.clients[client.fileno()] = Connection(client,
-                                                           self.wake_up)
-            else:
-                connection = self.clients[readable]
-                connection.read()
-                if connection.status == WAIT_PROCESS:
-                    itransport = TTransport.TMemoryBuffer(connection.message)
-                    otransport = TTransport.TMemoryBuffer()
-                    iprot = self.in_protocol.getProtocol(itransport)
-                    oprot = self.out_protocol.getProtocol(otransport)
-                    self.tasks.put([self.processor, iprot, oprot,
-                                    otransport, connection.ready])
-        for writeable in wset:
-            self.clients[writeable].write()
-        for oob in xset:
-            self.clients[oob].close()
-            del self.clients[oob]
-
-    def close(self):
-        """Closes the server."""
-        for _ in xrange(self.threads):
-            self.tasks.put([None, None, None, None, None])
-        self.socket.close()
-        self.prepared = False
-
-    def serve(self):
-        """Serve requests.
-
-        Serve requests forever, or until stop() is called.
-        """
-        self._stop = False
-        self.prepare()
-        while not self._stop:
-            self.handle()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/TProcessPoolServer.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/TProcessPoolServer.py
deleted file mode 100644
index c665e6d..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/TProcessPoolServer.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 logging
-from multiprocessing import  Process, Value, Condition
-
-from lib.thrift.server import TServer
-from thrift.transport.TTransport import TTransportException
-
-
-class TProcessPoolServer(TServer):
-    """Server with a fixed size pool of worker subprocesses to service requests
-
-    Note that if you need shared state between the handlers - it's up to you!
-    Written by Dvir Volk, doat.com
-    """
-    def __init__(self, *args):
-        TServer.__init__(self, *args)
-        self.numWorkers = 10
-        self.workers = []
-        self.isRunning = Value('b', False)
-        self.stopCondition = Condition()
-        self.postForkCallback = None
-
-    def setPostForkCallback(self, callback):
-        if not callable(callback):
-            raise TypeError("This is not a callback!")
-        self.postForkCallback = callback
-
-    def setNumWorkers(self, num):
-        """Set the number of worker threads that should be created"""
-        self.numWorkers = num
-
-    def workerProcess(self):
-        """Loop getting clients from the shared queue and process them"""
-        if self.postForkCallback:
-            self.postForkCallback()
-
-        while self.isRunning.value:
-            try:
-                client = self.serverTransport.accept()
-                self.serveClient(client)
-            except (KeyboardInterrupt, SystemExit):
-                return 0
-            except Exception, x:
-                logging.exception(x)
-
-    def serveClient(self, client):
-        """Process input/output from a client for as long as possible"""
-        itrans = self.inputTransportFactory.getTransport(client)
-        otrans = self.outputTransportFactory.getTransport(client)
-        iprot = self.inputProtocolFactory.getProtocol(itrans)
-        oprot = self.outputProtocolFactory.getProtocol(otrans)
-
-        try:
-            while True:
-                self.processor.process(iprot, oprot)
-        except TTransportException, tx:
-            pass
-        except Exception, x:
-            logging.exception(x)
-
-        itrans.close()
-        otrans.close()
-
-    def serve(self):
-        """Start workers and put into queue"""
-        # this is a shared state that can tell the workers to exit when False
-        self.isRunning.value = True
-
-        # first bind and listen to the port
-        self.serverTransport.listen()
-
-        # fork the children
-        for i in range(self.numWorkers):
-            try:
-                w = Process(target=self.workerProcess)
-                w.daemon = True
-                w.start()
-                self.workers.append(w)
-            except Exception, x:
-                logging.exception(x)
-
-        # wait until the condition is set by stop()
-        while True:
-            self.stopCondition.acquire()
-            try:
-                self.stopCondition.wait()
-                break
-            except (SystemExit, KeyboardInterrupt):
-                break
-            except Exception, x:
-                logging.exception(x)
-
-        self.isRunning.value = False
-
-    def stop(self):
-        self.isRunning.value = False
-        self.stopCondition.acquire()
-        self.stopCondition.notify()
-        self.stopCondition.release()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/TServer.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/TServer.py
deleted file mode 100644
index 2f24842..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/TServer.py
+++ /dev/null
@@ -1,269 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 Queue
-import logging
-import os
-import sys
-import threading
-import traceback
-
-from thrift.Thrift import TProcessor
-from thrift.protocol import TBinaryProtocol
-from thrift.transport import TTransport
-
-
-class TServer:
-  """Base interface for a server, which must have a serve() method.
-
-  Three constructors for all servers:
-  1) (processor, serverTransport)
-  2) (processor, serverTransport, transportFactory, protocolFactory)
-  3) (processor, serverTransport,
-      inputTransportFactory, outputTransportFactory,
-      inputProtocolFactory, outputProtocolFactory)
-  """
-  def __init__(self, *args):
-    if (len(args) == 2):
-      self.__initArgs__(args[0], args[1],
-                        TTransport.TTransportFactoryBase(),
-                        TTransport.TTransportFactoryBase(),
-                        TBinaryProtocol.TBinaryProtocolFactory(),
-                        TBinaryProtocol.TBinaryProtocolFactory())
-    elif (len(args) == 4):
-      self.__initArgs__(args[0], args[1], args[2], args[2], args[3], args[3])
-    elif (len(args) == 6):
-      self.__initArgs__(args[0], args[1], args[2], args[3], args[4], args[5])
-
-  def __initArgs__(self, processor, serverTransport,
-                   inputTransportFactory, outputTransportFactory,
-                   inputProtocolFactory, outputProtocolFactory):
-    self.processor = processor
-    self.serverTransport = serverTransport
-    self.inputTransportFactory = inputTransportFactory
-    self.outputTransportFactory = outputTransportFactory
-    self.inputProtocolFactory = inputProtocolFactory
-    self.outputProtocolFactory = outputProtocolFactory
-
-  def serve(self):
-    pass
-
-
-class TSimpleServer(TServer):
-  """Simple single-threaded server that just pumps around one transport."""
-
-  def __init__(self, *args):
-    TServer.__init__(self, *args)
-
-  def serve(self):
-    self.serverTransport.listen()
-    while True:
-      client = self.serverTransport.accept()
-      itrans = self.inputTransportFactory.getTransport(client)
-      otrans = self.outputTransportFactory.getTransport(client)
-      iprot = self.inputProtocolFactory.getProtocol(itrans)
-      oprot = self.outputProtocolFactory.getProtocol(otrans)
-      try:
-        while True:
-          self.processor.process(iprot, oprot)
-      except TTransport.TTransportException, tx:
-        pass
-      except Exception, x:
-        logging.exception(x)
-
-      itrans.close()
-      otrans.close()
-
-
-class TThreadedServer(TServer):
-  """Threaded server that spawns a new thread per each connection."""
-
-  def __init__(self, *args, **kwargs):
-    TServer.__init__(self, *args)
-    self.daemon = kwargs.get("daemon", False)
-
-  def serve(self):
-    self.serverTransport.listen()
-    while True:
-      try:
-        client = self.serverTransport.accept()
-        t = threading.Thread(target=self.handle, args=(client,))
-        t.setDaemon(self.daemon)
-        t.start()
-      except KeyboardInterrupt:
-        raise
-      except Exception, x:
-        logging.exception(x)
-
-  def handle(self, client):
-    itrans = self.inputTransportFactory.getTransport(client)
-    otrans = self.outputTransportFactory.getTransport(client)
-    iprot = self.inputProtocolFactory.getProtocol(itrans)
-    oprot = self.outputProtocolFactory.getProtocol(otrans)
-    try:
-      while True:
-        self.processor.process(iprot, oprot)
-    except TTransport.TTransportException, tx:
-      pass
-    except Exception, x:
-      logging.exception(x)
-
-    itrans.close()
-    otrans.close()
-
-
-class TThreadPoolServer(TServer):
-  """Server with a fixed size pool of threads which service requests."""
-
-  def __init__(self, *args, **kwargs):
-    TServer.__init__(self, *args)
-    self.clients = Queue.Queue()
-    self.threads = 10
-    self.daemon = kwargs.get("daemon", False)
-
-  def setNumThreads(self, num):
-    """Set the number of worker threads that should be created"""
-    self.threads = num
-
-  def serveThread(self):
-    """Loop around getting clients from the shared queue and process them."""
-    while True:
-      try:
-        client = self.clients.get()
-        self.serveClient(client)
-      except Exception, x:
-        logging.exception(x)
-
-  def serveClient(self, client):
-    """Process input/output from a client for as long as possible"""
-    itrans = self.inputTransportFactory.getTransport(client)
-    otrans = self.outputTransportFactory.getTransport(client)
-    iprot = self.inputProtocolFactory.getProtocol(itrans)
-    oprot = self.outputProtocolFactory.getProtocol(otrans)
-    try:
-      while True:
-        self.processor.process(iprot, oprot)
-    except TTransport.TTransportException, tx:
-      pass
-    except Exception, x:
-      logging.exception(x)
-
-    itrans.close()
-    otrans.close()
-
-  def serve(self):
-    """Start a fixed number of worker threads and put client into a queue"""
-    for i in range(self.threads):
-      try:
-        t = threading.Thread(target=self.serveThread)
-        t.setDaemon(self.daemon)
-        t.start()
-      except Exception, x:
-        logging.exception(x)
-
-    # Pump the socket for clients
-    self.serverTransport.listen()
-    while True:
-      try:
-        client = self.serverTransport.accept()
-        self.clients.put(client)
-      except Exception, x:
-        logging.exception(x)
-
-
-class TForkingServer(TServer):
-  """A Thrift server that forks a new process for each request
-
-  This is more scalable than the threaded server as it does not cause
-  GIL contention.
-
-  Note that this has different semantics from the threading server.
-  Specifically, updates to shared variables will no longer be shared.
-  It will also not work on windows.
-
-  This code is heavily inspired by SocketServer.ForkingMixIn in the
-  Python stdlib.
-  """
-  def __init__(self, *args):
-    TServer.__init__(self, *args)
-    self.children = []
-
-  def serve(self):
-    def try_close(file):
-      try:
-        file.close()
-      except IOError, e:
-        logging.warning(e, exc_info=True)
-
-    self.serverTransport.listen()
-    while True:
-      client = self.serverTransport.accept()
-      try:
-        pid = os.fork()
-
-        if pid:  # parent
-          # add before collect, otherwise you race w/ waitpid
-          self.children.append(pid)
-          self.collect_children()
-
-          # Parent must close socket or the connection may not get
-          # closed promptly
-          itrans = self.inputTransportFactory.getTransport(client)
-          otrans = self.outputTransportFactory.getTransport(client)
-          try_close(itrans)
-          try_close(otrans)
-        else:
-          itrans = self.inputTransportFactory.getTransport(client)
-          otrans = self.outputTransportFactory.getTransport(client)
-
-          iprot = self.inputProtocolFactory.getProtocol(itrans)
-          oprot = self.outputProtocolFactory.getProtocol(otrans)
-
-          ecode = 0
-          try:
-            try:
-              while True:
-                self.processor.process(iprot, oprot)
-            except TTransport.TTransportException, tx:
-              pass
-            except Exception, e:
-              logging.exception(e)
-              ecode = 1
-          finally:
-            try_close(itrans)
-            try_close(otrans)
-
-          os._exit(ecode)
-
-      except TTransport.TTransportException, tx:
-        pass
-      except Exception, x:
-        logging.exception(x)
-
-  def collect_children(self):
-    while self.children:
-      try:
-        pid, status = os.waitpid(0, os.WNOHANG)
-      except os.error:
-        pid = None
-
-      if pid:
-        self.children.remove(pid)
-      else:
-        break
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/__init__.py
deleted file mode 100644
index 1bf6e25..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/server/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-__all__ = ['TServer', 'TNonblockingServer']
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/THttpClient.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/THttpClient.py
deleted file mode 100644
index c98b966..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/THttpClient.py
+++ /dev/null
@@ -1,147 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 httplib
-import os
-import socket
-import sys
-import urllib
-import urlparse
-import warnings
-
-from lib.thrift.transport.TTransport import *
-
-
-class THttpClient(TTransportBase):
-  """Http implementation of TTransport base."""
-
-  def __init__(self, uri_or_host, port=None, path=None):
-    """THttpClient supports two different types constructor parameters.
-
-    THttpClient(host, port, path) - deprecated
-    THttpClient(uri)
-
-    Only the second supports https.
-    """
-    if port is not None:
-      warnings.warn(
-        "Please use the THttpClient('http://host:port/path') syntax",
-        DeprecationWarning,
-        stacklevel=2)
-      self.host = uri_or_host
-      self.port = port
-      assert path
-      self.path = path
-      self.scheme = 'http'
-    else:
-      parsed = urlparse.urlparse(uri_or_host)
-      self.scheme = parsed.scheme
-      assert self.scheme in ('http', 'https')
-      if self.scheme == 'http':
-        self.port = parsed.port or httplib.HTTP_PORT
-      elif self.scheme == 'https':
-        self.port = parsed.port or httplib.HTTPS_PORT
-      self.host = parsed.hostname
-      self.path = parsed.path
-      if parsed.query:
-        self.path += '?%s' % parsed.query
-    self.__wbuf = StringIO()
-    self.__http = None
-    self.__timeout = None
-    self.__custom_headers = None
-
-  def open(self):
-    if self.scheme == 'http':
-      self.__http = httplib.HTTP(self.host, self.port)
-    else:
-      self.__http = httplib.HTTPS(self.host, self.port)
-
-  def close(self):
-    self.__http.close()
-    self.__http = None
-
-  def isOpen(self):
-    return self.__http is not None
-
-  def setTimeout(self, ms):
-    if not hasattr(socket, 'getdefaulttimeout'):
-      raise NotImplementedError
-
-    if ms is None:
-      self.__timeout = None
-    else:
-      self.__timeout = ms / 1000.0
-
-  def setCustomHeaders(self, headers):
-    self.__custom_headers = headers
-
-  def read(self, sz):
-    return self.__http.file.read(sz)
-
-  def write(self, buf):
-    self.__wbuf.write(buf)
-
-  def __withTimeout(f):
-    def _f(*args, **kwargs):
-      orig_timeout = socket.getdefaulttimeout()
-      socket.setdefaulttimeout(args[0].__timeout)
-      result = f(*args, **kwargs)
-      socket.setdefaulttimeout(orig_timeout)
-      return result
-    return _f
-
-  def flush(self):
-    if self.isOpen():
-      self.close()
-    self.open()
-
-    # Pull data out of buffer
-    data = self.__wbuf.getvalue()
-    self.__wbuf = StringIO()
-
-    # HTTP request
-    self.__http.putrequest('POST', self.path)
-
-    # Write headers
-    self.__http.putheader('Host', self.host)
-    self.__http.putheader('Content-Type', 'application/x-thrift')
-    self.__http.putheader('Content-Length', str(len(data)))
-
-    if not self.__custom_headers or 'User-Agent' not in self.__custom_headers:
-      user_agent = 'Python/THttpClient'
-      script = os.path.basename(sys.argv[0])
-      if script:
-        user_agent = '%s (%s)' % (user_agent, urllib.quote(script))
-      self.__http.putheader('User-Agent', user_agent)
-
-    if self.__custom_headers:
-        for key, val in self.__custom_headers.iteritems():
-            self.__http.putheader(key, val)
-
-    self.__http.endheaders()
-
-    # Write payload
-    self.__http.send(data)
-
-    # Get reply to flush the request
-    self.code, self.message, self.headers = self.__http.getreply()
-
-  # Decorate if we know how to timeout
-  if hasattr(socket, 'getdefaulttimeout'):
-    flush = __withTimeout(flush)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TSSLSocket.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TSSLSocket.py
deleted file mode 100644
index 81e0984..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TSSLSocket.py
+++ /dev/null
@@ -1,214 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 os
-import socket
-import ssl
-
-from thrift.transport import TSocket
-from thrift.transport.TTransport import TTransportException
-
-
-class TSSLSocket(TSocket.TSocket):
-  """
-  SSL implementation of client-side TSocket
-
-  This class creates outbound sockets wrapped using the
-  python standard ssl module for encrypted connections.
-
-  The protocol used is set using the class variable
-  SSL_VERSION, which must be one of ssl.PROTOCOL_* and
-  defaults to  ssl.PROTOCOL_TLSv1 for greatest security.
-  """
-  SSL_VERSION = ssl.PROTOCOL_TLSv1
-
-  def __init__(self,
-               host='localhost',
-               port=9090,
-               validate=True,
-               ca_certs=None,
-               keyfile=None,
-               certfile=None,
-               unix_socket=None):
-    """Create SSL TSocket
-
-    @param validate: Set to False to disable SSL certificate validation
-    @type validate: bool
-    @param ca_certs: Filename to the Certificate Authority pem file, possibly a
-    file downloaded from: http://curl.haxx.se/ca/cacert.pem  This is passed to
-    the ssl_wrap function as the 'ca_certs' parameter.
-    @type ca_certs: str
-    @param keyfile: The private key
-    @type keyfile: str
-    @param certfile: The cert file
-    @type certfile: str
-    
-    Raises an IOError exception if validate is True and the ca_certs file is
-    None, not present or unreadable.
-    """
-    self.validate = validate
-    self.is_valid = False
-    self.peercert = None
-    if not validate:
-      self.cert_reqs = ssl.CERT_NONE
-    else:
-      self.cert_reqs = ssl.CERT_REQUIRED
-    self.ca_certs = ca_certs
-    self.keyfile = keyfile
-    self.certfile = certfile
-    if validate:
-      if ca_certs is None or not os.access(ca_certs, os.R_OK):
-        raise IOError('Certificate Authority ca_certs file "%s" '
-                      'is not readable, cannot validate SSL '
-                      'certificates.' % (ca_certs))
-    TSocket.TSocket.__init__(self, host, port, unix_socket)
-
-  def open(self):
-    try:
-      res0 = self._resolveAddr()
-      for res in res0:
-        sock_family, sock_type = res[0:2]
-        ip_port = res[4]
-        plain_sock = socket.socket(sock_family, sock_type)
-        self.handle = ssl.wrap_socket(plain_sock,
-                                      ssl_version=self.SSL_VERSION,
-                                      do_handshake_on_connect=True,
-                                      ca_certs=self.ca_certs,
-                                      keyfile=self.keyfile,
-                                      certfile=self.certfile,
-                                      cert_reqs=self.cert_reqs)
-        self.handle.settimeout(self._timeout)
-        try:
-          self.handle.connect(ip_port)
-        except socket.error, e:
-          if res is not res0[-1]:
-            continue
-          else:
-            raise e
-        break
-    except socket.error, e:
-      if self._unix_socket:
-        message = 'Could not connect to secure socket %s: %s' \
-                % (self._unix_socket, e)
-      else:
-        message = 'Could not connect to %s:%d: %s' % (self.host, self.port, e)
-      raise TTransportException(type=TTransportException.NOT_OPEN,
-                                message=message)
-    if self.validate:
-      self._validate_cert()
-
-  def _validate_cert(self):
-    """internal method to validate the peer's SSL certificate, and to check the
-    commonName of the certificate to ensure it matches the hostname we
-    used to make this connection.  Does not support subjectAltName records
-    in certificates.
-
-    raises TTransportException if the certificate fails validation.
-    """
-    cert = self.handle.getpeercert()
-    self.peercert = cert
-    if 'subject' not in cert:
-      raise TTransportException(
-        type=TTransportException.NOT_OPEN,
-        message='No SSL certificate found from %s:%s' % (self.host, self.port))
-    fields = cert['subject']
-    for field in fields:
-      # ensure structure we get back is what we expect
-      if not isinstance(field, tuple):
-        continue
-      cert_pair = field[0]
-      if len(cert_pair) < 2:
-        continue
-      cert_key, cert_value = cert_pair[0:2]
-      if cert_key != 'commonName':
-        continue
-      certhost = cert_value
-      # this check should be performed by some sort of Access Manager
-      if certhost == self.host:
-        # success, cert commonName matches desired hostname
-        self.is_valid = True
-        return
-      else:
-        raise TTransportException(
-          type=TTransportException.UNKNOWN,
-          message='Hostname we connected to "%s" doesn\'t match certificate '
-                  'provided commonName "%s"' % (self.host, certhost))
-    raise TTransportException(
-      type=TTransportException.UNKNOWN,
-      message='Could not validate SSL certificate from '
-              'host "%s".  Cert=%s' % (self.host, cert))
-
-
-class TSSLServerSocket(TSocket.TServerSocket):
-  """SSL implementation of TServerSocket
-
-  This uses the ssl module's wrap_socket() method to provide SSL
-  negotiated encryption.
-  """
-  SSL_VERSION = ssl.PROTOCOL_TLSv1
-
-  def __init__(self,
-               host=None,
-               port=9090,
-               certfile='cert.pem',
-               unix_socket=None):
-    """Initialize a TSSLServerSocket
-
-    @param certfile: filename of the server certificate, defaults to cert.pem
-    @type certfile: str
-    @param host: The hostname or IP to bind the listen socket to,
-                 i.e. 'localhost' for only allowing local network connections.
-                 Pass None to bind to all interfaces.
-    @type host: str
-    @param port: The port to listen on for inbound connections.
-    @type port: int
-    """
-    self.setCertfile(certfile)
-    TSocket.TServerSocket.__init__(self, host, port)
-
-  def setCertfile(self, certfile):
-    """Set or change the server certificate file used to wrap new connections.
-
-    @param certfile: The filename of the server certificate,
-                     i.e. '/etc/certs/server.pem'
-    @type certfile: str
-
-    Raises an IOError exception if the certfile is not present or unreadable.
-    """
-    if not os.access(certfile, os.R_OK):
-      raise IOError('No such certfile found: %s' % (certfile))
-    self.certfile = certfile
-
-  def accept(self):
-    plain_client, addr = self.handle.accept()
-    try:
-      client = ssl.wrap_socket(plain_client, certfile=self.certfile,
-                      server_side=True, ssl_version=self.SSL_VERSION)
-    except ssl.SSLError, ssl_exc:
-      # failed handshake/ssl wrap, close socket to client
-      plain_client.close()
-      # raise ssl_exc
-      # We can't raise the exception, because it kills most TServer derived
-      # serve() methods.
-      # Instead, return None, and let the TServer instance deal with it in
-      # other exception handling.  (but TSimpleServer dies anyway)
-      return None
-    result = TSocket.TSocket()
-    result.setHandle(client)
-    return result
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TSocket.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TSocket.py
deleted file mode 100644
index 2d1af94..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TSocket.py
+++ /dev/null
@@ -1,176 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 errno
-import os
-import socket
-import sys
-
-from lib.thrift.transport.TTransport import *
-
-
-class TSocketBase(TTransportBase):
-  def _resolveAddr(self):
-    if self._unix_socket is not None:
-      return [(socket.AF_UNIX, socket.SOCK_STREAM, None, None,
-               self._unix_socket)]
-    else:
-      return socket.getaddrinfo(self.host,
-                                self.port,
-                                socket.AF_UNSPEC,
-                                socket.SOCK_STREAM,
-                                0,
-                                socket.AI_PASSIVE | socket.AI_ADDRCONFIG)
-
-  def close(self):
-    if self.handle:
-      self.handle.close()
-      self.handle = None
-
-
-class TSocket(TSocketBase):
-  """Socket implementation of TTransport base."""
-
-  def __init__(self, host='localhost', port=9090, unix_socket=None):
-    """Initialize a TSocket
-
-    @param host(str)  The host to connect to.
-    @param port(int)  The (TCP) port to connect to.
-    @param unix_socket(str)  The filename of a unix socket to connect to.
-                             (host and port will be ignored.)
-    """
-    self.host = host
-    self.port = port
-    self.handle = None
-    self._unix_socket = unix_socket
-    self._timeout = None
-
-  def setHandle(self, h):
-    self.handle = h
-
-  def isOpen(self):
-    return self.handle is not None
-
-  def setTimeout(self, ms):
-    if ms is None:
-      self._timeout = None
-    else:
-      self._timeout = ms / 1000.0
-
-    if self.handle is not None:
-      self.handle.settimeout(self._timeout)
-
-  def open(self):
-    try:
-      res0 = self._resolveAddr()
-      for res in res0:
-        self.handle = socket.socket(res[0], res[1])
-        self.handle.settimeout(self._timeout)
-        try:
-          self.handle.connect(res[4])
-        except socket.error, e:
-          if res is not res0[-1]:
-            continue
-          else:
-            raise e
-        break
-    except socket.error, e:
-      if self._unix_socket:
-        message = 'Could not connect to socket %s' % self._unix_socket
-      else:
-        message = 'Could not connect to %s:%d' % (self.host, self.port)
-      raise TTransportException(type=TTransportException.NOT_OPEN,
-                                message=message)
-
-  def read(self, sz):
-    try:
-      buff = self.handle.recv(sz)
-    except socket.error, e:
-      if (e.args[0] == errno.ECONNRESET and
-          (sys.platform == 'darwin' or sys.platform.startswith('freebsd'))):
-        # freebsd and Mach don't follow POSIX semantic of recv
-        # and fail with ECONNRESET if peer performed shutdown.
-        # See corresponding comment and code in TSocket::read()
-        # in lib/cpp/src/transport/TSocket.cpp.
-        self.close()
-        # Trigger the check to raise the END_OF_FILE exception below.
-        buff = ''
-      else:
-        raise
-    if len(buff) == 0:
-      raise TTransportException(type=TTransportException.END_OF_FILE,
-                                message='TSocket read 0 bytes')
-    return buff
-
-  def write(self, buff):
-    if not self.handle:
-      raise TTransportException(type=TTransportException.NOT_OPEN,
-                                message='Transport not open')
-    sent = 0
-    have = len(buff)
-    while sent < have:
-      plus = self.handle.send(buff)
-      if plus == 0:
-        raise TTransportException(type=TTransportException.END_OF_FILE,
-                                  message='TSocket sent 0 bytes')
-      sent += plus
-      buff = buff[plus:]
-
-  def flush(self):
-    pass
-
-
-class TServerSocket(TSocketBase, TServerTransportBase):
-  """Socket implementation of TServerTransport base."""
-
-  def __init__(self, host=None, port=9090, unix_socket=None):
-    self.host = host
-    self.port = port
-    self._unix_socket = unix_socket
-    self.handle = None
-
-  def listen(self):
-    res0 = self._resolveAddr()
-    for res in res0:
-      if res[0] is socket.AF_INET6 or res is res0[-1]:
-        break
-
-    # We need remove the old unix socket if the file exists and
-    # nobody is listening on it.
-    if self._unix_socket:
-      tmp = socket.socket(res[0], res[1])
-      try:
-        tmp.connect(res[4])
-      except socket.error, err:
-        eno, message = err.args
-        if eno == errno.ECONNREFUSED:
-          os.unlink(res[4])
-
-    self.handle = socket.socket(res[0], res[1])
-    self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-    if hasattr(self.handle, 'settimeout'):
-      self.handle.settimeout(None)
-    self.handle.bind(res[4])
-    self.handle.listen(128)
-
-  def accept(self):
-    client, addr = self.handle.accept()
-    result = TSocket()
-    result.setHandle(client)
-    return result
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TTransport.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TTransport.py
deleted file mode 100644
index 4481371..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TTransport.py
+++ /dev/null
@@ -1,330 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from cStringIO import StringIO
-from struct import pack, unpack
-from thrift.Thrift import TException
-
-
-class TTransportException(TException):
-  """Custom Transport Exception class"""
-
-  UNKNOWN = 0
-  NOT_OPEN = 1
-  ALREADY_OPEN = 2
-  TIMED_OUT = 3
-  END_OF_FILE = 4
-
-  def __init__(self, type=UNKNOWN, message=None):
-    TException.__init__(self, message)
-    self.type = type
-
-
-class TTransportBase:
-  """Base class for Thrift transport layer."""
-
-  def isOpen(self):
-    pass
-
-  def open(self):
-    pass
-
-  def close(self):
-    pass
-
-  def read(self, sz):
-    pass
-
-  def readAll(self, sz):
-    buff = ''
-    have = 0
-    while (have < sz):
-      chunk = self.read(sz - have)
-      have += len(chunk)
-      buff += chunk
-
-      if len(chunk) == 0:
-        raise EOFError()
-
-    return buff
-
-  def write(self, buf):
-    pass
-
-  def flush(self):
-    pass
-
-
-# This class should be thought of as an interface.
-class CReadableTransport:
-  """base class for transports that are readable from C"""
-
-  # TODO(dreiss): Think about changing this interface to allow us to use
-  #               a (Python, not c) StringIO instead, because it allows
-  #               you to write after reading.
-
-  # NOTE: This is a classic class, so properties will NOT work
-  #       correctly for setting.
-  @property
-  def cstringio_buf(self):
-    """A cStringIO buffer that contains the current chunk we are reading."""
-    pass
-
-  def cstringio_refill(self, partialread, reqlen):
-    """Refills cstringio_buf.
-
-    Returns the currently used buffer (which can but need not be the same as
-    the old cstringio_buf). partialread is what the C code has read from the
-    buffer, and should be inserted into the buffer before any more reads.  The
-    return value must be a new, not borrowed reference.  Something along the
-    lines of self._buf should be fine.
-
-    If reqlen bytes can't be read, throw EOFError.
-    """
-    pass
-
-
-class TServerTransportBase:
-  """Base class for Thrift server transports."""
-
-  def listen(self):
-    pass
-
-  def accept(self):
-    pass
-
-  def close(self):
-    pass
-
-
-class TTransportFactoryBase:
-  """Base class for a Transport Factory"""
-
-  def getTransport(self, trans):
-    return trans
-
-
-class TBufferedTransportFactory:
-  """Factory transport that builds buffered transports"""
-
-  def getTransport(self, trans):
-    buffered = TBufferedTransport(trans)
-    return buffered
-
-
-class TBufferedTransport(TTransportBase, CReadableTransport):
-  """Class that wraps another transport and buffers its I/O.
-
-  The implementation uses a (configurable) fixed-size read buffer
-  but buffers all writes until a flush is performed.
-  """
-  DEFAULT_BUFFER = 4096
-
-  def __init__(self, trans, rbuf_size=DEFAULT_BUFFER):
-    self.__trans = trans
-    self.__wbuf = StringIO()
-    self.__rbuf = StringIO("")
-    self.__rbuf_size = rbuf_size
-
-  def isOpen(self):
-    return self.__trans.isOpen()
-
-  def open(self):
-    return self.__trans.open()
-
-  def close(self):
-    return self.__trans.close()
-
-  def read(self, sz):
-    ret = self.__rbuf.read(sz)
-    if len(ret) != 0:
-      return ret
-
-    self.__rbuf = StringIO(self.__trans.read(max(sz, self.__rbuf_size)))
-    return self.__rbuf.read(sz)
-
-  def write(self, buf):
-    self.__wbuf.write(buf)
-
-  def flush(self):
-    out = self.__wbuf.getvalue()
-    # reset wbuf before write/flush to preserve state on underlying failure
-    self.__wbuf = StringIO()
-    self.__trans.write(out)
-    self.__trans.flush()
-
-  # Implement the CReadableTransport interface.
-  @property
-  def cstringio_buf(self):
-    return self.__rbuf
-
-  def cstringio_refill(self, partialread, reqlen):
-    retstring = partialread
-    if reqlen < self.__rbuf_size:
-      # try to make a read of as much as we can.
-      retstring += self.__trans.read(self.__rbuf_size)
-
-    # but make sure we do read reqlen bytes.
-    if len(retstring) < reqlen:
-      retstring += self.__trans.readAll(reqlen - len(retstring))
-
-    self.__rbuf = StringIO(retstring)
-    return self.__rbuf
-
-
-class TMemoryBuffer(TTransportBase, CReadableTransport):
-  """Wraps a cStringIO object as a TTransport.
-
-  NOTE: Unlike the C++ version of this class, you cannot write to it
-        then immediately read from it.  If you want to read from a
-        TMemoryBuffer, you must either pass a string to the constructor.
-  TODO(dreiss): Make this work like the C++ version.
-  """
-
-  def __init__(self, value=None):
-    """value -- a value to read from for stringio
-
-    If value is set, this will be a transport for reading,
-    otherwise, it is for writing"""
-    if value is not None:
-      self._buffer = StringIO(value)
-    else:
-      self._buffer = StringIO()
-
-  def isOpen(self):
-    return not self._buffer.closed
-
-  def open(self):
-    pass
-
-  def close(self):
-    self._buffer.close()
-
-  def read(self, sz):
-    return self._buffer.read(sz)
-
-  def write(self, buf):
-    self._buffer.write(buf)
-
-  def flush(self):
-    pass
-
-  def getvalue(self):
-    return self._buffer.getvalue()
-
-  # Implement the CReadableTransport interface.
-  @property
-  def cstringio_buf(self):
-    return self._buffer
-
-  def cstringio_refill(self, partialread, reqlen):
-    # only one shot at reading...
-    raise EOFError()
-
-
-class TFramedTransportFactory:
-  """Factory transport that builds framed transports"""
-
-  def getTransport(self, trans):
-    framed = TFramedTransport(trans)
-    return framed
-
-
-class TFramedTransport(TTransportBase, CReadableTransport):
-  """Class that wraps another transport and frames its I/O when writing."""
-
-  def __init__(self, trans,):
-    self.__trans = trans
-    self.__rbuf = StringIO()
-    self.__wbuf = StringIO()
-
-  def isOpen(self):
-    return self.__trans.isOpen()
-
-  def open(self):
-    return self.__trans.open()
-
-  def close(self):
-    return self.__trans.close()
-
-  def read(self, sz):
-    ret = self.__rbuf.read(sz)
-    if len(ret) != 0:
-      return ret
-
-    self.readFrame()
-    return self.__rbuf.read(sz)
-
-  def readFrame(self):
-    buff = self.__trans.readAll(4)
-    sz, = unpack('!i', buff)
-    self.__rbuf = StringIO(self.__trans.readAll(sz))
-
-  def write(self, buf):
-    self.__wbuf.write(buf)
-
-  def flush(self):
-    wout = self.__wbuf.getvalue()
-    wsz = len(wout)
-    # reset wbuf before write/flush to preserve state on underlying failure
-    self.__wbuf = StringIO()
-    # N.B.: Doing this string concatenation is WAY cheaper than making
-    # two separate calls to the underlying socket object. Socket writes in
-    # Python turn out to be REALLY expensive, but it seems to do a pretty
-    # good job of managing string buffer operations without excessive copies
-    buf = pack("!i", wsz) + wout
-    self.__trans.write(buf)
-    self.__trans.flush()
-
-  # Implement the CReadableTransport interface.
-  @property
-  def cstringio_buf(self):
-    return self.__rbuf
-
-  def cstringio_refill(self, prefix, reqlen):
-    # self.__rbuf will already be empty here because fastbinary doesn't
-    # ask for a refill until the previous buffer is empty.  Therefore,
-    # we can start reading new frames immediately.
-    while len(prefix) < reqlen:
-      self.readFrame()
-      prefix += self.__rbuf.getvalue()
-    self.__rbuf = StringIO(prefix)
-    return self.__rbuf
-
-
-class TFileObjectTransport(TTransportBase):
-  """Wraps a file-like object to make it work as a Thrift transport."""
-
-  def __init__(self, fileobj):
-    self.fileobj = fileobj
-
-  def isOpen(self):
-    return True
-
-  def close(self):
-    self.fileobj.close()
-
-  def read(self, sz):
-    return self.fileobj.read(sz)
-
-  def write(self, buf):
-    self.fileobj.write(buf)
-
-  def flush(self):
-    self.fileobj.flush()
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TTwisted.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TTwisted.py
deleted file mode 100644
index 3ce3eb2..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TTwisted.py
+++ /dev/null
@@ -1,221 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from cStringIO import StringIO
-
-from zope.interface import implements, Interface, Attribute
-from twisted.internet.protocol import Protocol, ServerFactory, ClientFactory, \
-    connectionDone
-from twisted.internet import defer
-from twisted.protocols import basic
-from twisted.python import log
-from twisted.web import server, resource, http
-
-from thrift.transport import TTransport
-
-
-class TMessageSenderTransport(TTransport.TTransportBase):
-
-    def __init__(self):
-        self.__wbuf = StringIO()
-
-    def write(self, buf):
-        self.__wbuf.write(buf)
-
-    def flush(self):
-        msg = self.__wbuf.getvalue()
-        self.__wbuf = StringIO()
-        self.sendMessage(msg)
-
-    def sendMessage(self, message):
-        raise NotImplementedError
-
-
-class TCallbackTransport(TMessageSenderTransport):
-
-    def __init__(self, func):
-        TMessageSenderTransport.__init__(self)
-        self.func = func
-
-    def sendMessage(self, message):
-        self.func(message)
-
-
-class ThriftClientProtocol(basic.Int32StringReceiver):
-
-    MAX_LENGTH = 2 ** 31 - 1
-
-    def __init__(self, client_class, iprot_factory, oprot_factory=None):
-        self._client_class = client_class
-        self._iprot_factory = iprot_factory
-        if oprot_factory is None:
-            self._oprot_factory = iprot_factory
-        else:
-            self._oprot_factory = oprot_factory
-
-        self.recv_map = {}
-        self.started = defer.Deferred()
-
-    def dispatch(self, msg):
-        self.sendString(msg)
-
-    def connectionMade(self):
-        tmo = TCallbackTransport(self.dispatch)
-        self.client = self._client_class(tmo, self._oprot_factory)
-        self.started.callback(self.client)
-
-    def connectionLost(self, reason=connectionDone):
-        for k, v in self.client._reqs.iteritems():
-            tex = TTransport.TTransportException(
-                type=TTransport.TTransportException.END_OF_FILE,
-                message='Connection closed')
-            v.errback(tex)
-
-    def stringReceived(self, frame):
-        tr = TTransport.TMemoryBuffer(frame)
-        iprot = self._iprot_factory.getProtocol(tr)
-        (fname, mtype, rseqid) = iprot.readMessageBegin()
-
-        try:
-            method = self.recv_map[fname]
-        except KeyError:
-            method = getattr(self.client, 'recv_' + fname)
-            self.recv_map[fname] = method
-
-        method(iprot, mtype, rseqid)
-
-
-class ThriftServerProtocol(basic.Int32StringReceiver):
-
-    MAX_LENGTH = 2 ** 31 - 1
-
-    def dispatch(self, msg):
-        self.sendString(msg)
-
-    def processError(self, error):
-        self.transport.loseConnection()
-
-    def processOk(self, _, tmo):
-        msg = tmo.getvalue()
-
-        if len(msg) > 0:
-            self.dispatch(msg)
-
-    def stringReceived(self, frame):
-        tmi = TTransport.TMemoryBuffer(frame)
-        tmo = TTransport.TMemoryBuffer()
-
-        iprot = self.factory.iprot_factory.getProtocol(tmi)
-        oprot = self.factory.oprot_factory.getProtocol(tmo)
-
-        d = self.factory.processor.process(iprot, oprot)
-        d.addCallbacks(self.processOk, self.processError,
-            callbackArgs=(tmo,))
-
-
-class IThriftServerFactory(Interface):
-
-    processor = Attribute("Thrift processor")
-
-    iprot_factory = Attribute("Input protocol factory")
-
-    oprot_factory = Attribute("Output protocol factory")
-
-
-class IThriftClientFactory(Interface):
-
-    client_class = Attribute("Thrift client class")
-
-    iprot_factory = Attribute("Input protocol factory")
-
-    oprot_factory = Attribute("Output protocol factory")
-
-
-class ThriftServerFactory(ServerFactory):
-
-    implements(IThriftServerFactory)
-
-    protocol = ThriftServerProtocol
-
-    def __init__(self, processor, iprot_factory, oprot_factory=None):
-        self.processor = processor
-        self.iprot_factory = iprot_factory
-        if oprot_factory is None:
-            self.oprot_factory = iprot_factory
-        else:
-            self.oprot_factory = oprot_factory
-
-
-class ThriftClientFactory(ClientFactory):
-
-    implements(IThriftClientFactory)
-
-    protocol = ThriftClientProtocol
-
-    def __init__(self, client_class, iprot_factory, oprot_factory=None):
-        self.client_class = client_class
-        self.iprot_factory = iprot_factory
-        if oprot_factory is None:
-            self.oprot_factory = iprot_factory
-        else:
-            self.oprot_factory = oprot_factory
-
-    def buildProtocol(self, addr):
-        p = self.protocol(self.client_class, self.iprot_factory,
-            self.oprot_factory)
-        p.factory = self
-        return p
-
-
-class ThriftResource(resource.Resource):
-
-    allowedMethods = ('POST',)
-
-    def __init__(self, processor, inputProtocolFactory,
-        outputProtocolFactory=None):
-        resource.Resource.__init__(self)
-        self.inputProtocolFactory = inputProtocolFactory
-        if outputProtocolFactory is None:
-            self.outputProtocolFactory = inputProtocolFactory
-        else:
-            self.outputProtocolFactory = outputProtocolFactory
-        self.processor = processor
-
-    def getChild(self, path, request):
-        return self
-
-    def _cbProcess(self, _, request, tmo):
-        msg = tmo.getvalue()
-        request.setResponseCode(http.OK)
-        request.setHeader("content-type", "application/x-thrift")
-        request.write(msg)
-        request.finish()
-
-    def render_POST(self, request):
-        request.content.seek(0, 0)
-        data = request.content.read()
-        tmi = TTransport.TMemoryBuffer(data)
-        tmo = TTransport.TMemoryBuffer()
-
-        iprot = self.inputProtocolFactory.getProtocol(tmi)
-        oprot = self.outputProtocolFactory.getProtocol(tmo)
-
-        d = self.processor.process(iprot, oprot)
-        d.addCallback(self._cbProcess, request, tmo)
-        return server.NOT_DONE_YET
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TZlibTransport.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TZlibTransport.py
deleted file mode 100644
index 97e58b3..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/TZlibTransport.py
+++ /dev/null
@@ -1,249 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-"""TZlibTransport provides a compressed transport and transport factory
-class, using the python standard library zlib module to implement
-data compression.
-"""
-
-from __future__ import division
-import zlib
-from cStringIO import StringIO
-
-from lib.thrift.transport.TTransport import TTransportBase, CReadableTransport
-
-
-class TZlibTransportFactory(object):
-  """Factory transport that builds zlib compressed transports.
-
-  This factory caches the last single client/transport that it was passed
-  and returns the same TZlibTransport object that was created.
-
-  This caching means the TServer class will get the _same_ transport
-  object for both input and output transports from this factory.
-  (For non-threaded scenarios only, since the cache only holds one object)
-
-  The purpose of this caching is to allocate only one TZlibTransport where
-  only one is really needed (since it must have separate read/write buffers),
-  and makes the statistics from getCompSavings() and getCompRatio()
-  easier to understand.
-  """
-  # class scoped cache of last transport given and zlibtransport returned
-  _last_trans = None
-  _last_z = None
-
-  def getTransport(self, trans, compresslevel=9):
-    """Wrap a transport, trans, with the TZlibTransport
-    compressed transport class, returning a new
-    transport to the caller.
-
-    @param compresslevel: The zlib compression level, ranging
-    from 0 (no compression) to 9 (best compression).  Defaults to 9.
-    @type compresslevel: int
-
-    This method returns a TZlibTransport which wraps the
-    passed C{trans} TTransport derived instance.
-    """
-    if trans == self._last_trans:
-      return self._last_z
-    ztrans = TZlibTransport(trans, compresslevel)
-    self._last_trans = trans
-    self._last_z = ztrans
-    return ztrans
-
-
-class TZlibTransport(TTransportBase, CReadableTransport):
-  """Class that wraps a transport with zlib, compressing writes
-  and decompresses reads, using the python standard
-  library zlib module.
-  """
-  # Read buffer size for the python fastbinary C extension,
-  # the TBinaryProtocolAccelerated class.
-  DEFAULT_BUFFSIZE = 4096
-
-  def __init__(self, trans, compresslevel=9):
-    """Create a new TZlibTransport, wrapping C{trans}, another
-    TTransport derived object.
-
-    @param trans: A thrift transport object, i.e. a TSocket() object.
-    @type trans: TTransport
-    @param compresslevel: The zlib compression level, ranging
-    from 0 (no compression) to 9 (best compression).  Default is 9.
-    @type compresslevel: int
-    """
-    self.__trans = trans
-    self.compresslevel = compresslevel
-    self.__rbuf = StringIO()
-    self.__wbuf = StringIO()
-    self._init_zlib()
-    self._init_stats()
-
-  def _reinit_buffers(self):
-    """Internal method to initialize/reset the internal StringIO objects
-    for read and write buffers.
-    """
-    self.__rbuf = StringIO()
-    self.__wbuf = StringIO()
-
-  def _init_stats(self):
-    """Internal method to reset the internal statistics counters
-    for compression ratios and bandwidth savings.
-    """
-    self.bytes_in = 0
-    self.bytes_out = 0
-    self.bytes_in_comp = 0
-    self.bytes_out_comp = 0
-
-  def _init_zlib(self):
-    """Internal method for setting up the zlib compression and
-    decompression objects.
-    """
-    self._zcomp_read = zlib.decompressobj()
-    self._zcomp_write = zlib.compressobj(self.compresslevel)
-
-  def getCompRatio(self):
-    """Get the current measured compression ratios (in,out) from
-    this transport.
-
-    Returns a tuple of:
-    (inbound_compression_ratio, outbound_compression_ratio)
-
-    The compression ratios are computed as:
-        compressed / uncompressed
-
-    E.g., data that compresses by 10x will have a ratio of: 0.10
-    and data that compresses to half of ts original size will
-    have a ratio of 0.5
-
-    None is returned if no bytes have yet been processed in
-    a particular direction.
-    """
-    r_percent, w_percent = (None, None)
-    if self.bytes_in > 0:
-      r_percent = self.bytes_in_comp / self.bytes_in
-    if self.bytes_out > 0:
-      w_percent = self.bytes_out_comp / self.bytes_out
-    return (r_percent, w_percent)
-
-  def getCompSavings(self):
-    """Get the current count of saved bytes due to data
-    compression.
-
-    Returns a tuple of:
-    (inbound_saved_bytes, outbound_saved_bytes)
-
-    Note: if compression is actually expanding your
-    data (only likely with very tiny thrift objects), then
-    the values returned will be negative.
-    """
-    r_saved = self.bytes_in - self.bytes_in_comp
-    w_saved = self.bytes_out - self.bytes_out_comp
-    return (r_saved, w_saved)
-
-  def isOpen(self):
-    """Return the underlying transport's open status"""
-    return self.__trans.isOpen()
-
-  def open(self):
-    """Open the underlying transport"""
-    self._init_stats()
-    return self.__trans.open()
-
-  def listen(self):
-    """Invoke the underlying transport's listen() method"""
-    self.__trans.listen()
-
-  def accept(self):
-    """Accept connections on the underlying transport"""
-    return self.__trans.accept()
-
-  def close(self):
-    """Close the underlying transport,"""
-    self._reinit_buffers()
-    self._init_zlib()
-    return self.__trans.close()
-
-  def read(self, sz):
-    """Read up to sz bytes from the decompressed bytes buffer, and
-    read from the underlying transport if the decompression
-    buffer is empty.
-    """
-    ret = self.__rbuf.read(sz)
-    if len(ret) > 0:
-      return ret
-    # keep reading from transport until something comes back
-    while True:
-      if self.readComp(sz):
-        break
-    ret = self.__rbuf.read(sz)
-    return ret
-
-  def readComp(self, sz):
-    """Read compressed data from the underlying transport, then
-    decompress it and append it to the internal StringIO read buffer
-    """
-    zbuf = self.__trans.read(sz)
-    zbuf = self._zcomp_read.unconsumed_tail + zbuf
-    buf = self._zcomp_read.decompress(zbuf)
-    self.bytes_in += len(zbuf)
-    self.bytes_in_comp += len(buf)
-    old = self.__rbuf.read()
-    self.__rbuf = StringIO(old + buf)
-    if len(old) + len(buf) == 0:
-      return False
-    return True
-
-  def write(self, buf):
-    """Write some bytes, putting them into the internal write
-    buffer for eventual compression.
-    """
-    self.__wbuf.write(buf)
-
-  def flush(self):
-    """Flush any queued up data in the write buffer and ensure the
-    compression buffer is flushed out to the underlying transport
-    """
-    wout = self.__wbuf.getvalue()
-    if len(wout) > 0:
-      zbuf = self._zcomp_write.compress(wout)
-      self.bytes_out += len(wout)
-      self.bytes_out_comp += len(zbuf)
-    else:
-      zbuf = ''
-    ztail = self._zcomp_write.flush(zlib.Z_SYNC_FLUSH)
-    self.bytes_out_comp += len(ztail)
-    if (len(zbuf) + len(ztail)) > 0:
-      self.__wbuf = StringIO()
-      self.__trans.write(zbuf + ztail)
-    self.__trans.flush()
-
-  @property
-  def cstringio_buf(self):
-    """Implement the CReadableTransport interface"""
-    return self.__rbuf
-
-  def cstringio_refill(self, partialread, reqlen):
-    """Implement the CReadableTransport interface for refill"""
-    retstring = partialread
-    if reqlen < self.DEFAULT_BUFFSIZE:
-      retstring += self.read(self.DEFAULT_BUFFSIZE)
-    while len(retstring) < reqlen:
-      retstring += self.read(reqlen - len(retstring))
-    self.__rbuf = StringIO(retstring)
-    return self.__rbuf
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/__init__.py
deleted file mode 100644
index c9596d9..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/thrift/transport/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-__all__ = ['TTransport', 'TSocket', 'THttpClient', 'TZlibTransport']
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/AiravataClient.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/AiravataClient.py
deleted file mode 100644
index 1d305d8..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/AiravataClient.py
+++ /dev/null
@@ -1,306 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 sys, ConfigParser
-import time
-
-sys.path.append('../lib')
-sys.path.append('../') # necessary on some machines
-
-from apache.airavata.api import Airavata
-from apache.airavata.model.experiment.ttypes import ExperimentModel, UserConfigurationDataModel, ExperimentType
-from apache.airavata.model.workspace.ttypes import Project
-from apache.airavata.model.scheduling.ttypes import ComputationalResourceSchedulingModel
-from apache.airavata.model.security.ttypes import AuthzToken
-from apache.airavata.model.status.ttypes import ExperimentState
-
-from thrift import Thrift
-from thrift.transport import TSocket, TTransport
-from thrift.protocol import TBinaryProtocol
-from thrift.transport.THttpClient import THttpClient
-
-# from apache.airavata.api import Airavata
-# from apache.airavata.model.experiment.ttypes import *
-# from apache.airavata.model.security.ttypes import *
-# from apache.airavata.model.status.ttypes import *
-# from apache.airavata.model.scheduling.ttypes import *
-
-# from thrift import Thrift
-# from thrift.transport import TSocket
-# from thrift.transport import TTransport
-# from thrift.protocol import TBinaryProtocol
-
-class AiravataClient():
-    """Wrapper around airavataClient object"""
-    def __init__(self, config):
-        # Read Airavata Client properties
-        airavataConfig = ConfigParser.RawConfigParser()
-        airavataConfig.read(config)
-
-        self.host = airavataConfig.get('AiravataServer', 'host')
-        self.port = airavataConfig.getint('AiravataServer', 'port')
-        self.cred = airavataConfig.get('GatewayProperties', 'cred_token_id')
-        self.gatewayId = airavataConfig.get('GatewayProperties', 'gateway_id')
-
-        # Create a socket to the Airavata Server
-        socket = TSocket.TSocket(self.host, self.port)
-        socket.setTimeout(10000)
-
-        # Use Buffered Protocol to speed up over raw sockets
-        self.transport = TTransport.TBufferedTransport(socket)
-
-        # Airavata currently uses Binary Protocol
-        protocol = TBinaryProtocol.TBinaryProtocol(self.transport)
-
-        # Create a Airavata client to use the protocol encoder
-        self.client = Airavata.Client(protocol)
-
-        # Create dummy token
-        self.token =  AuthzToken("default-token")
-
-
-    # Context manager methods
-    def __enter__(self):
-        self.open()
-        return self
-
-
-    def __exit__(self, type, value, traceback):
-        self.close()
-
-
-    def open(self):
-        self.transport.open()
-
-
-    def close(self):
-        self.transport.close()
-
-
-    def printProperties(self):
-        print 'Host: {}'.format(self.host)
-        print 'Port: {}'.format(self.port)
-
-
-    def printVersion(self):
-        print 'Server version: {}'.format(self.client.getAPIVersion(self.token))
-
-
-    def getAllAppModules(self, gatewayId):
-        return self.client.getAllAppModules(self.token, gatewayId)
-
-
-    def getAllComputeResourceNames(self):
-        return self.client.getAllComputeResourceNames(self.token)
-
-
-    def getComputeResource(self, computeResourceId):
-        return self.client.getComputeResource(self.token, computeResourceId)
-
-
-    def getAllApplicationInterfaceNames(self):
-        return self.client.getAllApplicationInterfaceNames(self.token, self.gatewayId)
-
-
-    def getExperiment(self, expId):
-        """
-        Returns:
-            The airavata experiment_model.ExperimentModel corresponding to experiment ID
-        
-        """
-        experiment = self.client.getExperiment(self.token, expId)
-        # print 'Experiment configurationdata->computationalResource: {}'.format(experiment.userConfigurationData.computationalResourceScheduling.queueName)
-        return experiment
-
-
-    def getExperimentsInProject(self, projectId, limit, offset):
-        """
-        Args:
-            projectId: (str) Identifier of the project
-            limit: (int) Amount of results to be fetched
-            offset: (int) The starting point of the results to be fetched
-
-        Returns:
-            list<experiment_model.ExperimentModel>
-        """
-        return self.client.getExperimentsInProject(self.token, projectId, limit, offset)
-
-
-    def getProject(self, projectId):
-        """
-        Returns:
-            The airavata workspace_model.Project getProject corresponding to project ID
-        """
-        return self.client.getProject(self.token, projectId) 
-
-
-    def createProject(self, project):
-        return self.client.createProject(self.token, self.gatewayId, project) 
-
-
-    def createSampleExperiment(self):
-        """Creates a sample Amber experiment
-
-        Returns:
-            The experiment ID (str) corresponding to newly created experiment
-        """
-        amberId = "Amber_66ca2b6c-ef36-409d-9f2b-67630c760609"
-        #amberId = "Amber_74ad818e-7633-476a-b861-952de9b0a529"
-        inputs = self.client.getApplicationInputs(self.token,amberId)
-        for input in inputs:
-            # print input.name
-            if input.name == "Heat_Restart_File":
-                input.value = "file:///home/airavata/production/appInputs/AMBER_FILES/02_Heat.rst"
-            elif input.name == "Parameter_Topology_File":
-                input.value ="file:///home/airavata/production/appInputs/AMBER_FILES/prmtop"
-            elif input.name == "Production_Control_File":
-                input.value = "file:///home/airavata/production/appInputs/AMBER_FILES/03_Prod.in"
-
-        outputs = self.client.getApplicationOutputs(self.token, amberId)
-        # for output in outputs:
-        #    print output.name
-        #projectId =  "gsoc_2015_be5a201b-9228-4dd9-9961-ba61b17bf527"
-        projectId = "test_project_dd38ab8f-74ae-4ae6-a3ab-2c08cd41b77b" 
-        stampedeHostName = "stampede.tacc.xsede.org"
-
-        numberOfExps = len(self.getExperimentsInProject(projectId, 100, 0))
-
-        experiment = ExperimentModel()
-        experiment.gatewayId = 'default'
-        experiment.projectId = projectId
-        experiment.experimentType = ExperimentType.SINGLE_APPLICATION
-        experiment.userName = "admin"
-
-        # So i can keep track of how many experiments I have submitted
-        experiment.experimentName = "Sample_experiment_{0}".format(numberOfExps + 1)
-        experiment.description = "Test experiment"
-        experiment.executionId = amberId
-        experiment.experimentInputs = inputs
-        experiment.experimentOutputs = outputs
-
-        computeResources = self.client.getAvailableAppInterfaceComputeResources(self.token, amberId)
-        id = None
-        for key, value in computeResources.iteritems():
-            # print key , " " , value
-            if value == stampedeHostName:
-                id = key
-                break
-
-        # Create a computational resource scheduling model
-        crsm = ComputationalResourceSchedulingModel()
-        crsm.totalCPUCount = 4
-        crsm.nodeCount = 1
-        crsm.queueName = "development"
-        crsm.wallTimeLimit = 30
-        crsm.totalPhysicalMemory = 1
-        crsm.resourceHostId = id
-
-        ucdm = UserConfigurationDataModel()
-        ucdm.computationalResourceScheduling = crsm
-        ucdm.airavataAutoSchedule = False
-        ucdm.overrideManualScheduledParams = False
-        experiment.userConfigurationData  = ucdm
-
-        expId = self.client.createExperiment(self.token, "default", experiment)
-        return expId
-
-
-    def createExperiment(self, experiment):
-        """
-        Args:
-            experiment = (experiment_model.ExperimentModel)
-
-        Returns:
-            experiment ID (str) of newly created experiment
-        """
-        return self.client.createExperiment(self.token, self.gatewayId, experiment)
-
-    
-    def cloneExperiment(self, existingExperimentId, newExperimentName):
-        """Clone a specified experiment with a new name. A copy of the experiment configuration is
-        made and is persisted with new metadata. The client has to subsequently update this
-        configuration if needed and launch the cloned experiment.
-
-        Args:
-            existingExperimentId = (str)
-            newExperimentName = (str)
-
-        Returns:
-            experiment ID (str) of newly created experiment
-        """
-        return self.client.cloneExperiment(self.token, existingExperimentId, newExperimentName)
-
-
-    def launchExperiment(self, expId):
-        self.client.launchExperiment(self.token, expId, self.cred)
-
-
-    def getExperimentStatus(self, expId):
-        """
-        Returns:
-            status_models.ExperimentStatus 
-        """
-        return self.client.getExperimentStatus(self.token, expId)
-
-
-    def getJobStatuses(self, expId):
-        """
-        Returns:
-            map<string, status_models.JobStatus>
-        """
-        return self.client.getJobStatuses(self.token, expId)
-
-
-    def getJobDetails(self, expId):
-        """
-        Returns:
-            list<job_model.JobModel>
-        """
-        return self.client.getJobDetails(self.token, expId)
-
-
-    def getExperimentOutputs(self, expId):
-        """
-        Returns:
-            list<application_io_models.OutputDataObjectType>
-        """
-        return self.client.getExperimentOutputs(self.token, expId)
-
-
-    def getIntermediateOutputs(self, expId):
-        """
-        Returns:
-            list<application_io_models.OutputDataObjectType>
-        """
-        return self.client.getIntermediateOutputs(self.token, expId)
-
-
-    def validateExperiment(self, expId):
-        """ Validate experiment configuration. True generally indicates the experiment is
-        ready to be launched
-
-        Returns:
-            True or False
-
-        """
-        return self.client.validateExperiment(self.token, expId)
-
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/TestAiravataConnection.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/TestAiravataConnection.py
deleted file mode 100644
index 09c2727..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/TestAiravataConnection.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 sys, ConfigParser
-
-sys.path.append('../lib')
-
-from apache.airavata.api import Airavata
-from apache.airavata.api.ttypes import *
-
-from thrift import Thrift
-from thrift.transport import TSocket
-from thrift.transport import TTransport
-from thrift.protocol import TBinaryProtocol
-
-try:
-    # Read Airavata Client properties
-    airavataConfig = ConfigParser.RawConfigParser()
-    airavataConfig.read('../conf/airavata-client.properties')
-
-    # Create a socket to the Airavata Server
-    transport = TSocket.TSocket(airavataConfig.get('AiravataServer', 'host'), airavataConfig.get('AiravataServer', 'port'))
-
-    # Use Buffered Protocol to speedup over raw sockets
-    transport = TTransport.TBufferedTransport(transport)
-
-    # Airavata currently uses Binary Protocol
-    protocol = TBinaryProtocol.TBinaryProtocol(transport)
-
-    # Create a Airavata client to use the protocol encoder
-    airavataClient = Airavata.Client(protocol)
-
-    # Connect to Airavata Server
-    transport.open()
-
-    print 'Airavata Server Version is:', airavataClient.getAPIVersion()
-
-    # Close Connection to Airavata Server
-    transport.close()
-
-except Thrift.TException, tx:
-    print '%s' % (tx.message)
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/createExperiment.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/createExperiment.py
deleted file mode 100644
index f6f61a4..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/createExperiment.py
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 sys, ConfigParser
-
-sys.path.append('../lib')
-
-from apache.airavata.api import Airavata
-from apache.airavata.api.ttypes import *
-from apache.airavata.model.workspace.experiment.ttypes import *
-
-from thrift import Thrift
-from thrift.transport import TSocket
-from thrift.transport import TTransport
-from thrift.protocol import TBinaryProtocol
-
-try:
-    # Read Airavata Client properties
-    airavataConfig = ConfigParser.RawConfigParser()
-    airavataConfig.read('../conf/airavata-client.properties')
-
-    # Create a socket to the Airavata Server
-    transport = TSocket.TSocket(airavataConfig.get('AiravataServer', 'host'), airavataConfig.get('AiravataServer', 'port'))
-
-    # Use Buffered Protocol to speedup over raw sockets
-    transport = TTransport.TBufferedTransport(transport)
-
-    # Airavata currently uses Binary Protocol
-    protocol = TBinaryProtocol.TBinaryProtocol(transport)
-
-    # Create a Airavata client to use the protocol encoder
-    airavataClient = Airavata.Client(protocol)
-
-    # Connect to Airavata Server
-    transport.open()
-
-    #Create a experiment
-    experiment = Experiment()
-    experiment.userName = "smarru"
-    experiment.name = "cli-test-experiment"
-    experiment.description = "experiment to test python cli"
-    experiment.applicationId = "Echo_b22f2303-a574-43ef-a6f2-ab8e64e2d0a2"
-    #experiment.experimentInputs
-
-
-
-    print 'Created Experiment with Id:', airavataClient.createExperiment("sdsc", experiment)
-
-    print 'Airavata Server Version is:', airavataClient.getAPIVersion()
-
-    # Close Connection to Airavata Server
-    transport.close()
-
-except Thrift.TException, tx:
-    print '%s' % (tx.message)
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/createProject.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/createProject.py
deleted file mode 100644
index 3985b69..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/createProject.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 sys, ConfigParser
-
-sys.path.append('../lib')
-
-from apache.airavata.api import Airavata
-from apache.airavata.api.ttypes import *
-from apache.airavata.model.workspace.ttypes import *
-
-from thrift import Thrift
-from thrift.transport import TSocket
-from thrift.transport import TTransport
-from thrift.protocol import TBinaryProtocol
-
-try:
-    # Read Airavata Client properties
-    airavataConfig = ConfigParser.RawConfigParser()
-    airavataConfig.read('../conf/airavata-client.properties')
-
-    # Create a socket to the Airavata Server
-    transport = TSocket.TSocket(airavataConfig.get('AiravataServer', 'host'), airavataConfig.get('AiravataServer', 'port'))
-
-    # Use Buffered Protocol to speedup over raw sockets
-    transport = TTransport.TBufferedTransport(transport)
-
-    # Airavata currently uses Binary Protocol
-    protocol = TBinaryProtocol.TBinaryProtocol(transport)
-
-    # Create a Airavata client to use the protocol encoder
-    airavataClient = Airavata.Client(protocol)
-
-    # Connect to Airavata Server
-    transport.open()
-
-    #Create Project
-    project = Project()
-    project.owner = "smarru"
-    project.name = "CLI-Test"
-    project.description = "Test project to illustrate Python Client"
-
-    print 'Created Project with Id:', airavataClient.createProject("sdsc", project)
-
-    print 'Airavata Server Version is:', airavataClient.getAPIVersion()
-
-    # Close Connection to Airavata Server
-    transport.close()
-
-except Thrift.TException, tx:
-    print '%s' % (tx.message)
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/getAllApplicationInterfaces.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/getAllApplicationInterfaces.py
deleted file mode 100644
index 271d9f5..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/getAllApplicationInterfaces.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 sys, ConfigParser
-
-sys.path.append('../lib')
-
-from apache.airavata.api import Airavata
-from apache.airavata.api.ttypes import *
-from apache.airavata.model.workspace.ttypes import *
-
-from thrift import Thrift
-from thrift.transport import TSocket
-from thrift.transport import TTransport
-from thrift.protocol import TBinaryProtocol
-
-try:
-    # Read Airavata Client properties
-    airavataConfig = ConfigParser.RawConfigParser()
-    airavataConfig.read('../conf/airavata-client.properties')
-
-    # Create a socket to the Airavata Server
-    transport = TSocket.TSocket(airavataConfig.get('AiravataServer', 'host'), airavataConfig.get('AiravataServer', 'port'))
-
-    # Use Buffered Protocol to speedup over raw sockets
-    transport = TTransport.TBufferedTransport(transport)
-
-    # Airavata currently uses Binary Protocol
-    protocol = TBinaryProtocol.TBinaryProtocol(transport)
-
-    # Create a Airavata client to use the protocol encoder
-    airavataClient = Airavata.Client(protocol)
-
-    # Connect to Airavata Server
-    transport.open()
-
-    appInterfaceLists = airavataClient.getAllApplicationInterfaces("sdsc");
-
-    print appInterfaceLists
-
-    # Close Connection to Airavata Server
-    transport.close()
-
-except Thrift.TException, tx:
-    print '%s' % (tx.message)
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/getAllComputeResourceNames.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/getAllComputeResourceNames.py
deleted file mode 100644
index 65c9e99..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/getAllComputeResourceNames.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 sys, ConfigParser
-
-sys.path.append('../lib')
-
-from apache.airavata.api import Airavata
-from apache.airavata.api.ttypes import *
-from apache.airavata.model.workspace.ttypes import *
-
-from thrift import Thrift
-from thrift.transport import TSocket
-from thrift.transport import TTransport
-from thrift.protocol import TBinaryProtocol
-
-try:
-    # Read Airavata Client properties
-    airavataConfig = ConfigParser.RawConfigParser()
-    airavataConfig.read('../conf/airavata-client.properties')
-
-    # Create a socket to the Airavata Server
-    transport = TSocket.TSocket(airavataConfig.get('AiravataServer', 'host'), airavataConfig.get('AiravataServer', 'port'))
-
-    # Use Buffered Protocol to speedup over raw sockets
-    transport = TTransport.TBufferedTransport(transport)
-
-    # Airavata currently uses Binary Protocol
-    protocol = TBinaryProtocol.TBinaryProtocol(transport)
-
-    # Create a Airavata client to use the protocol encoder
-    airavataClient = Airavata.Client(protocol)
-
-    # Connect to Airavata Server
-    transport.open()
-
-    computeResourceNames = airavataClient.getAllComputeResourceNames();
-
-    print computeResourceNames
-
-    # Close Connection to Airavata Server
-    transport.close()
-
-except Thrift.TException, tx:
-    print '%s' % (tx.message)
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/getProjects.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/getProjects.py
deleted file mode 100644
index 9ac115a..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/getProjects.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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 sys, ConfigParser
-
-sys.path.append('../lib')
-
-from apache.airavata.api import Airavata
-from apache.airavata.api.ttypes import *
-from apache.airavata.model.workspace.ttypes import *
-
-from thrift import Thrift
-from thrift.transport import TSocket
-from thrift.transport import TTransport
-from thrift.protocol import TBinaryProtocol
-
-try:
-    # Read Airavata Client properties
-    airavataConfig = ConfigParser.RawConfigParser()
-    airavataConfig.read('../conf/airavata-client.properties')
-
-    # Create a socket to the Airavata Server
-    transport = TSocket.TSocket(airavataConfig.get('AiravataServer', 'host'), airavataConfig.get('AiravataServer', 'port'))
-
-    # Use Buffered Protocol to speedup over raw sockets
-    transport = TTransport.TBufferedTransport(transport)
-
-    # Airavata currently uses Binary Protocol
-    protocol = TBinaryProtocol.TBinaryProtocol(transport)
-
-    # Create a Airavata client to use the protocol encoder
-    airavataClient = Airavata.Client(protocol)
-
-    # Connect to Airavata Server
-    transport.open()
-
-    projectLists = airavataClient.getAllUserProjects("sdsc", "smarru");
-
-    print projectLists
-
-    # Close Connection to Airavata Server
-    transport.close()
-
-except Thrift.TException, tx:
-    print '%s' % (tx.message)
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/testAiravataClient.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/testAiravataClient.py
deleted file mode 100644
index 581ee61..0000000
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/samples/testAiravataClient.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-#
-
-from AiravataClient import AiravataClient
-
-def main():
-    with AiravataClient('../conf/airavata-client.properties') as client: 
-        client.printProperties()
-        client.printVersion()
-        print client.getAllComputeResourceNames()
-
-if __name__ == "__main__":
-    main()
-
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/__init__.py
similarity index 100%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/__init__.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/transport/__init__.py
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/settings.ini b/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/settings.ini
new file mode 100644
index 0000000..e08087f
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/settings.ini
@@ -0,0 +1,31 @@
+[APIServer]
+API_HOST = localhost
+API_PORT = 9930
+API_SECURE = True
+[Gateway]
+GATEWAY_ID = default
+GATEWAY_DATA_STORE_RESOURCE_ID = airavata.host_77116e91-f042-4d3a-ab9c-3e7b4ebcd5bd
+GATEWAY_DATA_STORE_DIR = /tmp
+GATEWAY_DATA_STORE_HOSTNAME = localhost
+FILE_UPLOAD_TEMP_DIR = /tmp
+[ProfileServer]
+PROFILE_SERVICE_HOST = localhost
+PROFILE_SERVICE_PORT = 8962
+PROFILE_SERVICE_SECURE = False
+[SharingServer]
+SHARING_API_HOST = localhost
+SHARING_API_PORT = 7878
+SHARING_API_SECURE = False
+[CredentialStoreServer]
+CREDENTIAL_STORE_API_HOST = localhost
+CREDENTIAL_STORE_API_PORT = 8960
+CREDENTIAL_STORE_API_SECURE = False
+[Thrift]
+THRIFT_CLIENT_POOL_KEEPALIVE = 5
+[KeycloakServer]
+CLIENT_ID = pga
+CLIENT_SECRET = 9790c8c4-7d9b-4ccc-a820-ca5aac38d2ad
+TOKEN_URL = https://airavata.host:8443/auth/realms/default/protocol/openid-connect/token
+USER_INFO_URL = https://airavata.host:8443/auth/realms/default/protocol/openid-connect/userinfo
+VERIFY_SSL = False
+;CERTIFICATE_FILE_PATH = samples/resources/incommon_rsa_server_ca.pem
\ No newline at end of file
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/settings.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/settings.py
new file mode 100644
index 0000000..9f7709b
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/settings.py
@@ -0,0 +1,118 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 configparser
+import os
+
+config = configparser.ConfigParser()
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+defaultSettings = os.path.join(BASE_DIR, "transport", "settings.ini")
+config.read(defaultSettings)
+
+
+class APIServerClientSettings(object):
+
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.API_SERVER_HOST = config.get('APIServer', 'API_HOST')
+        self.API_SERVER_PORT = config.getint('APIServer', 'API_PORT')
+        self.API_SERVER_SECURE = config.getboolean('APIServer', 'API_SECURE')
+
+
+class IAMAdminClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+        self.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+        self.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
+
+
+class TenantProfileServerClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+        self.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+        self.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
+
+
+class GroupManagerClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+        self.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+        self.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
+
+
+class SharingAPIClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.SHARING_API_HOST = config.get('SharingServer', 'SHARING_API_HOST')
+        self.SHARING_API_PORT = config.getint('SharingServer', 'SHARING_API_PORT')
+        self.SHARING_API_SECURE = config.getboolean('SharingServer', 'SHARING_API_SECURE')
+
+
+class CredentialStoreAPIClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.CREDENTIAL_STORE_API_HOST = config.get('CredentialStoreServer', 'CREDENTIAL_STORE_API_HOST')
+        self.CREDENTIAL_STORE_API_PORT = config.getint('CredentialStoreServer', 'CREDENTIAL_STORE_API_PORT')
+        self.CREDENTIAL_STORE_API_SECURE = config.getboolean('CredentialStoreServer', 'CREDENTIAL_STORE_API_SECURE')
+
+
+class UserProfileClientSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.PROFILE_SERVICE_HOST = config.get('ProfileServer', 'PROFILE_SERVICE_HOST')
+        self.PROFILE_SERVICE_PORT = config.getint('ProfileServer', 'PROFILE_SERVICE_PORT')
+        self.PROFILE_SERVICE_SECURE = config.getboolean('ProfileServer', 'PROFILE_SERVICE_SECURE')
+
+
+class ThriftSettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.THRIFT_CLIENT_POOL_KEEPALIVE = config.getfloat('Thrift', 'THRIFT_CLIENT_POOL_KEEPALIVE')
+
+
+class KeycloakConfiguration(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        # self.KEYCLOAK_CA_CERTIFICATE = os.path.join(BASE_DIR, "samples", "resources", "incommon_rsa_server_ca.pem")
+        self.CLIENT_ID = config.get('KeycloakServer', 'CLIENT_ID')
+        self.CLIENT_SECRET = config.get('KeycloakServer', 'CLIENT_SECRET')
+        self.TOKEN_URL = config.get('KeycloakServer', 'TOKEN_URL')
+        self.USER_INFO_URL = config.get('KeycloakServer', 'USER_INFO_URL')
+        self.VERIFY_SSL = config.getboolean('KeycloakServer', 'VERIFY_SSL')
+
+
+class GatewaySettings(object):
+    def __init__(self, configFileLocation=None):
+        if configFileLocation is not None:
+            config.read(configFileLocation)
+        self.GATEWAY_ID = config.get('Gateway', 'GATEWAY_ID')
+        self.GATEWAY_DATA_STORE_RESOURCE_ID = config.get('Gateway', 'GATEWAY_DATA_STORE_RESOURCE_ID')
+        self.GATEWAY_DATA_STORE_DIR = config.get('Gateway', 'GATEWAY_DATA_STORE_DIR')
+        self.GATEWAY_DATA_STORE_HOSTNAME = config.get('Gateway', 'GATEWAY_DATA_STORE_HOSTNAME')
+        self.FILE_UPLOAD_TEMP_DIR = config.get('Gateway', 'FILE_UPLOAD_TEMP_DIR')
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/utils.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/utils.py
new file mode 100644
index 0000000..ed8a637
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/transport/utils.py
@@ -0,0 +1,234 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You 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 logging
+
+import thrift_connector.connection_pool as connection_pool
+from thrift.protocol import TBinaryProtocol
+from thrift.protocol.TMultiplexedProtocol import TMultiplexedProtocol
+from thrift.transport import TSocket, TSSLSocket, TTransport
+
+from airavata.api import Airavata
+from airavata.api.sharing import SharingRegistryService
+from airavata.service.profile.groupmanager.cpi import GroupManagerService
+from airavata.service.profile.groupmanager.cpi.constants import (
+    GROUP_MANAGER_CPI_NAME
+)
+from airavata.service.profile.iam.admin.services.cpi import IamAdminServices
+from airavata.service.profile.iam.admin.services.cpi.constants import (
+    IAM_ADMIN_SERVICES_CPI_NAME
+)
+from airavata.service.profile.tenant.cpi import TenantProfileService
+from airavata.service.profile.tenant.cpi.constants import (
+    TENANT_PROFILE_CPI_NAME
+)
+from airavata.service.profile.user.cpi import UserProfileService
+from airavata.service.profile.user.cpi.constants import USER_PROFILE_CPI_NAME
+from airavata.api.credential.store import CredentialStoreService
+
+from transport.settings import APIServerClientSettings, UserProfileClientSettings, TenantProfileServerClientSettings, \
+    IAMAdminClientSettings, GroupManagerClientSettings, SharingAPIClientSettings, CredentialStoreAPIClientSettings, \
+    ThriftSettings
+
+log = logging.getLogger(__name__)
+
+default_api_server_settings = APIServerClientSettings()
+default_user_profile_server_settings = UserProfileClientSettings()
+default_tenant_profile_client_settings = TenantProfileServerClientSettings()
+default_iam_client_settings = IAMAdminClientSettings()
+default_group_manager_client_settings = GroupManagerClientSettings()
+default_sharing_API_client_settings = SharingAPIClientSettings()
+default_credential_store_client_settings = CredentialStoreAPIClientSettings()
+thrift_settings = ThriftSettings()
+
+
+class ThriftConnectionException(Exception):
+    pass
+
+
+class ThriftClientException(Exception):
+    pass
+
+
+class CustomThriftClient(connection_pool.ThriftClient):
+    secure = False
+    validate = False
+
+    @classmethod
+    def get_socket_factory(cls):
+        if not cls.secure:
+            return connection_pool.ThriftClient.get_socket_factory()
+        else:
+            def factory(host, port):
+                return TSSLSocket.TSSLSocket(host, port, validate=cls.validate)
+
+            return factory
+
+    def ping(self):
+        try:
+            self.client.getAPIVersion()
+        except Exception as e:
+            log.debug("getAPIVersion failed: {}".format(str(e)))
+            raise
+
+
+class MultiplexThriftClientMixin:
+    service_name = None
+
+    @classmethod
+    def get_protoco_factory(cls):
+        def factory(transport):
+            protocol = TBinaryProtocol.TBinaryProtocol(transport)
+            multiplex_prot = TMultiplexedProtocol(protocol, cls.service_name)
+            return multiplex_prot
+
+        return factory
+
+
+class AiravataAPIThriftClient(CustomThriftClient):
+    secure = default_api_server_settings.API_SERVER_SECURE
+
+
+class GroupManagerServiceThriftClient(MultiplexThriftClientMixin,
+                                      CustomThriftClient):
+    service_name = GROUP_MANAGER_CPI_NAME
+    secure = default_group_manager_client_settings.PROFILE_SERVICE_SECURE
+
+
+class IAMAdminServiceThriftClient(MultiplexThriftClientMixin,
+                                  CustomThriftClient):
+    service_name = IAM_ADMIN_SERVICES_CPI_NAME
+    secure = default_iam_client_settings.PROFILE_SERVICE_SECURE
+
+
+class TenantProfileServiceThriftClient(MultiplexThriftClientMixin,
+                                       CustomThriftClient):
+    service_name = TENANT_PROFILE_CPI_NAME
+    secure = default_tenant_profile_client_settings.PROFILE_SERVICE_SECURE
+
+
+class UserProfileServiceThriftClient(MultiplexThriftClientMixin,
+                                     CustomThriftClient):
+    service_name = USER_PROFILE_CPI_NAME
+    secure = default_user_profile_server_settings.PROFILE_SERVICE_SECURE
+
+
+class CredentialStoreServiceThriftClient(CustomThriftClient):
+    secure = default_credential_store_client_settings.CREDENTIAL_STORE_API_SECURE
+
+
+class SharingAPIThriftClient(CustomThriftClient):
+    secure = default_sharing_API_client_settings.SHARING_API_SECURE
+
+
+def initialize_api_client_pool(host=default_api_server_settings.API_SERVER_HOST,
+                               port=default_api_server_settings.API_SERVER_PORT,
+                               is_secure=default_api_server_settings.API_SERVER_SECURE):
+    AiravataAPIThriftClient.secure = is_secure
+    airavata_api_client_pool = connection_pool.ClientPool(
+        Airavata,
+        host,
+        port,
+        connection_class=AiravataAPIThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return airavata_api_client_pool
+
+
+def initialize_group_manager_client(host=default_group_manager_client_settings.PROFILE_SERVICE_HOST,
+                                    port=default_group_manager_client_settings.PROFILE_SERVICE_PORT,
+                                    is_secure=default_group_manager_client_settings.PROFILE_SERVICE_SECURE):
+    GroupManagerServiceThriftClient.secure = is_secure
+    group_manager_client_pool = connection_pool.ClientPool(
+        GroupManagerService,
+        host,
+        port,
+        connection_class=GroupManagerServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return group_manager_client_pool
+
+
+def initialize_iam_admin_client(host=default_iam_client_settings.PROFILE_SERVICE_HOST,
+                                port=default_iam_client_settings.PROFILE_SERVICE_PORT,
+                                is_secure=default_iam_client_settings.PROFILE_SERVICE_SECURE):
+    IAMAdminServiceThriftClient.secure = is_secure
+    iamadmin_client_pool = connection_pool.ClientPool(
+        IamAdminServices,
+        host,
+        port,
+        connection_class=IAMAdminServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return iamadmin_client_pool
+
+
+def initialize_tenant_profile_client(host=default_tenant_profile_client_settings.PROFILE_SERVICE_HOST,
+                                     port=default_tenant_profile_client_settings.PROFILE_SERVICE_PORT,
+                                     is_secure=default_tenant_profile_client_settings.PROFILE_SERVICE_SECURE):
+    TenantProfileServiceThriftClient.secure = is_secure
+
+    tenant_profile_client_pool = connection_pool.ClientPool(
+        TenantProfileService,
+        host,
+        port,
+        connection_class=TenantProfileServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return tenant_profile_client_pool
+
+
+def initialize_user_profile_client(host=default_user_profile_server_settings.PROFILE_SERVICE_HOST,
+                                   port=default_user_profile_server_settings.PROFILE_SERVICE_PORT,
+                                   is_secure=default_user_profile_server_settings.PROFILE_SERVICE_SECURE):
+    UserProfileServiceThriftClient.secure = is_secure
+    user_profile_client_pool = connection_pool.ClientPool(
+        UserProfileService,
+        host,
+        port,
+        connection_class=UserProfileServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return user_profile_client_pool
+
+
+def initialize_sharing_registry_client(host=default_sharing_API_client_settings.SHARING_API_HOST,
+                                       port=default_sharing_API_client_settings.SHARING_API_PORT,
+                                       is_secure=default_sharing_API_client_settings.SHARING_API_SECURE):
+    SharingAPIThriftClient.secure = is_secure
+
+    sharing_api_client_pool = connection_pool.ClientPool(
+        SharingRegistryService,
+        host,
+        port,
+        connection_class=SharingAPIThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return sharing_api_client_pool
+
+def initialize_credential_store_client(host=default_credential_store_client_settings.CREDENTIAL_STORE_API_HOST,
+                                       port=default_credential_store_client_settings.CREDENTIAL_STORE_API_PORT,
+                                       is_secure=default_credential_store_client_settings.CREDENTIAL_STORE_API_SECURE):
+    CredentialStoreService.secure = is_secure
+
+    credential_store_api_client_pool = connection_pool.ClientPool(
+        CredentialStoreService,
+        host,
+        port,
+        connection_class=CredentialStoreServiceThriftClient,
+        keepalive=thrift_settings.THRIFT_CLIENT_POOL_KEEPALIVE
+    )
+    return credential_store_api_client_pool
diff --git a/airavata-api/airavata-client-sdks/java-client-samples/pom.xml b/airavata-api/airavata-client-sdks/java-client-samples/pom.xml
index f8428e5..a6c3b39 100644
--- a/airavata-api/airavata-client-sdks/java-client-samples/pom.xml
+++ b/airavata-api/airavata-client-sdks/java-client-samples/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>airavata-client-sdks</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-api/airavata-client-sdks/pom.xml b/airavata-api/airavata-client-sdks/pom.xml
index 9958ed1..37b004d 100644
--- a/airavata-api/airavata-client-sdks/pom.xml
+++ b/airavata-api/airavata-client-sdks/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>airavata-api</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -46,7 +46,6 @@
                 <module>java-client-samples</module>
                 <module>airavata-php-sdk</module>
                 <module>airavata-cpp-sdk</module>
-                <module>airavata-python-sdk</module>
             </modules>
         </profile>
     </profiles>
diff --git a/airavata-api/airavata-data-models/pom.xml b/airavata-api/airavata-data-models/pom.xml
index ca8193a..369a365 100644
--- a/airavata-api/airavata-data-models/pom.xml
+++ b/airavata-api/airavata-data-models/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-api</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -43,7 +43,11 @@
             <artifactId>libthrift</artifactId>
             <version>${thrift.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>javax.annotation</groupId>
+            <artifactId>javax.annotation-api</artifactId>
+            <version>${javax.annotation.version}</version>
+        </dependency>
     </dependencies>
 
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/ComputeResourcePolicy.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/ComputeResourcePolicy.java
index 4f7f4bd..48f5ac2 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/ComputeResourcePolicy.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/ComputeResourcePolicy.java
@@ -618,13 +618,13 @@
           case 4: // ALLOWED_BATCH_QUEUES
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list8 = iprot.readListBegin();
-                struct.allowedBatchQueues = new java.util.ArrayList<java.lang.String>(_list8.size);
-                java.lang.String _elem9;
-                for (int _i10 = 0; _i10 < _list8.size; ++_i10)
+                org.apache.thrift.protocol.TList _list24 = iprot.readListBegin();
+                struct.allowedBatchQueues = new java.util.ArrayList<java.lang.String>(_list24.size);
+                java.lang.String _elem25;
+                for (int _i26 = 0; _i26 < _list24.size; ++_i26)
                 {
-                  _elem9 = iprot.readString();
-                  struct.allowedBatchQueues.add(_elem9);
+                  _elem25 = iprot.readString();
+                  struct.allowedBatchQueues.add(_elem25);
                 }
                 iprot.readListEnd();
               }
@@ -666,9 +666,9 @@
           oprot.writeFieldBegin(ALLOWED_BATCH_QUEUES_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.allowedBatchQueues.size()));
-            for (java.lang.String _iter11 : struct.allowedBatchQueues)
+            for (java.lang.String _iter27 : struct.allowedBatchQueues)
             {
-              oprot.writeString(_iter11);
+              oprot.writeString(_iter27);
             }
             oprot.writeListEnd();
           }
@@ -703,9 +703,9 @@
       if (struct.isSetAllowedBatchQueues()) {
         {
           oprot.writeI32(struct.allowedBatchQueues.size());
-          for (java.lang.String _iter12 : struct.allowedBatchQueues)
+          for (java.lang.String _iter28 : struct.allowedBatchQueues)
           {
-            oprot.writeString(_iter12);
+            oprot.writeString(_iter28);
           }
         }
       }
@@ -723,13 +723,13 @@
       java.util.BitSet incoming = iprot.readBitSet(1);
       if (incoming.get(0)) {
         {
-          org.apache.thrift.protocol.TList _list13 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-          struct.allowedBatchQueues = new java.util.ArrayList<java.lang.String>(_list13.size);
-          java.lang.String _elem14;
-          for (int _i15 = 0; _i15 < _list13.size; ++_i15)
+          org.apache.thrift.protocol.TList _list29 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+          struct.allowedBatchQueues = new java.util.ArrayList<java.lang.String>(_list29.size);
+          java.lang.String _elem30;
+          for (int _i31 = 0; _i31 < _list29.size; ++_i31)
           {
-            _elem14 = iprot.readString();
-            struct.allowedBatchQueues.add(_elem14);
+            _elem30 = iprot.readString();
+            struct.allowedBatchQueues.add(_elem30);
           }
         }
         struct.setAllowedBatchQueuesIsSet(true);
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/ComputeResourceReservation.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/ComputeResourceReservation.java
new file mode 100644
index 0000000..df76be4
--- /dev/null
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/ComputeResourceReservation.java
@@ -0,0 +1,820 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+/**
+ * Autogenerated by Thrift Compiler (0.10.0)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.model.appcatalog.groupresourceprofile;
+
+@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
+@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
+public class ComputeResourceReservation implements org.apache.thrift.TBase<ComputeResourceReservation, ComputeResourceReservation._Fields>, java.io.Serializable, Cloneable, Comparable<ComputeResourceReservation> {
+  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ComputeResourceReservation");
+
+  private static final org.apache.thrift.protocol.TField RESERVATION_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("reservationId", org.apache.thrift.protocol.TType.STRING, (short)1);
+  private static final org.apache.thrift.protocol.TField RESERVATION_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("reservationName", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField QUEUE_NAMES_FIELD_DESC = new org.apache.thrift.protocol.TField("queueNames", org.apache.thrift.protocol.TType.LIST, (short)3);
+  private static final org.apache.thrift.protocol.TField START_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("startTime", org.apache.thrift.protocol.TType.I64, (short)4);
+  private static final org.apache.thrift.protocol.TField END_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("endTime", org.apache.thrift.protocol.TType.I64, (short)5);
+
+  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new ComputeResourceReservationStandardSchemeFactory();
+  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new ComputeResourceReservationTupleSchemeFactory();
+
+  private java.lang.String reservationId; // required
+  private java.lang.String reservationName; // required
+  private java.util.List<java.lang.String> queueNames; // required
+  private long startTime; // required
+  private long endTime; // required
+
+  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+    RESERVATION_ID((short)1, "reservationId"),
+    RESERVATION_NAME((short)2, "reservationName"),
+    QUEUE_NAMES((short)3, "queueNames"),
+    START_TIME((short)4, "startTime"),
+    END_TIME((short)5, "endTime");
+
+    private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
+
+    static {
+      for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {
+        byName.put(field.getFieldName(), field);
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, or null if its not found.
+     */
+    public static _Fields findByThriftId(int fieldId) {
+      switch(fieldId) {
+        case 1: // RESERVATION_ID
+          return RESERVATION_ID;
+        case 2: // RESERVATION_NAME
+          return RESERVATION_NAME;
+        case 3: // QUEUE_NAMES
+          return QUEUE_NAMES;
+        case 4: // START_TIME
+          return START_TIME;
+        case 5: // END_TIME
+          return END_TIME;
+        default:
+          return null;
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, throwing an exception
+     * if it is not found.
+     */
+    public static _Fields findByThriftIdOrThrow(int fieldId) {
+      _Fields fields = findByThriftId(fieldId);
+      if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+      return fields;
+    }
+
+    /**
+     * Find the _Fields constant that matches name, or null if its not found.
+     */
+    public static _Fields findByName(java.lang.String name) {
+      return byName.get(name);
+    }
+
+    private final short _thriftId;
+    private final java.lang.String _fieldName;
+
+    _Fields(short thriftId, java.lang.String fieldName) {
+      _thriftId = thriftId;
+      _fieldName = fieldName;
+    }
+
+    public short getThriftFieldId() {
+      return _thriftId;
+    }
+
+    public java.lang.String getFieldName() {
+      return _fieldName;
+    }
+  }
+
+  // isset id assignments
+  private static final int __STARTTIME_ISSET_ID = 0;
+  private static final int __ENDTIME_ISSET_ID = 1;
+  private byte __isset_bitfield = 0;
+  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+  static {
+    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+    tmpMap.put(_Fields.RESERVATION_ID, new org.apache.thrift.meta_data.FieldMetaData("reservationId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.RESERVATION_NAME, new org.apache.thrift.meta_data.FieldMetaData("reservationName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.QUEUE_NAMES, new org.apache.thrift.meta_data.FieldMetaData("queueNames", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
+            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
+    tmpMap.put(_Fields.START_TIME, new org.apache.thrift.meta_data.FieldMetaData("startTime", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+    tmpMap.put(_Fields.END_TIME, new org.apache.thrift.meta_data.FieldMetaData("endTime", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
+    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ComputeResourceReservation.class, metaDataMap);
+  }
+
+  public ComputeResourceReservation() {
+    this.reservationId = "DO_NOT_SET_AT_CLIENTS";
+
+  }
+
+  public ComputeResourceReservation(
+    java.lang.String reservationId,
+    java.lang.String reservationName,
+    java.util.List<java.lang.String> queueNames,
+    long startTime,
+    long endTime)
+  {
+    this();
+    this.reservationId = reservationId;
+    this.reservationName = reservationName;
+    this.queueNames = queueNames;
+    this.startTime = startTime;
+    setStartTimeIsSet(true);
+    this.endTime = endTime;
+    setEndTimeIsSet(true);
+  }
+
+  /**
+   * Performs a deep copy on <i>other</i>.
+   */
+  public ComputeResourceReservation(ComputeResourceReservation other) {
+    __isset_bitfield = other.__isset_bitfield;
+    if (other.isSetReservationId()) {
+      this.reservationId = other.reservationId;
+    }
+    if (other.isSetReservationName()) {
+      this.reservationName = other.reservationName;
+    }
+    if (other.isSetQueueNames()) {
+      java.util.List<java.lang.String> __this__queueNames = new java.util.ArrayList<java.lang.String>(other.queueNames);
+      this.queueNames = __this__queueNames;
+    }
+    this.startTime = other.startTime;
+    this.endTime = other.endTime;
+  }
+
+  public ComputeResourceReservation deepCopy() {
+    return new ComputeResourceReservation(this);
+  }
+
+  @Override
+  public void clear() {
+    this.reservationId = "DO_NOT_SET_AT_CLIENTS";
+
+    this.reservationName = null;
+    this.queueNames = null;
+    setStartTimeIsSet(false);
+    this.startTime = 0;
+    setEndTimeIsSet(false);
+    this.endTime = 0;
+  }
+
+  public java.lang.String getReservationId() {
+    return this.reservationId;
+  }
+
+  public void setReservationId(java.lang.String reservationId) {
+    this.reservationId = reservationId;
+  }
+
+  public void unsetReservationId() {
+    this.reservationId = null;
+  }
+
+  /** Returns true if field reservationId is set (has been assigned a value) and false otherwise */
+  public boolean isSetReservationId() {
+    return this.reservationId != null;
+  }
+
+  public void setReservationIdIsSet(boolean value) {
+    if (!value) {
+      this.reservationId = null;
+    }
+  }
+
+  public java.lang.String getReservationName() {
+    return this.reservationName;
+  }
+
+  public void setReservationName(java.lang.String reservationName) {
+    this.reservationName = reservationName;
+  }
+
+  public void unsetReservationName() {
+    this.reservationName = null;
+  }
+
+  /** Returns true if field reservationName is set (has been assigned a value) and false otherwise */
+  public boolean isSetReservationName() {
+    return this.reservationName != null;
+  }
+
+  public void setReservationNameIsSet(boolean value) {
+    if (!value) {
+      this.reservationName = null;
+    }
+  }
+
+  public int getQueueNamesSize() {
+    return (this.queueNames == null) ? 0 : this.queueNames.size();
+  }
+
+  public java.util.Iterator<java.lang.String> getQueueNamesIterator() {
+    return (this.queueNames == null) ? null : this.queueNames.iterator();
+  }
+
+  public void addToQueueNames(java.lang.String elem) {
+    if (this.queueNames == null) {
+      this.queueNames = new java.util.ArrayList<java.lang.String>();
+    }
+    this.queueNames.add(elem);
+  }
+
+  public java.util.List<java.lang.String> getQueueNames() {
+    return this.queueNames;
+  }
+
+  public void setQueueNames(java.util.List<java.lang.String> queueNames) {
+    this.queueNames = queueNames;
+  }
+
+  public void unsetQueueNames() {
+    this.queueNames = null;
+  }
+
+  /** Returns true if field queueNames is set (has been assigned a value) and false otherwise */
+  public boolean isSetQueueNames() {
+    return this.queueNames != null;
+  }
+
+  public void setQueueNamesIsSet(boolean value) {
+    if (!value) {
+      this.queueNames = null;
+    }
+  }
+
+  public long getStartTime() {
+    return this.startTime;
+  }
+
+  public void setStartTime(long startTime) {
+    this.startTime = startTime;
+    setStartTimeIsSet(true);
+  }
+
+  public void unsetStartTime() {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __STARTTIME_ISSET_ID);
+  }
+
+  /** Returns true if field startTime is set (has been assigned a value) and false otherwise */
+  public boolean isSetStartTime() {
+    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __STARTTIME_ISSET_ID);
+  }
+
+  public void setStartTimeIsSet(boolean value) {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __STARTTIME_ISSET_ID, value);
+  }
+
+  public long getEndTime() {
+    return this.endTime;
+  }
+
+  public void setEndTime(long endTime) {
+    this.endTime = endTime;
+    setEndTimeIsSet(true);
+  }
+
+  public void unsetEndTime() {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __ENDTIME_ISSET_ID);
+  }
+
+  /** Returns true if field endTime is set (has been assigned a value) and false otherwise */
+  public boolean isSetEndTime() {
+    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ENDTIME_ISSET_ID);
+  }
+
+  public void setEndTimeIsSet(boolean value) {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ENDTIME_ISSET_ID, value);
+  }
+
+  public void setFieldValue(_Fields field, java.lang.Object value) {
+    switch (field) {
+    case RESERVATION_ID:
+      if (value == null) {
+        unsetReservationId();
+      } else {
+        setReservationId((java.lang.String)value);
+      }
+      break;
+
+    case RESERVATION_NAME:
+      if (value == null) {
+        unsetReservationName();
+      } else {
+        setReservationName((java.lang.String)value);
+      }
+      break;
+
+    case QUEUE_NAMES:
+      if (value == null) {
+        unsetQueueNames();
+      } else {
+        setQueueNames((java.util.List<java.lang.String>)value);
+      }
+      break;
+
+    case START_TIME:
+      if (value == null) {
+        unsetStartTime();
+      } else {
+        setStartTime((java.lang.Long)value);
+      }
+      break;
+
+    case END_TIME:
+      if (value == null) {
+        unsetEndTime();
+      } else {
+        setEndTime((java.lang.Long)value);
+      }
+      break;
+
+    }
+  }
+
+  public java.lang.Object getFieldValue(_Fields field) {
+    switch (field) {
+    case RESERVATION_ID:
+      return getReservationId();
+
+    case RESERVATION_NAME:
+      return getReservationName();
+
+    case QUEUE_NAMES:
+      return getQueueNames();
+
+    case START_TIME:
+      return getStartTime();
+
+    case END_TIME:
+      return getEndTime();
+
+    }
+    throw new java.lang.IllegalStateException();
+  }
+
+  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+  public boolean isSet(_Fields field) {
+    if (field == null) {
+      throw new java.lang.IllegalArgumentException();
+    }
+
+    switch (field) {
+    case RESERVATION_ID:
+      return isSetReservationId();
+    case RESERVATION_NAME:
+      return isSetReservationName();
+    case QUEUE_NAMES:
+      return isSetQueueNames();
+    case START_TIME:
+      return isSetStartTime();
+    case END_TIME:
+      return isSetEndTime();
+    }
+    throw new java.lang.IllegalStateException();
+  }
+
+  @Override
+  public boolean equals(java.lang.Object that) {
+    if (that == null)
+      return false;
+    if (that instanceof ComputeResourceReservation)
+      return this.equals((ComputeResourceReservation)that);
+    return false;
+  }
+
+  public boolean equals(ComputeResourceReservation that) {
+    if (that == null)
+      return false;
+    if (this == that)
+      return true;
+
+    boolean this_present_reservationId = true && this.isSetReservationId();
+    boolean that_present_reservationId = true && that.isSetReservationId();
+    if (this_present_reservationId || that_present_reservationId) {
+      if (!(this_present_reservationId && that_present_reservationId))
+        return false;
+      if (!this.reservationId.equals(that.reservationId))
+        return false;
+    }
+
+    boolean this_present_reservationName = true && this.isSetReservationName();
+    boolean that_present_reservationName = true && that.isSetReservationName();
+    if (this_present_reservationName || that_present_reservationName) {
+      if (!(this_present_reservationName && that_present_reservationName))
+        return false;
+      if (!this.reservationName.equals(that.reservationName))
+        return false;
+    }
+
+    boolean this_present_queueNames = true && this.isSetQueueNames();
+    boolean that_present_queueNames = true && that.isSetQueueNames();
+    if (this_present_queueNames || that_present_queueNames) {
+      if (!(this_present_queueNames && that_present_queueNames))
+        return false;
+      if (!this.queueNames.equals(that.queueNames))
+        return false;
+    }
+
+    boolean this_present_startTime = true;
+    boolean that_present_startTime = true;
+    if (this_present_startTime || that_present_startTime) {
+      if (!(this_present_startTime && that_present_startTime))
+        return false;
+      if (this.startTime != that.startTime)
+        return false;
+    }
+
+    boolean this_present_endTime = true;
+    boolean that_present_endTime = true;
+    if (this_present_endTime || that_present_endTime) {
+      if (!(this_present_endTime && that_present_endTime))
+        return false;
+      if (this.endTime != that.endTime)
+        return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    int hashCode = 1;
+
+    hashCode = hashCode * 8191 + ((isSetReservationId()) ? 131071 : 524287);
+    if (isSetReservationId())
+      hashCode = hashCode * 8191 + reservationId.hashCode();
+
+    hashCode = hashCode * 8191 + ((isSetReservationName()) ? 131071 : 524287);
+    if (isSetReservationName())
+      hashCode = hashCode * 8191 + reservationName.hashCode();
+
+    hashCode = hashCode * 8191 + ((isSetQueueNames()) ? 131071 : 524287);
+    if (isSetQueueNames())
+      hashCode = hashCode * 8191 + queueNames.hashCode();
+
+    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(startTime);
+
+    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(endTime);
+
+    return hashCode;
+  }
+
+  @Override
+  public int compareTo(ComputeResourceReservation other) {
+    if (!getClass().equals(other.getClass())) {
+      return getClass().getName().compareTo(other.getClass().getName());
+    }
+
+    int lastComparison = 0;
+
+    lastComparison = java.lang.Boolean.valueOf(isSetReservationId()).compareTo(other.isSetReservationId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetReservationId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reservationId, other.reservationId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = java.lang.Boolean.valueOf(isSetReservationName()).compareTo(other.isSetReservationName());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetReservationName()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reservationName, other.reservationName);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = java.lang.Boolean.valueOf(isSetQueueNames()).compareTo(other.isSetQueueNames());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetQueueNames()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.queueNames, other.queueNames);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = java.lang.Boolean.valueOf(isSetStartTime()).compareTo(other.isSetStartTime());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetStartTime()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.startTime, other.startTime);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = java.lang.Boolean.valueOf(isSetEndTime()).compareTo(other.isSetEndTime());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetEndTime()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.endTime, other.endTime);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    return 0;
+  }
+
+  public _Fields fieldForId(int fieldId) {
+    return _Fields.findByThriftId(fieldId);
+  }
+
+  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+    scheme(iprot).read(iprot, this);
+  }
+
+  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+    scheme(oprot).write(oprot, this);
+  }
+
+  @Override
+  public java.lang.String toString() {
+    java.lang.StringBuilder sb = new java.lang.StringBuilder("ComputeResourceReservation(");
+    boolean first = true;
+
+    sb.append("reservationId:");
+    if (this.reservationId == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.reservationId);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("reservationName:");
+    if (this.reservationName == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.reservationName);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("queueNames:");
+    if (this.queueNames == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.queueNames);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("startTime:");
+    sb.append(this.startTime);
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("endTime:");
+    sb.append(this.endTime);
+    first = false;
+    sb.append(")");
+    return sb.toString();
+  }
+
+  public void validate() throws org.apache.thrift.TException {
+    // check for required fields
+    if (!isSetReservationId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'reservationId' is unset! Struct:" + toString());
+    }
+
+    if (!isSetReservationName()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'reservationName' is unset! Struct:" + toString());
+    }
+
+    if (!isSetQueueNames()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'queueNames' is unset! Struct:" + toString());
+    }
+
+    if (!isSetStartTime()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'startTime' is unset! Struct:" + toString());
+    }
+
+    if (!isSetEndTime()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'endTime' is unset! Struct:" + toString());
+    }
+
+    // check for sub-struct validity
+  }
+
+  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+    try {
+      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {
+    try {
+      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
+      __isset_bitfield = 0;
+      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private static class ComputeResourceReservationStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+    public ComputeResourceReservationStandardScheme getScheme() {
+      return new ComputeResourceReservationStandardScheme();
+    }
+  }
+
+  private static class ComputeResourceReservationStandardScheme extends org.apache.thrift.scheme.StandardScheme<ComputeResourceReservation> {
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot, ComputeResourceReservation struct) throws org.apache.thrift.TException {
+      org.apache.thrift.protocol.TField schemeField;
+      iprot.readStructBegin();
+      while (true)
+      {
+        schemeField = iprot.readFieldBegin();
+        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+          break;
+        }
+        switch (schemeField.id) {
+          case 1: // RESERVATION_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.reservationId = iprot.readString();
+              struct.setReservationIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 2: // RESERVATION_NAME
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.reservationName = iprot.readString();
+              struct.setReservationNameIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 3: // QUEUE_NAMES
+            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
+              {
+                org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();
+                struct.queueNames = new java.util.ArrayList<java.lang.String>(_list0.size);
+                java.lang.String _elem1;
+                for (int _i2 = 0; _i2 < _list0.size; ++_i2)
+                {
+                  _elem1 = iprot.readString();
+                  struct.queueNames.add(_elem1);
+                }
+                iprot.readListEnd();
+              }
+              struct.setQueueNamesIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 4: // START_TIME
+            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
+              struct.startTime = iprot.readI64();
+              struct.setStartTimeIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 5: // END_TIME
+            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
+              struct.endTime = iprot.readI64();
+              struct.setEndTimeIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          default:
+            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+        }
+        iprot.readFieldEnd();
+      }
+      iprot.readStructEnd();
+      struct.validate();
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot, ComputeResourceReservation struct) throws org.apache.thrift.TException {
+      struct.validate();
+
+      oprot.writeStructBegin(STRUCT_DESC);
+      if (struct.reservationId != null) {
+        oprot.writeFieldBegin(RESERVATION_ID_FIELD_DESC);
+        oprot.writeString(struct.reservationId);
+        oprot.writeFieldEnd();
+      }
+      if (struct.reservationName != null) {
+        oprot.writeFieldBegin(RESERVATION_NAME_FIELD_DESC);
+        oprot.writeString(struct.reservationName);
+        oprot.writeFieldEnd();
+      }
+      if (struct.queueNames != null) {
+        oprot.writeFieldBegin(QUEUE_NAMES_FIELD_DESC);
+        {
+          oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.queueNames.size()));
+          for (java.lang.String _iter3 : struct.queueNames)
+          {
+            oprot.writeString(_iter3);
+          }
+          oprot.writeListEnd();
+        }
+        oprot.writeFieldEnd();
+      }
+      oprot.writeFieldBegin(START_TIME_FIELD_DESC);
+      oprot.writeI64(struct.startTime);
+      oprot.writeFieldEnd();
+      oprot.writeFieldBegin(END_TIME_FIELD_DESC);
+      oprot.writeI64(struct.endTime);
+      oprot.writeFieldEnd();
+      oprot.writeFieldStop();
+      oprot.writeStructEnd();
+    }
+
+  }
+
+  private static class ComputeResourceReservationTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+    public ComputeResourceReservationTupleScheme getScheme() {
+      return new ComputeResourceReservationTupleScheme();
+    }
+  }
+
+  private static class ComputeResourceReservationTupleScheme extends org.apache.thrift.scheme.TupleScheme<ComputeResourceReservation> {
+
+    @Override
+    public void write(org.apache.thrift.protocol.TProtocol prot, ComputeResourceReservation struct) throws org.apache.thrift.TException {
+      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+      oprot.writeString(struct.reservationId);
+      oprot.writeString(struct.reservationName);
+      {
+        oprot.writeI32(struct.queueNames.size());
+        for (java.lang.String _iter4 : struct.queueNames)
+        {
+          oprot.writeString(_iter4);
+        }
+      }
+      oprot.writeI64(struct.startTime);
+      oprot.writeI64(struct.endTime);
+    }
+
+    @Override
+    public void read(org.apache.thrift.protocol.TProtocol prot, ComputeResourceReservation struct) throws org.apache.thrift.TException {
+      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+      struct.reservationId = iprot.readString();
+      struct.setReservationIdIsSet(true);
+      struct.reservationName = iprot.readString();
+      struct.setReservationNameIsSet(true);
+      {
+        org.apache.thrift.protocol.TList _list5 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+        struct.queueNames = new java.util.ArrayList<java.lang.String>(_list5.size);
+        java.lang.String _elem6;
+        for (int _i7 = 0; _i7 < _list5.size; ++_i7)
+        {
+          _elem6 = iprot.readString();
+          struct.queueNames.add(_elem6);
+        }
+      }
+      struct.setQueueNamesIsSet(true);
+      struct.startTime = iprot.readI64();
+      struct.setStartTimeIsSet(true);
+      struct.endTime = iprot.readI64();
+      struct.setEndTimeIsSet(true);
+    }
+  }
+
+  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {
+    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
+  }
+}
+
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/GroupComputeResourcePreference.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/GroupComputeResourcePreference.java
index 32c0c42..eb1572c 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/GroupComputeResourcePreference.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/GroupComputeResourcePreference.java
@@ -40,12 +40,10 @@
   private static final org.apache.thrift.protocol.TField RESOURCE_SPECIFIC_CREDENTIAL_STORE_TOKEN_FIELD_DESC = new org.apache.thrift.protocol.TField("resourceSpecificCredentialStoreToken", org.apache.thrift.protocol.TType.STRING, (short)10);
   private static final org.apache.thrift.protocol.TField USAGE_REPORTING_GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("usageReportingGatewayId", org.apache.thrift.protocol.TType.STRING, (short)11);
   private static final org.apache.thrift.protocol.TField QUALITY_OF_SERVICE_FIELD_DESC = new org.apache.thrift.protocol.TField("qualityOfService", org.apache.thrift.protocol.TType.STRING, (short)12);
-  private static final org.apache.thrift.protocol.TField RESERVATION_FIELD_DESC = new org.apache.thrift.protocol.TField("reservation", org.apache.thrift.protocol.TType.STRING, (short)13);
-  private static final org.apache.thrift.protocol.TField RESERVATION_START_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("reservationStartTime", org.apache.thrift.protocol.TType.I64, (short)14);
-  private static final org.apache.thrift.protocol.TField RESERVATION_END_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("reservationEndTime", org.apache.thrift.protocol.TType.I64, (short)15);
   private static final org.apache.thrift.protocol.TField SSH_ACCOUNT_PROVISIONER_FIELD_DESC = new org.apache.thrift.protocol.TField("sshAccountProvisioner", org.apache.thrift.protocol.TType.STRING, (short)16);
   private static final org.apache.thrift.protocol.TField GROUP_SSHACCOUNT_PROVISIONER_CONFIGS_FIELD_DESC = new org.apache.thrift.protocol.TField("groupSSHAccountProvisionerConfigs", org.apache.thrift.protocol.TType.LIST, (short)17);
   private static final org.apache.thrift.protocol.TField SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO_FIELD_DESC = new org.apache.thrift.protocol.TField("sshAccountProvisionerAdditionalInfo", org.apache.thrift.protocol.TType.STRING, (short)18);
+  private static final org.apache.thrift.protocol.TField RESERVATIONS_FIELD_DESC = new org.apache.thrift.protocol.TField("reservations", org.apache.thrift.protocol.TType.LIST, (short)19);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new GroupComputeResourcePreferenceStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new GroupComputeResourcePreferenceTupleSchemeFactory();
@@ -62,12 +60,10 @@
   private java.lang.String resourceSpecificCredentialStoreToken; // optional
   private java.lang.String usageReportingGatewayId; // optional
   private java.lang.String qualityOfService; // optional
-  private java.lang.String reservation; // optional
-  private long reservationStartTime; // optional
-  private long reservationEndTime; // optional
   private java.lang.String sshAccountProvisioner; // optional
   private java.util.List<GroupAccountSSHProvisionerConfig> groupSSHAccountProvisionerConfigs; // optional
   private java.lang.String sshAccountProvisionerAdditionalInfo; // optional
+  private java.util.List<ComputeResourceReservation> reservations; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -91,12 +87,10 @@
     RESOURCE_SPECIFIC_CREDENTIAL_STORE_TOKEN((short)10, "resourceSpecificCredentialStoreToken"),
     USAGE_REPORTING_GATEWAY_ID((short)11, "usageReportingGatewayId"),
     QUALITY_OF_SERVICE((short)12, "qualityOfService"),
-    RESERVATION((short)13, "reservation"),
-    RESERVATION_START_TIME((short)14, "reservationStartTime"),
-    RESERVATION_END_TIME((short)15, "reservationEndTime"),
     SSH_ACCOUNT_PROVISIONER((short)16, "sshAccountProvisioner"),
     GROUP_SSHACCOUNT_PROVISIONER_CONFIGS((short)17, "groupSSHAccountProvisionerConfigs"),
-    SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO((short)18, "sshAccountProvisionerAdditionalInfo");
+    SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO((short)18, "sshAccountProvisionerAdditionalInfo"),
+    RESERVATIONS((short)19, "reservations");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -135,18 +129,14 @@
           return USAGE_REPORTING_GATEWAY_ID;
         case 12: // QUALITY_OF_SERVICE
           return QUALITY_OF_SERVICE;
-        case 13: // RESERVATION
-          return RESERVATION;
-        case 14: // RESERVATION_START_TIME
-          return RESERVATION_START_TIME;
-        case 15: // RESERVATION_END_TIME
-          return RESERVATION_END_TIME;
         case 16: // SSH_ACCOUNT_PROVISIONER
           return SSH_ACCOUNT_PROVISIONER;
         case 17: // GROUP_SSHACCOUNT_PROVISIONER_CONFIGS
           return GROUP_SSHACCOUNT_PROVISIONER_CONFIGS;
         case 18: // SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO
           return SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO;
+        case 19: // RESERVATIONS
+          return RESERVATIONS;
         default:
           return null;
       }
@@ -188,10 +178,8 @@
 
   // isset id assignments
   private static final int __OVERRIDEBYAIRAVATA_ISSET_ID = 0;
-  private static final int __RESERVATIONSTARTTIME_ISSET_ID = 1;
-  private static final int __RESERVATIONENDTIME_ISSET_ID = 2;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.LOGIN_USER_NAME,_Fields.PREFERRED_JOB_SUBMISSION_PROTOCOL,_Fields.PREFERRED_DATA_MOVEMENT_PROTOCOL,_Fields.PREFERRED_BATCH_QUEUE,_Fields.SCRATCH_LOCATION,_Fields.ALLOCATION_PROJECT_NUMBER,_Fields.RESOURCE_SPECIFIC_CREDENTIAL_STORE_TOKEN,_Fields.USAGE_REPORTING_GATEWAY_ID,_Fields.QUALITY_OF_SERVICE,_Fields.RESERVATION,_Fields.RESERVATION_START_TIME,_Fields.RESERVATION_END_TIME,_Fields.SSH_ACCOUNT_PROVISIONER,_Fields.GROUP_SSHACCOUNT_PROVISIONER_CONFIGS,_Fields.SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO};
+  private static final _Fields optionals[] = {_Fields.LOGIN_USER_NAME,_Fields.PREFERRED_JOB_SUBMISSION_PROTOCOL,_Fields.PREFERRED_DATA_MOVEMENT_PROTOCOL,_Fields.PREFERRED_BATCH_QUEUE,_Fields.SCRATCH_LOCATION,_Fields.ALLOCATION_PROJECT_NUMBER,_Fields.RESOURCE_SPECIFIC_CREDENTIAL_STORE_TOKEN,_Fields.USAGE_REPORTING_GATEWAY_ID,_Fields.QUALITY_OF_SERVICE,_Fields.SSH_ACCOUNT_PROVISIONER,_Fields.GROUP_SSHACCOUNT_PROVISIONER_CONFIGS,_Fields.SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO,_Fields.RESERVATIONS};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -219,12 +207,6 @@
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.QUALITY_OF_SERVICE, new org.apache.thrift.meta_data.FieldMetaData("qualityOfService", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
-    tmpMap.put(_Fields.RESERVATION, new org.apache.thrift.meta_data.FieldMetaData("reservation", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
-        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
-    tmpMap.put(_Fields.RESERVATION_START_TIME, new org.apache.thrift.meta_data.FieldMetaData("reservationStartTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
-        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
-    tmpMap.put(_Fields.RESERVATION_END_TIME, new org.apache.thrift.meta_data.FieldMetaData("reservationEndTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
-        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.SSH_ACCOUNT_PROVISIONER, new org.apache.thrift.meta_data.FieldMetaData("sshAccountProvisioner", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.GROUP_SSHACCOUNT_PROVISIONER_CONFIGS, new org.apache.thrift.meta_data.FieldMetaData("groupSSHAccountProvisionerConfigs", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
@@ -232,6 +214,9 @@
             new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, GroupAccountSSHProvisionerConfig.class))));
     tmpMap.put(_Fields.SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO, new org.apache.thrift.meta_data.FieldMetaData("sshAccountProvisionerAdditionalInfo", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.RESERVATIONS, new org.apache.thrift.meta_data.FieldMetaData("reservations", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
+            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, ComputeResourceReservation.class))));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(GroupComputeResourcePreference.class, metaDataMap);
   }
@@ -294,11 +279,6 @@
     if (other.isSetQualityOfService()) {
       this.qualityOfService = other.qualityOfService;
     }
-    if (other.isSetReservation()) {
-      this.reservation = other.reservation;
-    }
-    this.reservationStartTime = other.reservationStartTime;
-    this.reservationEndTime = other.reservationEndTime;
     if (other.isSetSshAccountProvisioner()) {
       this.sshAccountProvisioner = other.sshAccountProvisioner;
     }
@@ -312,6 +292,13 @@
     if (other.isSetSshAccountProvisionerAdditionalInfo()) {
       this.sshAccountProvisionerAdditionalInfo = other.sshAccountProvisionerAdditionalInfo;
     }
+    if (other.isSetReservations()) {
+      java.util.List<ComputeResourceReservation> __this__reservations = new java.util.ArrayList<ComputeResourceReservation>(other.reservations.size());
+      for (ComputeResourceReservation other_element : other.reservations) {
+        __this__reservations.add(new ComputeResourceReservation(other_element));
+      }
+      this.reservations = __this__reservations;
+    }
   }
 
   public GroupComputeResourcePreference deepCopy() {
@@ -334,14 +321,10 @@
     this.resourceSpecificCredentialStoreToken = null;
     this.usageReportingGatewayId = null;
     this.qualityOfService = null;
-    this.reservation = null;
-    setReservationStartTimeIsSet(false);
-    this.reservationStartTime = 0;
-    setReservationEndTimeIsSet(false);
-    this.reservationEndTime = 0;
     this.sshAccountProvisioner = null;
     this.groupSSHAccountProvisionerConfigs = null;
     this.sshAccountProvisionerAdditionalInfo = null;
+    this.reservations = null;
   }
 
   public java.lang.String getComputeResourceId() {
@@ -635,73 +618,6 @@
     }
   }
 
-  public java.lang.String getReservation() {
-    return this.reservation;
-  }
-
-  public void setReservation(java.lang.String reservation) {
-    this.reservation = reservation;
-  }
-
-  public void unsetReservation() {
-    this.reservation = null;
-  }
-
-  /** Returns true if field reservation is set (has been assigned a value) and false otherwise */
-  public boolean isSetReservation() {
-    return this.reservation != null;
-  }
-
-  public void setReservationIsSet(boolean value) {
-    if (!value) {
-      this.reservation = null;
-    }
-  }
-
-  public long getReservationStartTime() {
-    return this.reservationStartTime;
-  }
-
-  public void setReservationStartTime(long reservationStartTime) {
-    this.reservationStartTime = reservationStartTime;
-    setReservationStartTimeIsSet(true);
-  }
-
-  public void unsetReservationStartTime() {
-    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __RESERVATIONSTARTTIME_ISSET_ID);
-  }
-
-  /** Returns true if field reservationStartTime is set (has been assigned a value) and false otherwise */
-  public boolean isSetReservationStartTime() {
-    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __RESERVATIONSTARTTIME_ISSET_ID);
-  }
-
-  public void setReservationStartTimeIsSet(boolean value) {
-    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __RESERVATIONSTARTTIME_ISSET_ID, value);
-  }
-
-  public long getReservationEndTime() {
-    return this.reservationEndTime;
-  }
-
-  public void setReservationEndTime(long reservationEndTime) {
-    this.reservationEndTime = reservationEndTime;
-    setReservationEndTimeIsSet(true);
-  }
-
-  public void unsetReservationEndTime() {
-    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __RESERVATIONENDTIME_ISSET_ID);
-  }
-
-  /** Returns true if field reservationEndTime is set (has been assigned a value) and false otherwise */
-  public boolean isSetReservationEndTime() {
-    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __RESERVATIONENDTIME_ISSET_ID);
-  }
-
-  public void setReservationEndTimeIsSet(boolean value) {
-    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __RESERVATIONENDTIME_ISSET_ID, value);
-  }
-
   public java.lang.String getSshAccountProvisioner() {
     return this.sshAccountProvisioner;
   }
@@ -786,6 +702,44 @@
     }
   }
 
+  public int getReservationsSize() {
+    return (this.reservations == null) ? 0 : this.reservations.size();
+  }
+
+  public java.util.Iterator<ComputeResourceReservation> getReservationsIterator() {
+    return (this.reservations == null) ? null : this.reservations.iterator();
+  }
+
+  public void addToReservations(ComputeResourceReservation elem) {
+    if (this.reservations == null) {
+      this.reservations = new java.util.ArrayList<ComputeResourceReservation>();
+    }
+    this.reservations.add(elem);
+  }
+
+  public java.util.List<ComputeResourceReservation> getReservations() {
+    return this.reservations;
+  }
+
+  public void setReservations(java.util.List<ComputeResourceReservation> reservations) {
+    this.reservations = reservations;
+  }
+
+  public void unsetReservations() {
+    this.reservations = null;
+  }
+
+  /** Returns true if field reservations is set (has been assigned a value) and false otherwise */
+  public boolean isSetReservations() {
+    return this.reservations != null;
+  }
+
+  public void setReservationsIsSet(boolean value) {
+    if (!value) {
+      this.reservations = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case COMPUTE_RESOURCE_ID:
@@ -884,30 +838,6 @@
       }
       break;
 
-    case RESERVATION:
-      if (value == null) {
-        unsetReservation();
-      } else {
-        setReservation((java.lang.String)value);
-      }
-      break;
-
-    case RESERVATION_START_TIME:
-      if (value == null) {
-        unsetReservationStartTime();
-      } else {
-        setReservationStartTime((java.lang.Long)value);
-      }
-      break;
-
-    case RESERVATION_END_TIME:
-      if (value == null) {
-        unsetReservationEndTime();
-      } else {
-        setReservationEndTime((java.lang.Long)value);
-      }
-      break;
-
     case SSH_ACCOUNT_PROVISIONER:
       if (value == null) {
         unsetSshAccountProvisioner();
@@ -932,6 +862,14 @@
       }
       break;
 
+    case RESERVATIONS:
+      if (value == null) {
+        unsetReservations();
+      } else {
+        setReservations((java.util.List<ComputeResourceReservation>)value);
+      }
+      break;
+
     }
   }
 
@@ -973,15 +911,6 @@
     case QUALITY_OF_SERVICE:
       return getQualityOfService();
 
-    case RESERVATION:
-      return getReservation();
-
-    case RESERVATION_START_TIME:
-      return getReservationStartTime();
-
-    case RESERVATION_END_TIME:
-      return getReservationEndTime();
-
     case SSH_ACCOUNT_PROVISIONER:
       return getSshAccountProvisioner();
 
@@ -991,6 +920,9 @@
     case SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO:
       return getSshAccountProvisionerAdditionalInfo();
 
+    case RESERVATIONS:
+      return getReservations();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -1026,18 +958,14 @@
       return isSetUsageReportingGatewayId();
     case QUALITY_OF_SERVICE:
       return isSetQualityOfService();
-    case RESERVATION:
-      return isSetReservation();
-    case RESERVATION_START_TIME:
-      return isSetReservationStartTime();
-    case RESERVATION_END_TIME:
-      return isSetReservationEndTime();
     case SSH_ACCOUNT_PROVISIONER:
       return isSetSshAccountProvisioner();
     case GROUP_SSHACCOUNT_PROVISIONER_CONFIGS:
       return isSetGroupSSHAccountProvisionerConfigs();
     case SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO:
       return isSetSshAccountProvisionerAdditionalInfo();
+    case RESERVATIONS:
+      return isSetReservations();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -1165,33 +1093,6 @@
         return false;
     }
 
-    boolean this_present_reservation = true && this.isSetReservation();
-    boolean that_present_reservation = true && that.isSetReservation();
-    if (this_present_reservation || that_present_reservation) {
-      if (!(this_present_reservation && that_present_reservation))
-        return false;
-      if (!this.reservation.equals(that.reservation))
-        return false;
-    }
-
-    boolean this_present_reservationStartTime = true && this.isSetReservationStartTime();
-    boolean that_present_reservationStartTime = true && that.isSetReservationStartTime();
-    if (this_present_reservationStartTime || that_present_reservationStartTime) {
-      if (!(this_present_reservationStartTime && that_present_reservationStartTime))
-        return false;
-      if (this.reservationStartTime != that.reservationStartTime)
-        return false;
-    }
-
-    boolean this_present_reservationEndTime = true && this.isSetReservationEndTime();
-    boolean that_present_reservationEndTime = true && that.isSetReservationEndTime();
-    if (this_present_reservationEndTime || that_present_reservationEndTime) {
-      if (!(this_present_reservationEndTime && that_present_reservationEndTime))
-        return false;
-      if (this.reservationEndTime != that.reservationEndTime)
-        return false;
-    }
-
     boolean this_present_sshAccountProvisioner = true && this.isSetSshAccountProvisioner();
     boolean that_present_sshAccountProvisioner = true && that.isSetSshAccountProvisioner();
     if (this_present_sshAccountProvisioner || that_present_sshAccountProvisioner) {
@@ -1219,6 +1120,15 @@
         return false;
     }
 
+    boolean this_present_reservations = true && this.isSetReservations();
+    boolean that_present_reservations = true && that.isSetReservations();
+    if (this_present_reservations || that_present_reservations) {
+      if (!(this_present_reservations && that_present_reservations))
+        return false;
+      if (!this.reservations.equals(that.reservations))
+        return false;
+    }
+
     return true;
   }
 
@@ -1272,18 +1182,6 @@
     if (isSetQualityOfService())
       hashCode = hashCode * 8191 + qualityOfService.hashCode();
 
-    hashCode = hashCode * 8191 + ((isSetReservation()) ? 131071 : 524287);
-    if (isSetReservation())
-      hashCode = hashCode * 8191 + reservation.hashCode();
-
-    hashCode = hashCode * 8191 + ((isSetReservationStartTime()) ? 131071 : 524287);
-    if (isSetReservationStartTime())
-      hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(reservationStartTime);
-
-    hashCode = hashCode * 8191 + ((isSetReservationEndTime()) ? 131071 : 524287);
-    if (isSetReservationEndTime())
-      hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(reservationEndTime);
-
     hashCode = hashCode * 8191 + ((isSetSshAccountProvisioner()) ? 131071 : 524287);
     if (isSetSshAccountProvisioner())
       hashCode = hashCode * 8191 + sshAccountProvisioner.hashCode();
@@ -1296,6 +1194,10 @@
     if (isSetSshAccountProvisionerAdditionalInfo())
       hashCode = hashCode * 8191 + sshAccountProvisionerAdditionalInfo.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetReservations()) ? 131071 : 524287);
+    if (isSetReservations())
+      hashCode = hashCode * 8191 + reservations.hashCode();
+
     return hashCode;
   }
 
@@ -1427,36 +1329,6 @@
         return lastComparison;
       }
     }
-    lastComparison = java.lang.Boolean.valueOf(isSetReservation()).compareTo(other.isSetReservation());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetReservation()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reservation, other.reservation);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
-    lastComparison = java.lang.Boolean.valueOf(isSetReservationStartTime()).compareTo(other.isSetReservationStartTime());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetReservationStartTime()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reservationStartTime, other.reservationStartTime);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
-    lastComparison = java.lang.Boolean.valueOf(isSetReservationEndTime()).compareTo(other.isSetReservationEndTime());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetReservationEndTime()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reservationEndTime, other.reservationEndTime);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
     lastComparison = java.lang.Boolean.valueOf(isSetSshAccountProvisioner()).compareTo(other.isSetSshAccountProvisioner());
     if (lastComparison != 0) {
       return lastComparison;
@@ -1487,6 +1359,16 @@
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetReservations()).compareTo(other.isSetReservations());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetReservations()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reservations, other.reservations);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -1616,28 +1498,6 @@
       }
       first = false;
     }
-    if (isSetReservation()) {
-      if (!first) sb.append(", ");
-      sb.append("reservation:");
-      if (this.reservation == null) {
-        sb.append("null");
-      } else {
-        sb.append(this.reservation);
-      }
-      first = false;
-    }
-    if (isSetReservationStartTime()) {
-      if (!first) sb.append(", ");
-      sb.append("reservationStartTime:");
-      sb.append(this.reservationStartTime);
-      first = false;
-    }
-    if (isSetReservationEndTime()) {
-      if (!first) sb.append(", ");
-      sb.append("reservationEndTime:");
-      sb.append(this.reservationEndTime);
-      first = false;
-    }
     if (isSetSshAccountProvisioner()) {
       if (!first) sb.append(", ");
       sb.append("sshAccountProvisioner:");
@@ -1668,6 +1528,16 @@
       }
       first = false;
     }
+    if (isSetReservations()) {
+      if (!first) sb.append(", ");
+      sb.append("reservations:");
+      if (this.reservations == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.reservations);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -1821,30 +1691,6 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 13: // RESERVATION
-            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
-              struct.reservation = iprot.readString();
-              struct.setReservationIsSet(true);
-            } else { 
-              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
-            }
-            break;
-          case 14: // RESERVATION_START_TIME
-            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
-              struct.reservationStartTime = iprot.readI64();
-              struct.setReservationStartTimeIsSet(true);
-            } else { 
-              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
-            }
-            break;
-          case 15: // RESERVATION_END_TIME
-            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
-              struct.reservationEndTime = iprot.readI64();
-              struct.setReservationEndTimeIsSet(true);
-            } else { 
-              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
-            }
-            break;
           case 16: // SSH_ACCOUNT_PROVISIONER
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.sshAccountProvisioner = iprot.readString();
@@ -1856,14 +1702,14 @@
           case 17: // GROUP_SSHACCOUNT_PROVISIONER_CONFIGS
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();
-                struct.groupSSHAccountProvisionerConfigs = new java.util.ArrayList<GroupAccountSSHProvisionerConfig>(_list0.size);
-                GroupAccountSSHProvisionerConfig _elem1;
-                for (int _i2 = 0; _i2 < _list0.size; ++_i2)
+                org.apache.thrift.protocol.TList _list8 = iprot.readListBegin();
+                struct.groupSSHAccountProvisionerConfigs = new java.util.ArrayList<GroupAccountSSHProvisionerConfig>(_list8.size);
+                GroupAccountSSHProvisionerConfig _elem9;
+                for (int _i10 = 0; _i10 < _list8.size; ++_i10)
                 {
-                  _elem1 = new GroupAccountSSHProvisionerConfig();
-                  _elem1.read(iprot);
-                  struct.groupSSHAccountProvisionerConfigs.add(_elem1);
+                  _elem9 = new GroupAccountSSHProvisionerConfig();
+                  _elem9.read(iprot);
+                  struct.groupSSHAccountProvisionerConfigs.add(_elem9);
                 }
                 iprot.readListEnd();
               }
@@ -1880,6 +1726,25 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 19: // RESERVATIONS
+            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
+              {
+                org.apache.thrift.protocol.TList _list11 = iprot.readListBegin();
+                struct.reservations = new java.util.ArrayList<ComputeResourceReservation>(_list11.size);
+                ComputeResourceReservation _elem12;
+                for (int _i13 = 0; _i13 < _list11.size; ++_i13)
+                {
+                  _elem12 = new ComputeResourceReservation();
+                  _elem12.read(iprot);
+                  struct.reservations.add(_elem12);
+                }
+                iprot.readListEnd();
+              }
+              struct.setReservationsIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -1969,23 +1834,6 @@
           oprot.writeFieldEnd();
         }
       }
-      if (struct.reservation != null) {
-        if (struct.isSetReservation()) {
-          oprot.writeFieldBegin(RESERVATION_FIELD_DESC);
-          oprot.writeString(struct.reservation);
-          oprot.writeFieldEnd();
-        }
-      }
-      if (struct.isSetReservationStartTime()) {
-        oprot.writeFieldBegin(RESERVATION_START_TIME_FIELD_DESC);
-        oprot.writeI64(struct.reservationStartTime);
-        oprot.writeFieldEnd();
-      }
-      if (struct.isSetReservationEndTime()) {
-        oprot.writeFieldBegin(RESERVATION_END_TIME_FIELD_DESC);
-        oprot.writeI64(struct.reservationEndTime);
-        oprot.writeFieldEnd();
-      }
       if (struct.sshAccountProvisioner != null) {
         if (struct.isSetSshAccountProvisioner()) {
           oprot.writeFieldBegin(SSH_ACCOUNT_PROVISIONER_FIELD_DESC);
@@ -1998,9 +1846,9 @@
           oprot.writeFieldBegin(GROUP_SSHACCOUNT_PROVISIONER_CONFIGS_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.groupSSHAccountProvisionerConfigs.size()));
-            for (GroupAccountSSHProvisionerConfig _iter3 : struct.groupSSHAccountProvisionerConfigs)
+            for (GroupAccountSSHProvisionerConfig _iter14 : struct.groupSSHAccountProvisionerConfigs)
             {
-              _iter3.write(oprot);
+              _iter14.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -2014,6 +1862,20 @@
           oprot.writeFieldEnd();
         }
       }
+      if (struct.reservations != null) {
+        if (struct.isSetReservations()) {
+          oprot.writeFieldBegin(RESERVATIONS_FIELD_DESC);
+          {
+            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.reservations.size()));
+            for (ComputeResourceReservation _iter15 : struct.reservations)
+            {
+              _iter15.write(oprot);
+            }
+            oprot.writeListEnd();
+          }
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -2062,25 +1924,19 @@
       if (struct.isSetQualityOfService()) {
         optionals.set(8);
       }
-      if (struct.isSetReservation()) {
+      if (struct.isSetSshAccountProvisioner()) {
         optionals.set(9);
       }
-      if (struct.isSetReservationStartTime()) {
+      if (struct.isSetGroupSSHAccountProvisionerConfigs()) {
         optionals.set(10);
       }
-      if (struct.isSetReservationEndTime()) {
+      if (struct.isSetSshAccountProvisionerAdditionalInfo()) {
         optionals.set(11);
       }
-      if (struct.isSetSshAccountProvisioner()) {
+      if (struct.isSetReservations()) {
         optionals.set(12);
       }
-      if (struct.isSetGroupSSHAccountProvisionerConfigs()) {
-        optionals.set(13);
-      }
-      if (struct.isSetSshAccountProvisionerAdditionalInfo()) {
-        optionals.set(14);
-      }
-      oprot.writeBitSet(optionals, 15);
+      oprot.writeBitSet(optionals, 13);
       if (struct.isSetLoginUserName()) {
         oprot.writeString(struct.loginUserName);
       }
@@ -2108,30 +1964,30 @@
       if (struct.isSetQualityOfService()) {
         oprot.writeString(struct.qualityOfService);
       }
-      if (struct.isSetReservation()) {
-        oprot.writeString(struct.reservation);
-      }
-      if (struct.isSetReservationStartTime()) {
-        oprot.writeI64(struct.reservationStartTime);
-      }
-      if (struct.isSetReservationEndTime()) {
-        oprot.writeI64(struct.reservationEndTime);
-      }
       if (struct.isSetSshAccountProvisioner()) {
         oprot.writeString(struct.sshAccountProvisioner);
       }
       if (struct.isSetGroupSSHAccountProvisionerConfigs()) {
         {
           oprot.writeI32(struct.groupSSHAccountProvisionerConfigs.size());
-          for (GroupAccountSSHProvisionerConfig _iter4 : struct.groupSSHAccountProvisionerConfigs)
+          for (GroupAccountSSHProvisionerConfig _iter16 : struct.groupSSHAccountProvisionerConfigs)
           {
-            _iter4.write(oprot);
+            _iter16.write(oprot);
           }
         }
       }
       if (struct.isSetSshAccountProvisionerAdditionalInfo()) {
         oprot.writeString(struct.sshAccountProvisionerAdditionalInfo);
       }
+      if (struct.isSetReservations()) {
+        {
+          oprot.writeI32(struct.reservations.size());
+          for (ComputeResourceReservation _iter17 : struct.reservations)
+          {
+            _iter17.write(oprot);
+          }
+        }
+      }
     }
 
     @Override
@@ -2143,7 +1999,7 @@
       struct.setGroupResourceProfileIdIsSet(true);
       struct.overridebyAiravata = iprot.readBool();
       struct.setOverridebyAiravataIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(15);
+      java.util.BitSet incoming = iprot.readBitSet(13);
       if (incoming.get(0)) {
         struct.loginUserName = iprot.readString();
         struct.setLoginUserNameIsSet(true);
@@ -2181,39 +2037,41 @@
         struct.setQualityOfServiceIsSet(true);
       }
       if (incoming.get(9)) {
-        struct.reservation = iprot.readString();
-        struct.setReservationIsSet(true);
-      }
-      if (incoming.get(10)) {
-        struct.reservationStartTime = iprot.readI64();
-        struct.setReservationStartTimeIsSet(true);
-      }
-      if (incoming.get(11)) {
-        struct.reservationEndTime = iprot.readI64();
-        struct.setReservationEndTimeIsSet(true);
-      }
-      if (incoming.get(12)) {
         struct.sshAccountProvisioner = iprot.readString();
         struct.setSshAccountProvisionerIsSet(true);
       }
-      if (incoming.get(13)) {
+      if (incoming.get(10)) {
         {
-          org.apache.thrift.protocol.TList _list5 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.groupSSHAccountProvisionerConfigs = new java.util.ArrayList<GroupAccountSSHProvisionerConfig>(_list5.size);
-          GroupAccountSSHProvisionerConfig _elem6;
-          for (int _i7 = 0; _i7 < _list5.size; ++_i7)
+          org.apache.thrift.protocol.TList _list18 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.groupSSHAccountProvisionerConfigs = new java.util.ArrayList<GroupAccountSSHProvisionerConfig>(_list18.size);
+          GroupAccountSSHProvisionerConfig _elem19;
+          for (int _i20 = 0; _i20 < _list18.size; ++_i20)
           {
-            _elem6 = new GroupAccountSSHProvisionerConfig();
-            _elem6.read(iprot);
-            struct.groupSSHAccountProvisionerConfigs.add(_elem6);
+            _elem19 = new GroupAccountSSHProvisionerConfig();
+            _elem19.read(iprot);
+            struct.groupSSHAccountProvisionerConfigs.add(_elem19);
           }
         }
         struct.setGroupSSHAccountProvisionerConfigsIsSet(true);
       }
-      if (incoming.get(14)) {
+      if (incoming.get(11)) {
         struct.sshAccountProvisionerAdditionalInfo = iprot.readString();
         struct.setSshAccountProvisionerAdditionalInfoIsSet(true);
       }
+      if (incoming.get(12)) {
+        {
+          org.apache.thrift.protocol.TList _list21 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.reservations = new java.util.ArrayList<ComputeResourceReservation>(_list21.size);
+          ComputeResourceReservation _elem22;
+          for (int _i23 = 0; _i23 < _list21.size; ++_i23)
+          {
+            _elem22 = new ComputeResourceReservation();
+            _elem22.read(iprot);
+            struct.reservations.add(_elem22);
+          }
+        }
+        struct.setReservationsIsSet(true);
+      }
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/GroupResourceProfile.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/GroupResourceProfile.java
index e9eef80..b6e4526 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/GroupResourceProfile.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/GroupResourceProfile.java
@@ -1069,14 +1069,14 @@
           case 4: // COMPUTE_PREFERENCES
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list16 = iprot.readListBegin();
-                struct.computePreferences = new java.util.ArrayList<GroupComputeResourcePreference>(_list16.size);
-                GroupComputeResourcePreference _elem17;
-                for (int _i18 = 0; _i18 < _list16.size; ++_i18)
+                org.apache.thrift.protocol.TList _list32 = iprot.readListBegin();
+                struct.computePreferences = new java.util.ArrayList<GroupComputeResourcePreference>(_list32.size);
+                GroupComputeResourcePreference _elem33;
+                for (int _i34 = 0; _i34 < _list32.size; ++_i34)
                 {
-                  _elem17 = new GroupComputeResourcePreference();
-                  _elem17.read(iprot);
-                  struct.computePreferences.add(_elem17);
+                  _elem33 = new GroupComputeResourcePreference();
+                  _elem33.read(iprot);
+                  struct.computePreferences.add(_elem33);
                 }
                 iprot.readListEnd();
               }
@@ -1088,14 +1088,14 @@
           case 5: // COMPUTE_RESOURCE_POLICIES
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list19 = iprot.readListBegin();
-                struct.computeResourcePolicies = new java.util.ArrayList<ComputeResourcePolicy>(_list19.size);
-                ComputeResourcePolicy _elem20;
-                for (int _i21 = 0; _i21 < _list19.size; ++_i21)
+                org.apache.thrift.protocol.TList _list35 = iprot.readListBegin();
+                struct.computeResourcePolicies = new java.util.ArrayList<ComputeResourcePolicy>(_list35.size);
+                ComputeResourcePolicy _elem36;
+                for (int _i37 = 0; _i37 < _list35.size; ++_i37)
                 {
-                  _elem20 = new ComputeResourcePolicy();
-                  _elem20.read(iprot);
-                  struct.computeResourcePolicies.add(_elem20);
+                  _elem36 = new ComputeResourcePolicy();
+                  _elem36.read(iprot);
+                  struct.computeResourcePolicies.add(_elem36);
                 }
                 iprot.readListEnd();
               }
@@ -1107,14 +1107,14 @@
           case 6: // BATCH_QUEUE_RESOURCE_POLICIES
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list22 = iprot.readListBegin();
-                struct.batchQueueResourcePolicies = new java.util.ArrayList<BatchQueueResourcePolicy>(_list22.size);
-                BatchQueueResourcePolicy _elem23;
-                for (int _i24 = 0; _i24 < _list22.size; ++_i24)
+                org.apache.thrift.protocol.TList _list38 = iprot.readListBegin();
+                struct.batchQueueResourcePolicies = new java.util.ArrayList<BatchQueueResourcePolicy>(_list38.size);
+                BatchQueueResourcePolicy _elem39;
+                for (int _i40 = 0; _i40 < _list38.size; ++_i40)
                 {
-                  _elem23 = new BatchQueueResourcePolicy();
-                  _elem23.read(iprot);
-                  struct.batchQueueResourcePolicies.add(_elem23);
+                  _elem39 = new BatchQueueResourcePolicy();
+                  _elem39.read(iprot);
+                  struct.batchQueueResourcePolicies.add(_elem39);
                 }
                 iprot.readListEnd();
               }
@@ -1182,9 +1182,9 @@
           oprot.writeFieldBegin(COMPUTE_PREFERENCES_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.computePreferences.size()));
-            for (GroupComputeResourcePreference _iter25 : struct.computePreferences)
+            for (GroupComputeResourcePreference _iter41 : struct.computePreferences)
             {
-              _iter25.write(oprot);
+              _iter41.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -1196,9 +1196,9 @@
           oprot.writeFieldBegin(COMPUTE_RESOURCE_POLICIES_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.computeResourcePolicies.size()));
-            for (ComputeResourcePolicy _iter26 : struct.computeResourcePolicies)
+            for (ComputeResourcePolicy _iter42 : struct.computeResourcePolicies)
             {
-              _iter26.write(oprot);
+              _iter42.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -1210,9 +1210,9 @@
           oprot.writeFieldBegin(BATCH_QUEUE_RESOURCE_POLICIES_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.batchQueueResourcePolicies.size()));
-            for (BatchQueueResourcePolicy _iter27 : struct.batchQueueResourcePolicies)
+            for (BatchQueueResourcePolicy _iter43 : struct.batchQueueResourcePolicies)
             {
-              _iter27.write(oprot);
+              _iter43.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -1284,27 +1284,27 @@
       if (struct.isSetComputePreferences()) {
         {
           oprot.writeI32(struct.computePreferences.size());
-          for (GroupComputeResourcePreference _iter28 : struct.computePreferences)
+          for (GroupComputeResourcePreference _iter44 : struct.computePreferences)
           {
-            _iter28.write(oprot);
+            _iter44.write(oprot);
           }
         }
       }
       if (struct.isSetComputeResourcePolicies()) {
         {
           oprot.writeI32(struct.computeResourcePolicies.size());
-          for (ComputeResourcePolicy _iter29 : struct.computeResourcePolicies)
+          for (ComputeResourcePolicy _iter45 : struct.computeResourcePolicies)
           {
-            _iter29.write(oprot);
+            _iter45.write(oprot);
           }
         }
       }
       if (struct.isSetBatchQueueResourcePolicies()) {
         {
           oprot.writeI32(struct.batchQueueResourcePolicies.size());
-          for (BatchQueueResourcePolicy _iter30 : struct.batchQueueResourcePolicies)
+          for (BatchQueueResourcePolicy _iter46 : struct.batchQueueResourcePolicies)
           {
-            _iter30.write(oprot);
+            _iter46.write(oprot);
           }
         }
       }
@@ -1333,42 +1333,42 @@
       }
       if (incoming.get(1)) {
         {
-          org.apache.thrift.protocol.TList _list31 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.computePreferences = new java.util.ArrayList<GroupComputeResourcePreference>(_list31.size);
-          GroupComputeResourcePreference _elem32;
-          for (int _i33 = 0; _i33 < _list31.size; ++_i33)
+          org.apache.thrift.protocol.TList _list47 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.computePreferences = new java.util.ArrayList<GroupComputeResourcePreference>(_list47.size);
+          GroupComputeResourcePreference _elem48;
+          for (int _i49 = 0; _i49 < _list47.size; ++_i49)
           {
-            _elem32 = new GroupComputeResourcePreference();
-            _elem32.read(iprot);
-            struct.computePreferences.add(_elem32);
+            _elem48 = new GroupComputeResourcePreference();
+            _elem48.read(iprot);
+            struct.computePreferences.add(_elem48);
           }
         }
         struct.setComputePreferencesIsSet(true);
       }
       if (incoming.get(2)) {
         {
-          org.apache.thrift.protocol.TList _list34 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.computeResourcePolicies = new java.util.ArrayList<ComputeResourcePolicy>(_list34.size);
-          ComputeResourcePolicy _elem35;
-          for (int _i36 = 0; _i36 < _list34.size; ++_i36)
+          org.apache.thrift.protocol.TList _list50 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.computeResourcePolicies = new java.util.ArrayList<ComputeResourcePolicy>(_list50.size);
+          ComputeResourcePolicy _elem51;
+          for (int _i52 = 0; _i52 < _list50.size; ++_i52)
           {
-            _elem35 = new ComputeResourcePolicy();
-            _elem35.read(iprot);
-            struct.computeResourcePolicies.add(_elem35);
+            _elem51 = new ComputeResourcePolicy();
+            _elem51.read(iprot);
+            struct.computeResourcePolicies.add(_elem51);
           }
         }
         struct.setComputeResourcePoliciesIsSet(true);
       }
       if (incoming.get(3)) {
         {
-          org.apache.thrift.protocol.TList _list37 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.batchQueueResourcePolicies = new java.util.ArrayList<BatchQueueResourcePolicy>(_list37.size);
-          BatchQueueResourcePolicy _elem38;
-          for (int _i39 = 0; _i39 < _list37.size; ++_i39)
+          org.apache.thrift.protocol.TList _list53 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.batchQueueResourcePolicies = new java.util.ArrayList<BatchQueueResourcePolicy>(_list53.size);
+          BatchQueueResourcePolicy _elem54;
+          for (int _i55 = 0; _i55 < _list53.size; ++_i55)
           {
-            _elem38 = new BatchQueueResourcePolicy();
-            _elem38.read(iprot);
-            struct.batchQueueResourcePolicies.add(_elem38);
+            _elem54 = new BatchQueueResourcePolicy();
+            _elem54.read(iprot);
+            struct.batchQueueResourcePolicies.add(_elem54);
           }
         }
         struct.setBatchQueueResourcePoliciesIsSet(true);
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/application/io/InputDataObjectType.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/application/io/InputDataObjectType.java
index 48f45d8..3157f7c 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/application/io/InputDataObjectType.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/application/io/InputDataObjectType.java
@@ -49,6 +49,8 @@
  * metaData:
  *   Any metadat. This is typically ignore by Airavata and is used by gateways for application configuration.
  * 
+ * overrideFilename:
+ *   Rename input file to given value when staging to compute resource.
  */
 @javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
 public class InputDataObjectType implements org.apache.thrift.TBase<InputDataObjectType, InputDataObjectType._Fields>, java.io.Serializable, Cloneable, Comparable<InputDataObjectType> {
@@ -67,6 +69,7 @@
   private static final org.apache.thrift.protocol.TField DATA_STAGED_FIELD_DESC = new org.apache.thrift.protocol.TField("dataStaged", org.apache.thrift.protocol.TType.BOOL, (short)11);
   private static final org.apache.thrift.protocol.TField STORAGE_RESOURCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("storageResourceId", org.apache.thrift.protocol.TType.STRING, (short)12);
   private static final org.apache.thrift.protocol.TField IS_READ_ONLY_FIELD_DESC = new org.apache.thrift.protocol.TField("isReadOnly", org.apache.thrift.protocol.TType.BOOL, (short)13);
+  private static final org.apache.thrift.protocol.TField OVERRIDE_FILENAME_FIELD_DESC = new org.apache.thrift.protocol.TField("overrideFilename", org.apache.thrift.protocol.TType.STRING, (short)14);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new InputDataObjectTypeStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new InputDataObjectTypeTupleSchemeFactory();
@@ -84,6 +87,7 @@
   private boolean dataStaged; // optional
   private java.lang.String storageResourceId; // optional
   private boolean isReadOnly; // optional
+  private java.lang.String overrideFilename; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -103,7 +107,8 @@
     REQUIRED_TO_ADDED_TO_COMMAND_LINE((short)10, "requiredToAddedToCommandLine"),
     DATA_STAGED((short)11, "dataStaged"),
     STORAGE_RESOURCE_ID((short)12, "storageResourceId"),
-    IS_READ_ONLY((short)13, "isReadOnly");
+    IS_READ_ONLY((short)13, "isReadOnly"),
+    OVERRIDE_FILENAME((short)14, "overrideFilename");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -144,6 +149,8 @@
           return STORAGE_RESOURCE_ID;
         case 13: // IS_READ_ONLY
           return IS_READ_ONLY;
+        case 14: // OVERRIDE_FILENAME
+          return OVERRIDE_FILENAME;
         default:
           return null;
       }
@@ -191,7 +198,7 @@
   private static final int __DATASTAGED_ISSET_ID = 4;
   private static final int __ISREADONLY_ISSET_ID = 5;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.VALUE,_Fields.TYPE,_Fields.APPLICATION_ARGUMENT,_Fields.STANDARD_INPUT,_Fields.USER_FRIENDLY_DESCRIPTION,_Fields.META_DATA,_Fields.INPUT_ORDER,_Fields.IS_REQUIRED,_Fields.REQUIRED_TO_ADDED_TO_COMMAND_LINE,_Fields.DATA_STAGED,_Fields.STORAGE_RESOURCE_ID,_Fields.IS_READ_ONLY};
+  private static final _Fields optionals[] = {_Fields.VALUE,_Fields.TYPE,_Fields.APPLICATION_ARGUMENT,_Fields.STANDARD_INPUT,_Fields.USER_FRIENDLY_DESCRIPTION,_Fields.META_DATA,_Fields.INPUT_ORDER,_Fields.IS_REQUIRED,_Fields.REQUIRED_TO_ADDED_TO_COMMAND_LINE,_Fields.DATA_STAGED,_Fields.STORAGE_RESOURCE_ID,_Fields.IS_READ_ONLY,_Fields.OVERRIDE_FILENAME};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -221,6 +228,8 @@
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.IS_READ_ONLY, new org.apache.thrift.meta_data.FieldMetaData("isReadOnly", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
+    tmpMap.put(_Fields.OVERRIDE_FILENAME, new org.apache.thrift.meta_data.FieldMetaData("overrideFilename", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(InputDataObjectType.class, metaDataMap);
   }
@@ -267,6 +276,9 @@
       this.storageResourceId = other.storageResourceId;
     }
     this.isReadOnly = other.isReadOnly;
+    if (other.isSetOverrideFilename()) {
+      this.overrideFilename = other.overrideFilename;
+    }
   }
 
   public InputDataObjectType deepCopy() {
@@ -294,6 +306,7 @@
     this.storageResourceId = null;
     setIsReadOnlyIsSet(false);
     this.isReadOnly = false;
+    this.overrideFilename = null;
   }
 
   public java.lang.String getName() {
@@ -597,6 +610,29 @@
     __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ISREADONLY_ISSET_ID, value);
   }
 
+  public java.lang.String getOverrideFilename() {
+    return this.overrideFilename;
+  }
+
+  public void setOverrideFilename(java.lang.String overrideFilename) {
+    this.overrideFilename = overrideFilename;
+  }
+
+  public void unsetOverrideFilename() {
+    this.overrideFilename = null;
+  }
+
+  /** Returns true if field overrideFilename is set (has been assigned a value) and false otherwise */
+  public boolean isSetOverrideFilename() {
+    return this.overrideFilename != null;
+  }
+
+  public void setOverrideFilenameIsSet(boolean value) {
+    if (!value) {
+      this.overrideFilename = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case NAME:
@@ -703,6 +739,14 @@
       }
       break;
 
+    case OVERRIDE_FILENAME:
+      if (value == null) {
+        unsetOverrideFilename();
+      } else {
+        setOverrideFilename((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
@@ -747,6 +791,9 @@
     case IS_READ_ONLY:
       return isIsReadOnly();
 
+    case OVERRIDE_FILENAME:
+      return getOverrideFilename();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -784,6 +831,8 @@
       return isSetStorageResourceId();
     case IS_READ_ONLY:
       return isSetIsReadOnly();
+    case OVERRIDE_FILENAME:
+      return isSetOverrideFilename();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -920,6 +969,15 @@
         return false;
     }
 
+    boolean this_present_overrideFilename = true && this.isSetOverrideFilename();
+    boolean that_present_overrideFilename = true && that.isSetOverrideFilename();
+    if (this_present_overrideFilename || that_present_overrideFilename) {
+      if (!(this_present_overrideFilename && that_present_overrideFilename))
+        return false;
+      if (!this.overrideFilename.equals(that.overrideFilename))
+        return false;
+    }
+
     return true;
   }
 
@@ -979,6 +1037,10 @@
     if (isSetIsReadOnly())
       hashCode = hashCode * 8191 + ((isReadOnly) ? 131071 : 524287);
 
+    hashCode = hashCode * 8191 + ((isSetOverrideFilename()) ? 131071 : 524287);
+    if (isSetOverrideFilename())
+      hashCode = hashCode * 8191 + overrideFilename.hashCode();
+
     return hashCode;
   }
 
@@ -1120,6 +1182,16 @@
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetOverrideFilename()).compareTo(other.isSetOverrideFilename());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetOverrideFilename()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.overrideFilename, other.overrideFilename);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -1243,6 +1315,16 @@
       sb.append(this.isReadOnly);
       first = false;
     }
+    if (isSetOverrideFilename()) {
+      if (!first) sb.append(", ");
+      sb.append("overrideFilename:");
+      if (this.overrideFilename == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.overrideFilename);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -1396,6 +1478,14 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 14: // OVERRIDE_FILENAME
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.overrideFilename = iprot.readString();
+              struct.setOverrideFilenameIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -1486,6 +1576,13 @@
         oprot.writeBool(struct.isReadOnly);
         oprot.writeFieldEnd();
       }
+      if (struct.overrideFilename != null) {
+        if (struct.isSetOverrideFilename()) {
+          oprot.writeFieldBegin(OVERRIDE_FILENAME_FIELD_DESC);
+          oprot.writeString(struct.overrideFilename);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -1541,7 +1638,10 @@
       if (struct.isSetIsReadOnly()) {
         optionals.set(11);
       }
-      oprot.writeBitSet(optionals, 12);
+      if (struct.isSetOverrideFilename()) {
+        optionals.set(12);
+      }
+      oprot.writeBitSet(optionals, 13);
       if (struct.isSetValue()) {
         oprot.writeString(struct.value);
       }
@@ -1578,6 +1678,9 @@
       if (struct.isSetIsReadOnly()) {
         oprot.writeBool(struct.isReadOnly);
       }
+      if (struct.isSetOverrideFilename()) {
+        oprot.writeString(struct.overrideFilename);
+      }
     }
 
     @Override
@@ -1585,7 +1688,7 @@
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
       struct.name = iprot.readString();
       struct.setNameIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(12);
+      java.util.BitSet incoming = iprot.readBitSet(13);
       if (incoming.get(0)) {
         struct.value = iprot.readString();
         struct.setValueIsSet(true);
@@ -1634,6 +1737,10 @@
         struct.isReadOnly = iprot.readBool();
         struct.setIsReadOnlyIsSet(true);
       }
+      if (incoming.get(12)) {
+        struct.overrideFilename = iprot.readString();
+        struct.setOverrideFilenameIsSet(true);
+      }
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/group/ResourcePermissionType.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/group/ResourcePermissionType.java
index 8989c7a..467105c 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/group/ResourcePermissionType.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/group/ResourcePermissionType.java
@@ -51,7 +51,7 @@
    * Find a the enum type by its integer value, as defined in the Thrift IDL.
    * @return null if the value is not found.
    */
-  public static ResourcePermissionType findByValue(int value) {
+  public static ResourcePermissionType findByValue(int value) { 
     switch (value) {
       case 0:
         return WRITE;
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/workspace/Gateway.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/workspace/Gateway.java
index c5bf617..b600d3d 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/workspace/Gateway.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/workspace/Gateway.java
@@ -48,6 +48,8 @@
   private static final org.apache.thrift.protocol.TField OAUTH_CLIENT_SECRET_FIELD_DESC = new org.apache.thrift.protocol.TField("oauthClientSecret", org.apache.thrift.protocol.TType.STRING, (short)18);
   private static final org.apache.thrift.protocol.TField REQUEST_CREATION_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("requestCreationTime", org.apache.thrift.protocol.TType.I64, (short)19);
   private static final org.apache.thrift.protocol.TField REQUESTER_USERNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("requesterUsername", org.apache.thrift.protocol.TType.STRING, (short)20);
+  private static final org.apache.thrift.protocol.TField REDIRECT_URLS_FIELD_DESC = new org.apache.thrift.protocol.TField("redirectURLs", org.apache.thrift.protocol.TType.LIST, (short)21);
+  private static final org.apache.thrift.protocol.TField SCOPE_FIELD_DESC = new org.apache.thrift.protocol.TField("scope", org.apache.thrift.protocol.TType.STRING, (short)22);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new GatewayStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new GatewayTupleSchemeFactory();
@@ -72,6 +74,8 @@
   private java.lang.String oauthClientSecret; // optional
   private long requestCreationTime; // optional
   private java.lang.String requesterUsername; // optional
+  private java.util.List<java.lang.String> redirectURLs; // optional
+  private java.lang.String scope; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -98,7 +102,9 @@
     OAUTH_CLIENT_ID((short)17, "oauthClientId"),
     OAUTH_CLIENT_SECRET((short)18, "oauthClientSecret"),
     REQUEST_CREATION_TIME((short)19, "requestCreationTime"),
-    REQUESTER_USERNAME((short)20, "requesterUsername");
+    REQUESTER_USERNAME((short)20, "requesterUsername"),
+    REDIRECT_URLS((short)21, "redirectURLs"),
+    SCOPE((short)22, "scope");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -153,6 +159,10 @@
           return REQUEST_CREATION_TIME;
         case 20: // REQUESTER_USERNAME
           return REQUESTER_USERNAME;
+        case 21: // REDIRECT_URLS
+          return REDIRECT_URLS;
+        case 22: // SCOPE
+          return SCOPE;
         default:
           return null;
       }
@@ -195,7 +205,7 @@
   // isset id assignments
   private static final int __REQUESTCREATIONTIME_ISSET_ID = 0;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.AIRAVATA_INTERNAL_GATEWAY_ID,_Fields.GATEWAY_NAME,_Fields.DOMAIN,_Fields.EMAIL_ADDRESS,_Fields.GATEWAY_ACRONYM,_Fields.GATEWAY_URL,_Fields.GATEWAY_PUBLIC_ABSTRACT,_Fields.REVIEW_PROPOSAL_DESCRIPTION,_Fields.GATEWAY_ADMIN_FIRST_NAME,_Fields.GATEWAY_ADMIN_LAST_NAME,_Fields.GATEWAY_ADMIN_EMAIL,_Fields.IDENTITY_SERVER_USER_NAME,_Fields.IDENTITY_SERVER_PASSWORD_TOKEN,_Fields.DECLINED_REASON,_Fields.OAUTH_CLIENT_ID,_Fields.OAUTH_CLIENT_SECRET,_Fields.REQUEST_CREATION_TIME,_Fields.REQUESTER_USERNAME};
+  private static final _Fields optionals[] = {_Fields.AIRAVATA_INTERNAL_GATEWAY_ID,_Fields.GATEWAY_NAME,_Fields.DOMAIN,_Fields.EMAIL_ADDRESS,_Fields.GATEWAY_ACRONYM,_Fields.GATEWAY_URL,_Fields.GATEWAY_PUBLIC_ABSTRACT,_Fields.REVIEW_PROPOSAL_DESCRIPTION,_Fields.GATEWAY_ADMIN_FIRST_NAME,_Fields.GATEWAY_ADMIN_LAST_NAME,_Fields.GATEWAY_ADMIN_EMAIL,_Fields.IDENTITY_SERVER_USER_NAME,_Fields.IDENTITY_SERVER_PASSWORD_TOKEN,_Fields.DECLINED_REASON,_Fields.OAUTH_CLIENT_ID,_Fields.OAUTH_CLIENT_SECRET,_Fields.REQUEST_CREATION_TIME,_Fields.REQUESTER_USERNAME,_Fields.REDIRECT_URLS,_Fields.SCOPE};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -239,6 +249,11 @@
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.REQUESTER_USERNAME, new org.apache.thrift.meta_data.FieldMetaData("requesterUsername", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.REDIRECT_URLS, new org.apache.thrift.meta_data.FieldMetaData("redirectURLs", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
+            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
+    tmpMap.put(_Fields.SCOPE, new org.apache.thrift.meta_data.FieldMetaData("scope", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(Gateway.class, metaDataMap);
   }
@@ -318,6 +333,13 @@
     if (other.isSetRequesterUsername()) {
       this.requesterUsername = other.requesterUsername;
     }
+    if (other.isSetRedirectURLs()) {
+      java.util.List<java.lang.String> __this__redirectURLs = new java.util.ArrayList<java.lang.String>(other.redirectURLs);
+      this.redirectURLs = __this__redirectURLs;
+    }
+    if (other.isSetScope()) {
+      this.scope = other.scope;
+    }
   }
 
   public Gateway deepCopy() {
@@ -347,6 +369,8 @@
     setRequestCreationTimeIsSet(false);
     this.requestCreationTime = 0;
     this.requesterUsername = null;
+    this.redirectURLs = null;
+    this.scope = null;
   }
 
   public java.lang.String getAiravataInternalGatewayId() {
@@ -816,6 +840,67 @@
     }
   }
 
+  public int getRedirectURLsSize() {
+    return (this.redirectURLs == null) ? 0 : this.redirectURLs.size();
+  }
+
+  public java.util.Iterator<java.lang.String> getRedirectURLsIterator() {
+    return (this.redirectURLs == null) ? null : this.redirectURLs.iterator();
+  }
+
+  public void addToRedirectURLs(java.lang.String elem) {
+    if (this.redirectURLs == null) {
+      this.redirectURLs = new java.util.ArrayList<java.lang.String>();
+    }
+    this.redirectURLs.add(elem);
+  }
+
+  public java.util.List<java.lang.String> getRedirectURLs() {
+    return this.redirectURLs;
+  }
+
+  public void setRedirectURLs(java.util.List<java.lang.String> redirectURLs) {
+    this.redirectURLs = redirectURLs;
+  }
+
+  public void unsetRedirectURLs() {
+    this.redirectURLs = null;
+  }
+
+  /** Returns true if field redirectURLs is set (has been assigned a value) and false otherwise */
+  public boolean isSetRedirectURLs() {
+    return this.redirectURLs != null;
+  }
+
+  public void setRedirectURLsIsSet(boolean value) {
+    if (!value) {
+      this.redirectURLs = null;
+    }
+  }
+
+  public java.lang.String getScope() {
+    return this.scope;
+  }
+
+  public void setScope(java.lang.String scope) {
+    this.scope = scope;
+  }
+
+  public void unsetScope() {
+    this.scope = null;
+  }
+
+  /** Returns true if field scope is set (has been assigned a value) and false otherwise */
+  public boolean isSetScope() {
+    return this.scope != null;
+  }
+
+  public void setScopeIsSet(boolean value) {
+    if (!value) {
+      this.scope = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case AIRAVATA_INTERNAL_GATEWAY_ID:
@@ -978,6 +1063,22 @@
       }
       break;
 
+    case REDIRECT_URLS:
+      if (value == null) {
+        unsetRedirectURLs();
+      } else {
+        setRedirectURLs((java.util.List<java.lang.String>)value);
+      }
+      break;
+
+    case SCOPE:
+      if (value == null) {
+        unsetScope();
+      } else {
+        setScope((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
@@ -1043,6 +1144,12 @@
     case REQUESTER_USERNAME:
       return getRequesterUsername();
 
+    case REDIRECT_URLS:
+      return getRedirectURLs();
+
+    case SCOPE:
+      return getScope();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -1094,6 +1201,10 @@
       return isSetRequestCreationTime();
     case REQUESTER_USERNAME:
       return isSetRequesterUsername();
+    case REDIRECT_URLS:
+      return isSetRedirectURLs();
+    case SCOPE:
+      return isSetScope();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -1293,6 +1404,24 @@
         return false;
     }
 
+    boolean this_present_redirectURLs = true && this.isSetRedirectURLs();
+    boolean that_present_redirectURLs = true && that.isSetRedirectURLs();
+    if (this_present_redirectURLs || that_present_redirectURLs) {
+      if (!(this_present_redirectURLs && that_present_redirectURLs))
+        return false;
+      if (!this.redirectURLs.equals(that.redirectURLs))
+        return false;
+    }
+
+    boolean this_present_scope = true && this.isSetScope();
+    boolean that_present_scope = true && that.isSetScope();
+    if (this_present_scope || that_present_scope) {
+      if (!(this_present_scope && that_present_scope))
+        return false;
+      if (!this.scope.equals(that.scope))
+        return false;
+    }
+
     return true;
   }
 
@@ -1380,6 +1509,14 @@
     if (isSetRequesterUsername())
       hashCode = hashCode * 8191 + requesterUsername.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetRedirectURLs()) ? 131071 : 524287);
+    if (isSetRedirectURLs())
+      hashCode = hashCode * 8191 + redirectURLs.hashCode();
+
+    hashCode = hashCode * 8191 + ((isSetScope()) ? 131071 : 524287);
+    if (isSetScope())
+      hashCode = hashCode * 8191 + scope.hashCode();
+
     return hashCode;
   }
 
@@ -1591,6 +1728,26 @@
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetRedirectURLs()).compareTo(other.isSetRedirectURLs());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetRedirectURLs()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.redirectURLs, other.redirectURLs);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = java.lang.Boolean.valueOf(isSetScope()).compareTo(other.isSetScope());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetScope()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.scope, other.scope);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -1802,6 +1959,26 @@
       }
       first = false;
     }
+    if (isSetRedirectURLs()) {
+      if (!first) sb.append(", ");
+      sb.append("redirectURLs:");
+      if (this.redirectURLs == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.redirectURLs);
+      }
+      first = false;
+    }
+    if (isSetScope()) {
+      if (!first) sb.append(", ");
+      sb.append("scope:");
+      if (this.scope == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.scope);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -2015,6 +2192,32 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 21: // REDIRECT_URLS
+            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
+              {
+                org.apache.thrift.protocol.TList _list16 = iprot.readListBegin();
+                struct.redirectURLs = new java.util.ArrayList<java.lang.String>(_list16.size);
+                java.lang.String _elem17;
+                for (int _i18 = 0; _i18 < _list16.size; ++_i18)
+                {
+                  _elem17 = iprot.readString();
+                  struct.redirectURLs.add(_elem17);
+                }
+                iprot.readListEnd();
+              }
+              struct.setRedirectURLsIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 22: // SCOPE
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.scope = iprot.readString();
+              struct.setScopeIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -2162,6 +2365,27 @@
           oprot.writeFieldEnd();
         }
       }
+      if (struct.redirectURLs != null) {
+        if (struct.isSetRedirectURLs()) {
+          oprot.writeFieldBegin(REDIRECT_URLS_FIELD_DESC);
+          {
+            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.redirectURLs.size()));
+            for (java.lang.String _iter19 : struct.redirectURLs)
+            {
+              oprot.writeString(_iter19);
+            }
+            oprot.writeListEnd();
+          }
+          oprot.writeFieldEnd();
+        }
+      }
+      if (struct.scope != null) {
+        if (struct.isSetScope()) {
+          oprot.writeFieldBegin(SCOPE_FIELD_DESC);
+          oprot.writeString(struct.scope);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -2236,7 +2460,13 @@
       if (struct.isSetRequesterUsername()) {
         optionals.set(17);
       }
-      oprot.writeBitSet(optionals, 18);
+      if (struct.isSetRedirectURLs()) {
+        optionals.set(18);
+      }
+      if (struct.isSetScope()) {
+        optionals.set(19);
+      }
+      oprot.writeBitSet(optionals, 20);
       if (struct.isSetAiravataInternalGatewayId()) {
         oprot.writeString(struct.airavataInternalGatewayId);
       }
@@ -2291,6 +2521,18 @@
       if (struct.isSetRequesterUsername()) {
         oprot.writeString(struct.requesterUsername);
       }
+      if (struct.isSetRedirectURLs()) {
+        {
+          oprot.writeI32(struct.redirectURLs.size());
+          for (java.lang.String _iter20 : struct.redirectURLs)
+          {
+            oprot.writeString(_iter20);
+          }
+        }
+      }
+      if (struct.isSetScope()) {
+        oprot.writeString(struct.scope);
+      }
     }
 
     @Override
@@ -2300,7 +2542,7 @@
       struct.setGatewayIdIsSet(true);
       struct.gatewayApprovalStatus = org.apache.airavata.model.workspace.GatewayApprovalStatus.findByValue(iprot.readI32());
       struct.setGatewayApprovalStatusIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(18);
+      java.util.BitSet incoming = iprot.readBitSet(20);
       if (incoming.get(0)) {
         struct.airavataInternalGatewayId = iprot.readString();
         struct.setAiravataInternalGatewayIdIsSet(true);
@@ -2373,6 +2615,23 @@
         struct.requesterUsername = iprot.readString();
         struct.setRequesterUsernameIsSet(true);
       }
+      if (incoming.get(18)) {
+        {
+          org.apache.thrift.protocol.TList _list21 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+          struct.redirectURLs = new java.util.ArrayList<java.lang.String>(_list21.size);
+          java.lang.String _elem22;
+          for (int _i23 = 0; _i23 < _list21.size; ++_i23)
+          {
+            _elem22 = iprot.readString();
+            struct.redirectURLs.add(_elem22);
+          }
+        }
+        struct.setRedirectURLsIsSet(true);
+      }
+      if (incoming.get(19)) {
+        struct.scope = iprot.readString();
+        struct.setScopeIsSet(true);
+      }
     }
   }
 
diff --git a/airavata-api/airavata-model-utils/pom.xml b/airavata-api/airavata-model-utils/pom.xml
index 67eeaed..3952b71 100644
--- a/airavata-api/airavata-model-utils/pom.xml
+++ b/airavata-api/airavata-model-utils/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>airavata-api</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -43,7 +43,18 @@
             <artifactId>airavata-data-models</artifactId>
             <version>${project.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jmockit</groupId>
+            <artifactId>jmockit</artifactId>
+            <version>${jmockit.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/airavata-api/airavata-model-utils/src/main/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtil.java b/airavata-api/airavata-model-utils/src/main/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtil.java
new file mode 100644
index 0000000..58731e9
--- /dev/null
+++ b/airavata-api/airavata-model-utils/src/main/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtil.java
@@ -0,0 +1,44 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.model.util;
+
+import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourceReservation;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
+
+public class GroupComputeResourcePreferenceUtil {
+
+    public static ComputeResourceReservation getActiveReservationForQueue(
+            GroupComputeResourcePreference groupComputeResourcePreference, String queueName) {
+
+        long now = System.currentTimeMillis();
+        if (groupComputeResourcePreference.getReservationsSize() > 0) {
+            for (ComputeResourceReservation reservation : groupComputeResourcePreference.getReservations()) {
+
+                if (reservation.getQueueNames().contains(queueName) && now > reservation.getStartTime()
+                        && now < reservation.getEndTime()) {
+                    return reservation;
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/airavata-api/airavata-model-utils/src/test/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtilTest.java b/airavata-api/airavata-model-utils/src/test/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtilTest.java
new file mode 100644
index 0000000..7f9bedf
--- /dev/null
+++ b/airavata-api/airavata-model-utils/src/test/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtilTest.java
@@ -0,0 +1,116 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.model.util;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourceReservation;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * GroupComputeResourcePreferenceUtilTest
+ */
+public class GroupComputeResourcePreferenceUtilTest {
+
+    @Test
+    public void testGetActiveReservationForQueue() {
+
+        final GroupComputeResourcePreference pref = new GroupComputeResourcePreference();
+        final ComputeResourceReservation res1 = new ComputeResourceReservation("id1", "res1",
+                Arrays.asList("cpu", "gpu"), System.currentTimeMillis() - 10000, System.currentTimeMillis() + 10000);
+        pref.addToReservations(res1);
+
+        final ComputeResourceReservation result = GroupComputeResourcePreferenceUtil.getActiveReservationForQueue(pref,
+                "cpu");
+
+        Assert.assertSame(res1, result);
+    }
+
+    @Test
+    public void testGetActiveReservationForQueueWhenNoReservations() {
+
+        final GroupComputeResourcePreference pref = new GroupComputeResourcePreference();
+
+        final ComputeResourceReservation result = GroupComputeResourcePreferenceUtil.getActiveReservationForQueue(pref,
+                "cpu");
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void testGetActiveReservationForQueueWhenReservationIsExpired() {
+
+        final GroupComputeResourcePreference pref = new GroupComputeResourcePreference();
+        final ComputeResourceReservation res1 = new ComputeResourceReservation("id1", "res1",
+                Arrays.asList("cpu", "gpu"), System.currentTimeMillis() - 20000, System.currentTimeMillis() - 10000);
+        pref.addToReservations(res1);
+
+        final ComputeResourceReservation result = GroupComputeResourcePreferenceUtil.getActiveReservationForQueue(pref,
+                "cpu");
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void testGetActiveReservationForQueueWhenReservationActiveButWrongQueue() {
+
+        final GroupComputeResourcePreference pref = new GroupComputeResourcePreference();
+        final ComputeResourceReservation res1 = new ComputeResourceReservation("id1", "res1",
+                Arrays.asList("cpu", "gpu"), System.currentTimeMillis() - 10000, System.currentTimeMillis() + 10000);
+        pref.addToReservations(res1);
+
+        final ComputeResourceReservation result = GroupComputeResourcePreferenceUtil.getActiveReservationForQueue(pref,
+                "thirdqueue");
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void testGetActiveReservationWithRandomOrder() {
+
+        final GroupComputeResourcePreference pref = new GroupComputeResourcePreference();
+        final ComputeResourceReservation res1 = new ComputeResourceReservation("id1", "res1",
+                Arrays.asList("cpu", "gpu"), System.currentTimeMillis() - 10000, System.currentTimeMillis() + 10000);
+        // expired
+        final ComputeResourceReservation res2 = new ComputeResourceReservation("id2", "res2",
+                Arrays.asList("cpu", "gpu"), System.currentTimeMillis() - 20000, System.currentTimeMillis() - 10000);
+        // future
+        final ComputeResourceReservation res3 = new ComputeResourceReservation("id3", "res3",
+                Arrays.asList("cpu", "gpu"), System.currentTimeMillis() + 10000, System.currentTimeMillis() + 20000);
+        // wrong queue
+        final ComputeResourceReservation res4 = new ComputeResourceReservation("id3", "res3",
+                Arrays.asList("shared", "compute"), System.currentTimeMillis() + 10000, System.currentTimeMillis() + 20000);
+        final List<ComputeResourceReservation> reservations = Arrays.asList(res1, res2, res3, res4);
+
+        Collections.shuffle(reservations);
+        pref.setReservations(reservations);
+
+        final ComputeResourceReservation result = GroupComputeResourcePreferenceUtil.getActiveReservationForQueue(pref,
+                "cpu");
+
+        Assert.assertSame(res1, result);
+    }
+}
diff --git a/airavata-api/pom.xml b/airavata-api/pom.xml
index fe8ce34..08c1360 100644
--- a/airavata-api/pom.xml
+++ b/airavata-api/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-services/pom.xml b/airavata-services/pom.xml
index fb4e038..6e6bd94 100644
--- a/airavata-services/pom.xml
+++ b/airavata-services/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-services/profile-service/iam-admin-services-core/pom.xml b/airavata-services/profile-service/iam-admin-services-core/pom.xml
index 09556cb..f128867 100644
--- a/airavata-services/profile-service/iam-admin-services-core/pom.xml
+++ b/airavata-services/profile-service/iam-admin-services-core/pom.xml
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>profile-service</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-services/profile-service/iam-admin-services-core/src/main/java/org/apache/airavata/service/profile/iam/admin/services/core/impl/TenantManagementKeycloakImpl.java b/airavata-services/profile-service/iam-admin-services-core/src/main/java/org/apache/airavata/service/profile/iam/admin/services/core/impl/TenantManagementKeycloakImpl.java
index b9027e5..e93d6c0 100644
--- a/airavata-services/profile-service/iam-admin-services-core/src/main/java/org/apache/airavata/service/profile/iam/admin/services/core/impl/TenantManagementKeycloakImpl.java
+++ b/airavata-services/profile-service/iam-admin-services-core/src/main/java/org/apache/airavata/service/profile/iam/admin/services/core/impl/TenantManagementKeycloakImpl.java
@@ -768,16 +768,12 @@
         Keycloak client = null;
         try{
             client = TenantManagementKeycloakImpl.getClient(ServerSettings.getIamServerUrl(), tenantId, realmAdminCreds);
-            List<UserRepresentation> userRepresentationList = client.realm(tenantId).users().search(username,
-                    null,
-                    null,
-                    null,
-                    0, 1);
-            if (userRepresentationList.isEmpty()) {
+            UserRepresentation userRepresentation = getUserByUsername(client, tenantId, username);
+            if (userRepresentation == null) {
                 logger.warn("No Keycloak user found for username [" + username + "] in tenant [" + tenantId + "].");
                 return null;
             }
-            UserResource retrievedUser = client.realm(tenantId).users().get(userRepresentationList.get(0).getId());
+            UserResource retrievedUser = client.realm(tenantId).users().get(userRepresentation.getId());
             return retrievedUser.roles().realmLevel().listAll()
                     .stream()
                     .map(roleRepresentation -> roleRepresentation.getName())
diff --git a/airavata-services/profile-service/pom.xml b/airavata-services/profile-service/pom.xml
index 9636117..b807531 100644
--- a/airavata-services/profile-service/pom.xml
+++ b/airavata-services/profile-service/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-services</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-services/profile-service/profile-service-client-sdks/java-client-samples/pom.xml b/airavata-services/profile-service/profile-service-client-sdks/java-client-samples/pom.xml
index 18856c2..a6bb9c8 100644
--- a/airavata-services/profile-service/profile-service-client-sdks/java-client-samples/pom.xml
+++ b/airavata-services/profile-service/profile-service-client-sdks/java-client-samples/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>profile-service-client-sdks</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-services/profile-service/profile-service-client-sdks/pom.xml b/airavata-services/profile-service/profile-service-client-sdks/pom.xml
index c63b215..ccd360c 100644
--- a/airavata-services/profile-service/profile-service-client-sdks/pom.xml
+++ b/airavata-services/profile-service/profile-service-client-sdks/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>profile-service</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-services/profile-service/profile-service-commons/pom.xml b/airavata-services/profile-service/profile-service-commons/pom.xml
index 7e59ebf..f727055 100644
--- a/airavata-services/profile-service/profile-service-commons/pom.xml
+++ b/airavata-services/profile-service/profile-service-commons/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>profile-service</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
@@ -43,7 +43,7 @@
         <dependency>
             <groupId>net.sf.dozer</groupId>
             <artifactId>dozer</artifactId>
-            <version>5.4.0</version>
+            <version>${dozer.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.openjpa</groupId>
@@ -82,16 +82,17 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.1</version>
+                <version>3.8.0</version>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                    <!--<source>1.8</source>-->
+                    <!--<target>1.8</target>-->
+                    <release>11</release>
                 </configuration>
             </plugin>
             <plugin>
                 <groupId>org.apache.openjpa</groupId>
                 <artifactId>openjpa-maven-plugin</artifactId>
-                <version>2.4.3</version>
+                <version>${openjpa.version}</version>
                 <configuration>
                     <includes>**/entities/*.class</includes>
                     <excludes>**/entities/XML*.class</excludes>
@@ -107,6 +108,13 @@
                         </goals>
                     </execution>
                 </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.openjpa</groupId>
+                        <artifactId>openjpa</artifactId>
+                        <version>${openjpa.version}</version>
+                    </dependency>
+                </dependencies>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
diff --git a/airavata-services/profile-service/profile-service-server/pom.xml b/airavata-services/profile-service/profile-service-server/pom.xml
index 546b32d..f78e885 100644
--- a/airavata-services/profile-service/profile-service-server/pom.xml
+++ b/airavata-services/profile-service/profile-service-server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>profile-service</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -69,6 +69,16 @@
             <artifactId>airavata-sharing-registry-stubs</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>registry-api-stubs</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>custos-java-sdk</artifactId>
+            <version>${org.apache.custos.version}</version>
+        </dependency>
     </dependencies>
     
 </project>
diff --git a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/GroupManagerServiceHandler.java b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/GroupManagerServiceHandler.java
index 937951a..81a3b48 100644
--- a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/GroupManagerServiceHandler.java
+++ b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/GroupManagerServiceHandler.java
@@ -1,37 +1,39 @@
 package org.apache.airavata.service.profile.handlers;
 
-import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.utils.Constants;
-import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.common.utils.CustosUtils;
 import org.apache.airavata.model.error.AuthorizationException;
 import org.apache.airavata.model.group.GroupModel;
 import org.apache.airavata.model.security.AuthzToken;
 import org.apache.airavata.service.profile.groupmanager.cpi.GroupManagerService;
-import org.apache.airavata.service.profile.groupmanager.cpi.group_manager_cpiConstants;
 import org.apache.airavata.service.profile.groupmanager.cpi.exception.GroupManagerServiceException;
 import org.apache.airavata.service.profile.groupmanager.cpi.group_manager_cpiConstants;
 import org.apache.airavata.service.security.interceptor.SecurityCheck;
-import org.apache.airavata.sharing.registry.client.SharingRegistryServiceClientFactory;
-import org.apache.airavata.sharing.registry.models.GroupCardinality;
-import org.apache.airavata.sharing.registry.models.GroupType;
-import org.apache.airavata.sharing.registry.models.SharingRegistryException;
-import org.apache.airavata.sharing.registry.models.UserGroup;
-import org.apache.airavata.sharing.registry.service.cpi.SharingRegistryService;
+import org.apache.custos.group.management.client.GroupManagementClient;
+import org.apache.custos.iam.service.GroupRepresentation;
+import org.apache.custos.iam.service.GroupsResponse;
+import org.apache.custos.iam.service.OperationStatus;
+import org.apache.custos.user.profile.service.*;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.UUID;
-import java.util.stream.Collectors;
 
 public class GroupManagerServiceHandler implements GroupManagerService.Iface {
 
     private static final Logger logger = LoggerFactory.getLogger(GroupManagerServiceHandler.class);
 
-    public GroupManagerServiceHandler() {
+    private GroupManagementClient groupManagementClient;
 
+    public GroupManagerServiceHandler() {
+        try {
+            groupManagementClient = CustosUtils.getCustosClientProvider().getGroupManagementClient();
+
+        } catch (Exception ex) {
+            logger.error("Error while initiating Custos Group Management Client ");
+        }
     }
 
     @Override
@@ -43,25 +45,33 @@
     @SecurityCheck
     public String createGroup(AuthzToken authzToken, GroupModel groupModel) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            //TODO Validations for authorization
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
 
-            UserGroup sharingUserGroup = new UserGroup();
-            sharingUserGroup.setGroupId(UUID.randomUUID().toString());
-            sharingUserGroup.setName(groupModel.getName());
-            sharingUserGroup.setDescription(groupModel.getDescription());
-            sharingUserGroup.setGroupType(GroupType.USER_LEVEL_GROUP);
-            sharingUserGroup.setGroupCardinality(GroupCardinality.MULTI_USER);
-            String gatewayId = getDomainId(authzToken);
-            sharingUserGroup.setDomainId(gatewayId);
-            sharingUserGroup.setOwnerId(getUserId(authzToken));
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
 
-            String groupId = sharingClient.createGroup(sharingUserGroup);
-            sharingClient.addUsersToGroup(gatewayId, groupModel.getMembers(), groupId);
+            Group group = Group.newBuilder()
+                    .setName(groupModel.getName())
+                    .setOwnerId(groupModel.getOwnerId())
+                    .build();
+
+            if (groupModel.getDescription() != null) {
+               group = group.toBuilder().setDescription(groupModel.getDescription()).build();
+            }
+
+            Group response = groupManagementClient.createGroup(custosId, group);
+            String groupId = response.getId();
+
+            for (String id : groupModel.getMembers()) {
+                groupManagementClient.addUserToGroup(custosId, id, groupId, DefaultGroupMembershipTypes.MEMBER.name());
+            }
+
+            for (String id : groupModel.getAdmins()) {
+                groupManagementClient.addUserToGroup(custosId, id, groupId, DefaultGroupMembershipTypes.ADMIN.name());
+            }
+
             return groupId;
-        }
-        catch (Exception e) {
-            String msg = "Error Creating Group" ;
+
+        } catch (Exception e) {
+            String msg = "Error Creating Group";
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -73,27 +83,35 @@
     @SecurityCheck
     public boolean updateGroup(AuthzToken authzToken, GroupModel groupModel) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
             String userId = getUserId(authzToken);
-            String domainId = getDomainId(authzToken);
-            if (!(sharingClient.hasOwnerAccess(domainId, groupModel.getId(), userId)
-                    || sharingClient.hasAdminAccess(domainId, groupModel.getId(), userId))) {
-                throw new GroupManagerServiceException("User does not have permission to update group");
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            Status status = groupManagementClient.hasAccess(custosId, groupModel.getId(), userId,
+                    DefaultGroupMembershipTypes.OWNER.name());
+
+            Status exStatus = groupManagementClient.hasAccess(custosId, groupModel.getId(), userId,
+                    DefaultGroupMembershipTypes.ADMIN.name());
+
+            if (!(status.getStatus() || exStatus.getStatus())) {
+                throw new GroupManagerServiceException("User does not have access to update the group");
             }
 
-            UserGroup sharingUserGroup = new UserGroup();
-            sharingUserGroup.setGroupId(groupModel.getId());
-            sharingUserGroup.setName(groupModel.getName());
-            sharingUserGroup.setDescription(groupModel.getDescription());
-            sharingUserGroup.setGroupType(GroupType.USER_LEVEL_GROUP);
-            sharingUserGroup.setDomainId(getDomainId(authzToken));
+            Group groupRepresentation = Group
+                    .newBuilder()
+                    .setName(groupModel.getName())
+                    .setId(groupModel.getId())
+                    .setOwnerId(groupModel.getOwnerId())
+                    .build();
+            if (groupModel.getDescription() != null) {
+                groupRepresentation = groupRepresentation.toBuilder().setDescription(groupModel.getDescription()).build();
+            }
 
-            //adding and removal of users should be handle separately
-            sharingClient.updateGroup(sharingUserGroup);
+            groupManagementClient.updateGroup(custosId, groupRepresentation);
+
             return true;
-        }
-        catch (Exception e) {
-            String msg = "Error Updating Group" ;
+
+        } catch (Exception e) {
+            String msg = "Error Updating Group";
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -105,18 +123,24 @@
     @SecurityCheck
     public boolean deleteGroup(AuthzToken authzToken, String groupId, String ownerId) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
             String userId = getUserId(authzToken);
-            String domainId = getDomainId(authzToken);
-            if (!(sharingClient.hasOwnerAccess(domainId, groupId, userId))) {
-                throw new GroupManagerServiceException("User does not have permission to delete group");
+
+            Status status = groupManagementClient.hasAccess(custosId, groupId, userId,
+                    DefaultGroupMembershipTypes.OWNER.name());
+
+            if (!status.getStatus()) {
+                throw new GroupManagerServiceException("User does not have access to delete group");
             }
 
-            sharingClient.deleteGroup(getDomainId(authzToken), groupId);
-            return true;
-        }
-        catch (Exception e) {
-            String msg = "Error Deleting Group. Group ID: " + groupId ;
+            Group groupRepresentation = Group.newBuilder().setId(groupId).build();
+
+            Status st = groupManagementClient.deleteGroup(custosId, groupRepresentation);
+
+            return st.getStatus();
+
+        } catch (Exception e) {
+            String msg = "Error Deleting Group. Group ID: " + groupId;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -128,16 +152,16 @@
     @SecurityCheck
     public GroupModel getGroup(AuthzToken authzToken, String groupId) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
-            final String domainId = getDomainId(authzToken);
-            UserGroup userGroup = sharingClient.getGroup(domainId, groupId);
 
-            GroupModel groupModel = convertToGroupModel(userGroup, sharingClient);
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            Group groupRepresentation = groupManagementClient.findGroup(custosId, null, groupId);
+
+            GroupModel groupModel = convertToAiravataGroupModel(custosId, groupRepresentation);
 
             return groupModel;
-        }
-        catch (Exception e) {
-            String msg = "Error Retreiving Group. Group ID: " + groupId ;
+        } catch (Exception e) {
+            String msg = "Error Retreiving Group. Group ID: " + groupId;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -149,21 +173,21 @@
     @SecurityCheck
     public List<GroupModel> getGroups(AuthzToken authzToken) throws GroupManagerServiceException, AuthorizationException, TException {
         final String domainId = getDomainId(authzToken);
-        SharingRegistryService.Client sharingClient = null;
-        try {
-            sharingClient = getSharingRegistryServiceClient();
-            List<UserGroup> userGroups = sharingClient.getGroups(domainId, 0, -1);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
 
-            return convertToGroupModels(userGroups, sharingClient);
-        }
-        catch (Exception e) {
+        try {
+
+            GetAllGroupsResponse response = groupManagementClient.getAllGroups(custosId);
+
+            List<Group> groupRepresentations = response.getGroupsList();
+
+            return convertToAiravataGroupModels(custosId, groupRepresentations);
+        } catch (Exception e) {
             String msg = "Error Retrieving Groups. Domain ID: " + domainId;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
             exception.setMessage(msg + " More info : " + e.getMessage());
             throw exception;
-        } finally {
-            closeSharingClient(sharingClient);
         }
     }
 
@@ -171,15 +195,18 @@
     @SecurityCheck
     public List<GroupModel> getAllGroupsUserBelongs(AuthzToken authzToken, String userName) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
-            List<GroupModel> groupModels = new ArrayList<GroupModel>();
-            final String domainId = getDomainId(authzToken);
-            List<UserGroup> userGroups = sharingClient.getAllMemberGroupsForUser(domainId, userName);
 
-            return convertToGroupModels(userGroups, sharingClient);
-        }
-        catch (Exception e) {
-            String msg = "Error Retreiving All Groups for User. User ID: " + userName ;
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            GetAllGroupsResponse response = groupManagementClient.getAllGroupsOfUser(custosId, userName);
+
+            List<GroupModel> groupModels = new ArrayList<GroupModel>();
+
+            groupModels = convertToAiravataGroupModels(custosId, response.getGroupsList());
+
+            return groupModels;
+        } catch (Exception e) {
+            String msg = "Error Retreiving All Groups for User. User ID: " + userName;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -190,17 +217,27 @@
     @Override
     public boolean addUsersToGroup(AuthzToken authzToken, List<String> userIds, String groupId) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
+
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
             String userId = getUserId(authzToken);
-            String domainId = getDomainId(authzToken);
-            if (!(sharingClient.hasOwnerAccess(domainId, groupId, userId)
-                    || sharingClient.hasAdminAccess(domainId, groupId, userId))) {
+
+            Status status = groupManagementClient.hasAccess(custosId, groupId, userId, "OWNER");
+
+            Status exStatus = groupManagementClient.hasAccess(custosId, groupId, userId, "ADMIN");
+
+            if (!(status.getStatus() || exStatus.getStatus())) {
                 throw new GroupManagerServiceException("User does not have access to add users to the group");
             }
-            return sharingClient.addUsersToGroup(domainId, userIds, groupId);
+
+            for (String usr : userIds) {
+
+                groupManagementClient.addUserToGroup(custosId, usr, groupId, DefaultGroupMembershipTypes.MEMBER.name());
+            }
+
+            return true;
 
         } catch (Exception e) {
-            String msg = "Error adding users to group. Group ID: " + groupId ;
+            String msg = "Error adding users to group. Group ID: " + groupId;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -211,16 +248,25 @@
     @Override
     public boolean removeUsersFromGroup(AuthzToken authzToken, List<String> userIds, String groupId) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
             String userId = getUserId(authzToken);
-            String domainId = getDomainId(authzToken);
-            if (!(sharingClient.hasOwnerAccess(domainId, groupId, userId)
-                    || sharingClient.hasAdminAccess(domainId, groupId, userId))) {
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            Status status = groupManagementClient.hasAccess(custosId, groupId, userId, "OWNER");
+
+
+            Status exStatus = groupManagementClient.hasAccess(custosId, groupId, userId, "ADMIN");
+
+            if (!(status.getStatus() || exStatus.getStatus())) {
                 throw new GroupManagerServiceException("User does not have access to remove users to the group");
             }
-            return sharingClient.removeUsersFromGroup(domainId, userIds, groupId);
+
+            for (String id : userIds) {
+                groupManagementClient.removeUserFromGroup(custosId, id, groupId);
+            }
+
+            return true;
         } catch (Exception e) {
-            String msg = "Error remove users to group. Group ID: " + groupId ;
+            String msg = "Error remove users to group. Group ID: " + groupId;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
             exception.setMessage(msg + " More info : " + e.getMessage());
@@ -231,22 +277,26 @@
     @Override
     @SecurityCheck
     public boolean transferGroupOwnership(AuthzToken authzToken, String groupId, String newOwnerId) throws GroupManagerServiceException, AuthorizationException, TException {
-       try{
-           SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
-           String userId = getUserId(authzToken);
-           String domainId = getDomainId(authzToken);
-           if (!(sharingClient.hasOwnerAccess(domainId, groupId, userId))) {
-               throw new GroupManagerServiceException("User does not have Owner permission to transfer group ownership");
-           }
-           return sharingClient.transferGroupOwnership(getDomainId(authzToken), groupId, newOwnerId);
-       }
-       catch (Exception e) {
-           String msg = "Error Transferring Group Ownership";
-           logger.error(msg, e);
-           GroupManagerServiceException exception = new GroupManagerServiceException();
-           exception.setMessage(msg + " More info : " + e.getMessage());
-           throw exception;
-       }
+        try {
+            String userId = getUserId(authzToken);
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            Status status = groupManagementClient.hasAccess(custosId, groupId, userId,
+                    DefaultGroupMembershipTypes.OWNER.name());
+
+            if (!status.getStatus()) {
+                throw new GroupManagerServiceException("User does not have access to transfer ownership group");
+            }
+            Status st = groupManagementClient.changeUserMembershipType(custosId, newOwnerId, groupId,
+                    DefaultGroupMembershipTypes.OWNER.name());
+            return st.getStatus();
+        } catch (Exception e) {
+            String msg = "Error Transferring Group Ownership";
+            logger.error(msg, e);
+            GroupManagerServiceException exception = new GroupManagerServiceException();
+            exception.setMessage(msg + " More info : " + e.getMessage());
+            throw exception;
+        }
 
     }
 
@@ -254,15 +304,40 @@
     @SecurityCheck
     public boolean addGroupAdmins(AuthzToken authzToken, String groupId, List<String> adminIds) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
             String userId = getUserId(authzToken);
-            String domainId = getDomainId(authzToken);
-            if (!(sharingClient.hasOwnerAccess(domainId, groupId, userId))) {
-                throw new GroupManagerServiceException("User does not have Owner permission to add group admins");
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            Status status = groupManagementClient.hasAccess(custosId, groupId, userId,
+                    DefaultGroupMembershipTypes.OWNER.name());
+
+            if (!status.getStatus()) {
+                throw new GroupManagerServiceException("User does not have access to transfer ownership group");
             }
-            return sharingClient.addGroupAdmins(getDomainId(authzToken), groupId, adminIds);
-        }
-        catch (Exception e) {
+
+            for (String id : adminIds) {
+
+                GetAllGroupsResponse response = groupManagementClient.getAllGroupsOfUser(custosId, id);
+
+                boolean exist = false;
+                if (response.getGroupsList() != null && !response.getGroupsList().isEmpty()) {
+                    for (Group group : response.getGroupsList()) {
+
+                        if (group.getId().equals(groupId)) {
+                            exist = true;
+                            break;
+                        }
+                    }
+                }
+
+                if (exist) {
+                    groupManagementClient.changeUserMembershipType(custosId, id, groupId, DefaultGroupMembershipTypes.ADMIN.name());
+                } else {
+                    groupManagementClient.addUserToGroup(custosId, id, groupId, DefaultGroupMembershipTypes.ADMIN.name());
+                }
+            }
+
+            return true;
+        } catch (Exception e) {
             String msg = "Error Adding Admins to Group. Group ID: " + groupId;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
@@ -275,15 +350,22 @@
     @SecurityCheck
     public boolean removeGroupAdmins(AuthzToken authzToken, String groupId, List<String> adminIds) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
             String userId = getUserId(authzToken);
-            String domainId = getDomainId(authzToken);
-            if (!(sharingClient.hasOwnerAccess(domainId, groupId, userId))) {
-                throw new GroupManagerServiceException("User does not have Owner permission to remove group admins");
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            Status status = groupManagementClient.hasAccess(custosId, groupId, userId,
+                    DefaultGroupMembershipTypes.OWNER.name());
+
+            if (!status.getStatus()) {
+                throw new GroupManagerServiceException("User does not have access to transfer ownership group");
             }
-            return sharingClient.removeGroupAdmins(getDomainId(authzToken), groupId, adminIds);
-        }
-        catch (Exception e) {
+
+            for (String id : adminIds) {
+                groupManagementClient.changeUserMembershipType(custosId,
+                        id, groupId, DefaultGroupMembershipTypes.MEMBER.name());
+            }
+            return true;
+        } catch (Exception e) {
             String msg = "Error Removing Admins from the Group. Group ID: " + groupId;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
@@ -296,10 +378,15 @@
     @SecurityCheck
     public boolean hasAdminAccess(AuthzToken authzToken, String groupId, String adminId) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
-            return sharingClient.hasAdminAccess(getDomainId(authzToken), groupId, adminId);
-        }
-        catch (Exception e) {
+            String userId = getUserId(authzToken);
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            Status status = groupManagementClient.hasAccess(custosId, groupId, adminId,
+                    DefaultGroupMembershipTypes.ADMIN.name());
+
+            return status.getStatus();
+
+        } catch (Exception e) {
             String msg = "Error Checking Admin Access for the Group. Group ID: " + groupId + " Admin ID: " + adminId;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
@@ -312,10 +399,14 @@
     @SecurityCheck
     public boolean hasOwnerAccess(AuthzToken authzToken, String groupId, String ownerId) throws GroupManagerServiceException, AuthorizationException, TException {
         try {
-            SharingRegistryService.Client sharingClient = getSharingRegistryServiceClient();
-            return sharingClient.hasOwnerAccess(getDomainId(authzToken), groupId, ownerId);
-        }
-        catch (Exception e) {
+            String userId = getUserId(authzToken);
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            Status status = groupManagementClient.hasAccess(custosId, groupId, ownerId,
+                    DefaultGroupMembershipTypes.OWNER.name());
+
+            return status.getStatus();
+        } catch (Exception e) {
             String msg = "Error Checking Owner Access for the Group. Group ID: " + groupId + " Owner ID: " + ownerId;
             logger.error(msg, e);
             GroupManagerServiceException exception = new GroupManagerServiceException();
@@ -324,63 +415,61 @@
         }
     }
 
-    // TODO: replace these methods with ThriftClientPool (see AIRAVATA-2607)
-    private SharingRegistryService.Client getSharingRegistryServiceClient() throws TException, ApplicationSettingsException {
-        final int serverPort = Integer.parseInt(ServerSettings.getSharingRegistryPort());
-        final String serverHost = ServerSettings.getSharingRegistryHost();
-        try {
-            return SharingRegistryServiceClientFactory.createSharingRegistryClient(serverHost, serverPort);
-        } catch (SharingRegistryException e) {
-            throw new TException("Unable to create sharing registry client...", e);
-        }
-    }
 
     private String getDomainId(AuthzToken authzToken) {
         return authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
     }
 
     private String getUserId(AuthzToken authzToken) {
-        return authzToken.getClaimsMap().get(Constants.USER_NAME) + "@" + getDomainId(authzToken);
+        return authzToken.getClaimsMap().get(Constants.USER_NAME);
     }
 
-    private List<GroupModel> convertToGroupModels(List<UserGroup> userGroups, SharingRegistryService.Client sharingClient) throws TException {
+
+    private List<GroupModel> convertToAiravataGroupModels(String custosId, List userGroups) throws TException {
 
         List<GroupModel> groupModels = new ArrayList<>();
 
-        for (UserGroup userGroup: userGroups) {
-            GroupModel groupModel = convertToGroupModel(userGroup, sharingClient);
+        if (userGroups != null && !userGroups.isEmpty()) {
 
-            groupModels.add(groupModel);
+            for (Object userGroup : userGroups) {
+                GroupModel groupModel = convertToAiravataGroupModel(custosId, (Group) userGroup);
+                groupModels.add(groupModel);
+            }
         }
         return groupModels;
     }
 
-    private GroupModel convertToGroupModel(UserGroup userGroup, SharingRegistryService.Client sharingClient) throws TException {
+
+
+
+
+    private GroupModel convertToAiravataGroupModel(String custosId, Group userGroup) throws TException {
         GroupModel groupModel = new GroupModel();
-        groupModel.setId(userGroup.getGroupId());
+        groupModel.setId(userGroup.getId());
         groupModel.setName(userGroup.getName());
         groupModel.setDescription(userGroup.getDescription());
         groupModel.setOwnerId(userGroup.getOwnerId());
-        final List<String> admins = userGroup.getGroupAdmins().stream()
-                                                              .map(groupAdmin -> groupAdmin.getAdminId())
-                                                              .collect(Collectors.toList());
-        groupModel.setAdmins(admins);
 
-        sharingClient.getGroupMembersOfTypeUser(userGroup.getDomainId(), userGroup.getGroupId(), 0, -1).stream().forEach(user->
-                groupModel.addToMembers(user.getUserId())
-        );
+
+        GetAllUserProfilesResponse response = groupManagementClient.getAllChildUsers(custosId, userGroup.getId());
+        List<String> admins = new ArrayList<>();
+        List<String> member = new ArrayList<>();
+
+        if (response.getProfilesList() != null && !response.getProfilesList().isEmpty()) {
+            for (org.apache.custos.user.profile.service.UserProfile profile : response.getProfilesList()) {
+                if (profile.getMembershipType().equals(DefaultGroupMembershipTypes.ADMIN)) {
+                    admins.add(profile.getUsername());
+                    member.add(profile.getUsername());
+                } else if (profile.getMembershipType().equals(DefaultGroupMembershipTypes.MEMBER)) {
+                    member.add(profile.getUsername());
+                }
+            }
+        }
+        member.add(userGroup.getOwnerId());
+        groupModel.setAdmins(admins);
+        groupModel.setMembers(member);
         return groupModel;
     }
 
-    private void closeSharingClient(SharingRegistryService.Client sharingClient) {
-        if (sharingClient != null) {
-            if (sharingClient.getInputProtocol().getTransport().isOpen()) {
-                sharingClient.getInputProtocol().getTransport().close();
-            }
-            if (sharingClient.getOutputProtocol().getTransport().isOpen()) {
-                sharingClient.getOutputProtocol().getTransport().close();
-            }
-        }
-    }
 
 }
diff --git a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/IamAdminServicesHandler.java b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/IamAdminServicesHandler.java
index ea6d504..db3fcf3 100644
--- a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/IamAdminServicesHandler.java
+++ b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/IamAdminServicesHandler.java
@@ -1,5 +1,4 @@
 /**
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -7,9 +6,9 @@
  * to you 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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
@@ -21,60 +20,102 @@
 
 import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.utils.Constants;
-import org.apache.airavata.common.utils.ServerSettings;
-import org.apache.airavata.credential.store.client.CredentialStoreClientFactory;
-import org.apache.airavata.credential.store.cpi.CredentialStoreService;
-import org.apache.airavata.credential.store.exception.CredentialStoreException;
-import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
-import org.apache.airavata.model.credential.store.PasswordCredential;
+import org.apache.airavata.common.utils.CustosToAiravataDataModelMapper;
+import org.apache.airavata.common.utils.CustosUtils;
+import org.apache.airavata.common.utils.DBEventService;
+import org.apache.airavata.messaging.core.util.DBEventPublisherUtils;
+import org.apache.airavata.model.dbevent.CrudType;
+import org.apache.airavata.model.dbevent.EntityType;
 import org.apache.airavata.model.error.AuthorizationException;
 import org.apache.airavata.model.security.AuthzToken;
 import org.apache.airavata.model.user.UserProfile;
 import org.apache.airavata.model.workspace.Gateway;
-import org.apache.airavata.registry.api.RegistryService;
-import org.apache.airavata.registry.api.client.RegistryServiceClientFactory;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
-import org.apache.airavata.service.profile.iam.admin.services.core.impl.TenantManagementKeycloakImpl;
 import org.apache.airavata.service.profile.iam.admin.services.cpi.IamAdminServices;
 import org.apache.airavata.service.profile.iam.admin.services.cpi.exception.IamAdminServicesException;
 import org.apache.airavata.service.profile.iam.admin.services.cpi.iam_admin_services_cpiConstants;
+import org.apache.airavata.service.profile.tenant.cpi.exception.TenantProfileServiceException;
 import org.apache.airavata.service.security.interceptor.SecurityCheck;
+import org.apache.custos.iam.service.FindUsersResponse;
+import org.apache.custos.iam.service.OperationStatus;
+import org.apache.custos.iam.service.RegisterUserResponse;
+import org.apache.custos.iam.service.UserRepresentation;
+import org.apache.custos.resource.secret.management.client.ResourceSecretManagementClient;
+import org.apache.custos.resource.secret.service.AddResourceCredentialResponse;
+import org.apache.custos.tenant.management.service.CreateTenantResponse;
+import org.apache.custos.tenant.manamgement.client.TenantManagementClient;
+import org.apache.custos.user.management.client.UserManagementClient;
+import org.apache.custos.user.profile.service.GetAllUserProfilesResponse;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class IamAdminServicesHandler implements IamAdminServices.Iface {
 
     private final static Logger logger = LoggerFactory.getLogger(IamAdminServicesHandler.class);
+    private DBEventPublisherUtils dbEventPublisherUtils = new DBEventPublisherUtils(DBEventService.IAM_ADMIN);
+
+    private UserManagementClient userManagementClient;
+    private TenantManagementClient tenantManagementClient;
+    private ResourceSecretManagementClient resourceSecretManagementClient;
+
+    public IamAdminServicesHandler() {
+        try {
+            userManagementClient = CustosUtils.getCustosClientProvider().getUserManagementClient();
+            tenantManagementClient = CustosUtils.getCustosClientProvider().getTenantManagementClient();
+            resourceSecretManagementClient = CustosUtils.getCustosClientProvider().getResourceSecretManagementClient();
+
+        } catch (Exception ex) {
+            logger.error("Error while initiating Custos User management client ");
+        }
+    }
 
     @Override
     public String getAPIVersion() throws TException {
         return iam_admin_services_cpiConstants.IAM_ADMIN_SERVICES_CPI_VERSION;
     }
 
+
     @Override
     @SecurityCheck
-    public Gateway setUpGateway(AuthzToken authzToken, Gateway gateway) throws IamAdminServicesException, AuthorizationException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        PasswordCredential isSuperAdminCredentials = getSuperAdminPasswordCredential();
+    public Gateway setUpGateway(AuthzToken authzToken, Gateway gateway) throws IamAdminServicesException, AuthorizationException, TException {
         try {
-            keycloakclient.addTenant(isSuperAdminCredentials, gateway);
+            String[] contacts = {gateway.getEmailAddress()};
+            String comment = "Airavata gateway internal id " + gateway.getGatewayId();
 
-            // Load the tenant admin password stored in gateway request
-            CredentialStoreService.Client credentialStoreClient = getCredentialStoreServiceClient();
-            // Admin password token should already be stored under requested gateway's gatewayId
-            PasswordCredential tenantAdminPasswordCredential = credentialStoreClient.getPasswordCredential(gateway.getIdentityServerPasswordToken(), gateway.getGatewayId());
-
-            if (!keycloakclient.createTenantAdminAccount(isSuperAdminCredentials, gateway, tenantAdminPasswordCredential.getPassword())) {
-                logger.error("Admin account creation failed !!, please refer error logs for reason");
+            String domain = gateway.getDomain();
+            if (gateway.getDomain() == null || gateway.getDomain().trim().equals("")) {
+                String gatewayURL = gateway.getGatewayURL();
+                domain = gatewayURL.substring(gatewayURL.lastIndexOf("://"), gatewayURL.lastIndexOf("/"));
             }
-            Gateway gatewayWithIdAndSecret = keycloakclient.configureClient(isSuperAdminCredentials, gateway);
-            return gatewayWithIdAndSecret;
-        } catch (TException|ApplicationSettingsException ex) {
-            logger.error("Gateway Setup Failed, reason: " + ex.getMessage(), ex);
-            IamAdminServicesException iamAdminServicesException = new IamAdminServicesException(ex.getMessage());
+            String adminPassword = getAdminPassword(authzToken, gateway);
+            CreateTenantResponse response = tenantManagementClient.registerTenant(gateway.getGatewayName(),
+                    gateway.getRequesterUsername(),
+                    gateway.getGatewayAdminFirstName(),
+                    gateway.getGatewayAdminLastName(),
+                    gateway.getEmailAddress(),
+                    gateway.getIdentityServerUserName(),
+                    adminPassword,
+                    contacts,
+                    gateway.getRedirectURLs().toArray(new String[gateway.getRedirectURLs().size()]),
+                    gateway.getGatewayURL(),
+                    gateway.getScope(),
+                    domain,
+                    gateway.getGatewayURL(),
+                    comment);
+
+            copyAdminPasswordToGateway(authzToken, gateway, response.getClientId());
+            gateway.setOauthClientId(response.getClientId());
+            gateway.setOauthClientSecret(response.getClientSecret());
+
+            dbEventPublisherUtils.publish(EntityType.TENANT, CrudType.UPDATE, gateway);
+
+            return gateway;
+        } catch (Exception e) {
+            logger.error("Gateway creating error, reason: " + e.getMessage(), e);
+            IamAdminServicesException iamAdminServicesException = new IamAdminServicesException(e.getMessage());
             throw iamAdminServicesException;
         }
     }
@@ -82,24 +123,32 @@
     @Override
     @SecurityCheck
     public boolean isUsernameAvailable(AuthzToken authzToken, String username) throws IamAdminServicesException, AuthorizationException, TException {
-        TenantManagementKeycloakImpl keycloakClient = new TenantManagementKeycloakImpl();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-        return keycloakClient.isUsernameAvailable(authzToken.getAccessToken(), gatewayId, username);
+        try {
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+            OperationStatus status =
+                    userManagementClient.isUsernameAvailable(username, custosId);
+            return status.getStatus();
+        } catch (Exception e) {
+            logger.error("Username checking error, reason: " + e.getMessage(), e);
+            IamAdminServicesException iamAdminServicesException = new IamAdminServicesException(e.getMessage());
+            throw iamAdminServicesException;
+        }
     }
 
     //ToDo: Will only be secure when using SSL between PGA and Airavata
     @Override
     @SecurityCheck
     public boolean registerUser(AuthzToken authzToken, String username, String emailAddress, String firstName, String lastName, String newPassword) throws IamAdminServicesException, AuthorizationException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            if (keycloakclient.createUser(authzToken.getAccessToken(), gatewayId, username, emailAddress, firstName, lastName, newPassword))
-                return true;
-            else
-                return false;
-        } catch (TException ex) {
-            String msg = "Error while registering user into Identity Server, reason: " + ex.getMessage();
+            RegisterUserResponse response = userManagementClient.registerUser(username,
+                    firstName, lastName, newPassword, emailAddress, false, custosId);
+
+            return response.getIsRegistered();
+
+        } catch (Exception ex) {
+            String msg = "Error while registering user into Custos Server, reason: " + ex.getMessage();
             logger.error(msg, ex);
             throw new IamAdminServicesException(msg);
         }
@@ -108,16 +157,24 @@
     @Override
     @SecurityCheck
     public boolean enableUser(AuthzToken authzToken, String username) throws IamAdminServicesException, AuthorizationException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         try {
-            if (keycloakclient.enableUserAccount(authzToken.getAccessToken(), gatewayId, username))
+            UserRepresentation representation = userManagementClient.enableUser(username, custosId);
+            if (representation != null && representation.getUsername() != null && !
+                    representation.getUsername().trim().equals("")) {
+
+                UserProfile profile = CustosToAiravataDataModelMapper.transform(representation, gatewayId);
+                profile.setAiravataInternalUserId(profile.getUserId() + "@" + gatewayId);
+                dbEventPublisherUtils.publish(EntityType.USER_PROFILE, CrudType.CREATE, profile);
                 return true;
-            else
-                return false;
-        } catch (TException ex) {
-            String msg = "Error while enabling user account, reason: " + ex.getMessage();
-            logger.error(msg, ex);
+            }
+
+            return false;
+
+        } catch (Exception e) {
+            String msg = "Error while enabling user account, reason: " + e.getMessage();
+            logger.error(msg, e);
             throw new IamAdminServicesException(msg);
         }
     }
@@ -125,10 +182,10 @@
     @Override
     @SecurityCheck
     public boolean isUserEnabled(AuthzToken authzToken, String username) throws IamAdminServicesException, AuthorizationException, TException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         try {
-            return keycloakclient.isUserAccountEnabled(authzToken.getAccessToken(), gatewayId, username);
+            OperationStatus status = userManagementClient.isUserEnabled(username, custosId);
+            return status.getStatus();
         } catch (Exception ex) {
             String msg = "Error while checking if user account is enabled, reason: " + ex.getMessage();
             logger.error(msg, ex);
@@ -139,10 +196,16 @@
     @Override
     @SecurityCheck
     public boolean isUserExist(AuthzToken authzToken, String username) throws IamAdminServicesException, AuthorizationException, TException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
         try {
-            return keycloakclient.isUserExist(authzToken.getAccessToken(), gatewayId, username);
+            FindUsersResponse response = userManagementClient.
+                    findUsers(null, username, null, null, null, 0, 1, custosId);
+            if (!response.getUsersList().isEmpty()) {
+                return true;
+            } else {
+                return false;
+            }
         } catch (Exception ex) {
             String msg = "Error while checking if user account exists, reason: " + ex.getMessage();
             logger.error(msg, ex);
@@ -153,10 +216,12 @@
     @Override
     @SecurityCheck
     public UserProfile getUser(AuthzToken authzToken, String username) throws IamAdminServicesException, AuthorizationException, TException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         try {
-            return keycloakclient.getUser(authzToken.getAccessToken(), gatewayId, username);
+            UserRepresentation userRepresentation = userManagementClient.getUser(username, custosId);
+            return CustosToAiravataDataModelMapper.transform(userRepresentation, gatewayId);
+
         } catch (Exception ex) {
             String msg = "Error while retrieving user profile from IAM backend, reason: " + ex.getMessage();
             logger.error(msg, ex);
@@ -169,10 +234,18 @@
     @SecurityCheck
     public List<UserProfile> getUsers(AuthzToken authzToken, int offset, int limit, String search)
             throws IamAdminServicesException, AuthorizationException, TException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         try {
-            return keycloakclient.getUsers(authzToken.getAccessToken(), gatewayId, offset, limit, search);
+            FindUsersResponse response = userManagementClient.findUsers(search, null,
+                    null, null, null, offset, limit, custosId);
+            List<UserProfile> userProfiles = new ArrayList<>();
+            if (response.getUsersList() != null && !response.getUsersList().isEmpty()) {
+                for (UserRepresentation representation : response.getUsersList()) {
+                    userProfiles.add(CustosToAiravataDataModelMapper.transform(representation, gatewayId));
+                }
+            }
+            return userProfiles;
         } catch (Exception ex) {
             String msg = "Error while retrieving user profile from IAM backend, reason: " + ex.getMessage();
             logger.error(msg, ex);
@@ -183,14 +256,12 @@
     @Override
     @SecurityCheck
     public boolean resetUserPassword(AuthzToken authzToken, String username, String newPassword) throws IamAdminServicesException, AuthorizationException, TException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         try {
-            if (keycloakclient.resetUserPassword(authzToken.getAccessToken(), gatewayId, username, newPassword))
-                return true;
-            else
-                return false;
-        } catch (TException ex) {
+            OperationStatus status = userManagementClient.resetUserPassword(username, newPassword, custosId);
+            return status.getStatus();
+
+        } catch (Exception ex) {
             String msg = "Error while resetting user password in Identity Server, reason: " + ex.getMessage();
             logger.error(msg, ex);
             throw new IamAdminServicesException(msg);
@@ -200,11 +271,19 @@
     @Override
     @SecurityCheck
     public List<UserProfile> findUsers(AuthzToken authzToken, String email, String userId) throws IamAdminServicesException, AuthorizationException, TException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         try {
-            return keycloakclient.findUser(authzToken.getAccessToken(), gatewayId, email, userId);
-        } catch (TException ex) {
+            FindUsersResponse response = userManagementClient.findUsers(null, userId,
+                    null, null, email, 0, -1, custosId);
+            List<UserProfile> userProfiles = new ArrayList<>();
+            if (response.getUsersList() != null && !response.getUsersList().isEmpty()) {
+                for (UserRepresentation representation : response.getUsersList()) {
+                    userProfiles.add(CustosToAiravataDataModelMapper.transform(representation, gatewayId));
+                }
+            }
+            return userProfiles;
+        } catch (Exception ex) {
             String msg = "Error while retrieving users from Identity Server, reason: " + ex.getMessage();
             logger.error(msg, ex);
             throw new IamAdminServicesException(msg);
@@ -214,109 +293,148 @@
     @Override
     @SecurityCheck
     public void updateUserProfile(AuthzToken authzToken, UserProfile userDetails) throws IamAdminServicesException, AuthorizationException, TException {
-
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        String username = userDetails.getUserId();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-
-        keycloakclient.updateUserProfile(authzToken.getAccessToken(), gatewayId, username, userDetails);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+        try {
+            userManagementClient.updateUserProfile(userDetails.getUserId(),
+                    userDetails.getFirstName(),
+                    userDetails.getLastName(),
+                    userDetails.getEmails().get(0),
+                    custosId);
+        } catch (Exception ex) {
+            String msg = "Error while updating user profile in Identity Server, reason: " + ex.getMessage();
+            logger.error(msg, ex);
+            throw new IamAdminServicesException(msg);
+        }
     }
 
     @Override
     @SecurityCheck
     public boolean deleteUser(AuthzToken authzToken, String username) throws IamAdminServicesException, AuthorizationException, TException {
-
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-
-        return keycloakclient.deleteUser(authzToken.getAccessToken(), gatewayId, username);
-    }
-
-    @Override
-    @SecurityCheck
-    @Deprecated
-    public boolean addRoleToUser(AuthzToken authzToken, String username, String roleName) throws IamAdminServicesException, AuthorizationException, TException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         try {
-            PasswordCredential isRealmAdminCredentials = getTenantAdminPasswordCredential(gatewayId);
-            return keycloakclient.addRoleToUser(isRealmAdminCredentials, gatewayId, username, roleName);
-        } catch (TException | ApplicationSettingsException ex) {
-            String msg = "Error while adding role to user, reason: " + ex.getMessage();
-            logger.error(msg, ex);
-            throw new IamAdminServicesException(msg);
-        }
-    }
 
-    @Override
-    @SecurityCheck
-    @Deprecated
-    public boolean removeRoleFromUser(AuthzToken authzToken, String username, String roleName) throws IamAdminServicesException, AuthorizationException, TException {
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-        try {
-            PasswordCredential isRealmAdminCredentials = getTenantAdminPasswordCredential(gatewayId);
-            return keycloakclient.removeRoleFromUser(isRealmAdminCredentials, gatewayId, username, roleName);
-        } catch (TException | ApplicationSettingsException ex) {
-            String msg = "Error while removing role from user, reason: " + ex.getMessage();
-            logger.error(msg, ex);
-            throw new IamAdminServicesException(msg);
-        }
-    }
-
-    @Override
-    @SecurityCheck
-    @Deprecated
-    public List<UserProfile> getUsersWithRole(AuthzToken authzToken, String roleName) throws IamAdminServicesException, AuthorizationException, TException {
-
-        TenantManagementKeycloakImpl keycloakclient = new TenantManagementKeycloakImpl();
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-        try {
-            PasswordCredential isRealmAdminCredentials = getTenantAdminPasswordCredential(gatewayId);
-            return keycloakclient.getUsersWithRole(isRealmAdminCredentials, gatewayId, roleName);
+            OperationStatus status = userManagementClient.deleteUser(username, custosId, authzToken.getAccessToken());
+            return status.getStatus();
         } catch (Exception ex) {
-            String msg = "Error while retrieving users with role, reason: " + ex.getMessage();
+            String msg = "Error while deleting user  in Identity Server, reason: " + ex.getMessage();
             logger.error(msg, ex);
             throw new IamAdminServicesException(msg);
         }
     }
 
-    private PasswordCredential getSuperAdminPasswordCredential() {
-        PasswordCredential isSuperAdminCredentials = new PasswordCredential();
+    @Override
+    public boolean addRoleToUser(AuthzToken authzToken, String username, String roleName) throws IamAdminServicesException, AuthorizationException, TException {
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         try {
-            isSuperAdminCredentials.setLoginUserName(ServerSettings.getIamServerSuperAdminUsername());
-            isSuperAdminCredentials.setPassword(ServerSettings.getIamServerSuperAdminPassword());
-        } catch (ApplicationSettingsException e) {
-            throw new RuntimeException("Unable to get settings for IAM super admin username/password", e);
-        }
-        return isSuperAdminCredentials;
-    }
+            String[] usernames = {username};
+            String[] roles = {roleName};
 
-    private PasswordCredential getTenantAdminPasswordCredential(String tenantId) throws TException, ApplicationSettingsException {
 
-        GatewayResourceProfile gwrp = getRegistryServiceClient().getGatewayResourceProfile(tenantId);
+            OperationStatus status = userManagementClient.addRolesToUsers(roles, usernames, false, custosId, authzToken.getAccessToken());
 
-        CredentialStoreService.Client csClient = getCredentialStoreServiceClient();
-        return csClient.getPasswordCredential(gwrp.getIdentityServerPwdCredToken(), gwrp.getGatewayID());
-    }
-
-    private RegistryService.Client getRegistryServiceClient() throws TException, ApplicationSettingsException {
-        final int serverPort = Integer.parseInt(ServerSettings.getRegistryServerPort());
-        final String serverHost = ServerSettings.getRegistryServerHost();
-        try {
-            return RegistryServiceClientFactory.createRegistryClient(serverHost, serverPort);
-        } catch (RegistryServiceException e) {
-            throw new TException("Unable to create registry client...", e);
+            return status.getStatus();
+        } catch (Exception ex) {
+            String msg = "Error while deleting user  in Identity Server, reason: " + ex.getMessage();
+            logger.error(msg, ex);
+            throw new IamAdminServicesException(msg);
         }
     }
 
-    private CredentialStoreService.Client getCredentialStoreServiceClient() throws TException, ApplicationSettingsException {
-        final int serverPort = Integer.parseInt(ServerSettings.getCredentialStoreServerPort());
-        final String serverHost = ServerSettings.getCredentialStoreServerHost();
+    @Override
+    public boolean removeRoleFromUser(AuthzToken authzToken, String username, String roleName) throws IamAdminServicesException, AuthorizationException, TException {
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         try {
-            return CredentialStoreClientFactory.createAiravataCSClient(serverHost, serverPort);
-        } catch (CredentialStoreException e) {
-            throw new TException("Unable to create credential store client...", e);
+            String[] roles = {roleName};
+            String[] clientRoles = {};
+
+            OperationStatus status = userManagementClient.deleteUserRoles(clientRoles, roles, username, custosId, authzToken.getAccessToken());
+
+            return status.getStatus();
+        } catch (Exception ex) {
+            String msg = "Error while deleting user  in Identity Server, reason: " + ex.getMessage();
+            logger.error(msg, ex);
+            throw new IamAdminServicesException(msg);
         }
     }
+
+    @Override
+    public List<UserProfile> getUsersWithRole(AuthzToken authzToken, String roleName) throws IamAdminServicesException, AuthorizationException, TException {
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        try {
+
+            GetAllUserProfilesResponse response = userManagementClient.getAllUserProfiles(custosId);
+
+            List<org.apache.custos.user.profile.service.UserProfile> userProfileList = response.getProfilesList();
+
+            List<org.apache.custos.user.profile.service.UserProfile> selectedList = new ArrayList<>();
+
+            List<UserProfile> profiles = new ArrayList<>();
+
+            if (userProfileList != null && !userProfileList.isEmpty()) {
+
+                for (org.apache.custos.user.profile.service.UserProfile profile : userProfileList) {
+                    if (profile.getRealmRolesList() != null && !profile.getRealmRolesList().isEmpty()) {
+                        for (String realmRole : profile.getRealmRolesList()) {
+                            if (realmRole.equals(roleName)) {
+                                selectedList.add(profile);
+                            }
+                        }
+                    }
+
+                }
+
+                for (org.apache.custos.user.profile.service.UserProfile profile : selectedList) {
+                    profiles.add(CustosToAiravataDataModelMapper.transform(profile, gatewayId));
+                }
+
+
+            }
+
+            return profiles;
+        } catch (Exception ex) {
+            String msg = "Error while deleting user  in Identity Server, reason: " + ex.getMessage();
+            logger.error(msg, ex);
+            throw new IamAdminServicesException(msg);
+        }
+
+
+    }
+
+    private String getAdminPassword(AuthzToken authzToken, Gateway gateway) throws TException, ApplicationSettingsException {
+        try {
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            org.apache.custos.resource.secret.service.PasswordCredential passwordCredential =
+                    resourceSecretManagementClient.getPasswordCredential(custosId, gateway.getIdentityServerPasswordToken());
+
+            return passwordCredential.getPassword();
+        } catch (Exception ex) {
+            logger.error("Unable to fetch admin password credential, reason: " + ex.getMessage(), ex);
+            TenantProfileServiceException exception = new TenantProfileServiceException();
+            exception.setMessage("Unable to fetch admin password credential, reason: " + ex.getMessage());
+            throw exception;
+        }
+    }
+
+    private void copyAdminPasswordToGateway(AuthzToken authzToken, Gateway gateway, String createdGatewayCustosId) throws TException, ApplicationSettingsException {
+        try {
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            org.apache.custos.resource.secret.service.PasswordCredential passwordCredential =
+                    resourceSecretManagementClient.getPasswordCredential(custosId, gateway.getIdentityServerPasswordToken());
+
+            AddResourceCredentialResponse response = resourceSecretManagementClient.addPasswordCredential(createdGatewayCustosId,
+                    passwordCredential.getMetadata().getDescription(),
+                    gateway.getIdentityServerUserName(),
+                    passwordCredential.getPassword());
+            gateway.setIdentityServerPasswordToken(response.getToken());
+        } catch (Exception ex) {
+            logger.error("Unable to save admin password credential, reason: " + ex.getMessage(), ex);
+            TenantProfileServiceException exception = new TenantProfileServiceException();
+            exception.setMessage("Unable to save admin password credential, reason: " + ex.getMessage());
+            throw exception;
+        }
+    }
+
 }
diff --git a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/TenantProfileServiceHandler.java b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/TenantProfileServiceHandler.java
index 6f8f74e..51372af 100644
--- a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/TenantProfileServiceHandler.java
+++ b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/TenantProfileServiceHandler.java
@@ -1,5 +1,4 @@
 /**
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -7,9 +6,9 @@
  * to you 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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
@@ -20,32 +19,34 @@
 package org.apache.airavata.service.profile.handlers;
 
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.utils.Constants;
-import org.apache.airavata.common.utils.DBEventService;
-import org.apache.airavata.common.utils.ServerSettings;
-import org.apache.airavata.credential.store.client.CredentialStoreClientFactory;
-import org.apache.airavata.credential.store.cpi.CredentialStoreService;
-import org.apache.airavata.credential.store.exception.CredentialStoreException;
+import org.apache.airavata.common.utils.*;
 import org.apache.airavata.messaging.core.util.DBEventPublisherUtils;
-import org.apache.airavata.model.credential.store.PasswordCredential;
 import org.apache.airavata.model.dbevent.CrudType;
 import org.apache.airavata.model.dbevent.EntityType;
 import org.apache.airavata.model.error.AuthorizationException;
 import org.apache.airavata.model.security.AuthzToken;
 import org.apache.airavata.model.workspace.Gateway;
 import org.apache.airavata.model.workspace.GatewayApprovalStatus;
+import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.service.profile.commons.tenant.entities.GatewayEntity;
 import org.apache.airavata.service.profile.tenant.core.repositories.TenantProfileRepository;
 import org.apache.airavata.service.profile.tenant.cpi.TenantProfileService;
 import org.apache.airavata.service.profile.tenant.cpi.exception.TenantProfileServiceException;
 import org.apache.airavata.service.profile.tenant.cpi.profile_tenant_cpiConstants;
 import org.apache.airavata.service.security.interceptor.SecurityCheck;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.apache.custos.resource.secret.management.client.ResourceSecretManagementClient;
+import org.apache.custos.resource.secret.service.AddResourceCredentialResponse;
+import org.apache.custos.tenant.management.service.CreateTenantResponse;
+import org.apache.custos.tenant.management.service.GetTenantResponse;
+import org.apache.custos.tenant.manamgement.client.TenantManagementClient;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.UUID;
 
 /**
  * Created by goshenoy on 3/6/17.
@@ -55,11 +56,38 @@
     private final static Logger logger = LoggerFactory.getLogger(TenantProfileServiceHandler.class);
 
     private TenantProfileRepository tenantProfileRepository;
+    private ResourceSecretManagementClient resourceSecretManagementClient;
     private DBEventPublisherUtils dbEventPublisherUtils = new DBEventPublisherUtils(DBEventService.TENANT);
+    private ThriftClientPool<RegistryService.Client> registryClientPool;
 
-    public TenantProfileServiceHandler() {
+    private TenantManagementClient tenantManagementClient;
+
+    public TenantProfileServiceHandler() throws ApplicationSettingsException, IOException {
         logger.debug("Initializing TenantProfileServiceHandler");
         this.tenantProfileRepository = new TenantProfileRepository(Gateway.class, GatewayEntity.class);
+        tenantManagementClient = CustosUtils.getCustosClientProvider().getTenantManagementClient();
+        resourceSecretManagementClient = CustosUtils.getCustosClientProvider().getResourceSecretManagementClient();
+        registryClientPool = new ThriftClientPool<>(
+                tProtocol -> new RegistryService.Client(tProtocol),
+                this.<RegistryService.Client>createGenericObjectPoolConfig(),
+                ServerSettings.getRegistryServerHost(),
+                Integer.parseInt(ServerSettings.getRegistryServerPort()));
+
+    }
+
+    private <T> GenericObjectPoolConfig<T> createGenericObjectPoolConfig() {
+
+        GenericObjectPoolConfig<T> poolConfig = new GenericObjectPoolConfig<T>();
+        poolConfig.setMaxTotal(100);
+        poolConfig.setMinIdle(5);
+        poolConfig.setBlockWhenExhausted(true);
+        poolConfig.setTestOnBorrow(true);
+        poolConfig.setTestWhileIdle(true);
+        // must set timeBetweenEvictionRunsMillis since eviction doesn't run unless that is positive
+        poolConfig.setTimeBetweenEvictionRunsMillis(5L * 60L * 1000L);
+        poolConfig.setNumTestsPerEvictionRun(10);
+        poolConfig.setMaxWaitMillis(3000);
+        return poolConfig;
     }
 
     @Override
@@ -70,64 +98,63 @@
     @Override
     @SecurityCheck
     public String addGateway(AuthzToken authzToken, Gateway gateway) throws TenantProfileServiceException, AuthorizationException, TException {
+        RegistryService.Client registryClient = registryClientPool.getResource();
         try {
+
+            gateway.setAiravataInternalGatewayId(gateway.getGatewayId());
+
             // Assign UUID to gateway
-            gateway.setAiravataInternalGatewayId(UUID.randomUUID().toString());
-            if (!checkDuplicateGateway(gateway)) {
+            if (!registryClient.isGatewayExist(gateway.getGatewayId())) {
                 // If admin password, copy it in the credential store under the requested gateway's gatewayId
-                if (gateway.getIdentityServerPasswordToken() != null) {
-                    copyAdminPasswordToGateway(authzToken, gateway);
-                }
-                gateway = tenantProfileRepository.create(gateway);
-                if (gateway != null) {
-                    logger.info("Added Airavata Gateway with Id: " + gateway.getGatewayId());
-                    // replicate tenant at end-places only if status is APPROVED
-                    if (gateway.getGatewayApprovalStatus().equals(GatewayApprovalStatus.APPROVED)) {
-                        logger.info("Gateway with ID: {}, is now APPROVED, replicating to subscribers.", gateway.getGatewayId());
-                        dbEventPublisherUtils.publish(EntityType.TENANT, CrudType.CREATE, gateway);
-                    }
-                    // return internal id
-                    return gateway.getAiravataInternalGatewayId();
-                } else {
-                    throw new Exception("Gateway object is null.");
-                }
+
+                logger.info("Added Airavata Gateway with Id: " + gateway.getGatewayId());
+                // replicate tenant at end-places only if status is APPROVED
+
+                logger.info("Gateway with ID: {}, is now APPROVED, replicating to subscribers.", gateway.getGatewayId());
+                dbEventPublisherUtils.publish(EntityType.TENANT, CrudType.CREATE, gateway);
+
             }
-            else {
-                throw new TenantProfileServiceException("An approved Gateway already exists with the same GatewayId, Name or URL");
-            }
+            // return internal id
+            registryClientPool.returnResource(registryClient);
+            String stringToBereturned =
+                    gateway.getAiravataInternalGatewayId();
+            return stringToBereturned;
+
+
         } catch (Exception ex) {
             logger.error("Error adding gateway-profile, reason: " + ex.getMessage(), ex);
             TenantProfileServiceException exception = new TenantProfileServiceException();
             exception.setMessage("Error adding gateway-profile, reason: " + ex.getMessage());
+            registryClientPool.returnBrokenResource(registryClient);
             throw exception;
+
         }
     }
 
     @Override
     @SecurityCheck
     public boolean updateGateway(AuthzToken authzToken, Gateway updatedGateway) throws TenantProfileServiceException, AuthorizationException, TException {
+        RegistryService.Client registryClient = registryClientPool.getResource();
         try {
 
             // if admin password token changes then copy the admin password and store under this gateway id and then update the admin password token
-            Gateway existingGateway = tenantProfileRepository.getGateway(updatedGateway.getAiravataInternalGatewayId());
-            if (updatedGateway.getIdentityServerPasswordToken() != null
-                    && (existingGateway.getIdentityServerPasswordToken() == null
-                        || !existingGateway.getIdentityServerPasswordToken().equals(updatedGateway.getIdentityServerPasswordToken()))) {
-                copyAdminPasswordToGateway(authzToken, updatedGateway);
+
+            updatedGateway.setAiravataInternalGatewayId(updatedGateway.getGatewayId());
+
+           if (updatedGateway.getGatewayApprovalStatus().equals(GatewayApprovalStatus.DEACTIVATED)) {
+                tenantManagementClient.deleteTenant(updatedGateway.getOauthClientId());
             }
 
-            if (tenantProfileRepository.update(updatedGateway) != null) {
-                logger.debug("Updated gateway-profile with ID: " + updatedGateway.getGatewayId());
-                // replicate tenant at end-places
-                dbEventPublisherUtils.publish(EntityType.TENANT, CrudType.UPDATE, updatedGateway);
-                return true;
-            } else {
-                return false;
-            }
+            // replicate tenant at end-places
+            dbEventPublisherUtils.publish(EntityType.TENANT, CrudType.UPDATE, updatedGateway);
+            registryClientPool.returnResource(registryClient);
+            return true;
+
         } catch (Exception ex) {
             logger.error("Error updating gateway-profile, reason: " + ex.getMessage(), ex);
             TenantProfileServiceException exception = new TenantProfileServiceException();
             exception.setMessage("Error updating gateway-profile, reason: " + ex.getMessage());
+            registryClientPool.returnBrokenResource(registryClient);
             return false;
         }
     }
@@ -135,16 +162,20 @@
     @Override
     @SecurityCheck
     public Gateway getGateway(AuthzToken authzToken, String airavataInternalGatewayId) throws TenantProfileServiceException, AuthorizationException, TException {
+        RegistryService.Client registryClient = registryClientPool.getResource();
         try {
-            Gateway gateway = tenantProfileRepository.getGateway(airavataInternalGatewayId);
+
+            Gateway gateway = registryClient.getGateway(airavataInternalGatewayId);
             if (gateway == null) {
                 throw new Exception("Could not find Gateway with internal ID: " + airavataInternalGatewayId);
             }
+            registryClientPool.returnResource(registryClient);
             return gateway;
         } catch (Exception ex) {
             logger.error("Error getting gateway-profile, reason: " + ex.getMessage(), ex);
             TenantProfileServiceException exception = new TenantProfileServiceException();
             exception.setMessage("Error getting gateway-profile, reason: " + ex.getMessage());
+            registryClientPool.returnBrokenResource(registryClient);
             throw exception;
         }
     }
@@ -152,21 +183,26 @@
     @Override
     @SecurityCheck
     public boolean deleteGateway(AuthzToken authzToken, String airavataInternalGatewayId, String gatewayId) throws TenantProfileServiceException, AuthorizationException, TException {
+        RegistryService.Client registryClient = registryClientPool.getResource();
         try {
-            logger.debug("Deleting Airavata gateway-profile with ID: " + gatewayId + "Internal ID: " + airavataInternalGatewayId);
-            boolean deleteSuccess = tenantProfileRepository.delete(airavataInternalGatewayId);
-            if (deleteSuccess) {
-                // delete tenant at end-places
-                dbEventPublisherUtils.publish(EntityType.TENANT, CrudType.DELETE,
-                        // pass along gateway datamodel, with correct gatewayId;
-                        // approvalstatus is not used for delete, hence set dummy value
-                        new Gateway(gatewayId, GatewayApprovalStatus.DEACTIVATED));
-            }
-            return deleteSuccess;
+
+            Gateway gateway = registryClient.getGateway(airavataInternalGatewayId);
+
+            tenantManagementClient.deleteTenant(gateway.getOauthClientId());
+
+            // delete tenant at end-places
+            dbEventPublisherUtils.publish(EntityType.TENANT, CrudType.DELETE,
+                    // pass along gateway datamodel, with correct gatewayId;
+                    // approvalstatus is not used for delete, hence set dummy value
+                    new Gateway(gatewayId, GatewayApprovalStatus.DEACTIVATED));
+            registryClientPool.returnResource(registryClient);
+
+            return true;
         } catch (Exception ex) {
             logger.error("Error deleting gateway-profile, reason: " + ex.getMessage(), ex);
             TenantProfileServiceException exception = new TenantProfileServiceException();
             exception.setMessage("Error deleting gateway-profile, reason: " + ex.getMessage());
+            registryClientPool.returnBrokenResource(registryClient);
             throw exception;
         }
     }
@@ -174,12 +210,22 @@
     @Override
     @SecurityCheck
     public List<Gateway> getAllGateways(AuthzToken authzToken) throws TenantProfileServiceException, AuthorizationException, TException {
+        RegistryService.Client registryClient = registryClientPool.getResource();
         try {
-            return tenantProfileRepository.getAllGateways();
+
+            List<Gateway> gateways = registryClient.getAllGateways();
+            if (gateways != null && !gateways.isEmpty()) {
+                for (Gateway gateway : gateways) {
+                    gateway.setAiravataInternalGatewayId(gateway.getGatewayId());
+                }
+            }
+            registryClientPool.returnResource(registryClient);
+            return gateways;
         } catch (Exception ex) {
             logger.error("Error getting all gateway-profiles, reason: " + ex.getMessage(), ex);
             TenantProfileServiceException exception = new TenantProfileServiceException();
             exception.setMessage("Error getting all gateway-profiles, reason: " + ex.getMessage());
+            registryClientPool.returnBrokenResource(registryClient);
             throw exception;
         }
     }
@@ -187,13 +233,17 @@
     @Override
     @SecurityCheck
     public boolean isGatewayExist(AuthzToken authzToken, String gatewayId) throws TenantProfileServiceException, AuthorizationException, TException {
+        RegistryService.Client registryClient = registryClientPool.getResource();
         try {
-            Gateway gateway = tenantProfileRepository.getGateway(gatewayId);
-            return (gateway != null);
+
+            boolean status = registryClient.isGatewayExist(gatewayId);
+            registryClientPool.returnResource(registryClient);
+            return status;
         } catch (Exception ex) {
             logger.error("Error checking if gateway-profile exists, reason: " + ex.getMessage(), ex);
             TenantProfileServiceException exception = new TenantProfileServiceException();
             exception.setMessage("Error checking if gateway-profile exists, reason: " + ex.getMessage());
+            registryClientPool.returnBrokenResource(registryClient);
             throw exception;
         }
     }
@@ -201,55 +251,32 @@
     @Override
     @SecurityCheck
     public List<Gateway> getAllGatewaysForUser(AuthzToken authzToken, String requesterUsername) throws TenantProfileServiceException, AuthorizationException, TException {
+        RegistryService.Client registryClient = registryClientPool.getResource();
         try {
-            return tenantProfileRepository.getAllGatewaysForUser(requesterUsername);
+
+            List<Gateway> gateways = registryClient.getAllGateways();
+            List<Gateway> selectedGateways = new ArrayList<>();
+
+            if (gateways != null && !gateways.isEmpty()) {
+                for (Gateway gateway : gateways) {
+                    if (gateway.getRequesterUsername().equals(requesterUsername)) {
+                        gateway.setAiravataInternalGatewayId(gateway.getGatewayId());
+                        selectedGateways.add(gateway);
+                    }
+                }
+
+            }
+            registryClientPool.returnResource(registryClient);
+            return selectedGateways;
         } catch (Exception ex) {
             logger.error("Error getting user's gateway-profiles, reason: " + ex.getMessage(), ex);
             TenantProfileServiceException exception = new TenantProfileServiceException();
             exception.setMessage("Error getting user's gateway-profiles, reason: " + ex.getMessage());
+            registryClientPool.returnBrokenResource(registryClient);
             throw exception;
         }
     }
 
-    private boolean checkDuplicateGateway(Gateway gateway) throws TenantProfileServiceException {
-        try {
-            Gateway duplicateGateway = tenantProfileRepository.getDuplicateGateway(gateway.getGatewayId(), gateway.getGatewayName(), gateway.getGatewayURL());
-            return duplicateGateway != null;
-        } catch (Exception ex) {
-            logger.error("Error checking if duplicate gateway-profile exists, reason: " + ex.getMessage(), ex);
-            TenantProfileServiceException exception = new TenantProfileServiceException();
-            exception.setMessage("Error checking if duplicate gateway-profiles exists, reason: " + ex.getMessage());
-            throw exception;
-        }
-    }
 
-    // admin passwords are stored in credential store in the super portal gateway and need to be
-    // copied to a credential that is stored in the requested/newly created gateway
-    private void copyAdminPasswordToGateway(AuthzToken authzToken, Gateway gateway) throws TException, ApplicationSettingsException {
-        CredentialStoreService.Client csClient = getCredentialStoreServiceClient();
-        try {
-            String requestGatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-            PasswordCredential adminPasswordCredential = csClient.getPasswordCredential(gateway.getIdentityServerPasswordToken(), requestGatewayId);
-            adminPasswordCredential.setGatewayId(gateway.getGatewayId());
-            String newAdminPasswordCredentialToken = csClient.addPasswordCredential(adminPasswordCredential);
-            gateway.setIdentityServerPasswordToken(newAdminPasswordCredentialToken);
-        } finally {
-            if (csClient.getInputProtocol().getTransport().isOpen()) {
-                csClient.getInputProtocol().getTransport().close();
-            }
-            if (csClient.getOutputProtocol().getTransport().isOpen()) {
-                csClient.getOutputProtocol().getTransport().close();
-            }
-        }
-    }
 
-    private CredentialStoreService.Client getCredentialStoreServiceClient() throws TException, ApplicationSettingsException {
-        final int serverPort = Integer.parseInt(ServerSettings.getCredentialStoreServerPort());
-        final String serverHost = ServerSettings.getCredentialStoreServerHost();
-        try {
-            return CredentialStoreClientFactory.createAiravataCSClient(serverHost, serverPort);
-        } catch (CredentialStoreException e) {
-            throw new TException("Unable to create credential store client...", e);
-        }
-    }
 }
diff --git a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java
index 2308d92..d56ebd0 100644
--- a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java
+++ b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java
@@ -1,5 +1,4 @@
 /**
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -7,9 +6,9 @@
  * to you 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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
@@ -19,47 +18,47 @@
  */
 package org.apache.airavata.service.profile.handlers;
 
-import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.common.utils.Constants;
+import org.apache.airavata.common.utils.CustosToAiravataDataModelMapper;
+import org.apache.airavata.common.utils.CustosUtils;
 import org.apache.airavata.common.utils.DBEventService;
-import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.messaging.core.util.DBEventPublisherUtils;
 import org.apache.airavata.model.dbevent.CrudType;
 import org.apache.airavata.model.dbevent.EntityType;
 import org.apache.airavata.model.error.AuthorizationException;
 import org.apache.airavata.model.security.AuthzToken;
-import org.apache.airavata.model.user.Status;
 import org.apache.airavata.model.user.UserProfile;
-import org.apache.airavata.model.user.user_profile_modelConstants;
-import org.apache.airavata.security.AiravataSecurityException;
-import org.apache.airavata.service.profile.client.ProfileServiceClientFactory;
-import org.apache.airavata.service.profile.iam.admin.services.cpi.IamAdminServices;
-import org.apache.airavata.service.profile.iam.admin.services.cpi.exception.IamAdminServicesException;
-import org.apache.airavata.service.profile.user.core.repositories.UserProfileRepository;
 import org.apache.airavata.service.profile.user.cpi.UserProfileService;
 import org.apache.airavata.service.profile.user.cpi.exception.UserProfileServiceException;
-import org.apache.airavata.service.security.AiravataSecurityManager;
-import org.apache.airavata.service.security.SecurityManagerFactory;
-import org.apache.airavata.service.security.UserInfo;
 import org.apache.airavata.service.profile.user.cpi.profile_user_cpiConstants;
 import org.apache.airavata.service.security.interceptor.SecurityCheck;
+import org.apache.custos.iam.service.FindUsersResponse;
+import org.apache.custos.iam.service.OperationStatus;
+import org.apache.custos.iam.service.UserRepresentation;
+import org.apache.custos.user.management.client.UserManagementClient;
+import org.apache.custos.user.profile.service.GetAllUserProfilesResponse;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class UserProfileServiceHandler implements UserProfileService.Iface {
 
     private final static Logger logger = LoggerFactory.getLogger(UserProfileServiceHandler.class);
 
-    private UserProfileRepository userProfileRepository;
     private DBEventPublisherUtils dbEventPublisherUtils = new DBEventPublisherUtils(DBEventService.USER_PROFILE);
 
-    public UserProfileServiceHandler() {
+    private UserManagementClient userManagementClient;
 
-        userProfileRepository = new UserProfileRepository();
+    public UserProfileServiceHandler() {
+        try {
+            userManagementClient = CustosUtils.getCustosClientProvider().getUserManagementClient();
+        } catch (Exception ex) {
+            logger.error("Error occurred while initializing Custos client");
+        }
+
     }
 
     @Override
@@ -70,36 +69,24 @@
     @Override
     @SecurityCheck
     public String initializeUserProfile(AuthzToken authzToken) throws UserProfileServiceException, AuthorizationException, TException {
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+        String username = authzToken.getClaimsMap().get(Constants.USER_NAME);
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
         try {
-            // Load UserInfo for the access token and create an initial UserProfile from it
-            UserInfo userInfo = SecurityManagerFactory.getSecurityManager().getUserInfoFromAuthzToken(authzToken);
-            final UserProfile existingProfile = userProfileRepository.getUserProfileByIdAndGateWay(userInfo.getUsername(), gatewayId);
-            // If a user profile already exists, just return the userId
-            if (existingProfile != null) {
-                return existingProfile.getUserId();
-            }
-            UserProfile userProfile = new UserProfile();
-            userProfile.setUserId(userInfo.getUsername().toLowerCase());
-            userProfile.setGatewayId(gatewayId);
-            userProfile.setAiravataInternalUserId(userProfile.getUserId() + "@" + gatewayId);
-            userProfile.addToEmails(userInfo.getEmailAddress());
-            userProfile.setFirstName(userInfo.getFirstName());
-            userProfile.setLastName(userInfo.getLastName());
-            userProfile.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-            userProfile.setLastAccessTime(AiravataUtils.getCurrentTimestamp().getTime());
-            userProfile.setValidUntil(-1);
-            userProfile.setState(Status.ACTIVE);
-            userProfile = userProfileRepository.createUserProfile(userProfile);
-            if (null != userProfile) {
-                logger.info("Added UserProfile with userId: " + userProfile.getUserId());
-                // replicate userProfile at end-places
-                dbEventPublisherUtils.publish(EntityType.USER_PROFILE, CrudType.CREATE, userProfile);
-                // return userId
-                return userProfile.getUserId();
-            } else {
-                throw new Exception("User creation failed. Please try again.");
-            }
+            org.apache.custos.iam.service.UserRepresentation userRepresentation =
+                    userManagementClient.getUser(username, custosId);
+
+            userManagementClient.updateUserProfile(userRepresentation.getUsername(),
+                    userRepresentation.getFirstName(),
+                    userRepresentation.getLastName(),
+                    userRepresentation.getEmail(),
+                    custosId);
+
+            UserProfile profile =  CustosToAiravataDataModelMapper.transform(userRepresentation,gatewayId);
+            profile.setAiravataInternalUserId(profile.getUserId()+"@"+gatewayId);
+            dbEventPublisherUtils.publish(EntityType.USER_PROFILE, CrudType.CREATE, profile);
+
+            return userRepresentation.getUsername().toLowerCase();
         } catch (Exception e) {
             logger.error("Error while initializing user profile", e);
             UserProfileServiceException exception = new UserProfileServiceException();
@@ -111,20 +98,22 @@
     @Override
     @SecurityCheck
     public String addUserProfile(AuthzToken authzToken, UserProfile userProfile) throws UserProfileServiceException, AuthorizationException, TException {
-        try{
+        try {
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+            String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
             // Lowercase user id and internal id
-            userProfile.setUserId(userProfile.getUserId().toLowerCase());
-            userProfile.setAiravataInternalUserId(userProfile.getUserId() + "@" + userProfile.getGatewayId());
-            userProfile = userProfileRepository.updateUserProfile(userProfile, getIAMUserProfileUpdater(authzToken, userProfile));
-            if (null != userProfile) {
-                logger.info("Added UserProfile with userId: " + userProfile.getUserId());
-                // replicate userProfile at end-places
-                dbEventPublisherUtils.publish(EntityType.USER_PROFILE, CrudType.CREATE, userProfile);
-                // return userId
-                return userProfile.getUserId();
-            } else {
-                throw new Exception("User creation failed. Please try again.");
-            }
+            org.apache.custos.user.profile.service.UserProfile profile = userManagementClient.
+                    updateUserProfile(userProfile.getUserId().toLowerCase(),
+                            userProfile.getFirstName(),
+                            userProfile.getLastName(),
+                            userProfile.getEmails().get(0),
+                            custosId);
+
+            String internalUserId = profile.getUsername() + "@" + gatewayId;
+            userProfile.setAiravataInternalUserId(internalUserId);
+            dbEventPublisherUtils.publish(EntityType.USER_PROFILE, CrudType.CREATE, userProfile);
+
+            return profile.getUsername();
         } catch (Exception e) {
             logger.error("Error while creating user profile", e);
             UserProfileServiceException exception = new UserProfileServiceException();
@@ -140,14 +129,22 @@
             // After updating the user profile in the database but before committing the transaction, the
             // following will update the user profile in the IAM service also. If the update in the IAM service
             // fails then the transaction will be rolled back.
-            Runnable iamUserProfileUpdater = getIAMUserProfileUpdater(authzToken, userProfile);
-            if(userProfileRepository.updateUserProfile(userProfile, iamUserProfileUpdater) != null) {
-                logger.info("Updated UserProfile with userId: " + userProfile.getUserId());
-                // replicate userProfile at end-places
-                dbEventPublisherUtils.publish(EntityType.USER_PROFILE, CrudType.UPDATE, userProfile);
-                return true;
-            }
-            return false;
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+            String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+            // Lowercase user id and internal id
+            userManagementClient.
+                    updateUserProfile(userProfile.getUserId().toLowerCase(),
+                            userProfile.getFirstName(),
+                            userProfile.getLastName(),
+                            userProfile.getEmails().get(0),
+                            custosId);
+
+            String internalUserId = userProfile.getUserId() + "@" + gatewayId;
+            userProfile.setAiravataInternalUserId(internalUserId);
+            dbEventPublisherUtils.publish(EntityType.USER_PROFILE, CrudType.UPDATE, userProfile);
+
+            return true;
+
         } catch (Exception e) {
             logger.error("Error while Updating user profile", e);
             UserProfileServiceException exception = new UserProfileServiceException();
@@ -156,29 +153,17 @@
         }
     }
 
-    private Runnable getIAMUserProfileUpdater(AuthzToken authzToken, UserProfile userProfile) throws UserProfileServiceException {
-        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-        return () -> {
-            try {
-                AiravataSecurityManager securityManager = SecurityManagerFactory.getSecurityManager();
-                AuthzToken serviceAccountAuthzToken = securityManager.getUserManagementServiceAccountAuthzToken(gatewayId);
-                IamAdminServices.Client iamAdminServicesClient = getIamAdminServicesClient();
-                iamAdminServicesClient.updateUserProfile(serviceAccountAuthzToken, userProfile);
-            } catch (AiravataSecurityException|TException e) {
-                throw new RuntimeException("Failed to update user profile in IAM service", e);
-            }
-        };
-    }
 
     @Override
     @SecurityCheck
     public UserProfile getUserProfileById(AuthzToken authzToken, String userId, String gatewayId) throws UserProfileServiceException, AuthorizationException, TException {
-        try{
-            UserProfile userProfile = userProfileRepository.getUserProfileByIdAndGateWay(userId, gatewayId);
-            if(userProfile != null)
-                return userProfile;
-            else
-                throw new Exception("User with userId: " + userId + ", in Gateway: " + gatewayId + ", does not exist.");
+        try {
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            UserRepresentation userRepresentation = userManagementClient.getUser(userId, custosId);
+
+            return CustosToAiravataDataModelMapper.transform(userRepresentation, gatewayId);
+
         } catch (Exception e) {
             logger.error("Error retrieving user profile by ID", e);
             UserProfileServiceException exception = new UserProfileServiceException();
@@ -190,19 +175,21 @@
     @Override
     @SecurityCheck
     public boolean deleteUserProfile(AuthzToken authzToken, String userId, String gatewayId) throws UserProfileServiceException, AuthorizationException, TException {
-        try{
-            // find user-profile
-            UserProfile userProfile = userProfileRepository.getUserProfileByIdAndGateWay(userId, gatewayId);
+        try {
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
 
-            // delete user
-            boolean deleteSuccess = userProfileRepository.delete(userId);
-            logger.info("Delete UserProfile with userId: " + userId + ", " + (deleteSuccess? "Success!" : "Failed!"));
+            UserRepresentation userRepresentation = userManagementClient.getUser(userId,custosId);
 
-            if (deleteSuccess) {
-                // delete userProfile at end-places
+            OperationStatus status = userManagementClient
+                    .deleteUser(userId, custosId, authzToken.getAccessToken());
+
+            if (status.getStatus()) {
+                UserProfile userProfile =  CustosToAiravataDataModelMapper.transform(userRepresentation, gatewayId);
+                userProfile.setAiravataInternalUserId(userProfile.getUserId()+"@"+gatewayId);
                 dbEventPublisherUtils.publish(EntityType.USER_PROFILE, CrudType.DELETE, userProfile);
             }
-            return deleteSuccess;
+
+            return status.getStatus();
         } catch (Exception e) {
             logger.error("Error while deleting user profile", e);
             UserProfileServiceException exception = new UserProfileServiceException();
@@ -214,12 +201,24 @@
     @Override
     @SecurityCheck
     public List<UserProfile> getAllUserProfilesInGateway(AuthzToken authzToken, String gatewayId, int offset, int limit) throws UserProfileServiceException, AuthorizationException, TException {
-        try{
-            List<UserProfile> usersInGateway = userProfileRepository.getAllUserProfilesInGateway(gatewayId, offset, limit);
-            if(usersInGateway != null)
-                return usersInGateway;
-            else
-                throw new Exception("There are no users for the requested gatewayId: " + gatewayId);
+        try {
+
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            GetAllUserProfilesResponse response = userManagementClient.getAllUserProfiles(custosId);
+
+            List<org.apache.custos.user.profile.service.UserProfile> userProfiles = response.getProfilesList();
+
+            List<UserProfile> profiles = new ArrayList<>();
+            if (userProfiles != null && !userProfiles.isEmpty()) {
+                for (org.apache.custos.user.profile.service.UserProfile userProfile : userProfiles) {
+                    UserProfile profile = CustosToAiravataDataModelMapper.transform(userProfile, custosId);
+                    profiles.add(profile);
+                }
+            }
+
+            return profiles;
+
         } catch (Exception e) {
             logger.error("Error while retrieving user profile List", e);
             UserProfileServiceException exception = new UserProfileServiceException();
@@ -230,9 +229,14 @@
 
     @Override
     public boolean doesUserExist(AuthzToken authzToken, String userId, String gatewayId) throws UserProfileServiceException, AuthorizationException, TException {
-        try{
-            UserProfile userProfile = userProfileRepository.getUserProfileByIdAndGateWay(userId, gatewayId);
-            return null != userProfile;
+        try {
+            String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+
+            FindUsersResponse response = userManagementClient.findUsers(null, userId, null, null,
+                    null, 0, -1, custosId);
+
+            return !response.getUsersList().isEmpty();
+
         } catch (Exception e) {
             logger.error("Error while finding user profile", e);
             UserProfileServiceException exception = new UserProfileServiceException();
@@ -241,15 +245,5 @@
         }
     }
 
-    private IamAdminServices.Client getIamAdminServicesClient() throws UserProfileServiceException {
-        try {
-            final int serverPort = Integer.parseInt(ServerSettings.getProfileServiceServerPort());
-            final String serverHost = ServerSettings.getProfileServiceServerHost();
-            return ProfileServiceClientFactory.createIamAdminServiceClient(serverHost, serverPort);
-        } catch (IamAdminServicesException|ApplicationSettingsException e) {
-            logger.error("Failed to create IAM Admin Services client", e);
-            UserProfileServiceException ex = new UserProfileServiceException("Failed to create IAM Admin Services client");
-            throw ex;
-        }
-    }
+
 }
diff --git a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/server/ProfileServiceServer.java b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/server/ProfileServiceServer.java
index 48819ff..1533a5f 100644
--- a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/server/ProfileServiceServer.java
+++ b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/server/ProfileServiceServer.java
@@ -150,6 +150,7 @@
             }.start();
         } catch (TTransportException e) {
             setStatus(ServerStatus.FAILED);
+            logger.error("Error while starting the Profile Service Server : "+ e.getMessage());
             throw new Exception("Error while starting the Profile Service Server", e);
         }
     }
diff --git a/airavata-services/profile-service/profile-service-stubs/pom.xml b/airavata-services/profile-service/profile-service-stubs/pom.xml
index bec3f4f..a08739d 100644
--- a/airavata-services/profile-service/profile-service-stubs/pom.xml
+++ b/airavata-services/profile-service/profile-service-stubs/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>profile-service</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-services/profile-service/profile-tenant-core/pom.xml b/airavata-services/profile-service/profile-tenant-core/pom.xml
index a28acd8..4bddd4d 100644
--- a/airavata-services/profile-service/profile-tenant-core/pom.xml
+++ b/airavata-services/profile-service/profile-tenant-core/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>profile-service</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/airavata-services/profile-service/profile-user-core/pom.xml b/airavata-services/profile-service/profile-user-core/pom.xml
index d6b8b0a..e739a5b 100644
--- a/airavata-services/profile-service/profile-user-core/pom.xml
+++ b/airavata-services/profile-service/profile-user-core/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>profile-service</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -52,10 +52,13 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.1</version>
+                <version>3.8.0</version>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                   <release>11</release>
+                    <compilerArgs>
+                        <arg>--add-opens=java.base/java.lang=ALL-UNNAMED</arg>
+                    </compilerArgs>
+                    <fork>true</fork>
                 </configuration>
             </plugin>
             <plugin>
diff --git a/airavata-services/services-security/pom.xml b/airavata-services/services-security/pom.xml
index 10ecc30..ef5baca 100644
--- a/airavata-services/services-security/pom.xml
+++ b/airavata-services/services-security/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>airavata-services</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -57,6 +57,11 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>airavata-sharing-registry-stubs</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
             <version>4.4</version>
@@ -87,9 +92,14 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>custos-java-sdk</artifactId>
+            <version>${org.apache.custos.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.jmockit</groupId>
             <artifactId>jmockit</artifactId>
-            <version>1.39</version>
+            <version>${jmockit.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -98,5 +108,24 @@
             <version>20131018</version>
         </dependency>
     </dependencies>
+    <build>
+    <plugins>
+        <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <version>${surefire.version}</version>
+            <inherited>true</inherited>
+            <configuration>
+                <useSystemClassLoader>false</useSystemClassLoader>
+                <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
 
+                <reuseForks>false</reuseForks>
+                <argLine>
+                    -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
+                </argLine>
+                <testSourceDirectory>${basedir}\src\test\java\</testSourceDirectory>
+            </configuration>
+        </plugin>
+    </plugins>
+    </build>
 </project>
diff --git a/airavata-services/services-security/src/main/java/org/apache/airavata/service/security/GatewayGroupsInitializer.java b/airavata-services/services-security/src/main/java/org/apache/airavata/service/security/GatewayGroupsInitializer.java
index fcc1ae5..8586b11 100644
--- a/airavata-services/services-security/src/main/java/org/apache/airavata/service/security/GatewayGroupsInitializer.java
+++ b/airavata-services/services-security/src/main/java/org/apache/airavata/service/security/GatewayGroupsInitializer.java
@@ -21,21 +21,23 @@
 package org.apache.airavata.service.security;
 
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.utils.AiravataUtils;
+import org.apache.airavata.common.utils.CustosUtils;
 import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.common.utils.ThriftUtils;
-import org.apache.airavata.credential.store.client.CredentialStoreClientFactory;
-import org.apache.airavata.credential.store.cpi.CredentialStoreService;
-import org.apache.airavata.credential.store.exception.CredentialStoreException;
 import org.apache.airavata.model.appcatalog.gatewaygroups.GatewayGroups;
-import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
-import org.apache.airavata.model.credential.store.PasswordCredential;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.registry.api.client.RegistryServiceClientFactory;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
-import org.apache.airavata.sharing.registry.client.SharingRegistryServiceClientFactory;
-import org.apache.airavata.sharing.registry.models.*;
-import org.apache.airavata.sharing.registry.service.cpi.SharingRegistryService;
+import org.apache.airavata.sharing.registry.models.GroupCardinality;
+import org.apache.airavata.sharing.registry.models.GroupType;
+import org.apache.airavata.sharing.registry.models.UserGroup;
+import org.apache.custos.group.management.client.GroupManagementClient;
+import org.apache.custos.iam.service.GroupRepresentation;
+import org.apache.custos.iam.service.GroupsResponse;
+import org.apache.custos.resource.secret.management.client.ResourceSecretManagementClient;
+import org.apache.custos.tenant.management.service.GetTenantResponse;
+import org.apache.custos.tenant.manamgement.client.TenantManagementClient;
+import org.apache.custos.user.profile.service.Group;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,67 +49,67 @@
 
     private final static Logger logger = LoggerFactory.getLogger(KeyCloakSecurityManager.class);
 
-    public static GatewayGroups initializeGatewayGroups(String gatewayId) {
-
-        SharingRegistryService.Client sharingRegistryClient = createSharingRegistryClient();
+    public static GatewayGroups initializeGatewayGroups(String gatewayId, String custosId) {
         RegistryService.Client registryClient = createRegistryClient();
-        CredentialStoreService.Client credentialStoreClient = createCredentialStoreClient();
         try {
-            GatewayGroupsInitializer gatewayGroupsInitializer = new GatewayGroupsInitializer(registryClient, sharingRegistryClient, credentialStoreClient);
-            return gatewayGroupsInitializer.initialize(gatewayId);
+            GroupManagementClient groupManagementClient = CustosUtils
+                    .getCustosClientProvider().getGroupManagementClient();
+            ResourceSecretManagementClient resourceSecretClient = CustosUtils
+                    .getCustosClientProvider().getResourceSecretManagementClient();
+            TenantManagementClient tenantManagementClient = CustosUtils.getCustosClientProvider()
+                    .getTenantManagementClient();
+
+            GatewayGroupsInitializer gatewayGroupsInitializer = new GatewayGroupsInitializer(registryClient,
+                    groupManagementClient, resourceSecretClient, tenantManagementClient);
+            return gatewayGroupsInitializer.initialize(gatewayId, custosId);
         } catch (Exception e) {
             throw new RuntimeException("Failed to initialize a GatewayGroups instance for gateway: " + gatewayId, e);
         } finally {
-            ThriftUtils.close(sharingRegistryClient);
             ThriftUtils.close(registryClient);
-            ThriftUtils.close(credentialStoreClient);
         }
     }
 
     private RegistryService.Client registryClient;
-    private SharingRegistryService.Client sharingRegistryClient;
-    private CredentialStoreService.Client credentialStoreClient;
+    private GroupManagementClient groupManagementClient;
+    private ResourceSecretManagementClient credentialStoreClient;
+    private TenantManagementClient tenantManagementClient;
 
-    public GatewayGroupsInitializer(RegistryService.Client registryClient, SharingRegistryService.Client sharingRegistryClient, CredentialStoreService.Client credentialStoreClient) {
+    public GatewayGroupsInitializer(RegistryService.Client registryClient, GroupManagementClient groupManagementClient,
+                                    ResourceSecretManagementClient credentialStoreClient,
+                                    TenantManagementClient tenantManagementClient) {
 
         this.registryClient = registryClient;
-        this.sharingRegistryClient = sharingRegistryClient;
+        this.groupManagementClient = groupManagementClient;
         this.credentialStoreClient = credentialStoreClient;
+        this.tenantManagementClient = tenantManagementClient;
     }
 
-    public GatewayGroups initialize(String gatewayId) throws TException {
+    public GatewayGroups initialize(String gatewayId, String custosId) throws TException {
 
         logger.info("Creating a GatewayGroups instance for gateway " + gatewayId + " ...");
 
         GatewayGroups gatewayGroups = new GatewayGroups();
         gatewayGroups.setGatewayId(gatewayId);
 
-        String adminOwnerUsername = getAdminOwnerUsername(registryClient, credentialStoreClient, gatewayId);
-        String ownerId = adminOwnerUsername + "@" + gatewayId;
-        if (!sharingRegistryClient.isUserExists(gatewayId, ownerId)) {
-            User adminUser = new User();
-            adminUser.setUserId(ownerId);
-            adminUser.setDomainId(gatewayId);
-            adminUser.setCreatedTime(System.currentTimeMillis());
-            adminUser.setUpdatedTime(System.currentTimeMillis());
-            adminUser.setUserName(adminOwnerUsername);
-            sharingRegistryClient.createUser(adminUser);
-        }
+        GetTenantResponse getTenantResponse = tenantManagementClient.getTenant(custosId);
+
+        String ownerId = getTenantResponse.getAdminUsername();
+
 
         // Gateway Users
-        UserGroup gatewayUsersGroup = createGroup(sharingRegistryClient, gatewayId, ownerId,
+        UserGroup gatewayUsersGroup = createGroup(groupManagementClient, gatewayId, ownerId,
                 "Gateway Users",
-                "Default group for users of the gateway.");
+                "Default group for users of the gateway.", custosId);
         gatewayGroups.setDefaultGatewayUsersGroupId(gatewayUsersGroup.getGroupId());
         // Admin Users
-        UserGroup adminUsersGroup = createGroup(sharingRegistryClient, gatewayId, ownerId,
+        UserGroup adminUsersGroup = createGroup(groupManagementClient, gatewayId, ownerId,
                 "Admin Users",
-                "Admin users group.");
+                "Admin users group.", custosId);
         gatewayGroups.setAdminsGroupId(adminUsersGroup.getGroupId());
         // Read Only Admin Users
-        UserGroup readOnlyAdminsGroup = createGroup(sharingRegistryClient, gatewayId, ownerId,
+        UserGroup readOnlyAdminsGroup = createGroup(groupManagementClient, gatewayId, ownerId,
                 "Read Only Admin Users",
-                "Group of admin users with read-only access.");
+                "Group of admin users with read-only access.", custosId);
         gatewayGroups.setReadOnlyAdminsGroupId(readOnlyAdminsGroup.getGroupId());
 
         registryClient.createGatewayGroups(gatewayGroups);
@@ -116,10 +118,10 @@
     }
 
 
-    private UserGroup createGroup(SharingRegistryService.Client sharingRegistryClient, String gatewayId, String ownerId, String groupName, String groupDescription) throws TException {
+    private UserGroup createGroup(GroupManagementClient groupManagementClient, String gatewayId, String ownerId,
+                                  String groupName, String groupDescription, String custosId) throws TException {
 
         UserGroup userGroup = new UserGroup();
-        userGroup.setGroupId(AiravataUtils.getId(groupName));
         userGroup.setDomainId(gatewayId);
         userGroup.setGroupCardinality(GroupCardinality.MULTI_USER);
         userGroup.setCreatedTime(System.currentTimeMillis());
@@ -128,47 +130,31 @@
         userGroup.setDescription(groupDescription);
         userGroup.setOwnerId(ownerId);
         userGroup.setGroupType(GroupType.DOMAIN_LEVEL_GROUP);
-        sharingRegistryClient.createGroup(userGroup);
 
+        org.apache.custos.user.profile.service.Group groupRepresentation = org.apache.custos.user.profile.service.Group
+                .newBuilder()
+                .setName(groupName)
+                .setDescription(groupDescription)
+                .setOwnerId(ownerId)
+                .build();
+
+        Group groupsResponse = groupManagementClient.createGroup(custosId, groupRepresentation);
+
+        String groupId = groupsResponse.getId();
+        userGroup.setGroupId(groupId);
         return userGroup;
     }
 
-    private String getAdminOwnerUsername(RegistryService.Client registryClient, CredentialStoreService.Client credentialStoreClient, String gatewayId) throws TException {
-
-        GatewayResourceProfile gatewayResourceProfile = registryClient.getGatewayResourceProfile(gatewayId);
-        PasswordCredential credential = credentialStoreClient.getPasswordCredential(
-                    gatewayResourceProfile.getIdentityServerPwdCredToken(), gatewayResourceProfile.getGatewayID());
-        String adminUsername = credential.getLoginUserName();
-        return adminUsername;
-    }
-
-    private static SharingRegistryService.Client createSharingRegistryClient() {
-        final int serverPort = Integer.parseInt(ServerSettings.getSharingRegistryPort());
-        final String serverHost = ServerSettings.getSharingRegistryHost();
-        try {
-            return SharingRegistryServiceClientFactory.createSharingRegistryClient(serverHost, serverPort);
-        } catch (SharingRegistryException e) {
-            throw new RuntimeException("Unable to create sharing registry client...", e);
-        }
-    }
 
     private static RegistryService.Client createRegistryClient() {
         try {
             final int serverPort = Integer.parseInt(ServerSettings.getRegistryServerPort());
             final String serverHost = ServerSettings.getRegistryServerHost();
             return RegistryServiceClientFactory.createRegistryClient(serverHost, serverPort);
-        } catch (ApplicationSettingsException|RegistryServiceException e) {
+        } catch (ApplicationSettingsException | RegistryServiceException e) {
             throw new RuntimeException("Unable to create registry client...", e);
         }
     }
 
-    private static CredentialStoreService.Client createCredentialStoreClient() {
-        try {
-            final int serverPort = Integer.parseInt(ServerSettings.getCredentialStoreServerPort());
-            final String serverHost = ServerSettings.getCredentialStoreServerHost();
-            return CredentialStoreClientFactory.createAiravataCSClient(serverHost, serverPort);
-        } catch (ApplicationSettingsException|CredentialStoreException e) {
-            throw new RuntimeException("Unable to create credential store client...", e);
-        }
-    }
+
 }
diff --git a/airavata-services/services-security/src/main/java/org/apache/airavata/service/security/KeyCloakSecurityManager.java b/airavata-services/services-security/src/main/java/org/apache/airavata/service/security/KeyCloakSecurityManager.java
index 3a1efae..314eee1 100644
--- a/airavata-services/services-security/src/main/java/org/apache/airavata/service/security/KeyCloakSecurityManager.java
+++ b/airavata-services/services-security/src/main/java/org/apache/airavata/service/security/KeyCloakSecurityManager.java
@@ -1,5 +1,4 @@
 /**
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -7,9 +6,9 @@
  * to you 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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
@@ -21,6 +20,7 @@
 
 import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.utils.Constants;
+import org.apache.airavata.common.utils.CustosUtils;
 import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.common.utils.ThriftUtils;
 import org.apache.airavata.credential.store.client.CredentialStoreClientFactory;
@@ -35,16 +35,16 @@
 import org.apache.airavata.registry.api.client.RegistryServiceClientFactory;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.airavata.security.AiravataSecurityException;
-import org.apache.airavata.security.util.TrustStoreManager;
-import org.apache.airavata.service.security.authzcache.AuthzCacheEntry;
-import org.apache.airavata.service.security.authzcache.AuthzCacheIndex;
-import org.apache.airavata.service.security.authzcache.AuthzCacheManager;
-import org.apache.airavata.service.security.authzcache.AuthzCacheManagerFactory;
-import org.apache.airavata.service.security.authzcache.AuthzCachedStatus;
-import org.apache.airavata.sharing.registry.client.SharingRegistryServiceClientFactory;
-import org.apache.airavata.sharing.registry.models.SharingRegistryException;
+import org.apache.airavata.service.security.authzcache.*;
 import org.apache.airavata.sharing.registry.models.UserGroup;
 import org.apache.airavata.sharing.registry.service.cpi.SharingRegistryService;
+import org.apache.custos.group.management.client.GroupManagementClient;
+import org.apache.custos.identity.management.client.IdentityManagementClient;
+import org.apache.custos.identity.service.User;
+import org.apache.custos.sharing.management.client.SharingManagementClient;
+import org.apache.custos.user.management.client.UserManagementClient;
+import org.apache.custos.user.profile.service.GetAllGroupsResponse;
+import org.apache.custos.user.profile.service.Group;
 import org.apache.http.Consts;
 import org.apache.http.HttpHeaders;
 import org.apache.http.NameValuePair;
@@ -67,11 +67,7 @@
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -90,9 +86,9 @@
             "|/airavata/deleteUserComputeResourcePreference|/airavata/deleteUserStoragePreference" +
             "|/airavata/generateAndRegisterSSHKeys|/airavata/getAllCredentialSummaryForUsersInGateway" +
             "|/airavata/deleteSSHPubKey|/airavata/isUserResourceProfileExists";
-    private final static String SHARING_RESOURCE_METHODS = "/airavata/shareResourceWithUsers|/airavata/revokeSharingOfResourceFromUsers" + 
-            "|/airavata/shareResourceWithGroups|/airavata/revokeSharingOfResourceFromGroups|/airavata/getAllAccessibleUsers" + 
-            "|/airavata/getAllAccessibleGroups|/airavata/userHasAccess|/airavata/getAllDirectlyAccessibleUsers" + 
+    private final static String SHARING_RESOURCE_METHODS = "/airavata/shareResourceWithUsers|/airavata/revokeSharingOfResourceFromUsers" +
+            "|/airavata/shareResourceWithGroups|/airavata/revokeSharingOfResourceFromGroups|/airavata/getAllAccessibleUsers" +
+            "|/airavata/getAllAccessibleGroups|/airavata/userHasAccess|/airavata/getAllDirectlyAccessibleUsers" +
             "|/airavata/getAllDirectlyAccessibleGroups";
     private final static String SSH_ACCOUNT_PROVISIONER_METHODS =
             "/airavata/getSSHAccountProvisioners|/airavata/doesUserHaveSSHAccount|/airavata" +
@@ -121,6 +117,11 @@
     private RegistryService.Client registryServiceClient = null;
     private SharingRegistryService.Client sharingRegistryServiceClient = null;
 
+    private SharingManagementClient sharingManagementClient;
+    private GroupManagementClient groupManagementClient;
+    private UserManagementClient userManagementClient;
+    private IdentityManagementClient identityManagementClient;
+
     private static class GatewayGroupMembership {
         private boolean inAdminsGroup = false;
         private boolean inReadOnlyAdminsGroup = false;
@@ -177,7 +178,7 @@
                 "/airavata/createProject|/airavata/updateProject|/airavata/getProject|/airavata/deleteProject|/airavata/getUserProjects|" +
                 "/airavata/searchProjectsByProjectName|/airavata/searchProjectsByProjectDesc|/airavata/searchExperimentsByName|" +
                 "/airavata/searchExperimentsByDesc|/airavata/searchExperimentsByApplication|/airavata/searchExperimentsByStatus|" +
-                "/airavata/searchExperimentsByCreationTime|/airavata/searchExperiments|/airavata/getExperimentStatistics|" +
+                "/airavata/searchExperimentsByCreationTime|/airavata/searchExperiments|" +
                 "/airavata/getExperimentsInProject|/airavata/getUserExperiments|/airavata/createExperiment|/airavata/deleteExperiment|" +
                 "/airavata/getExperiment|/airavata/getDetailedExperimentTree|/airavata/updateExperiment|/airavata/updateExperimentConfiguration|" +
                 "/airavata/updateResourceScheduleing|/airavata/validateExperiment|/airavata/launchExperiment|/airavata/getExperimentStatus|" +
@@ -204,9 +205,11 @@
     public void initializeSecurityInfra() throws AiravataSecurityException {
         try {
             //initialize SSL context with the trust store that contains the public cert of WSO2 Identity Server.
-            TrustStoreManager trustStoreManager = new TrustStoreManager();
-            trustStoreManager.initializeTrustStoreManager(ServerSettings.getTrustStorePath(),
-                    ServerSettings.getTrustStorePassword());
+            this.sharingManagementClient = CustosUtils.getCustosClientProvider().getSharingManagementClient();
+            this.userManagementClient = CustosUtils.getCustosClientProvider().getUserManagementClient();
+            this.groupManagementClient = CustosUtils.getCustosClientProvider().getGroupManagementClient();
+            this.identityManagementClient = CustosUtils.getCustosClientProvider().getIdentityManagementClient();
+
         } catch (Exception e) {
             throw new AiravataSecurityException(e.getMessage(), e);
         }
@@ -226,6 +229,7 @@
         String subject = authzToken.getClaimsMap().get(Constants.USER_NAME);
         String accessToken = authzToken.getAccessToken();
         String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
         String action = "/airavata/" + metaData.get(Constants.API_METHOD_NAME);
         try {
             if (!ServerSettings.isAPISecured()) {
@@ -250,7 +254,7 @@
                 } else if (AuthzCachedStatus.NOT_CACHED.equals(authzCachedStatus)) {
                     logger.debug("Authz decision for: (" + subject + ", " + accessToken + ", " + action + ") is not in the cache. " +
                             "Generating decision based on group membership.");
-                    GatewayGroupMembership gatewayGroupMembership = getGatewayGroupMembership(subject, accessToken, gatewayId);
+                    GatewayGroupMembership gatewayGroupMembership = getGatewayGroupMembership(authzToken, subject, accessToken, gatewayId);
                     boolean authorizationDecision = hasPermission(gatewayGroupMembership, action);
                     //cache the authorization decision
                     long currentTime = System.currentTimeMillis();
@@ -263,7 +267,7 @@
                     throw new AiravataSecurityException("Error in reading from the authorization cache.");
                 }
             } else {
-                GatewayGroupMembership gatewayGroupMembership = getGatewayGroupMembership(subject, accessToken, gatewayId);
+                GatewayGroupMembership gatewayGroupMembership = getGatewayGroupMembership(authzToken, subject, accessToken, gatewayId);
                 return hasPermission(gatewayGroupMembership, action);
             }
 
@@ -303,7 +307,7 @@
             initServiceClients();
             final String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
             final String token = authzToken.getAccessToken();
-            return getUserInfo(gatewayId, token);
+            return getUserInfo(authzToken);
         } catch (Exception e) {
             throw new AiravataSecurityException(e);
         } finally {
@@ -311,71 +315,55 @@
         }
     }
 
-    private UserInfo getUserInfo(String gatewayId, String token) throws Exception {
-        GatewayResourceProfile gwrp = registryServiceClient.getGatewayResourceProfile(gatewayId);
-        String identityServerRealm = gwrp.getIdentityServerTenant();
-        String openIdConnectUrl = getOpenIDConfigurationUrl(identityServerRealm);
-        JSONObject openIdConnectConfig = new JSONObject(getFromUrl(openIdConnectUrl, null));
-        String userInfoEndPoint = openIdConnectConfig.getString("userinfo_endpoint");
-        JSONObject userInfo = new JSONObject(getFromUrl(userInfoEndPoint, token));
+    private UserInfo getUserInfo(AuthzToken authToken) throws Exception {
+        String userId = authToken.getClaimsMap().get(Constants.USER_NAME);
+        String custosId = authToken.getClaimsMap().get(Constants.CUSTOS_ID);
+        User user = identityManagementClient.getUser(custosId, userId, authToken.getAccessToken());
         return new UserInfo()
-                .setSub(userInfo.getString("sub"))
-                .setFullName(userInfo.getString("name"))
-                .setFirstName(userInfo.getString("given_name"))
-                .setLastName(userInfo.getString("family_name"))
-                .setEmailAddress(userInfo.getString("email"))
-                .setUsername(userInfo.getString("preferred_username"));
+                .setSub(user.getSub())
+                .setFullName(user.getFullName())
+                .setFirstName(user.getFirstName())
+                .setLastName(user.getLastName())
+                .setEmailAddress(user.getEmailAddress())
+                .setUsername(user.getUsername());
     }
 
-    private GatewayGroupMembership getGatewayGroupMembership(String username, String token, String gatewayId) throws Exception {
-        validateToken(username, token, gatewayId);
-        GatewayGroups gatewayGroups = getGatewayGroups(gatewayId);
-        List<UserGroup> userGroups = sharingRegistryServiceClient.getAllMemberGroupsForUser(gatewayId, username + "@" + gatewayId);
-        List<String> userGroupIds = userGroups.stream().map(g -> g.getGroupId()).collect(Collectors.toList());
+    private GatewayGroupMembership getGatewayGroupMembership(AuthzToken authzToken, String username, String token, String gatewayId) throws Exception {
+        validateToken(authzToken);
+        String custosId = authzToken.getClaimsMap().get(Constants.CUSTOS_ID);
+        GatewayGroups gatewayGroups = getGatewayGroups(gatewayId, custosId);
+
+        GetAllGroupsResponse getAllGroupsResponse =  groupManagementClient.getAllGroupsOfUser(custosId, username);
+
+        List<String> userGroupIds = new ArrayList<>();
+
+        for (Group gr: getAllGroupsResponse.getGroupsList()) {
+            userGroupIds.add(gr.getId());
+        }
+
         GatewayGroupMembership gatewayGroupMembership = new GatewayGroupMembership();
         gatewayGroupMembership.setInAdminsGroup(userGroupIds.contains(gatewayGroups.getAdminsGroupId()));
         gatewayGroupMembership.setInReadOnlyAdminsGroup(userGroupIds.contains(gatewayGroups.getReadOnlyAdminsGroupId()));
         return gatewayGroupMembership;
     }
 
-    private GatewayGroups getGatewayGroups(String gatewayId) throws Exception {
+    private GatewayGroups getGatewayGroups(String gatewayId, String custosId) throws Exception {
         if (registryServiceClient.isGatewayGroupsExists(gatewayId)) {
             return registryServiceClient.getGatewayGroups(gatewayId);
         } else {
-            return GatewayGroupsInitializer.initializeGatewayGroups(gatewayId);
+            return GatewayGroupsInitializer.initializeGatewayGroups(gatewayId, custosId);
         }
     }
 
-    private void validateToken(String username, String token, String gatewayId) throws Exception {
-        UserInfo userInfo = getUserInfo(gatewayId, token);
+    private void validateToken(AuthzToken authzToken) throws Exception {
+        String username = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        UserInfo userInfo = getUserInfo(authzToken);
         if (!username.equals(userInfo.getUsername())) {
             throw new AiravataSecurityException("Subject name and username for the token doesn't match");
         }
     }
 
-    private String[] getUserRolesFromOAuthToken(String username, String token, String gatewayId) throws Exception {
-        GatewayResourceProfile gwrp = getRegistryServiceClient().getGatewayResourceProfile(gatewayId);
-        String identityServerRealm = gwrp.getIdentityServerTenant();
-        String openIdConnectUrl = getOpenIDConfigurationUrl(identityServerRealm);
-        JSONObject openIdConnectConfig = new JSONObject(getFromUrl(openIdConnectUrl, token));
-        String userInfoEndPoint = openIdConnectConfig.getString("userinfo_endpoint");
-        JSONObject userInfo = new JSONObject(getFromUrl(userInfoEndPoint, token));
-        if (!username.equals(userInfo.get("preferred_username"))) {
-            throw new AiravataSecurityException("Subject name and username for the token doesn't match");
-        }
-        String userId = userInfo.getString("sub");
 
-        String userRoleMappingUrl = ServerSettings.getRemoteIDPServiceUrl() + "/admin/realms/"
-                + identityServerRealm + "/users/"
-                + userId + "/role-mappings/realm";
-        JSONArray roleMappings = new JSONArray(getFromUrl(userRoleMappingUrl, getAdminAccessToken(gatewayId)));
-        String[] roles = new String[roleMappings.length()];
-        for (int i = 0; i < roleMappings.length(); i++) {
-            roles[i] = (new JSONObject(roleMappings.get(i).toString())).get("name").toString();
-        }
-
-        return roles;
-    }
 
     private String getOpenIDConfigurationUrl(String realm) throws ApplicationSettingsException {
         return ServerSettings.getRemoteIDPServiceUrl() + "/realms/" + realm + "/.well-known/openid-configuration";
@@ -400,32 +388,7 @@
         return result.toString();
     }
 
-    private String getAdminAccessToken(String gatewayId) throws Exception {
-        CredentialStoreService.Client csClient = getCredentialStoreServiceClient();
-        GatewayResourceProfile gwrp = getRegistryServiceClient().getGatewayResourceProfile(gatewayId);
-        String identityServerRealm = gwrp.getIdentityServerTenant();
-        String openIdConnectUrl = getOpenIDConfigurationUrl(identityServerRealm);
-        JSONObject openIdConnectConfig = new JSONObject(getFromUrl(openIdConnectUrl, null));
-        PasswordCredential credential = csClient.getPasswordCredential(gwrp.getIdentityServerPwdCredToken(), gwrp.getGatewayID());
-        String username = credential.getLoginUserName();
-        String password = credential.getPassword();
-        String urlString = openIdConnectConfig.getString("token_endpoint");
-        StringBuilder result = new StringBuilder();
-        URL url = new URL(urlString);
-        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-        conn.setRequestMethod("POST");
-        conn.setDoOutput(true);
-        String postFields = "client_id=admin-cli&username=" + username + "&password=" + password + "&grant_type=password";
-        conn.getOutputStream().write(postFields.getBytes());
-        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
-        String line;
-        while ((line = rd.readLine()) != null) {
-            result.append(line);
-        }
-        rd.close();
-        JSONObject tokenInfo = new JSONObject(result.toString());
-        return tokenInfo.get("access_token").toString();
-    }
+
 
     private String getTokenEndpoint(String gatewayId) throws Exception {
         String openIdConnectUrl = getOpenIDConfigurationUrl(gatewayId);
@@ -438,7 +401,7 @@
         CloseableHttpClient httpClient = HttpClients.createSystem();
 
         HttpPost httpPost = new HttpPost(tokenURL);
-        String encoded = Base64.getEncoder().encodeToString((clientId+":"+clientSecret).getBytes(StandardCharsets.UTF_8));
+        String encoded = Base64.getEncoder().encodeToString((clientId + ":" + clientSecret).getBytes(StandardCharsets.UTF_8));
         httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Basic " + encoded);
         List<NameValuePair> formParams = new ArrayList<>();
         formParams.add(new BasicNameValuePair("grant_type", "client_credentials"));
@@ -482,31 +445,16 @@
         return matcher.matches();
     }
 
-    private boolean hasPermission(String[] roles, String apiMethod) {
-        for (int i = 0; i < roles.length; i++) {
-            String role = roles[i];
-            if (this.rolePermissionConfig.keySet().contains(role)) {
-                Pattern pattern = Pattern.compile(this.rolePermissionConfig.get(role));
-                Matcher matcher = pattern.matcher(apiMethod);
-                if (matcher.matches())
-                    return true;
-            }
-        }
-        return false;
-    }
 
     private void initServiceClients() throws TException, ApplicationSettingsException {
         registryServiceClient = getRegistryServiceClient();
-        sharingRegistryServiceClient = getSharingRegistryServiceClient();
     }
 
     private void closeServiceClients() {
         if (registryServiceClient != null) {
             ThriftUtils.close(registryServiceClient);
         }
-        if (sharingRegistryServiceClient != null) {
-            ThriftUtils.close(sharingRegistryServiceClient);
-        }
+
     }
 
     private RegistryService.Client getRegistryServiceClient() throws TException, ApplicationSettingsException {
@@ -519,25 +467,8 @@
         }
     }
 
-    private CredentialStoreService.Client getCredentialStoreServiceClient() throws TException, ApplicationSettingsException {
-        final int serverPort = Integer.parseInt(ServerSettings.getCredentialStoreServerPort());
-        final String serverHost = ServerSettings.getCredentialStoreServerHost();
-        try {
-            return CredentialStoreClientFactory.createAiravataCSClient(serverHost, serverPort);
-        } catch (CredentialStoreException e) {
-            throw new TException("Unable to create credential store client...", e);
-        }
-    }
 
-    private SharingRegistryService.Client getSharingRegistryServiceClient() throws TException, ApplicationSettingsException {
-        final int serverPort = Integer.parseInt(ServerSettings.getSharingRegistryPort());
-        final String serverHost = ServerSettings.getSharingRegistryHost();
-        try {
-            return SharingRegistryServiceClientFactory.createSharingRegistryClient(serverHost, serverPort);
-        } catch (SharingRegistryException e) {
-            throw new TException("Unable to create sharing registry client...", e);
-        }
-    }
+
 
     public static void main(String[] args) throws AiravataSecurityException, ApplicationSettingsException {
         ServerSettings.setSetting("trust.store", "./modules/configuration/server/src/main/resources/client_truststore.jks");
diff --git a/airavata-services/services-security/src/test/java/org/apache/airavata/service/security/GatewayGroupsInitializerTest.java b/airavata-services/services-security/src/test/java/org/apache/airavata/service/security/GatewayGroupsInitializerTest.java
index e98b189..ed46750 100644
--- a/airavata-services/services-security/src/test/java/org/apache/airavata/service/security/GatewayGroupsInitializerTest.java
+++ b/airavata-services/services-security/src/test/java/org/apache/airavata/service/security/GatewayGroupsInitializerTest.java
@@ -23,7 +23,6 @@
 import mockit.Expectations;
 import mockit.Mocked;
 import mockit.Verifications;
-import mockit.integration.junit4.JMockit;
 import org.apache.airavata.credential.store.cpi.CredentialStoreService;
 import org.apache.airavata.model.appcatalog.gatewaygroups.GatewayGroups;
 import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
@@ -37,12 +36,10 @@
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 import java.util.ArrayList;
 import java.util.List;
 
-@RunWith(JMockit.class)
 public class GatewayGroupsInitializerTest {
     public static final String GATEWAY_ID = "test-gateway";
     public static final String IDENTITY_SERVER_PWD_CRED_TOKEN = "identity-server-pwd-cred-token";
diff --git a/airavata-services/services-security/src/test/java/org/apache/airavata/service/security/KeyCloakSecurityManagerTest.java b/airavata-services/services-security/src/test/java/org/apache/airavata/service/security/KeyCloakSecurityManagerTest.java
index ec0f6db..aa29b75 100644
--- a/airavata-services/services-security/src/test/java/org/apache/airavata/service/security/KeyCloakSecurityManagerTest.java
+++ b/airavata-services/services-security/src/test/java/org/apache/airavata/service/security/KeyCloakSecurityManagerTest.java
@@ -22,7 +22,6 @@
 
 import mockit.Expectations;
 import mockit.Mocked;
-import mockit.integration.junit4.JMockit;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.utils.Constants;
 import org.apache.airavata.common.utils.ServerSettings;
@@ -43,7 +42,6 @@
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -55,7 +53,6 @@
 import java.util.List;
 import java.util.Map;
 
-@RunWith(JMockit.class)
 public class KeyCloakSecurityManagerTest {
     public static final String TEST_USERNAME = "test-user";
     public static final String TEST_GATEWAY = "test-gateway";
diff --git a/dev-tools/ansible/apiserver.yml b/dev-tools/ansible/apiserver.yml
index c893ac5..8a22961 100644
--- a/dev-tools/ansible/apiserver.yml
+++ b/dev-tools/ansible/apiserver.yml
@@ -19,9 +19,10 @@
 #
 
 ---
-# Just gather facts on database
-#- hosts: database
-#  gather_facts: True
+# Just gather facts on database to get internal IP address
+- hosts: database
+  gather_facts: True
+
 - hosts: api-orch
   tags: api-orch, airavata
   roles:
diff --git a/dev-tools/ansible/django.yml b/dev-tools/ansible/django.yml
index 6e28ae3..0d90bfa 100644
--- a/dev-tools/ansible/django.yml
+++ b/dev-tools/ansible/django.yml
@@ -19,22 +19,27 @@
 #
 
 ---
-- hosts: database
-  gather_facts: True
-
-# Run the following setup once
-- hosts: django[0]
+# Run the following setup once per server (each server can have one or more Django vhosts)
+- hosts: django
+  tasks:
+    - group_by: key=django_{{ ansible_hostname }}
+- hosts: django
   name: webserver setup
   roles:
-    - env_setup
+    - role: env_setup
+      when: inventory_hostname == groups['django_' +  ansible_hostname][0]
     # Oracle JDK is needed by Django apps that call Java code (e.g., SimCCS Maptool)
-    - java
-    - httpd
+    - role: java
+      when: inventory_hostname == groups['django_' +  ansible_hostname][0]
+    - role: httpd
+      when: inventory_hostname == groups['django_' +  ansible_hostname][0]
+    - role: letsencrypt
+      when: inventory_hostname == groups['django_' +  ansible_hostname][0]
+    - role: django_setup
+      when: inventory_hostname == groups['django_' +  ansible_hostname][0]
 
 # Create a django virtual host
 - hosts: django
-  # Limit to deploying to only 1 host at once. This is to lighten the load during the JavaScript build step.
-  serial: 2
   name: Create/update Django portal for gateway
   roles:
     - django
diff --git a/dev-tools/ansible/helix.yml b/dev-tools/ansible/helix.yml
index 056c1f7..f080958 100644
--- a/dev-tools/ansible/helix.yml
+++ b/dev-tools/ansible/helix.yml
@@ -29,6 +29,8 @@
 - hosts: helix
   tags: helix, airavata
   roles:
+    - env_setup
+    - java
     - role: common
       become: yes
       become_user: "{{user}}"
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/files/airavata.jks b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/files/airavata.jks
new file mode 100644
index 0000000..ddaea75
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/files/airavata.jks
Binary files differ
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/files/client_truststore.jks b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/files/client_truststore.jks
new file mode 100644
index 0000000..a8b6140
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/files/client_truststore.jks
Binary files differ
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/files/cred_store.jks b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/files/cred_store.jks
new file mode 100644
index 0000000..db5c3a2
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/files/cred_store.jks
Binary files differ
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/all/vars.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/all/vars.yml
new file mode 100644
index 0000000..48e3e15
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/all/vars.yml
@@ -0,0 +1,151 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+# NOTE: copied from scigap/production/group_vars/all/vars.yml on 8-28-2017. Variables are added and removed all
+# the time so make sure you have the latest by comparing with scigap/production/group_vars/all/vars.yml
+
+# Update all entries below that have CHANGEME as the value
+
+ansible_connection: ssh
+ansible_user: root
+
+user: airavata
+group: airavata
+user_home: "/home/{{ user }}"
+
+# deployment related variables
+deployment_dir: "{{ user_home }}/RPID-SEAGrid-deployment"
+airavata_source_dir: "{{ user_home }}/RPID-SEAGrid-source"
+airavata_repo: "https://github.com/apache/airavata.git"
+airavata_dist: "apache-airavata-api-server-0.19-SNAPSHOT"
+airavata_dist_name: "{{ airavata_dist }}-bin.tar.gz"
+old_airavata_dist: "apache-airavata-server-0.19-SNAPSHOT"
+git_branch: "RPID+SEAGrid"
+
+# Database related variables
+db_server: "localhost"
+db_server_port: "3306"
+db_user: "airavata"
+db_password: "{{ vault_db_password }}"
+mysql_root_password: "{{ vault_mysql_root_password }}"
+app_catalog: "app_catalog"
+exp_catalog: "experiment_catalog"
+replica_catalog: "replica_catalog"
+sharing_catalog: "sharing_catalog"
+workflow_catalog: "workflow_catalog"
+credential_store: "credential_store"
+profile_service: "profile_service"
+
+django_db_username: "django"
+django_db_password: "{{ vault_db_password }}"
+
+mysql_connector_jar: "mysql-connector-java-5.1.37-bin.jar"
+
+# Rabbitmq related vareables
+rabbitmq_server: "{{ hostvars[groups['rabbitmq'][0]]['ansible_default_ipv4']['address'] }}"
+rabbitmq_vhost: "master"
+rabbitmq_user: "airavata"
+rabbitmq_password: "{{ vault_rabbitmq_password }}"
+rabbitmq_port: "5672"
+rabbitmq_broker_url: "amqp://{{ rabbitmq_user }}:{{ rabbitmq_password }}@{{ rabbitmq_server}}:{{ rabbitmq_port }}/{{ rabbitmq_vhost }}"
+
+# Zoookeeper related variables
+zookeeper_client_port: 2181
+zookeeper_connection_url: "{{ groups['zookeeper'][0] }}:{{ zookeeper_client_port }}"
+
+# API Server related variables
+api_server_name: "apiserver-node0"
+api_server_host: "{{ groups['api-orch'][0] }}"
+# api_server_bind_host: "{{ api_server_host }}"
+api_server_port: "8930"
+api_secured: "false"
+tls_enable: "true"
+api_server_tls_port: "9930"
+enable_sharing: "true"
+iam_server_url: "https://{{ groups['keycloak'][0] }}/auth"
+iam_server_super_admin_username: "admin"
+iam_server_super_admin_password: "{{ vault_iam_server_super_admin_password }}"
+
+# Orchestrator  related variables
+orchestrator_name: "orchestrator-node0"
+orchestrator_host: "{{ groups['api-orch'][0] }}"
+orchestrator_port: "8940"
+api_orch_dir: "{{ deployment_dir }}/api-orchestrator"
+api_orch_log_dir: "{{ api_orch_dir }}/logs"
+# orchestrator_bind_host: "{{ orchestrator_host }}"
+
+# registry related variables
+registry_name: regserver-node0
+registry_host: "{{ groups['api-orch'][0] }}"
+registry_port: 8970
+default_gateway: "default"
+# registry_bind_host: "{{ registry_host }}"
+default_registry_user: "default-admin"
+default_registry_password: "{{ vault_default_registry_password }}"
+
+# Credential and keystore related variables
+keystore_src_path: "{{inventory_dir}}/files/airavata.jks"
+keystore_passwd: "{{ vault_keystore_passwd }}"
+client_truststore_src_path: "{{inventory_dir}}/files/client_truststore.jks"
+client_truststore_passwd: "{{ vault_client_truststore_passwd }}"
+cred_keystore_src_path: "{{inventory_dir}}/files/cred_store.jks"
+cred_keystore_passwd: "{{ vault_cred_keystore_passwd }}"
+cred_keystore_alias: "seckey"
+cred_store_server_host: "{{ groups['api-orch'][0] }}"
+cred_store_port: "8960"
+keystores_location: "{{ deployment_dir }}/keystores"
+# cred_store_server_bind_host: "{{ cred_store_server_host }}"
+
+#removed gfac configurations.
+
+# Monitoring variables
+monitor_email_address: "rpidseagrid2020@gmail.com"
+monitor_email_password: "{{ vault_monitor_email_password }}"
+
+# PGA variables
+pga_repo: "https://github.com/apache/airavata-php-gateway.git"
+user_data_dir: "/data/gateway-user-data"
+airavata_server: "tls://localhost"
+airavata_port: "9930"
+airavata_profile_service_server: "localhost"
+auth_verify_peer: "false"
+oauth_service_url: "{{ iam_server_url }}"
+# pga_default_http_port: 8008
+# pga_default_https_port: 8443
+
+# Sharing Registry related variables
+sharing_registry_host: "{{ groups['api-orch'][0] }}"
+sharing_registry_port: 7878
+# sharing_registry_bind_host: "{{ sharing_registry_host }}"
+
+# Profile Service related variables
+profile_service_host: "{{ groups['api-orch'][0] }}"
+profile_service_port: 8962
+# profile_service_bind_host: "{{ profile_service_host }}"
+
+# Keycloak
+keycloak_ssl_keystore_file: "{{ keystore_src_path }}"
+keycloak_ssl_keystore_password: "{{ keystore_passwd }}"
+keycloak_db_host: "localhost"
+keycloak_db_username: "{{ db_user }}"
+keycloak_db_password: "{{ db_password }}"
+keycloak_master_account_username: "{{ iam_server_super_admin_username }}"
+keycloak_master_account_password: "{{ iam_server_super_admin_password }}"
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/all/vault.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/all/vault.yml
new file mode 100644
index 0000000..11894b1
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/all/vault.yml
@@ -0,0 +1,36 @@
+$ANSIBLE_VAULT;1.1;AES256
+32656162623438336364323639376665336162613733626133633533653534666635313539353130
+3861653565643933343566343437326231613432343437630a616366623933396535623566326461
+31613439616532643432643837623736653138376263643030316237636236383165326539623661
+6636653464346433300a383232303839623730376233666234333762326266383530636536386331
+34346235303562643038303035373835393861356538613332363135623332336535373333386332
+39313436396162633535313833326130373033643234346533386635316164633462333666346338
+63653834353436346632363939373065323933343361666630333436396265656635393161666466
+61323230393033386636373631383631663161646339653934393536303933346563653438393063
+64623062333531303966376563663633623135323536663763323266336566663138633362383237
+30303736343063306339383665333534366632323264653730346434656466313136313036343161
+30663738663534636533636663336263326562656666313932636662346136396139313763616366
+62613933666138646332623633373632343765373562663365626361373434646561313038366338
+31343633383931653735343632363834396138346235666336366463663061363137346365373135
+66346336346661353333613166383937363237383339303364393533323334316565313639663636
+63346266383035646632303264316237383836343933386165373635653634343436326661353831
+62316232373165656135663362663837323738633932633938613765303062656134646266376437
+33666663373936663938353931653530383366393465626133613466323561376539666534353662
+30616238303962613762393433326239666265383866313564323736383438653133343038623533
+35613232643562343363393730633737653835366332373939346636643034316539613033343439
+30393033663335393239643264323134623963303961323365353266396139336261386561333838
+31313133626235633061303662373463666436633332316137636531333536336264376363666135
+64653538663965643137383432613531303137346331613834336134386134353239333134666331
+63313132656666346434303638343266373766383539316636623561316534383263653032633434
+64373139326434303638313365303365303335643034333937363236613866663866383132633839
+61343264626437393736653864396433356333393037333835636438383933306436663337326632
+30643761353764633034623634613731346631623739376632346332633733373636383261343033
+62653332663664386233663432373831656461616235613032616661383936636463656638343664
+65656531396665396132316666623031386436306136666131663861653730613837346564653934
+66366237363930373662383366386336353664636639656165346662333437356333343831346630
+65613933626433333338353739306531313833363563656266306438643966663933343734386333
+38613031303239333438623538313435376531653936653232613662656639343734653733323936
+61616366333831353666363934663933343539663938323133653862386530356138356532326432
+66633138316335663965303734326636363933333861313738323565356231346238396131623238
+31653338336234636534636331346163373130356364393063616235303739373561663264353938
+333664373531653836636437323636313863
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/django/vars.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/django/vars.yml
new file mode 100644
index 0000000..c90c742
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/django/vars.yml
@@ -0,0 +1,36 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+user: "pga"
+group: "pga"
+gateway_data_store_hostname: "pgadev.scigap.org"
+gateway_data_store_resource_id: "pgadev.scigap.org_7ddf28fd-d503-4ff8-bbc5-3279a7c3b99e"
+django_wsgi_processes: 2
+doc_root_dir: "/var/www/portals/django-{{gateway_id}}"
+admin_emails: "[('SGRC Group', 'sgrc-iu-group@iu.edu')]"
+django_error_emails: "[('Marcus Christie', 'machrist@iu.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+django_database_name: "django_{{ inventory_hostname }}"
+db_server: "localhost"
+django_hidden_airavata_apps: "['django_airavata_dataparsers']"
+# django_tus_endpoint: "https://tus.dev.scigap.org/files/"
+airavata_django_git_branch: "RPID+SEAGrid"
+api_server_host: "localhost"
+profile_service_host: "localhost"
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/helix/vars.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/helix/vars.yml
new file mode 100644
index 0000000..7f9b52f
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/helix/vars.yml
@@ -0,0 +1,49 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+helix_version: 0.7.1
+helix_url: http://www-us.apache.org/dist//helix/{{helix_version}}/binaries/helix-core-{{helix_version}}-pkg.tar
+helix_dir: "{{ deployment_dir }}/airavata-helix"
+helix_cluster_name: "AiravataDemoCluster"
+
+snapshot_version: "0.19-SNAPSHOT"
+
+# Listening port for kafka installations
+kafka_listener_port: 9092
+kafka_rest_proxy_listener_port: 8082
+
+# Realtime Monitoring related variables
+realtime_monitor_broker_url: "{{ groups['kafka'][0] }}:{{ kafka_listener_port }}"
+realtime_monitor_broker_publisher: "RealtimeProducer"
+realtime_monitor_broker_consumer_group: "monitor"
+realtime_monitor_broker_topic: "helix-airavata-mq"
+
+# Variables related to the broker in which parsed job statuses are published
+job_monitor_broker_url: "{{ groups['kafka'][0] }}:{{ kafka_listener_port }}"
+job_monitor_broker_topic: "parsed-data"
+job_monitor_broker_consumer_group: "MonitoringConsumer"
+
+# Variables related to parser framework
+parser_broker_url: "{{ groups['kafka'][0] }}:{{ kafka_listener_port }}"
+parser_broker_topic: "completed-messages"
+parser_broker_consumer_group: "ParsingConsumer"
+parser_storage_resource_id: "CHANGEME"
+parser_broker_publisher_id: "ParserProducer"
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/pga/vars.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/pga/vars.yml
new file mode 100644
index 0000000..4c8676f
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/pga/vars.yml
@@ -0,0 +1,70 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+# NOTE: copied from scigap/production/pga_config/seagrid/vars.yml on 8-28-2017. Variables are added and removed all
+# the time so make sure you have the latest by comparing with scigap/production/pga_config/seagrid/vars.yml
+
+# Update all entries below that have CHANGEME as the value
+
+pga_repo: "https://github.com/apache/airavata-php-gateway.git"
+pga_git_branch: "master"
+user: "pga"
+group: "pga"
+doc_root_dir: "/var/www/portals/{{ gateway_id }}"
+vhost_servername: "rpid.scigap.seagrid.org"
+#vhost_serveralias: "CHANGEME"
+# Enable and change the following to enable SSL
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/rpid.scigap.seagrid.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/rpid.scigap.seagrid.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/rpid.scigap.seagrid.org/privkey.pem"
+
+
+## Keycloak related variables
+tenant_domain: "{{ gateway_id }}"
+admin_username: "default-admin"
+admin_password: "{{ vault_default_registry_password }}"
+oauth_client_key: "pga"
+oauth_client_secret: "db863a66-f0cd-45b0-bc44-decd3fd73b79"
+oidc_discovery_url: "https://{{ groups['keycloak'][0] }}/auth/realms/{{ tenant_domain }}/.well-known/openid-configuration"
+
+auth_options:
+  - name: "Airavata"
+    oauth_grant_type: "password"
+oauth_callback_url: "http://{{ vhost_servername }}/callback-url"
+# or if SSL then:
+#oauth_callback_url: "https://{{ vhost_servername }}/callback-url"
+
+gateway_id: "default"
+# relative to document root dir
+experiment_data_dir: "{{ user_data_dir }}/default"
+#gateway_data_store_resource_id: "CHANGEME"
+#gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClwPzT95sK4eA5vuOHe+9cDewjkfBZA0GLt7SfHtJ5Zp/DBWRb5ykobX7JbwJGN9eHmVnW1yL5O708/dLL3y8kT0MjEP5jxZKMSayAiP9c2yN8dved4DIomX3omqsztIcbllei+QM9YvFY7tTtjWFTtAX6WxkZEvzcv2MDTLbgqJ537B4WRRWchXFws98QfDZvlfvdql6BcoZMwDCjdNOl8ZqSTS0PC22+HFesdhMh4mjjNj3Sm2MqxjU8FmSjVlC37dubqS9lZMeKuwsgT1nMjCB8tL+FH5eneNLVKvsvJL4AgQNo84YFi/Gels40zVuCqXVRNsAw/Tn+9sH9JgVx"
+
+## Portal related variables
+super_admin_portal: "true"
+admin_emails: "['eabeysin@iu.edu']"
+#example: admin_emails: "['emailaddress1@example.com', 'emailaddress2@example.com']"
+portal_email_username: "pga.airavata.gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+portal_theme: "base"
+portal_title: "SciGaP Portal"
+...
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/pga/vault.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/pga/vault.yml
new file mode 100644
index 0000000..23f01bb
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/group_vars/pga/vault.yml
@@ -0,0 +1,38 @@
+$ANSIBLE_VAULT;1.1;AES256
+63623062323930623030323661323437383731653539386266613331316661353961366137376661
+3364343530656334306566346565626639623437636431390a303330653530653831626665333364
+63323430326265666562393461376633386534343638633262336636356666373063313634666637
+6634663732356533650a323332376536326563303732303661653564353435326236376436626433
+31633035316333393439323566653061363438393533323731393935646235643162633266303235
+35313235343163383731333531376335646437383235616364663633316632653637623562663138
+32333662616462346161656231393632316434353161643637323164393733383537346462633161
+32623661636463343333613234393332386366613036616463383566343936393137393962373461
+34646234633064613566633066306634616666323466373037636232343034356365663166356630
+64356133656537343937613333366530623832346434616238663230636162396435303863363234
+39623431366139363263336564366234326236663764393363393735613936313761323737383431
+36623663653038613466303231643262353764316334393562326439333935356435376564383466
+61343363376439666337306566336230636433383837613437656538326135323163316136393966
+62323963376439646261343039363736336363313532663466623535333030316239323764646538
+62343036643165356631613134323865346531633331396163643632626164343065636635386239
+30386531333836306135343434313631313530663533396437333161336264663031633764383730
+30383933623435396638616437373932386438303437646637363830316637326266346130303264
+61623566373731306433343236333961343834633962336261316430396534366435336530303566
+62386631303564356435363165626538636235366663366263323066303738333266666465396330
+36313431383662633931363762626562376132666665323735626364346337376435313138636338
+34353062643963653264623735396533393138353837623739636162616639363439376135386262
+35323139323862613530343963303336333638373634653537613632613266393063653832643936
+31393039663336666464616263336531363763336637653635633434373634343364636262636662
+63353133343838333364626436636464343133386237393038663635643362333738353564333133
+31613365653665663233376366333266363465303262386162656662326437393935666631346534
+31353563643334356236353736666462373064666135306634393564623165323465336431373766
+35373163383430326230396232643633363533633461366166326533353837636131643364376533
+33396136363861346539653433353738666162323534303361323030333030323962656135626138
+33326132316336636261663766353332316363626435396663336461633161363335613665633236
+31663736383231386536643635356364376530376138653866376436303739376431386139363735
+65633930333638653836613764626436613562366639373736653134646466333565393432393133
+35663165303963613236653262356162313639366662383630613531653862383232356561313934
+63323664336533393064396233623665653234646137623635396637366237336164653233326534
+65666635396264626362653063383935613564643166353663323131373736393730363134303230
+34633236313837356236643636363561346430616331393730653833383436633863663231306639
+36336635653738373836373437623465393761376562383464303265363639646364393838363564
+61356137616437666537303764333233356438643462616364663731656632366563
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/host_vars/seagrid/vars.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/host_vars/seagrid/vars.yml
new file mode 100644
index 0000000..7b171d7
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/host_vars/seagrid/vars.yml
@@ -0,0 +1,53 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "rpid.seagrid.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/rpid.seagrid.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/rpid.seagrid.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/rpid.seagrid.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "default"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "RPID+SEAGrid"
+#  external:
+#    - name: "CILogon"
+#      idp_alias: "oidc"
+
+gateway_id: "default"
+experiment_data_dir: "{{ user_data_dir }}/django-rpid-seagrid"
+#gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCFgLWSw6Mf0tPbkeSyzPMxgT50cNEXFDiE9UnEx0tIm+is9C3hIK78Ct8NAWgPxdXy1vd/9NBVIqkR516NZ7VyGbUHkrtPLOYL+Of9IyvxOQmrLzTLQNS9yVkxwxykJzBePZySyLcOKQdG8YoNj6+2iRolzfo5/w4Gz+MSqKmPJcVH8hjwTdoE5s0hYU4MaLF966hh6LUH7SG31BcTadtEgnE8nYfxeoa20oj0h0n1LKO06OZgVXVN3iulHimQ1paQiW71X9UPUhgpLnYAiI99BmYOQqEM4IndwZLZPwDeb23A0Dh3bLO8CAPgPRcG5b1Da6kABi5i5gcIt3WCJzeP"
+
+portal_email_host: "smtp.gmail.com"
+portal_email_port: 587
+portal_email_tls: true
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Sudhakar Pamidighantam', 'pamidigs@iu.edu'), ('Eroma Abeysinghe', 'eroma.abeysinghe@gmail.com')]"
+portal_server_email: "{{ portal_email_username }}"
+portal_title: "RPID+SEAGrid Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/host_vars/seagrid/vault.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/host_vars/seagrid/vault.yml
new file mode 100644
index 0000000..68599c8
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/host_vars/seagrid/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+39666537663337636131356663353532313538306465366532653035343638616137306233316466
+6235333364313536396463383035393039373161613030630a393034613033613666316661323230
+38336566643732363130333332346131323835626236656365633462656636313137303132366631
+6130666566633235380a336665343931363966643363366131626436323332383761626132663136
+32386331613534663462626266306637396338386262336234396661323531633662653035323133
+66646536363862313137613930396261386561343936306634646530636463616362306635346439
+65643731326631643164613731326236653932656539666134616633316661376535376537333139
+31366462613035353631303565356235666161646232323231353937663465656461373834333835
+34306562383730313334663738663965643137333763653266626338356133646463353530323231
+62626361663634613536366265383538313764663237356561653935346463376363666231366530
+32306233636131626261326663323736356134303333386361323833333537313031643761393137
+66393465303232343865633335396363626631343931316537303261666232313666383963633239
+33353938306231343438636263373132633864376261376362363666323535343065613439393332
+3738393065366231613433313234386639646464656536386362
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/hosts b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/hosts
new file mode 100644
index 0000000..f5f3e42
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/hosts
@@ -0,0 +1,30 @@
+---
+# inventory file
+# NOTE: update the CHANGEMEs to the actual ip address or hostname.
+
+[zookeeper]
+149.165.157.21 ansible_connection=ssh ansible_user=root
+
+[rabbitmq]
+149.165.157.21 ansible_connection=ssh ansible_user=root
+
+[database]
+149.165.157.21 ansible_connection=ssh ansible_user=root
+
+[api-orch]
+149.165.157.21 ansible_connection=ssh ansible_user=root
+
+[pga]
+149.165.157.21 ansible_user=root
+
+[django]
+seagrid ansible_host=149.165.157.21 ansible_user=root
+
+[keycloak]
+iamdev.rpid.seagrid.org ansible_connection=ssh ansible_user=root
+
+[kafka]
+149.165.157.21 ansible_connection=ssh ansible_user=root
+
+[helix]
+149.165.157.21 ansible_connection=ssh ansible_user=root
\ No newline at end of file
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/pga_config/scigap/vars.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/pga_config/scigap/vars.yml
new file mode 100644
index 0000000..91cc5e4
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/pga_config/scigap/vars.yml
@@ -0,0 +1,57 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+pga_repo: "https://github.com/apache/airavata-php-gateway.git"
+pga_git_branch: "develop"
+user: "pga"
+group: "pga"
+doc_root_dir: "/var/www/portals/dev-scigap"
+vhost_servername: "rpid.scigap.seagrid.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/rpid.scigap.seagrid.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/rpid.scigap.seagrid.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/rpid.scigap.seagrid.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "scigap"
+admin_username: "scigap_admin"
+admin_password: "{{ vault_admin_password }}"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+oauth_grant_type: "password"
+oidc_discovery_url: "https://iamdev.scigap.org/auth/realms/scigap/.well-known/openid-configuration"
+oauth_callback_url: "https://{{ vhost_servername }}/callback-url"
+initial_role_name: "gateway-provider"
+
+gateway_id: "scigap"
+# relative to document root dir
+experiment_data_dir: "{{ user_data_dir }}/dev-scigap"
+# NOTE: scigap portal doesn't make use of the gateway data store, only used to manage other gateways
+gateway_data_store_resource_id: ""
+
+## Portal related variables
+super_admin_portal: "true"
+admin_emails: "['sgrc-iu-group@iu.edu']"
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+portal_theme: "base"
+portal_title: "SciGaP Admin Portal"
+...
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/pga_config/scigap/vault.yml b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/pga_config/scigap/vault.yml
new file mode 100644
index 0000000..8b3b274
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/pga_config/scigap/vault.yml
@@ -0,0 +1,18 @@
+$ANSIBLE_VAULT;1.1;AES256
+66643536656361636339616663393332663862623736333263353739396330333833666336663564
+6332613062363366333265376537656436306438343164380a383362623064383237396433353139
+36323038313235323962613864376562386165353365343430306635383131663636616131323962
+6237356432313434660a346364303238343938376437663939363361336666323234366266666161
+65396434313232323463363965623130333637323134653234383962313566323161626535613533
+32303632633137306436356265386533643634663561366131646234343734656161373463653432
+30336132396634343339323466663132313666343631346430643131363939373564383766356266
+36383336373361333139323038623638633130616330313461656566663164353166373466343232
+37346665663566646562356363376638336330353838646634373633646133653163656138373336
+35346434316466616535393332373839636161363038643937616533306433656335373134313036
+63346462623637643461303364353637623166633235373835306338333435656333633731376461
+35643330323064366137383530346234383266363531346265616530306363383463623234623137
+34343637353430373936393766396135383461323832353165393839653236653135613266376236
+30643438316431373566653639353931323030343030303762376431306231336336633131613963
+65656361363961316338373135333864363766616466376539613061663364353937613664393462
+62323562666634653936323837363738316330353163393632376463336165336439306530363139
+3465
diff --git a/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/templates/pga-vhost.conf.j2 b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/templates/pga-vhost.conf.j2
new file mode 100644
index 0000000..ac8cef9
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/RPID+SEAGrid/templates/pga-vhost.conf.j2
@@ -0,0 +1,26 @@
+{% if vhost_server_redirect is defined %}
+<VirtualHost *:{{pga_default_http_port}}>
+    ServerName {{ vhost_server_redirect }}
+    Redirect "/" "http://{{ vhost_servername }}"
+</VirtualHost>
+{% endif %}
+
+# Add a listen on the non-default port (8008)
+Listen {{pga_default_http_port}}
+
+<VirtualHost *:{{pga_default_http_port}}>
+    ServerName {{ vhost_servername }}
+    {% if vhost_serveralias is defined %}
+    ServerAlias {{ vhost_serveralias }}
+    {% endif %}
+
+    DocumentRoot {{ doc_root_dir }}/public
+    <Directory "{{ doc_root_dir }}/public">
+       AllowOverride All
+       php_value upload_max_filesize {{ php_upload_max_filesize }}
+       php_value post_max_size {{ php_post_max_size }}
+    </Directory>
+    ErrorLog {{ httpd_log_dir[ansible_os_family] }}/{{ gateway_id }}.error.log
+    CustomLog {{ httpd_log_dir[ansible_os_family] }}/{{ gateway_id }}.requests.log combined
+
+</VirtualHost>
diff --git a/dev-tools/ansible/inventories/scigap/develop/files/client_truststore.jks b/dev-tools/ansible/inventories/scigap/develop/files/client_truststore.jks
index 7d09731..f45fc52 100644
--- a/dev-tools/ansible/inventories/scigap/develop/files/client_truststore.jks
+++ b/dev-tools/ansible/inventories/scigap/develop/files/client_truststore.jks
Binary files differ
diff --git a/dev-tools/ansible/inventories/scigap/develop/group_vars/all/vars.yml b/dev-tools/ansible/inventories/scigap/develop/group_vars/all/vars.yml
index 514e355..2cebd1c 100644
--- a/dev-tools/ansible/inventories/scigap/develop/group_vars/all/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/group_vars/all/vars.yml
@@ -27,12 +27,12 @@
 user_home: "/home/{{ user }}"
 
 # deployment related variables
-deployment_dir: "{{ user_home }}/develop-deployment"
-airavata_source_dir: "{{ user_home }}/develop-source"
+deployment_dir: "{{ user_home }}/RPID-SEAGrid-deployment"
+airavata_source_dir: "{{ user_home }}//RPID-SEAGrid-source"
 airavata_repo: "https://github.com/apache/airavata.git"
-airavata_dist: "apache-airavata-api-server-0.19-SNAPSHOT"
+airavata_dist: "apache-airavata-api-server-0.20-SNAPSHOT"
 airavata_dist_name: "{{ airavata_dist }}-bin.tar.gz"
-git_branch: develop
+git_branch: RPID+SEAGrid
 
 # Database related variables
 # FIXME: once we get the entire dev stack on the same network we can use the
@@ -144,13 +144,16 @@
 keycloak_db_password: "{{ vault_keycloak_db_password }}"
 keycloak_master_account_username: "admin"
 keycloak_master_account_password: "{{ vault_keycloak_master_account_password }}"
+keycloak_vhost_servername: "iamdev.scigap.org"
 
 # Helix
 helix_version: 0.7.1
 helix_url: http://www-us.apache.org/dist//helix/{{helix_version}}/binaries/helix-core-{{helix_version}}-pkg.tar
 helix_dir: "{{ deployment_dir }}/airavata-helix"
 helix_cluster_name: "AiravataDevCluster"
-snapshot_version: "0.19-SNAPSHOT"
+snapshot_version: "0.20-SNAPSHOT"
+helix_pre_wm_load_balance_clusters: "false"
+helix_post_wm_load_balance_clusters: "false"
 
 # Listening port for kafka installations
 kafka_listener_port: 9092
@@ -174,4 +177,7 @@
 parser_storage_resource_id: "pgadev.scigap.org_7ddf28fd-d503-4ff8-bbc5-3279a7c3b99e"
 parser_broker_publisher_id: "ParserProducer"
 
+thrift_client_pool_abandoned_removal_enabled: true
+thrift_client_pool_abandoned_removal_logged: true
 
+usage_reporting_key: "{{ vault_usage_reporting_key }}"
diff --git a/dev-tools/ansible/inventories/scigap/develop/group_vars/all/vault.yml b/dev-tools/ansible/inventories/scigap/develop/group_vars/all/vault.yml
index 11b3eff..5d93480 100644
--- a/dev-tools/ansible/inventories/scigap/develop/group_vars/all/vault.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/group_vars/all/vault.yml
@@ -1,34 +1,37 @@
 $ANSIBLE_VAULT;1.1;AES256
-62633563633539333964376337353936303532313039313636636134333831303139366361396465
-6639643834623637663162613062386466633364636337340a646365613739306633363233346539
-63643361303835623035316238646239613964663735333631326262323735376365313534346335
-6665346235316439620a633265316236336330316138666262396338383335343863303939333531
-31393339313831316635616565313038613061393865646530323936303834623230663030626336
-38313930613461623661616533333336393666343266656639383934303362643036333465363338
-31336336316434336537333537366665383439353630663764306265363934626564626462363863
-66313035316636656662333533353264356665376666313631386534383865383734383831303833
-35663962646462643461383034333433343064326139646662643931363063383166613739653333
-39333464343063646638373163366531313830306266633031336432323836356338636530663131
-35623765636462393535643363613635623666643565386535616663373463343039333035623337
-34303061326336656338613839343661303937323366336632373866343266373861353537306562
-64393362623932383464326363363461633734393662643239643138663733643134636332643539
-38396338333934373831343931653266306231656663363139626333653534356130613535643434
-30633963373536626635393635333637316637393838343935333162313162666637303961323066
-37346261643330303664343536633861396139616335386665666639643462313164396365613837
-61313264333162376533333834353231313039343233353332643032613431323633323261373330
-31646532383532666436313764626632366235333665313737326561353463363666653131623564
-36316430383730643135343331343237383239356131643735623237633932636362633361323261
-33636432306532376230636333343838326234323734653765333436323930373635373234313063
-30653661616337363235333837653638383165306538323665386136326534386532346231613765
-30633931343831666464396363646630373866373865373036323536363533633966656635303865
-61383738623638373962656335343464666533393837336139643437323930646163333030336136
-33653963616530646162656439636563373238396439383965646335633064613832653838366362
-64636265343333346166363064616264303734343831326633363932366535643732646435353336
-39323435303638373533633839333262613663646366613638653163643631346230626235636463
-62653763373436353932363939326537656636636665396238313161303438633637363834316164
-34643634373530346533393663303934346561656138636465336434366464393530303864313536
-35653365363037373732386433326332363437353964323630383061663138623736356338366238
-63633465633462393735366538396162356464653538636635636433363531326536333139303062
-66376335356139616565616536336632303338656631396138326533626130633931626163303365
-34653864623765313438653731613165643639316339643265353639616433653731373537316533
-3964
+64373730636638343131656234363134393139343231333961323733316533396231376435613131
+6233643639663536643036656666366532396338653963330a386137343537326164626436633463
+64643531303235336334373839383838626236313164383232663466366537303036663638386338
+3962343332643739650a313635616531663837613136393636613432393433656133303834353532
+37393966313739366639616533333361323232376435613031393639613062393538666462303264
+35323239613434623537633833376430386630396565346363653738653662376539346138313832
+30623934663735346135313364636165376138313063323637313730303132383330333330323461
+35636461666134363432633563336333343765343165616531353461353630373661633834656430
+37303966336162346539353733663535336563626163343435666535356231306532393861633239
+35613664386430636164373131353732666232326263613433343965363262633933343336633535
+64343633656432313134383133616462316232383761376533343238653937616161653061646230
+36393232653863363164333361366263386230333964373537333731343338613437666365653330
+61326535303437643334376432643533626533646634313364386137643065383438373438313563
+66383765333536643330613838353535636566646636393332396631666163366335343435663733
+38346438303332396435303861656533306630656561323866356361326663303933313965303166
+64303331343863343236333165333765383931306665616533356163613537346461396665313433
+63346466363165663465636233393334656166373035333630623665633939326563656561383532
+31626365306364393033366166343762646262373637363662666632386333626137343662396632
+34646436333037663363306162383534393136643230306236353230326432393137613232616665
+65653465393963323130316564643734613831303462636163343735346566343961646636623337
+63303131653739363264376466343837653430616634626236643439373334616337366362316432
+62303137323338353933613533393738356333333536373230343832333331336465616332633562
+61313964303831366439386463353632623832326563396665396132336337363937336230363365
+66316464653631656438323362303663386231363665376131643334376434656432393532326338
+63393836643864626136396263613439386361373730303035356562383539623032663863653237
+39356666343438363331353730313035313362663261343130333961346262633464353638626137
+61383834303666366336313363343633383566633762353865663137613732316566323630336262
+62363763656166323363316261306663643462373636383961626531376238663136316335303061
+31656465373132646437343039323337643033613064663434633931343861393032393530386534
+63396132646262323562646134323432653962653835313164626232656464633638313862366431
+30386564363430363764656135633432653635376237353139383365333039656134353461346665
+37356662323133623764643362336436643332326131353535303664663065653432303133633332
+64346337616162613761663737633135373766356461633965643834313062383639343063613861
+38313835656266633766623231396239373530636264376262633664326466353034343830336263
+31633634346661306433646266646233393339333365336161656663656230643734613034306635
+32623633303461633961
diff --git a/dev-tools/ansible/inventories/scigap/develop/group_vars/django/vars.yml b/dev-tools/ansible/inventories/scigap/develop/group_vars/django/vars.yml
index 2e3064c..194ace4 100644
--- a/dev-tools/ansible/inventories/scigap/develop/group_vars/django/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/group_vars/django/vars.yml
@@ -23,9 +23,12 @@
 group: "pga"
 gateway_data_store_hostname: "pgadev.scigap.org"
 gateway_data_store_resource_id: "pgadev.scigap.org_7ddf28fd-d503-4ff8-bbc5-3279a7c3b99e"
-gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWgLve4J9WCohF/4UnbBZsh/nRkP1aM9FmA1FjKwK2gQAnKwhU+NrbsjW38h2Hi+8s9N2oZ9cCJHrvDi2U0cMxz4exIUBcVoRhw37ThlREHADeKR1FbKw0QLhTyfJb0K+1/8GWRluiFx0vHPptJe0KTqu+RJY0NSe+d/BEuGyCZ1hR+SKNuTgcb05Ia6opbSN5D68N9biseEux60d69ARQxLw+VN3Kr/UaBNpGIAfKLlLSUQlTyPA6G6UKCcJZv+/ye10oa0SK0qtrxMpL+4VJcVx+d56U7CUFWKEgPAaQrX1qdGUNDA7HKmD+EBtzw6DJqNJ0Cue/XuPe/RT62tpf"
-django_wsgi_processes: 2
+django_wsgi_processes: 1
 doc_root_dir: "/var/www/portals/django-{{gateway_id}}"
 admin_emails: "[('SGRC Group', 'sgrc-iu-group@iu.edu')]"
 django_error_emails: "[('Marcus Christie', 'machrist@iu.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
 django_database_name: "django_{{ gateway_id }}"
+django_hidden_airavata_apps: "['django_airavata_dataparsers']"
+django_tus_endpoint: "https://tus.dev.scigap.org/files/"
+airavata_django_git_branch: "develop"
+# django_keycloak_ca_certfile_path: 'os.path.join(BASE_DIR, "django_airavata", "resources", "incommon_rsa_server_ca.pem")'
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/amp/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/amp/vars.yml
new file mode 100644
index 0000000..7167c68
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/amp/vars.yml
@@ -0,0 +1,55 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+# No symlink, user_data_dir is same as real_user_data_dir
+user_data_dir: "{{ real_user_data_dir }}"
+#airavata_django_git_branch: "simccs"
+vhost_servername: "dev.ampgateway.org"
+vhost_ssl: true
+# sudo certbot --apache certonly -d django.simccs.scigap.org
+ssl_certificate_file: "/etc/letsencrypt/live/dev.ampgateway.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/dev.ampgateway.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/dev.ampgateway.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "amp"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Dev AMP"
+  external:
+    - name: "Existing Institute Login"
+      idp_alias: "cilogon"
+
+gateway_id: "amp"
+experiment_data_dir: "{{ user_data_dir }}/django-amp"
+# gateway_data_store_ssh_public_key: "TODO"
+
+portal_email_host: "smtp.gmail.com"
+portal_email_port: 587
+portal_email_tls: true
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+portal_server_email: "{{ portal_email_username }}"
+portal_title: "Dev AMP Gateway"
+...
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/amp/vault.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/amp/vault.yml
new file mode 100644
index 0000000..f773127
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/amp/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+39356230616664346264303637313033653665666332303662323762623939333436353530633536
+6232313462313161336164366538353337326461623936310a626434343066326134303437323437
+36336131316539376366643061373439616430663138396561663033383161643765363164333139
+3437383161653033630a356232366163653863663533636136313562636166666336663736373861
+63376361663137653465313538393664346230313764333961393831633332303335386536313131
+35633864623264633133666465376135663564643833653664666664646461313938303062306161
+37616630396237653633626339646539313335313432363661323437303236643038393139346665
+66316635323863353838393838643763613064633439346565343830376264663064356137326263
+62663233376561663362356332656331653762303031383438313935643338623430373630653839
+64393566306235323931323964356132383036656434313834373234353936326561376264633235
+36313934383565326537353730373035646130313736653533386261396331343435656239653035
+31303039393530653166306336333934343537613230353237323337363135633134393561613236
+62343362313564303063666433633165626362306139333863393335646262333938376561626132
+3165356531646134633839353664626236333761383335366661
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/csbglsu/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/csbglsu/vars.yml
index c8eb595..4d13471 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/csbglsu/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/csbglsu/vars.yml
@@ -41,6 +41,7 @@
 
 gateway_id: "csbglsu"
 experiment_data_dir: "{{ user_data_dir }}/django-csbglsu"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCFlFv/4KuHykIWcOEvTa64ELh9/qNsF6qf11IjrseYp/th8agceygIViFkwfRZzAPj+Vx11Ic+NXKI3aOZjtauUKl+R+iRTMFDX39deV5hyCHPBJTTw7wqltmH/lxJOU0nMaAnQlXmNu+zHEmz0hhkfKn6sQdYFRMb6eDWtZwJqGHzIrZNOs+wxhJ7FBWQ+yDx8akutKEXX5Zka9fnTgOfoWP+ch262uzI/eeJgwuzlu0iFb7IKdHZm3FJEsUaz0W+u+mKY9uxktW16KW4xS2ox7smVUOyuZgxAwThSQjPe2kVZxJNgbN/uSxuGy0pOC+o+8Av/dK4qPI41A/4qKSv"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/cyberwater/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/cyberwater/vars.yml
index b72937e..a6241f6 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/cyberwater/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/cyberwater/vars.yml
@@ -41,6 +41,7 @@
 
 gateway_id: "cyberwater"
 experiment_data_dir: "{{ user_data_dir }}/django-cyberwater"
+# gateway_data_store_ssh_public_key: "TODO"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/delta/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/delta/vars.yml
new file mode 100644
index 0000000..72403e3
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/delta/vars.yml
@@ -0,0 +1,57 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+# No symlink, user_data_dir is same as real_user_data_dir
+user_data_dir: "{{ real_user_data_dir }}"
+#airavata_django_git_branch: "simccs"
+vhost_servername: "dev.delta-topology.org"
+vhost_ssl: true
+# sudo certbot --apache certonly -d django.simccs.scigap.org
+ssl_certificate_file: "/etc/letsencrypt/live/dev.delta-topology.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/dev.delta-topology.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/dev.delta-topology.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "dev-delta"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Dev DELTA"
+#  external:
+#    - name: "Existing Institute Login"
+#      idp_alias: "cilogon"
+
+gateway_id: "dev-delta"
+experiment_data_dir: "{{ user_data_dir }}/django-dev-delta"
+# gateway_data_store_ssh_public_key: "TODO"
+
+portal_email_host: "smtp.gmail.com"
+portal_email_port: 587
+portal_email_tls: true
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+admin_emails: "[('SGRC', 'circ-iu-group@iu.edu')]"
+portal_server_email: "{{ portal_email_username }}"
+portal_title: "Dev DELTA Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/delta/vault.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/delta/vault.yml
new file mode 100644
index 0000000..d7b914f
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/delta/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+61323461333234626436643737323133313661383665626165363430616364633834383136326336
+6563313362623566343834396331323738343931663938310a356564333262643139373633363663
+65626535303736366339356363343463363537666231396531313763326236353061306664373763
+6433323463306234620a643336663830303339323566336563646565636562326163306565643039
+30653766336266656234633734393461373864626661336365613835393137313235623734646438
+38613562366430393065616336613635333764396631613839666431313437376435653531343233
+32623763383736666132316537343132613662303865646562313163343036616132383237643439
+35333666366561303738316163636137353935636437653831393862633232643532363435613064
+66633863646239653632393666366432633931323665346164313063373837633030393733626530
+30656231353136616633326635326265626464646661393437616166666265323666613730623038
+34383031636238663832356236353735303630303238353961323538646162633130656430623235
+62623634356339613234613633336132363765633330383465363033363961306266376236636462
+64613561303661333338343832643734663536383834616165336534313961366465646463363531
+3130393161393630636466336666383164353737383266663238
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/distantr/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/distantr/vars.yml
new file mode 100644
index 0000000..a7acbf7
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/distantr/vars.yml
@@ -0,0 +1,54 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+#airavata_django_git_branch: "simccs"
+vhost_servername: "beta.distantreader.scigap.org"
+vhost_ssl: true
+# sudo certbot --apache certonly -d django.simccs.scigap.org
+ssl_certificate_file: "/etc/letsencrypt/live/beta.distantreader.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/beta.distantreader.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/beta.distantreader.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "distantr"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Distant Reader Gateway"
+#  external:
+#    - name: "Existing Institute Login"
+#      idp_alias: "cilogon"
+
+gateway_id: "distantr"
+experiment_data_dir: "{{ user_data_dir }}/django-distantreader"
+# gateway_data_store_ssh_public_key: "TODO"
+
+portal_email_host: "smtp.gmail.com"
+portal_email_port: 587
+portal_email_tls: true
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Eric Lease Morgan','emorgan@nd.edu')]"
+portal_server_email: "{{ portal_email_username }}"
+portal_title: "Distant Reader Gateway"
+...
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/distantr/vault.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/distantr/vault.yml
new file mode 100644
index 0000000..402ff51
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/distantr/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+39646533613432663934613530333136616130656430363839613630643764356333373666323230
+3036643763336561353431633235393562386331626666310a393338396431376334346131643930
+36313834653264316261616332393061663632346265333836323737366636363362393765346433
+3835326662663630650a646661346166623237633663363939366239396563326538313530666339
+32333165386438643566386133303765383363306136323463306665366135336231386137306334
+61353064653737323435383132626564626162363737346536663462346461393030636338373836
+38323936383335333664353865316134353237636531303236366561333437393037663438633266
+31613464383732343438633364623837633964323665613262313266376635336365353236643139
+39306536366134386564333930323833666235663030383231663462343166386261376238363838
+30313932356532656164333332626338626264343262356361353063636264343066623733373166
+37656164633138363838616531653431613462326133613634656632313466396233633939343431
+35343733353333353265646338346666643963666263343764663931336366346330616237663965
+32393663343966653438613163316166633365353632316662303735303736386337393335343635
+3632333332356537393638363061653834393139353337386135
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/geo/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/geo/vars.yml
new file mode 100644
index 0000000..8152cc7
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/geo/vars.yml
@@ -0,0 +1,56 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+# No symlink, user_data_dir is same as real_user_data_dir
+user_data_dir: "{{ real_user_data_dir }}"
+#airavata_django_git_branch: "simccs"
+vhost_servername: "beta.geogateway.scigap.org"
+vhost_ssl: true
+# sudo certbot --apache certonly -d django.simccs.scigap.org
+ssl_certificate_file: "/etc/letsencrypt/live/beta.geogateway.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/beta.geogateway.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/beta.geogateway.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "beta-geo"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Beta GEO"
+#  external:
+#    - name: "Existing Institute Login"
+#     idp_alias: "cilogon"
+
+gateway_id: "beta-geo"
+experiment_data_dir: "{{ user_data_dir }}/django-geo"
+# gateway_data_store_ssh_public_key: "TODO"
+
+portal_email_host: "smtp.gmail.com"
+portal_email_port: 587
+portal_email_tls: true
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+admin_emails: "[('SGRC', 'sgg@iu.edu')]"
+portal_server_email: "{{ portal_email_username }}"
+portal_title: "Beta GEO Gateway"
+...
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/geo/vault.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/geo/vault.yml
new file mode 100644
index 0000000..134259b
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/geo/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+33643638633466663966303839316236303531303064346635633938613535663431313234643636
+6131383264383263633131646464356539643433356539370a613331633039363534303761393561
+32613539333162633939356239303863383965363464376333366236373265656266663963623733
+3733306230323232340a386435333465613237356463303666653230616566643032333230636533
+32343363643266303664396664376461303337376339303434353331396261363736663034376661
+66303962623738356465643036313865386261323036363437343764666632666230366337616263
+31373735626232333237326535333233386166366637373336383832623661336331383933656532
+62363431353566656332376630313331626237626234653237366462316665386364353634643761
+30343832303963613736343561343539353564666331303935623738353835356230323230383731
+34373064386535383361306364356665306239323232386530336532356430353262653134333332
+39306565323138383631623036613265303066386337356530383238313532313861373934306566
+62633062333737323635633330636363373938316537313165303663306161333835663032333037
+64396434653864663738653861316338333736363239373331323730663763366634383565323138
+3539356466636239643663656239346161323236623564306565
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/interactwel/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/interactwel/vars.yml
index 48bb551..362b1c7 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/interactwel/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/interactwel/vars.yml
@@ -20,12 +20,21 @@
 
 ---
 #airavata_django_git_branch: "simccs"
-vhost_servername: "django.interactwel.scigap.org"
+#vhost_servername: "django.interactwel.scigap.org"
+vhost_servername: "interactwel.org"
+vhost_server_redirect: "www.interactwel.org"
 vhost_ssl: true
 # sudo certbot --apache certonly -d django.simccs.scigap.org
-ssl_certificate_file: "/etc/letsencrypt/live/django.interactwel.scigap.org/cert.pem"
-ssl_certificate_chain_file: "/etc/letsencrypt/live/django.interactwel.scigap.org/fullchain.pem"
-ssl_certificate_key_file: "/etc/letsencrypt/live/django.interactwel.scigap.org/privkey.pem"
+ssl_certificate_file: "/etc/letsencrypt/live/interactwel.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/interactwel.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/interactwel.org/privkey.pem"
+
+interactwel_django_app_branch: "api-integration"
+airavata_django_extra_dependencies:
+  - git+https://github.com/InterACTWEL/interactactwel-django-app.git@{{ interactwel_django_app_branch }}#egg=interactwel-django-app
+
+django_extra_settings:
+  LOGIN_REDIRECT_URL: "/interactwel/#/dashboard"
 
 ## Keycloak related variables
 tenant_domain: "interactwel"
@@ -41,6 +50,9 @@
 
 gateway_id: "interactwel"
 experiment_data_dir: "{{ user_data_dir }}/django-interactwel"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCK+P6aQeRRIUcm2oocxfCyHO9Kl9npX+Fc5f7jaEFgN3SfyYjah69yxvhVAWguRgXIG9xuKvzXmoSeNT0Yk1NoBTFHAtSUDy0KqIXkp5XK2Ocv/W2fblCx8v46amiv5VZToq+YK+P+XfmyfjNEv9WXo9vtIfj2RQlVk3g+GIcCQgkiIxl4XEh7+AknahqWEkzlGeqTBHtwyRXbhuvLf6M4vNoUhxn4aY8DOcJPZF1jnWB+ZiTiNBXRA7Hx/L78RWoHTf50KOO3LQ+AD7727kdIYWM4wVgRzY8pac5bIJ7ncyp//2GiUzSoXSbLV2vZDMz9CM0Ovfpg6P6Q2j5inS0J"
+# Show the Data Parsers app option for Interactwel
+django_hidden_airavata_apps: "[]"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/mines/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/mines/vars.yml
new file mode 100644
index 0000000..4d1a25a
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/mines/vars.yml
@@ -0,0 +1,54 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+#airavata_django_git_branch: "simccs"
+vhost_servername: "django.mines.scigap.org"
+vhost_ssl: true
+# sudo certbot --apache certonly -d django.simccs.scigap.org
+ssl_certificate_file: "/etc/letsencrypt/live/django.mines.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/django.mines.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/django.mines.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "mines"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Mines"
+#  external:
+#    - name: "Existing Institute Login"
+#      idp_alias: "cilogon"
+
+gateway_id: "mines"
+experiment_data_dir: "{{ user_data_dir }}/django-mines"
+# gateway_data_store_ssh_public_key: "TODO"
+
+portal_email_host: "smtp.gmail.com"
+portal_email_port: 587
+portal_email_tls: true
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Matthew T Jones','matjones@mymail.mines.edu')]"
+portal_server_email: "{{ portal_email_username }}"
+portal_title: "Mines Gateway"
+...
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/mines/vault.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/mines/vault.yml
new file mode 100644
index 0000000..71935b6
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/mines/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+63663361373130616432323633626237653131656333333266393731393432393135623561356365
+3163343134306533393737313236353139633962373634360a643164373863623836373762346636
+65393430303034666534376563383132646233363464393430313232386363653039356431623636
+3963353737306536650a613934376331353835663838636363646165396232303865666462363661
+65626364393239346332646637323934653638323836363433346539653838333533376230373239
+39306236303732373037656537356538313265343935363430336535613964666563396464376636
+37623163383633396664666631333038633533636566363061393438366332623566643538353633
+61333563346434326331633265623734343736396138373165396235646562646333646234343238
+30383134376162613434303566663730316338363965336237316463353731613163356463326634
+33646235383933313062366430316265373338633463363734626162393665303839363434303633
+64326264353734646563323931313435366431306338313635363834383366643737323066326339
+64376536336139646664643638363761303836313038386638613634343265346633303533376135
+33343535613731396561383630366337356461323836633838363334396332353437663433356636
+6566343137373438643235303032316430656237333335663362
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/nexttdb/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/nexttdb/vars.yml
index 35b74d5..00fc76b 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/nexttdb/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/nexttdb/vars.yml
@@ -20,12 +20,12 @@
 
 ---
 #airavata_django_git_branch: "simccs"
-vhost_servername: "geochemsim.org"
+vhost_servername: "nexttdb.sciencegateway.scigap.org"
 vhost_ssl: true
 # sudo certbot --apache certonly -d django.simccs.scigap.org
-ssl_certificate_file: "/etc/letsencrypt/live/geochemsim.org/cert.pem"
-ssl_certificate_chain_file: "/etc/letsencrypt/live/geochemsim.org/fullchain.pem"
-ssl_certificate_key_file: "/etc/letsencrypt/live/geochemsim.org/privkey.pem"
+ssl_certificate_file: "/etc/letsencrypt/live/nexttdb.sciencegateway.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/nexttdb.sciencegateway.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/nexttdb.sciencegateway.scigap.org/privkey.pem"
 
 ## Keycloak related variables
 tenant_domain: "nexttdb"
@@ -41,6 +41,7 @@
 
 gateway_id: "nexttdb"
 experiment_data_dir: "{{ user_data_dir }}/django-nexttdb"
+# gateway_data_store_ssh_public_key: "TODO"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/pfec-hydro/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/pfec-hydro/vars.yml
index 6b273a2..8ec0a66 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/pfec-hydro/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/pfec-hydro/vars.yml
@@ -41,6 +41,7 @@
 
 gateway_id: "pfec-hydro"
 experiment_data_dir: "{{ user_data_dir }}/django-pfec-hydro"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCVUiDweafreHh7nN4vabpG0wHrlyYCAObDtjmjP9hist848Y25BP+Rdq+64xHlKmJ1CDDZmjmb9T6JI5JhzYvg0RoD2WxDFcV10y7wamzT7b5TjGK/x11Qwh68qNfAi5amePvkL5oE/HCG95oKityG24EUt3yNOttOLYFnbdnlUXQiDkk1xT/8mbtAPXKnhjopYebwjsK7tYBzGe6YIU0teMA2goWl/6WjTWQBikhSOR1P074qEKzrvqt5mQqVi1HDpHKPP+JA/6upJu2THPNqUw2XuzkwFLkPAjUlnj2NugKTdUZco3lRc2lyjb2OEGuFO6I41WB/xnbBhQOXqDJX"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/saver-x/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/saver-x/vars.yml
index 3dda9ae..ee0184c 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/saver-x/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/saver-x/vars.yml
@@ -41,6 +41,7 @@
 
 gateway_id: "saver-x"
 experiment_data_dir: "{{ user_data_dir }}/django-saver-x"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCXm3BdHBlCa4xX2dgq5NNONElxAla4ijczVnEG+NtxMM6H6joasxAUAlhAKZ4752T8bYGMopKELVKWzhiNELgsOitQcXODh27eAbQ0/DXDy9EEMYYTLzEzj89lpaHjh1HK1BrVCtfhnmHDr7nczQ2ywHroaKKTXfMt8AA0XqUF68bcVxAiqD2LiEFlSOq3ebLpqcD0188gWKT1T1BG1xhiUO+8XyDAdBnFqudGAkvQeTDhODSkVuD+kWZwj6/bfI9YHMqr8hXA6HpRrIrPr3hE6BUYci8y8gmfyJ9oLTo+0gMFzer8K/BMVU+bKZwSTtUZ0Xbr7wf28OH4wuzrhQd3"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/seagrid/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/seagrid/vars.yml
index f8ada41..9b268f7 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/seagrid/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/seagrid/vars.yml
@@ -39,6 +39,7 @@
 
 gateway_id: "seagrid"
 experiment_data_dir: "{{ user_data_dir }}/django-seagrid"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCFgLWSw6Mf0tPbkeSyzPMxgT50cNEXFDiE9UnEx0tIm+is9C3hIK78Ct8NAWgPxdXy1vd/9NBVIqkR516NZ7VyGbUHkrtPLOYL+Of9IyvxOQmrLzTLQNS9yVkxwxykJzBePZySyLcOKQdG8YoNj6+2iRolzfo5/w4Gz+MSqKmPJcVH8hjwTdoE5s0hYU4MaLF966hh6LUH7SG31BcTadtEgnE8nYfxeoa20oj0h0n1LKO06OZgVXVN3iulHimQ1paQiW71X9UPUhgpLnYAiI99BmYOQqEM4IndwZLZPwDeb23A0Dh3bLO8CAPgPRcG5b1Da6kABi5i5gcIt3WCJzeP"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/simccs/files/django-ssl-vhost.conf.j2 b/dev-tools/ansible/inventories/scigap/develop/host_vars/simccs/files/django-ssl-vhost.conf.j2
index b6be6da..6090cd1 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/simccs/files/django-ssl-vhost.conf.j2
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/simccs/files/django-ssl-vhost.conf.j2
@@ -38,6 +38,7 @@
 
 <VirtualHost *:{{ httpd_default_https_port }}>
     ServerName {{ vhost_servername }}
+    TimeOut {{ vhost_timeout }}
 
     # Reverse proxy to geoserver on gf8
     ProxyPass /geoserver "http://gf8.ucs.indiana.edu/geoserver"
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/simccs/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/simccs/vars.yml
index 25be00a..e589295 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/simccs/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/simccs/vars.yml
@@ -19,20 +19,26 @@
 #
 
 ---
+# simccs_maptool_branch: "issue-50-Use-national-cost-surface-for-from-scratch-scenarios"
+simccs_maptool_branch: "dev"
 airavata_django_extra_dependencies:
   # Need to separately install cython in the VM or do two deploys, one with
   # just cython, then a second with the other dependencies. Reason: pyjnius
   # requires that cython already be installed and they can't both be installed
   # at the same time.
   - cython
-  - git+https://github.com/SciGaP/simccs-maptool.git#egg=simccs-maptool
+  - "git+https://github.com/SciGaP/simccs-maptool.git@{{ simccs_maptool_branch }}#egg=simccs-maptool"
   - pyjnius
-vhost_servername: "beta.simccs.org"
+# vhost_servername: "beta.simccs.org"
+# Temporary use a *.scigap.org domain name
+vhost_servername: "beta.simccs.scigap.org"
 vhost_ssl: True
+# Some of the maptool views call into Java code and can take 2-3 minutes to execute
+vhost_timeout: 300
 # sudo certbot --apache certonly -d django.simccs.scigap.org
-ssl_certificate_file: "/etc/letsencrypt/live/beta.simccs.org/cert.pem"
-ssl_certificate_chain_file: "/etc/letsencrypt/live/beta.simccs.org/fullchain.pem"
-ssl_certificate_key_file: "/etc/letsencrypt/live/beta.simccs.org/privkey.pem"
+ssl_certificate_file: "/etc/letsencrypt/live/{{ vhost_servername }}/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/{{ vhost_servername }}/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/{{ vhost_servername }}/privkey.pem"
 # Custom vhost config file to specify the geoserver reverse proxy
 django_ssl_vhost_template: "{{ inventory_dir }}/host_vars/simccs/files/django-ssl-vhost.conf.j2"
 
@@ -50,9 +56,14 @@
 
 django_extra_settings:
   JAVA_HOME: "/usr/java/default"
+  MAPTOOL_SETTINGS:
+    CPLEX_APPLICATION_ID: "Cplex_a7eaf483-ab92-4441-baeb-2f302ccb2919"
+    DATASETS_DIR: "/data/gateway-user-data/simccs-datasets"
+    JAVA_OPTIONS: "-Xmx13g"
 
 gateway_id: "simccs"
 experiment_data_dir: "{{ user_data_dir }}/django-simccs"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuylY2GrNiS6ylc4a0qfnNHEUHq9kzCg4yrNmK6O5KTIDN8SdUvVQ9BMx1jPnc9WZEFhvGvUvY1vqM/X0NZ5CS2wXs0LYxucL8Qz1YTJ2p55p0+5ImsaxZa/R4JlAaNeI1IFuR3bgBkjH92KzJha8UFko18md7M72wio1w4Mwq2sCC0g9Iuni04uSSps4BL0hA/lopeRSwzIE0aRT6mVe+vZ73+LfA39e0jJLbcbyhhGUKqUu1YThKo5UIlaz6VMyr0L+NuR5ng21Fyp7C0vdGkOoxIBAX7NcuUnKD6P0rBG7QvzHYTxjGivyjFNE3vjTH40iiSPdQ7nw/+PKpo/C9"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/simvascular/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/simvascular/vars.yml
index 8b081a4..d90ff44 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/simvascular/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/simvascular/vars.yml
@@ -39,6 +39,7 @@
 
 gateway_id: "simvascular"
 experiment_data_dir: "{{ user_data_dir }}/simvascular"
+# gateway_data_store_ssh_public_key: "TODO"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/host_vars/usd/vars.yml b/dev-tools/ansible/inventories/scigap/develop/host_vars/usd/vars.yml
index 81d29b8..b4a5a24 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/usd/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/usd/vars.yml
@@ -22,10 +22,9 @@
 #airavata_django_git_branch: "simccs"
 vhost_servername: "beta.sciencegateway.usd.edu"
 vhost_ssl: true
-# sudo certbot --apache certonly -d django.simccs.scigap.org
-ssl_certificate_file: "/etc/letsencrypt/live/beta.sciencegateway.usd.edu/cert.pem"
-ssl_certificate_chain_file: "/etc/letsencrypt/live/beta.sciencegateway.usd.edu/fullchain.pem"
-ssl_certificate_key_file: "/etc/letsencrypt/live/beta.sciencegateway.usd.edu/privkey.pem"
+ssl_certificate_file: "/etc/pki/tls/certs/__sciencegateway_usd_edu_cert.cer"
+ssl_certificate_chain_file: "/etc/pki/tls/certs/__sciencegateway_usd_edu_interm.cer"
+ssl_certificate_key_file: "/etc/pki/tls/private/usd.key"
 
 ## Keycloak related variables
 tenant_domain: "usd"
@@ -43,6 +42,7 @@
 
 gateway_id: "usd"
 experiment_data_dir: "{{ user_data_dir }}/django-usd"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCddtn5FW08tc1anCFYYzD/DqyCFL4prZ0dU+wWBnoxMQOV5vM6yZUKAErmWQOInWQeMDXvznsmyeTcg04FjE+t7xV0NeJ3YEpeayxObOF4oSHTmUAaM+taF+7dSXT+SUgwVOsYaOkCJRVNqkpu1KireN6L2y53j4tmXQTCWgWOQre3a2hLVFqI6JDVVj3Cquq0muSK8wdaYSrwBMwqQ0eJCGPvyhrMNJ/YmADS6GaztZOc+YJGC1jEeKNdrSPV5a8pbHgjZsqjRDDLAeCS5d0kK17P79LUX/Ui1m8wq7HgzWULZPh8zoUYPKjgVjHndB5e6nKsWgLgTyI64Gmy4ETp"
 
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/develop/hosts b/dev-tools/ansible/inventories/scigap/develop/hosts
index 22e10409..9184ea6 100644
--- a/dev-tools/ansible/inventories/scigap/develop/hosts
+++ b/dev-tools/ansible/inventories/scigap/develop/hosts
@@ -33,6 +33,11 @@
 saver-x ansible_host=149.165.156.46
 pfec-hydro ansible_host=149.165.156.46
 cyberwater ansible_host=149.165.156.46
+mines ansible_host=149.165.156.46
+distantr ansible_host=149.165.156.46
+amp ansible_host=149.165.169.129
+geo ansible_host=149.165.156.46
+delta ansible_host=149.165.169.250
 
 [helix]
 149.165.157.37
diff --git a/dev-tools/ansible/inventories/scigap/dreg-production/group_vars/all/vars.yml b/dev-tools/ansible/inventories/scigap/dreg-production/group_vars/all/vars.yml
new file mode 100644
index 0000000..6b260f5
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/dreg-production/group_vars/all/vars.yml
@@ -0,0 +1,30 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+user_data_dir: "/var/www/portals/gateway-user-data"
+real_user_data_dir: "/data/gateway-user-data"
+## Airavata Client related variables
+airavata_server: "tls://{{ groups['api-orch'][0] }}"
+airavata_port: "9930"
+airavata_profile_service_server: "{{ groups['api-orch'][0] }}"
+oauth_service_url: "https://iam.scigap.org/auth"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/dreg-production/group_vars/pga/vars.yml b/dev-tools/ansible/inventories/scigap/dreg-production/group_vars/pga/vars.yml
index e1dcb64..fa3b4a5 100644
--- a/dev-tools/ansible/inventories/scigap/dreg-production/group_vars/pga/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/dreg-production/group_vars/pga/vars.yml
@@ -61,6 +61,7 @@
 experiment_data_dir: "{{ user_data_dir }}/cornell-dnasequence"
 gateway_data_store_resource_id: "js-156-72.jetstream-cloud.org_758cf5c0-71f4-4268-bb42-5ede23cfeea9"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCTs6k2lSt5nn+UF3N1rAko9WjdtHZ1xLcKxCG4+4AVMdTIeng12g+1qB5hIFiDgesT/D/nzoA27EFj5nWiYanxBySNgl1Re8kR0nEqQbR0zj1dSibmfjW+vmOZzEiNSrNoLlc4KbFgqFCRGIlZ1bWZ7yHtJ3I7xxfKhvvxCTzJ4K71v1aovnDTUYophy2lUsdOcOq84Qhv3ITZafgblz3mJSwVpnnI72IepzonzDUdcf/w0lKCl70L9MgQAZ2V4e9sQZWJLI5s1VtJsqKggtgI4goPyxXROoH9PTUZFqvvYjLGW8JVS9eZKblSKil09yckPfZCSk1i/UD/uY6O7bjf"
+group_resource_profile_id: "93f2b6f9-8012-4d00-afa2-52bfba9bc954"
 
 ## Portal related variables
 super_admin_portal: "false"
@@ -71,4 +72,6 @@
 portal_theme: "dreg"
 portal_title: "dREG DNA Sequencing"
 pga_google_analytics_id: "UA-111528347-3"
+pga_airavata_django_url: "https://django.dreg.scigap.org"
+pga_reroute_to_django: true
 ...
diff --git a/dev-tools/ansible/inventories/scigap/dreg-production/hosts b/dev-tools/ansible/inventories/scigap/dreg-production/hosts
index 7ec9a26..17bfc20 100644
--- a/dev-tools/ansible/inventories/scigap/dreg-production/hosts
+++ b/dev-tools/ansible/inventories/scigap/dreg-production/hosts
@@ -1,23 +1,11 @@
 ---
 # inventory file : scigap production deployment
 
-[zookeeper]
-scigap07.sciencegateways.iu.edu ansible_user=root
-
-[rabbitmq]
-scigap06.sciencegateways.iu.edu ansible_user=root
-
 [database]
-scigap05.sciencegateways.iu.edu ansible_user=root
+scigap01.sciencegateways.iu.edu ansible_user=root
 
 [api-orch]
-scigap06.sciencegateways.iu.edu ansible_user=root
-
-[helix]
-scigap07.sciencegateways.iu.edu ansible_user=root
-
-[kafka]
-scigap07.sciencegateways.iu.edu ansible_user=root
+scigap02.sciencegateways.iu.edu ansible_user=root
 
 [pga]
 # Hosted on Jetstream
diff --git a/dev-tools/ansible/inventories/scigap/pfec-hydro-production/group_vars/all/vars.yml b/dev-tools/ansible/inventories/scigap/pfec-hydro-production/group_vars/all/vars.yml
new file mode 100644
index 0000000..6b260f5
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/pfec-hydro-production/group_vars/all/vars.yml
@@ -0,0 +1,30 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+user_data_dir: "/var/www/portals/gateway-user-data"
+real_user_data_dir: "/data/gateway-user-data"
+## Airavata Client related variables
+airavata_server: "tls://{{ groups['api-orch'][0] }}"
+airavata_port: "9930"
+airavata_profile_service_server: "{{ groups['api-orch'][0] }}"
+oauth_service_url: "https://iam.scigap.org/auth"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/pfec-hydro-production/group_vars/pga/vars.yml b/dev-tools/ansible/inventories/scigap/pfec-hydro-production/group_vars/pga/vars.yml
index afebcfd..55d3386 100644
--- a/dev-tools/ansible/inventories/scigap/pfec-hydro-production/group_vars/pga/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/pfec-hydro-production/group_vars/pga/vars.yml
@@ -33,13 +33,14 @@
 user: "pga"
 group: "pga"
 doc_root_dir: "/var/www/portals/{{ gateway_id }}"
-vhost_servername: "futurewater.scigap.org"
+vhost_servername: "gateway.futurewater.indiana.edu"
+#vhost_servername: "futurewater.scigap.org"
 #vhost_serveralias: "www.mines.scigap.org"
 vhost_ssl: true
 # TODO: have Ansible manage these files as well
-ssl_certificate_file: "/etc/letsencrypt/live/futurewater.scigap.org/cert.pem"
-ssl_certificate_chain_file: "/etc/letsencrypt/live/futurewater.scigap.org/fullchain.pem"
-ssl_certificate_key_file: "/etc/letsencrypt/live/futurewater.scigap.org/privkey.pem"
+ssl_certificate_file: "/etc/letsencrypt/live/gateway.futurewater.indiana.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/gateway.futurewater.indiana.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/gateway.futurewater.indiana.edu/privkey.pem"
 
 php_upload_max_filesize: "6000M"
 php_post_max_size: "15000M"
@@ -66,13 +67,16 @@
 experiment_data_dir: "{{ user_data_dir }}/{{ gateway_id }}"
 gateway_data_store_resource_id: "js-171-92.jetstream-cloud.org_1a76397d-cc28-4ec9-82e8-d27c5cf80c79"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9qczDIVUhTxPmMsvF2J/NGIWo35HDgm3IUL41w1bUi5FX3CzuKwWtBh6IGoY4l+ibvWiRw2w9+MLWPhAWglLjXXekHCc/C5LuU8qi6zGZgQfD6U4yFpHXmkZLUHt30iKbLJXgypy7MaQ4n3sWDXJe2Dbsc4FMSK+KXFQ5KNZ/meOCCurEswcDyz4Mrvf9ZSZWzq6vPTXtdHo+/oRMmiGNZqhcBkqIWfz5alzyq4HTAidz5uc6fD8mqj1hg87qywv6OwMUAxB84S8glcLs5ZzuTbpGl3sdftVH9zqabx6eAGXX9V389qdLp1k//u45ph+INOk11HFCCxmh/YmqQM9f"
+group_resource_profile_id: "f5000275-61c9-4abc-973b-6168d4e8c63b"
 
 ## Portal related variables
 super_admin_portal: "false"
 admin_emails: "['sgrc-iu-group@iu.edu','brandjen@iu.edu']"
 portal_email_username: "pga.airavata@gmail.com"
 portal_email_password: "{{ vault_portal_email_password }}"
-#portal_theme: "qusp-gateway-theme"
-#portal_theme_repo: "https://github.com/SciGaP/qusp-gateway-theme.git"
+portal_theme: "futurewater-gateway-theme"
+portal_theme_repo: "https://github.com/SciGaP/futurewater-gateway-theme.git"
 portal_title: "Future Water Gateway"
+pga_airavata_django_url: "https://django.futurewater.scigap.org"
+pga_reroute_to_django: true
 ...
diff --git a/dev-tools/ansible/inventories/scigap/pfec-hydro-production/hosts b/dev-tools/ansible/inventories/scigap/pfec-hydro-production/hosts
index 4482b88..ba6cf3b 100644
--- a/dev-tools/ansible/inventories/scigap/pfec-hydro-production/hosts
+++ b/dev-tools/ansible/inventories/scigap/pfec-hydro-production/hosts
@@ -1,23 +1,11 @@
 ---
 # inventory file : scigap production deployment
 
-[zookeeper]
-scigap07.sciencegateways.iu.edu ansible_user=root
-
-[rabbitmq]
-scigap06.sciencegateways.iu.edu ansible_user=root
-
 [database]
-scigap05.sciencegateways.iu.edu ansible_user=root
+scigap01.sciencegateways.iu.edu ansible_user=root
 
 [api-orch]
-scigap06.sciencegateways.iu.edu ansible_user=root
-
-[helix]
-scigap07.sciencegateways.iu.edu ansible_user=root
-
-[kafka]
-scigap07.sciencegateways.iu.edu ansible_user=root
+scigap02.sciencegateways.iu.edu ansible_user=root
 
 [pga]
 # Hosted on Jetstream
diff --git a/dev-tools/ansible/inventories/scigap/production/files/client_truststore.jks b/dev-tools/ansible/inventories/scigap/production/files/client_truststore.jks
index 14967c6..a5939c8 100644
--- a/dev-tools/ansible/inventories/scigap/production/files/client_truststore.jks
+++ b/dev-tools/ansible/inventories/scigap/production/files/client_truststore.jks
Binary files differ
diff --git a/dev-tools/ansible/inventories/scigap/production/group_vars/all/vars.yml b/dev-tools/ansible/inventories/scigap/production/group_vars/all/vars.yml
index 5647467..1ccaecd 100644
--- a/dev-tools/ansible/inventories/scigap/production/group_vars/all/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/group_vars/all/vars.yml
@@ -20,7 +20,7 @@
 
 ---
 ansible_connection: ssh
-ansible_user: centos
+ansible_user: root
 
 user: airavata
 group: airavata
@@ -30,7 +30,7 @@
 deployment_dir: "{{ user_home }}/master-deployment"
 airavata_source_dir: "{{ user_home }}/master-source"
 airavata_repo: "https://github.com/apache/airavata.git"
-airavata_dist: "apache-airavata-api-server-0.18-SNAPSHOT"
+airavata_dist: "apache-airavata-api-server-0.19-SNAPSHOT"
 airavata_dist_name: "{{ airavata_dist }}-bin.tar.gz"
 git_branch: master
 
@@ -48,6 +48,9 @@
 credential_store: "credential_store"
 profile_service: "profile_service"
 
+django_db_username: "django"
+django_db_password: "{{ vault_db_password }}"
+
 # Rabbitmq related vareables
 rabbitmq_server: "{{ groups['rabbitmq'][0] }}"
 rabbitmq_vhost: "master"
@@ -64,7 +67,7 @@
 api_server_name: "apiserver-node0"
 api_server_host: "{{ groups['api-orch'][0] }}"
 api_server_port: "8930"
-api_secured: "false"
+api_secured: "true"
 tls_enable: "true"
 api_server_tls_port: "9930"
 enable_sharing: "true"
@@ -130,19 +133,21 @@
 keycloak_db_password: "{{ vault_keycloak_db_password }}"
 keycloak_master_account_username: "AiravataAdmin"
 keycloak_master_account_password: "{{ vault_keycloak_master_account_password }}"
+keycloak_vhost_servername: "iam.scigap.org"
 
 # Helix
 helix_version: 0.7.1
 helix_url: http://www-us.apache.org/dist//helix/{{helix_version}}/binaries/helix-core-{{helix_version}}-pkg.tar
 helix_dir: "{{ deployment_dir }}/airavata-helix"
 helix_cluster_name: "AiravataDemoCluster"
-snapshot_version: "0.18-SNAPSHOT"
+snapshot_version: "0.19-SNAPSHOT"
 helix_controller_name: "helixcontroller"
 helix_participant_name: "helixparticipant"
 helix_pre_wm_name: "prewm"
 helix_pre_wm_load_balance_clusters: "false"
 helix_post_wm_name: "postwm"
 helix_post_wm_load_balance_clusters: "false"
+local_data_location: "/home/airavata/temp-storage"
 
 # Listening port for kafka installations
 kafka_listener_port: 9092
@@ -164,3 +169,15 @@
 platform_monitor_email_address: "airavataplatformmonitor@gmail.com"
 platform_monitor_email_password: "{{ vault_platform_monitor_email_password }}"
 platform_monitor_target_email_addresses: "dimuthu.upeksha2@gmail.com,dwannipu@iu.edu"
+
+thrift_client_pool_abandoned_removal_enabled: true
+thrift_client_pool_abandoned_removal_logged: false
+
+# Variables related to parser framework
+parser_broker_url: "{{ groups['kafka'][0] }}:{{ kafka_listener_port }}"
+parser_broker_topic: "completed-messages"
+parser_broker_consumer_group: "ParsingConsumer"
+parser_storage_resource_id: "pgadev.scigap.org_7ddf28fd-d503-4ff8-bbc5-3279a7c3b99e"
+parser_broker_publisher_id: "ParserProducer"
+
+usage_reporting_key: "{{ vault_usage_reporting_key }}"
diff --git a/dev-tools/ansible/inventories/scigap/production/group_vars/all/vault.yml b/dev-tools/ansible/inventories/scigap/production/group_vars/all/vault.yml
index 4efff11..ec1af56 100644
--- a/dev-tools/ansible/inventories/scigap/production/group_vars/all/vault.yml
+++ b/dev-tools/ansible/inventories/scigap/production/group_vars/all/vault.yml
@@ -1,35 +1,38 @@
 $ANSIBLE_VAULT;1.1;AES256
-32326532653963626434326231373439623237396363643165653230356533386166373431313939
-3131616564656133373730353234616439613730643766620a323637666366313063643333363438
-64303438393332666538383963626539393062386438646363656533323434346538376161363665
-3831356362343964300a343561663930363535366562313337663331376339306132323762383737
-39646638303462383862303366626134333330623938616231363538353837333231336162396134
-35656237313762363331643936376533313236393561333463636261373332343961646162663930
-38333965653535346262383936656361643364346632376439636261396131393531643861393561
-31303434333036636637303162343833336338326239623134646133666337333433313632643438
-62373733346437393334376235343933626162303631393037376638373566633734643333303265
-39333636626338633033626663663337643831666135316461663639613634303738613235646336
-37663766663636666630383236356335303137626633393934323537666261613662623534366464
-38333166613335653838393530636636303564313334326463363532623834323733613433316363
-64303762653330643037363433326639323561313539653930363538616331323961626231663836
-39366335666364623133313933636636366433303036653263383463303034333965373965636531
-36383438396563303938326438323431343835373935613162323766653437353664656566613665
-65373364636230376162333732346634613861356638646634323538316535396539333533303438
-32333364336561396365333365623936613963373932313735363738386430353263663434656339
-33366534376535346538633961623935663634393334316463313531346565363333316439353237
-64306161613339393037316361323362613431613761326266316135613732363831613031386235
-36346233643431636165336536306234393538616263636561626665343139303266353861393639
-35343462326563343533643564623765616537666466613935643166653831356565373762313265
-66363433306432343165643565393062333135343264666538356166653263353163313535643262
-30636566383730383935323434613338623964323733643435366333646430626337643165306235
-38613038333339376335623161373034666564623763643563323935333337343334346566626264
-32356232383933346266313232363164346333313130636566313631333234333762303835363663
-65646435333834363063343635316332623332336331643263386363633361643432616563346665
-35643231653635366661383630303965356364653634616534373165646434363331636165373863
-64636234323265623139313931613739663765326434633539613839343236333262393135656432
-39363465333339363738306665323562376338303230343032663334656439643064366430633134
-32333436363536336465386561626236643036353239306634313663343831393765313637393362
-39643332336562333639646631626633323437616630323832383661666537303461646563396663
-39346235376432303334393536313061333161656232343466386632303037386362306332663934
-66613230633064313834333538313565616534623130353766326661346338353233646162623963
-3238303031303061636337343034633335333439666165653433
+65383931663535343139353066623239633637383135636234353837386263316264616639393235
+3030633763636133633166356464306334333962353531340a373233346365663230633462376536
+33353963386230363530383065623231343032633832666233373931316366663239383033383664
+3231313662653665320a396538323735393332333563303838623865613463616263376162353036
+32636234353639396361313261646634336131633433663463666538623966333362303764623132
+62313263656663303437626238616536303361323938376231393732333066313065623539316237
+33373665353664343831353666613633316565336162666431343137393236333333643935643333
+38346366613439303937666337336239396530323865353962373765356439336633396261643263
+62303836393337313761323231623030653763346138396664333366623138386531363330353861
+63616361613238363066363038383230373664376135363133616638376630396137346538363138
+62353163663839363465626437306662653138323430643231353264333662346365663135666137
+61613732656566353635383131343038616261653162373738393563393563343439626435393434
+34396562656230306564663935303361363036623835393465663962393566343136306636616364
+38346161303435363138636335363764626637623731666261333263366239373965383835366531
+34323039633634323036653430396663356430306238663233643738306165313666363932356363
+32386232666366643130393436363333326166636634616334366262393638623630643332353931
+38663739313766626634616465613965633362366130353066636239306431313964383036316636
+64343864643966386161313066346238643334313331386134663931386232316665616633343632
+62356161366165336436376430333733386362653232663333323163633336623635356638353865
+66666262343538363864353332353265383734376563633561303034326261613464336462333431
+35626634623233386332343834373861626436626133653362313666386137366263643533643336
+63613766663439303839386661313534326534663934333631646638303936363861326563643866
+66326366646430353139343664643631333433643463336462323163346236333762386164353164
+62636535643939643934656330336466353938323461633864376534393831363666396234666635
+61643239633662313966366364356465306466323431616466643632326561333366376538663538
+37633732393665323764303138623535666236346330383137313261383135633764616438623131
+30346262653139323766346634383865336230636336633137393838333130303032623632366662
+62613166353461626464366130613334623031373137663264336439313635623663636533373335
+30653530613036393734613861343337646435656636656166353863666537363433373466626336
+31653065373166353639306466663836313337353433306135626432356262313661656166666338
+30303330396638353537346538393030376265376139666563653661363863316463613133653265
+31666233366331383166343731646337333665663264353132386535333837383565353233633835
+39613862396266366165393736366465643033326234643736313239316362363461363930333965
+38663833366631306534396133396630333435666431323039303431363835303232303133626163
+36363864373739623039313436313836383833366365623335646365303939656363623032623230
+31373562643166343832366239376132643836616130373839393265353736643234666434656361
+39626239636534366132663336373832616262313430313832626133306538366135
diff --git a/dev-tools/ansible/inventories/scigap/production/group_vars/django/vars.yml b/dev-tools/ansible/inventories/scigap/production/group_vars/django/vars.yml
new file mode 100644
index 0000000..8f5d4a8
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/group_vars/django/vars.yml
@@ -0,0 +1,41 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+user: "pga"
+group: "pga"
+gateway_data_store_hostname: "gf4.ucs.indiana.edu"
+gateway_data_store_resource_id: "gf4.ucs.indiana.edu_61552681-96f0-462a-a36c-a62a010bffc6"
+django_wsgi_processes: 1
+doc_root_dir: "/var/www/portals/django-{{gateway_id}}"
+django_database_name: "django_{{ inventory_hostname }}"
+django_hidden_airavata_apps: "['django_airavata_dataparsers']"
+django_tus_endpoint: "https://tus.airavata.org/files/"
+# django_keycloak_ca_certfile_path: 'os.path.join(BASE_DIR, "django_airavata", "resources", "incommon_rsa_server_ca.pem")'
+
+# Default email settings
+portal_email_host: "smtp.gmail.com"
+portal_email_port: 587
+portal_email_tls: true
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+portal_server_email: "{{ portal_email_username }}"
+admin_emails: "[('SGRC Group', 'sgrc-iu-group@iu.edu')]"
+django_error_emails: "[('SciGaP Errors', 'bugs@scigap.org')]"
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/ampgateway/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/ampgateway/vars.yml
new file mode 100644
index 0000000..89b25e5
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/ampgateway/vars.yml
@@ -0,0 +1,51 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+airavata_django_extra_dependencies:
+  - git+https://github.com/SciGaP/amp-gateway-django-app.git#egg=amp_gateway_django_app
+
+vhost_servername: "ampgateway.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/ampgateway.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/ampgateway.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/ampgateway.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "amp"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Atomic and Molecular Physics and Optics Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "amp"
+experiment_data_dir: "{{ user_data_dir }}/amp"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCAfFAdLrGC/om63ipx9RhuzcGnMlVQkKsuy5NtUgK7I4OdTJ1Ck1H/ARBwiWNQy08GO2HETfM7StCROwW+tlZ6n+THBkbei4G8q6xV6UXlC3BJxuDlwkxnyOFSYEt8Qd2g8IC/X0qo9/m5Ea9Z5axzTk+n2OZlV87DrLheV+OVhgf+yYGVo9egTZ7Kg/TV/Hl1xeU5JgRcPPrLrWYn8vEQo7xT5boS3X9y2o7FgNTdUf5K10ZJ37RWcLQpzZ+7zEKs/P/I/QU+BUhxRRfnEf/4e4L3OFE36SQ4DSFmu3lKU4BcQQb3A6SfQGC1PwQdD5y9MUkpit4hMCSJLjVBTN3H"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Barry Schneider', '	bis@nist.gov')]"
+portal_title: "Atomic and Molecular Physics and Optics Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/ampgateway/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/ampgateway/vault.yml
new file mode 100644
index 0000000..c91dae0
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/ampgateway/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+38616530653265643666613863336335646332393633343032656233616135303564343964356537
+3538616137616137383336393635383465333932323933390a336465313261323864313832353961
+35333732643039306338613636333966303338393139643064373231386164663136396132343033
+3761346362613963640a336363623939663563326265343561386532306335316232643732303565
+64646162623231643464376331336363366366613337366163626434393337393865626463653930
+34303033346133376635343662373439616438616538313934313432326437396664633464346438
+37393135616262663934316538303531643435396464343336353531613838303435383738653061
+32323336623838663361346438386663623262623661376266643739356135353438333966393666
+61633364333435326331646233326430643931646536623731393736613339393235303032623533
+63656439636265643037303334313861666439666466333431353934373834613832363034643137
+64393739326335306430393133653565303766666139336161613237333033383663663637333663
+66333737303766313237343137333830373961353862396332383736636531396430376638363234
+34613834343936666564633265356232346131303464613834643236636235363239623934313763
+3039333336303031323565663130623361366464613461656263
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/bcbportal/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/bcbportal/vars.yml
new file mode 100644
index 0000000..89ee503
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/bcbportal/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+
+vhost_servername: "bcbportal.medicine.iu.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/bcbportal.medicine.iu.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/bcbportal.medicine.iu.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/bcbportal.medicine.iu.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "bcbportal"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "BCB Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "bcbportal"
+experiment_data_dir: "{{ user_data_dir }}/bcbportal"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1WOyu47oKrRhIBUGI5aJsFk4wxCEgf3DzFdlYrWbGacfEETbE1Cxe8Tdj5TevIflui+HWJq5quHkMiZtHhGZbC4JMDKlzJaBn5vHpEAWtyvCXglkpu+Q+/XGLOwqy4XGa4rdf/CXvuWgc5+XCBb++A/eBswQVPt4C631Xsym7LA1NQXK3XxJApP/2IHnWtJI2d9g5TnzH8Oa99d146KmAKMl73lsCZtC1saBtGRsggJ7dRal7ush3XqiNCMgWPM8QU0ogbOBXDUZKRGAoY+frDaJdA3eQISiRRknpFyZwWcXU0CGnqaBiJdJEGYKLMvP9qBz/juN8jKMBkEJLGU1/"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "BCB Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/bcbportal/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/bcbportal/vault.yml
new file mode 100644
index 0000000..10fca2e
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/bcbportal/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+37363331613634613338653765396530323736643632373337316566316264396336653438383363
+3239343432316164313766303666663262333661313463320a623932623035623663653036383531
+37393266636235666164303536376539313439333363643365353763613064353539616139313061
+3632646637386336370a373731613138346465666638343737323066393436313534626566303863
+37643931663630313930353763343764353264623964396434653530616435313633633133643135
+34313032363134613964386532333062623532623430396665323935393534333635363131613233
+64386661336566393234646461376434636261373165663034303163303764323965346561633636
+62336464623061643533333834356435306365353432626631386135646265316234323636636465
+33643230653238333838663534663561393565633663383930633239643664373431363764636462
+33313061653034353439616130393438353237353930653534323961333430663834666337643262
+31393966376138313235373838393738346463363530633834373833666664303261343036373834
+65303365346261616664393163303966643432613537383139373965373937323535613461343662
+61653062613335373063326464633630636564326330626332396565386139646164313132633735
+6666666635323639393730303132313931626666623863396464
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/cgpe/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/cgpe/vars.yml
new file mode 100644
index 0000000..944ec27
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/cgpe/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+
+vhost_servername: "cgpexplorer.net"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/cgpexplorer.net/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/cgpexplorer.net/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/cgpexplorer.net/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "cgpe"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "CGPExplorer Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "cgpe"
+experiment_data_dir: "{{ user_data_dir }}/cgpe"
+#gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCNOy82E44c+/64s1Gd/VeQ4CpcGuTHwodXd1sLKu9sUDVO3pH4oBIQi0SLAns7W9qG63mZWO7lh2lSpqVyVzPY8eN+s/9JcvdLpJaTD35mxIXFTzPjbaVczpSB7DVpwPeQkHysrFe4U3TDgZemmVtFEe0TwU6wmVA42XFZi9+Z+q+jEJuG6t4O4v25jqkX6pQPkfDzMWh8Wxu2jXoBVLYIkpl1hXVGx+xLZFsgPkpjI9/+e29TEfcHBocE2a0/rtRUEFZjYApg2zb8Zglq37c6y8NepT5YyznA0QJV/hr7BogVHqrLy1HL5MCTt83Yn8e5/srNq27yjow1Jy8UHlB3"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Liu Jiannan' 'johliu@iu.edu')]"
+portal_title: "CGPExplorer Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/cgpe/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/cgpe/vault.yml
new file mode 100644
index 0000000..d90d6e2
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/cgpe/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+35363733363236626364313435396435316463353431653639393334633432306237366639353432
+3764623365343738363334396330363938373262356535640a373938343236383836353939656235
+62363530343634653663383739626133313635666337383461353935386364613863306636396336
+3436373430653162380a623761666132616163623338316330383836373466346435323162353635
+61356162613464656134353762653931313364633030323436613935663732653963616233363531
+33666361343839303565376632623139656464333965376137333135383665623830633839363133
+64666437383732393635633236323635363063653535393366636264393962653863353962363332
+31616364343937356638363034336566376462623638376339373064626637623735653832363130
+33353036316361306565653266386138346332333065663136333663323066396537373930393664
+32623863356332626331373837653762346630663237663364396365386434623663336631653365
+31303938353063383035633565393666663939656136653539366238366335313130643238326361
+64663833386430636630633766323465316662616131316163636165343463663264313832666434
+33303232356436656563653336306363306130383439663238396332356166663966363530373730
+6466313661363434333366316639353236333130643439373164
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/csbglsu/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/csbglsu/vars.yml
new file mode 100644
index 0000000..5f36e23
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/csbglsu/vars.yml
@@ -0,0 +1,51 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "sciencegateway.brylinski.org"
+vhost_server_redirect: "www.sciencegateway.brylinski.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/sciencegateway.brylinski.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/sciencegateway.brylinski.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/sciencegateway.brylinski.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "lsu-computational-sys-biology"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "LSU Computational Sys Biology"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "lsu-computational-sys-biology"
+experiment_data_dir: "{{ user_data_dir }}/lsu-computational-sys-biology"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDc/WQnD40zGuO+bIMsWc0ey8oxDzEj/dPFPg8LN7oNn/V7pi74mF2D57wgA8KsxcpsNydcReSXZhx6FynlK6iABDZP5QdREmhm87gkrMQUA/ZI7R2q7ekchbRtCnrGwU/pdHBh4penaiScs08o7OPfqJJp/TfgwH92dA9dThqGf9hD1Y0nmWECfvX56rXAggcgZl+Q6IFD0VFinFMkqZRWFFi4Zm7yiKCNWYXvXlIGjFOlDp0/ONGg5wjpCFivhI934Uk6Y69hSMhnFJc6g1JHD4PLaBILlUjwEikmH6KL3ii6Wt30pou+tIihBDBv0ODR4jDiOeBJGkcisWeh3Uzj"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Michal Brylinski', 'mbrylinski@lsu.edu')]"
+portal_title: "LSU Computational Sys Biology"
+
+django_google_analytics_tracking_id: "UA-117484529-1"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/csbglsu/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/csbglsu/vault.yml
new file mode 100644
index 0000000..eae0c2a
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/csbglsu/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32663464313366663032333836613465336632626133363438383736393165666434363362616364
+3232343632336137363139386430333935643666336264380a666531363536333037306163343963
+33646461656234303565333139663134396462636432633739373035353964666430363137646538
+3534626436373961390a366631316333343964353635313133626538396139323737613565313736
+32333864306233326433613536626337636262363537376134356566636435326331366137396635
+39373739333436643366346437393135373338306263333537656564633661643864313163653366
+34623362636563303665336331646133343661353139636365396161343166333232613663633661
+39306234646361343233313537613232613732336562393939643266346533623933393632376336
+34653934626331636263373730306466623934623064653461353838383231663662313637356636
+35383730303236393736376665353231353766343761386336343364663962336662353661623630
+66363261326238613265356236383965376536663537663262316130653438333835643966643837
+38383665346463346434373734343463663564356233383839396366623835363633653139636438
+32363737613332336665633565613666316230656331313635326463633333636339666130353662
+6339383830396532313831336135323330373665306164336633
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/delta/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/delta/vars.yml
new file mode 100644
index 0000000..2027781
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/delta/vars.yml
@@ -0,0 +1,56 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+# NOTE: Delta gateway is deployed to a Jetstream VM
+
+gateway_data_store_hostname: "delta-topology.org"
+gateway_data_store_resource_id: "delta-topology.jetstream-cloud.org_61fe21d4-07ea-41fc-9f2e-104bc3061318"
+#django_tus_endpoint: "https://tus.scigap.org/files/" this requires manual installation steps outside of Ansible.
+django_tus_endpoint:
+
+vhost_servername: "delta-topology.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/delta-topology.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/delta-topology.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/delta-topology.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "delta"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "DELTA Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "delta"
+experiment_data_dir: "{{ user_data_dir }}/delta"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCLjM9LkUfp7WEBCAOKn4+2JmOHqCNnOt8ZKa5LZYi6DerREMH1oaiDBwrOd8LEL6bC1Ac6X7aA7tz6Z3F8rM6czVKUVeGcfUglPFj7fNqetIY4R5hkidLBkXrOiR9fPFDyiBJnG+/WIlJm4HJN3dM2jzlcGcx5O0syXdgDY5lM2mgKCmhG/Q6qt3/GxZ/DtG2QV5tV3cLTaufncFoyNtBthnVzVagnJ+4tnWsEEv/S2RZDA09LHALH/51zrcLIyRRMD/qNSTf6hPMOAM2+90naVALy84qbTfdcEsATQU9eOyUZ/qb8kc78CM0tmz37e9xlH30W/E2a8lr+qRBxSLPD"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Aurora Clark','auclark@wsu.edu'),('Sudhakar Pamidighantam','pamidigs@iu.edu')]"
+portal_title: "DELTA Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/delta/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/delta/vault.yml
new file mode 100644
index 0000000..e629adb
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/delta/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32656632636531613862363833386635336339313064663834356261396231653564316163363632
+6263353933396364326238363830343164396335616464350a613431346238396335306139613436
+38316366386230336632353565303536376664333935383932616434616135656432343337396564
+3163323861356533660a336138653536313135343733383730616438323534646535306339356139
+39353737313336633066653562373739623930333434663566373938343262646431666537633065
+63356436313462623139333332323166663965643334636161643663333535313531303730313361
+30313637306162643963633464383063363236346161306434326532346563363661353137323330
+36633933373535366333343538636234646333313165316638303465366365366663616438373534
+31393833623333663334643563643639383536656430643332666363363131643632656661613232
+35613132336130613464333032656463353262373331323066396465623437666338373935636466
+38363134623134373030323066643637363862353537623334353939393234333164396631393265
+35343865353032353438646235303539616135316563663461643136343566306438353234376632
+63386336346334373663356633323136643166623435656137663337316261323262306133643638
+3932333166343961653939623036633334336337353866613633
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/distantreader/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/distantreader/vars.yml
new file mode 100644
index 0000000..84c9bdf
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/distantreader/vars.yml
@@ -0,0 +1,51 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "distantreader.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/distantreader.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/distantreader.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/distantreader.org/privkey.pem"
+
+django_file_upload_max_file_size_mb: 256
+django_pga_url: "https://distantreader.scigap.org"
+
+## Keycloak related variables
+tenant_domain: "distantreader"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Distant Reader"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "distantreader"
+experiment_data_dir: "{{ user_data_dir }}/distantreader"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCCgAWzF/GHT0ZesTM9JtUtvYBmaunOc5V4ab5//jUjC7vjF7s1fon4MvALvWCoC1uPvppG3NRzq4huAQCX89wu/9zJErpuKDpkjjTf90cHl+YxzHGGFUUtllSTZzhSyhUaMXC1qzeJg7TLdzOct+21HyoqSIJe86Aj8DQuAMXky6l7XFz5YqMkzY9kG/sS0rFRfpjz4K3zWe/Y7a0lQnKzePM/d6zrcdkiYhlMrCbEFcrWWMYNpIkWq7psjQiQ9SlICrNso6NQQSNy4CeoItDGSe7GsXdQLqdRMXUKua22G7wrq2ibh4Kqcid+mVJ8kyYQJO2UCdC2cOYd0EljmHh/"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Eric Morgan','emorgan@nd.edu')]"
+portal_title: "Distant Reader Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/distantreader/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/distantreader/vault.yml
new file mode 100644
index 0000000..f0aa56f
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/distantreader/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+36326437346338623736653236656264393363643866323364353364366564353666333432313963
+6231366630346266333036343939626166396230333964660a396130633930353330353236613132
+62616338633536323933303332626131626461323438316365373461323931646634666238666661
+6364333061363031320a646434663165383835343937663934363963633864616661303236623336
+62353932386234316632313730323161393237383565303432346561346539646237303965613566
+32633932336132376463653166393662396164613238623631373861616365353735633164383264
+66623666663031336466636234663466373839336665303166383239363930653438653538663433
+62306533306436613036643261356665613334386161613661396335303133306462356634316232
+37356164643031643837333966663535376130336565633065623966343933643937363164323236
+30646637326665386435623439363730353163336635303236363031646331613365373034636166
+63666161333231653137383837376663663062633832643630653830356165396232313735333462
+33366237376137343965333165396136616266613766613535653861646532643962383061663036
+61653731303666663062363530663534666266303537656164646638663066363239333765653036
+6364326665333537383731663031303566663331636236376530
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/files/django-ssl-vhost.conf.j2 b/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/files/django-ssl-vhost.conf.j2
new file mode 100644
index 0000000..6060667
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/files/django-ssl-vhost.conf.j2
@@ -0,0 +1,89 @@
+{#
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+#}
+
+{% if vhost_server_redirect is defined %}
+<VirtualHost *:{{httpd_default_http_port}}>
+    ServerName {{ vhost_server_redirect }}
+    Redirect "/" "https://{{ vhost_servername }}"
+</VirtualHost>
+{% endif %}
+
+<VirtualHost *:{{ httpd_default_http_port }}>
+    ServerName {{ vhost_servername }}
+    
+    ## Redirect all http traffic to https
+    RewriteEngine On
+    RewriteCond %{HTTPS} off
+    # Don't redirect /gbrowser and /gbfile requests to HTTPS
+    RewriteCond %{THE_REQUEST} !\s/dreg/(gbrowser|gbfile)
+    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
+</VirtualHost>
+
+<VirtualHost *:{{ httpd_default_https_port }}>
+    ServerName {{ vhost_servername }}
+    TimeOut {{ vhost_timeout }}
+
+    Alias /robots.txt {{ doc_root_dir }}/static/robots.txt
+    Alias /favicon.ico {{ doc_root_dir }}/static/favicon.ico
+
+    Alias /static/ {{ doc_root_dir }}/static/
+
+    <Directory {{ doc_root_dir }}/static>
+    Require all granted
+    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
+    </Directory>
+
+    Alias /media/ {{ airavata_django_checkout }}/django_airavata/media/
+
+    <Directory {{ airavata_django_checkout }}/django_airavata/media>
+        Require all granted
+    </Directory>
+
+    {# Additional aliases #}
+    {% for alias in vhost_aliases %}
+    Alias "{{ alias.url }}" "{{ alias.path }}"
+    <Directory "{{ alias.path }}">
+        Require all granted
+    </Directory>
+    {% endfor %}
+
+    WSGIDaemonProcess {{ vhost_servername }} display-name=%{GROUP} python-home={{ doc_root_dir }}/venv python-path={{ doc_root_dir }}/airavata-django-portal processes={{ django_wsgi_processes }} user={{ user }} group={{ group }}
+    WSGIProcessGroup {{ vhost_servername }}
+
+    WSGIScriptAlias / {{ doc_root_dir }}/airavata-django-portal/django_airavata/wsgi.py
+
+    <Directory {{ doc_root_dir }}/airavata-django-portal/django_airavata>
+        <Files wsgi.py>
+        Require all granted
+        </Files>
+    </Directory>
+
+    ErrorLog {{ httpd_log_dir[ansible_os_family] }}/django-{{ gateway_id }}.error.log
+    CustomLog {{ httpd_log_dir[ansible_os_family] }}/django-{{ gateway_id }}.requests.log combined
+
+    SSLEngine on
+    # Disable SSLv3 which is vulnerable to the POODLE attack
+    SSLProtocol All -SSLv2 -SSLv3
+    SSLCertificateFile {{ ssl_certificate_file }}
+    SSLCertificateChainFile {{ ssl_certificate_chain_file }}
+    SSLCertificateKeyFile {{ ssl_certificate_key_file }}
+</VirtualHost>
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/vars.yml
new file mode 100644
index 0000000..56a0f48
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/vars.yml
@@ -0,0 +1,63 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+# NOTE: dreg is deployed on a Jetstream server
+
+gateway_data_store_hostname: "dreg.dnasequence.org"
+gateway_data_store_resource_id: "js-156-72.jetstream-cloud.org_758cf5c0-71f4-4268-bb42-5ede23cfeea9"
+django_tus_endpoint: "https://tus.dreg.scigap.org/files/"
+# Increase max upload size to 1GB
+django_file_upload_max_file_size_mb: 1024
+
+# TODO: while testing dreg-djangoapp, turn off SELinux, but turn it back on
+# once it is installed for real
+httpd_selinux_mode: "permissive"
+# airavata_django_extra_dependencies:
+#   - git+https://github.com/SciGaP/dreg-djangoapp.git@gbrowser#egg=dreg-djangoapp
+
+vhost_servername: "django.dreg.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/django.dreg.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/django.dreg.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/django.dreg.scigap.org/privkey.pem"
+django_ssl_vhost_template: "{{ inventory_dir }}/host_vars/dreg/files/django-ssl-vhost.conf.j2"
+
+## Keycloak related variables
+tenant_domain: "cornelldna"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "dREG"
+#  external:
+
+gateway_id: "cornelldna"
+experiment_data_dir: "{{ user_data_dir }}/cornell-dnasequence"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCTs6k2lSt5nn+UF3N1rAko9WjdtHZ1xLcKxCG4+4AVMdTIeng12g+1qB5hIFiDgesT/D/nzoA27EFj5nWiYanxBySNgl1Re8kR0nEqQbR0zj1dSibmfjW+vmOZzEiNSrNoLlc4KbFgqFCRGIlZ1bWZ7yHtJ3I7xxfKhvvxCTzJ4K71v1aovnDTUYophy2lUsdOcOq84Qhv3ITZafgblz3mJSwVpnnI72IepzonzDUdcf/w0lKCl70L9MgQAZ2V4e9sQZWJLI5s1VtJsqKggtgI4goPyxXROoH9PTUZFqvvYjLGW8JVS9eZKblSKil09yckPfZCSk1i/UD/uY6O7bjf"
+
+admin_emails: "[('Zhong Wang', 'zw355@cornell.edu'), ('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "dREG Portal"
+
+django_google_analytics_tracking_id: "UA-111528347-3"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/vault.yml
new file mode 100644
index 0000000..88a0956
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+66616265356461353939626135623233346630623331646636653131366435666235333065663861
+3766386133323366316130343166613330613734653835610a653632343762343830323732396439
+33636639623764663565323263323332656235363336653334613862316164346437363538313030
+3338653037653435650a643466326139616634373662343337646439623531393366396632383531
+36333530316465616364623461616666326463373965643336303462316364343165383534616261
+30393633333739383265633666313230643138323938353837633833393862356438653839653936
+65316535623739636366663639663636636239393365333063333935616361356636303833313366
+35333464613033346464326638653738373163613164333862316661363937636237636632643935
+36323664396338656665363365303434623831363137316138636164373734623634656332323835
+64313234346330623731653931313862626630626233303061346361383564623963646161646261
+39313436303939646438636264366265343130626331316139316639376565633965333962656337
+39306162643731323039623537616161353364623261623935393835383766356466666338663934
+39356332636361623037623766336166393231373065353133313934663130653434303830316636
+6239313439613465336338313663663962333137313963663866
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/epwgateway/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/epwgateway/vars.yml
new file mode 100644
index 0000000..e7b7e3a
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/epwgateway/vars.yml
@@ -0,0 +1,49 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "epw-gateway.cs.binghamton.edu"
+vhost_serveralias: "www.epw-gateway.cs.binghamton.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/epw-gateway.cs.binghamton.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/epw-gateway.cs.binghamton.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/epw-gateway.cs.binghamton.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "epw-gateway"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Electron-Phonon-Wannier (EPW) Gateway"
+#  external:
+#    - name: "existing institution credentials"
+#      idp_alias: "cilogon"
+#      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "epw-gateway"
+experiment_data_dir: "{{ user_data_dir }}/epw-gateway"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCSqYzuDDUNK3uX4AG7sg9diKERh716i0lA5RfbvfUhm+hVmyJ1P+0/OLZqwrwqzd9+1v/U08GAhys/qeOD2+x0ujgyKtY+5cjk3Td01sVTEmcXJPYhhWyAOrhhUAVAL51Zh7u2Zd/0RWf3iG0fuPPQQaBCIEY3wApwuqsLVk9G0plMtZgzXPGLgK9Ou8xJ8806yGx92nc1b1grmgkYugv5SQTe2lhmrXI/WUnfuoweadNzU0uSwwL6AaZa9grCAV1YVnGq6IX+Euwpx/P1pSRNWkoNHkm8fpkz/6dqq5YFxgr3QN0JQU5OSbbwWTWQcXr1kWNx+yS4qCtDc42EHsf3"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Angel Beltre','abeltre1@binghamton.edu'),('Srinidhi Raghavendra','gsraghav2@binghamton.edu'),('Madhusudhan Govindaraju','mgovinda@binghamton.edu')]"
+portal_title: "Electron-Phonon-Wannier (EPW) Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/epwgateway/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/epwgateway/vault.yml
new file mode 100644
index 0000000..5362545
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/epwgateway/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+63663861393662356366636435343136633964623439323437316364373032616531666539306234
+6633306463333631663163613934636563636330363130300a626139633031613135313465366363
+64383165316437616430663861623330306635363337646366653632616161633262373833303362
+3838366334316431650a363436653365366561323864333238346438336230623737643762363631
+61656532346333656534363831616139383035353537393934333564303563656235376630633264
+61383932353032623435343664656666643865613462656266336635313662393530656332633638
+35626363333238613461623366616537396262323862353964363438343663353161636535396266
+39653133303337663266616436306563333066393638636232383238623062333831623161316532
+37386333336532633861663632383366346561383034323063326632653565306231663961383066
+34663731336439323831313436633165373862633164613335653138396331353463613561303162
+31653663366331383364303434616536656162386232633565316139663163356564333435663562
+34396662306663663535386630613663313061643135323633373637646661636263323032303739
+64343837333638636338303331306561656439663139366335303862303462383035386238353535
+3539663064656639373334383066323765616336623365346131
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/futurewater/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/futurewater/vars.yml
new file mode 100644
index 0000000..65fe47d
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/futurewater/vars.yml
@@ -0,0 +1,57 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+# NOTE: futurewater is deployed to a Jetstream VM
+
+gateway_data_store_hostname: "gateway.futurewater.indiana.edu"
+gateway_data_store_resource_id: "js-171-92.jetstream-cloud.org_1a76397d-cc28-4ec9-82e8-d27c5cf80c79"
+django_tus_endpoint: "https://tus.scigap.org/files/"
+
+vhost_servername: "gateway.futurewater.indiana.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/gateway.futurewater.indiana.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/gateway.futurewater.indiana.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/gateway.futurewater.indiana.edu/privkey.pem"
+
+django_file_upload_max_file_size_mb: 6000
+
+## Keycloak related variables
+tenant_domain: "pfec-hydro"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Future Water Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "pfec-hydro"
+experiment_data_dir: "{{ user_data_dir }}/pfec-hydro"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9qczDIVUhTxPmMsvF2J/NGIWo35HDgm3IUL41w1bUi5FX3CzuKwWtBh6IGoY4l+ibvWiRw2w9+MLWPhAWglLjXXekHCc/C5LuU8qi6zGZgQfD6U4yFpHXmkZLUHt30iKbLJXgypy7MaQ4n3sWDXJe2Dbsc4FMSK+KXFQ5KNZ/meOCCurEswcDyz4Mrvf9ZSZWzq6vPTXtdHo+/oRMmiGNZqhcBkqIWfz5alzyq4HTAidz5uc6fD8mqj1hg87qywv6OwMUAxB84S8glcLs5ZzuTbpGl3sdftVH9zqabx6eAGXX9V389qdLp1k//u45ph+INOk11HFCCxmh/YmqQM9f"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Jen Brand','jbrand@uwsp.edu'),('Chen Zhu','chenzhu@indiana.edu'),('Lei Gong','lgong@indiana.edu'),('Bidisha Faruque','bidabesh@iu.edu')]"
+portal_title: "Future Water Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/futurewater/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/futurewater/vault.yml
new file mode 100644
index 0000000..1bcad0b
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/futurewater/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+36386436333338386363356236316364303161373337376533633762396466666266613930663962
+6365393863653638616434626564353336376538663833640a336566353031653964353031346633
+36633262336665663261313737333366383632373738636231633463373839623930656632353461
+6433393934656364310a653430326438666362333330666438316664383463646466363938303830
+65363236653965613136623131656434303532626133663962613465366138326262333038383563
+35346661383362636336363631656137363733303564616236306536316639313235643031383265
+34336630643861353636643366623232306663336534633635393134313238633563663632303664
+65333038613137353136306135333230346366353334643834383932376363353261346262303639
+64616638656132356136326431653736633630646166303030653362613136636261346435306636
+37366538376536613836376365623732623532346233383631326237393137333733303735393162
+35346530323838643233346230623534356666393362633661373734386438353835373939393633
+33313335366537383038666630326232363030323338333937653430613239353262336532346565
+38303465393461333762646333643332633132666635323936316263383430373465633938633336
+3061643536623830306563653965303035343633383530356237
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/georgiastate/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/georgiastate/vars.yml
new file mode 100644
index 0000000..ff2cf97
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/georgiastate/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "hpcgateway.gsu.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/hpcgateway.gsu.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/hpcgateway.gsu.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/hpcgateway.gsu.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "georgiastate"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Georgia State Science Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "georgiastate"
+experiment_data_dir: "{{ user_data_dir }}/georgia-state"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCFSg9IEgsXlGhgPkj4hPuON30rbE3/gUUn4K3NVvBFKLyQQ8Pm/NR6dZmFglQR1HxBRSnq4WmH3EVyxHuT7MkQDAjTkclEuhaRjcYN0nua8g4dI9SgO9DeqbOyurVIuw/YChP5nC+6/ubMyzYPr6Z5xU5QHZI/QlVG4nz3joMIKkRXt/bsaEvv+/nzED/j6FTdK6P6dg1ESkNVZUPqhtWpwuC28Et7/86jcEObJedwx8geLoxKogPZ6kqO+Q/WUHDtMpFYtwuPaiYuN3Pb/GCvnDRsSoFmtRU+UH1UIdEy0piYUuBW+5aCv/PbH/UtHFg1Y1942TYCXv4rl1i/KW1z"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Suranga Edirisinghe Pathirannehelage','neranjan@gsu.edu')]"
+portal_title: "Georgia State Science Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/georgiastate/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/georgiastate/vault.yml
new file mode 100644
index 0000000..9b3941d
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/georgiastate/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32326665656232356135306363366264336336376537323436383836316638376466333739656532
+3661386564613864613238333932383462626535663533340a356331623262383532373131623964
+38356234396538313032656634666634313733386634393462323438306262613731376136316336
+3962393665313566650a366465653530386362623530326134363135336134656162626635626336
+64643865386233343732376563363038346166373066663934393739656362356535656530623231
+33666262653862386138303434653338623534396436626531393061383339613565353432646266
+36653136663563333235323931626436363630323130393033353634353064323563383832383730
+34323031316239643132343931373366393061353431323236336363353664643537396166636531
+37326363303730343238666634363566313032356131616237313066363638613637623536666137
+38323630633663356361656231396464353534306462336462376136646362313830313935643361
+32376161303332346163303466376565386132376637623734343162363935623530363165653063
+66326339353534396137396662323461313435646234636437366233306165383635623032653461
+30396466333934383764383133343337643366663531373430396436653065353834393835336262
+3636643731306531313965363266393236656331636438333762
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/hubzero/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/hubzero/vars.yml
new file mode 100644
index 0000000..7b19682
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/hubzero/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "hubzero.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/hubzero.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/hubzero.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/hubzero.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "hubzero"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "HubZero Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "hubzero"
+experiment_data_dir: "{{ user_data_dir }}/hubzero"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEs5h0NUb+8yDYtAXigQDQ/s2tQmIKTMJYhxiDRnxGSGylIMPVkKfbhytNry+fOd4aJ4q7HxkR4K808NqmytfH9o06De5ODkbp2InpzWw4O4QtKNwaqwNpIukU+S1seaodQaNfKeniT+LAq5pGQgUYdcIH4PjFSKY1z0HmfktY55lwGxdUwfe81aDMQ9Zu/310656/BftgdFIA51sOiL4nCxFj7H5cLeeSZujW5E9Yx7d3u6BCk5YMLrVBqoHThwtKK02BgugypeNn3rJHQvOGduKu0UpHV6IfLayeKGy3YYPzLkVb+ApJo4hOm6zsskWKH3PP3auCEFfyqYonA4sF"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "HubZero Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/hubzero/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/hubzero/vault.yml
new file mode 100644
index 0000000..b288a60
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/hubzero/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+34393666613666616562363031643062316163616165653735633063376232393963626362623261
+3064636230633364653437363463366434353661613963650a643639646434343335373539386331
+31376161616266343139353262336535653338396566343131303038356237353162633163613836
+6437393965636632620a633364633662396638333965636561333037386335346233303230633761
+32336631663564376666303439623265633931636565616232366333663366393063306462373439
+36633031643837366532646233326562396239383237336533326338353237373238376265613739
+38303161653630623531643363323537633132336133663332313833613461616538376266633338
+37336135306562623335323764626230633930313362366265336332633565323936656666653132
+31346134653765636531623435313234373631633438646561303264353131613566346235616562
+62326430613139383435376331333262626166646631343436303766626364336166663230313064
+31393837316535643436633565386331616163643837386263636236393863666336353433313333
+63643039376264653638363433333332363034383462396231636565333365613335636232643839
+64383866363930366537636162323466643738316338353334386134336130326437303430393439
+6562303362633738396139663333303134623938346239613934
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/interactwel/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/interactwel/vars.yml
new file mode 100644
index 0000000..98dabe2
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/interactwel/vars.yml
@@ -0,0 +1,49 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "interactwel.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/interactwel.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/interactwel.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/interactwel.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "interactwel"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "InterACTWEL Gateway"
+  # external:
+  #   - name: "existing institution credentials"
+  #     idp_alias: "cilogon"
+  #     logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "interactwel"
+experiment_data_dir: "{{ user_data_dir }}/interactwel"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCFkcK2krGe1tZ339p5bGrBi6+Vrgl9q7VRILUP39C5vC753dajWBtRWI3Id47KXcGPsbl/JPYAn5+jHDFlQwP6aXrGt3npL0thPXOMQ8pykrQs6ridaeFwa3QrlwFVeAhf+Y0FqlXNbl8aHTP0oQAaG8p2ID1/K7GLty0cgiVgEY1aPY6/aQT/81zCoxQzpOodJtU247Ls8I6Lgha/jv6P+fKgcogqaAm39UzCDTy7HN1Owh+yfLh6Cy3XT8SPegVw8XFpOLP8AO1S3CB3B5s1DBdHYOeEGserIbaEgtDHoLw/YIXtAZt9QL6IJ3g9uXVDtZhexj7Rp07QCQhhiaep"
+django_hidden_airavata_apps: "[]"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Samuel Rivera','sammy.rivera@oregonstate.edu'),('Meghna Babbar-Sebens','meghna@oregonstate.edu')]"
+portal_title: "InterACTWEL Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/interactwel/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/interactwel/vault.yml
new file mode 100644
index 0000000..df06c8e
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/interactwel/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+38666161343034633134323436353361643566636562393765316137396464663663383132313035
+6437623033613864366334306336323763623933663231660a653866383662353364376362393936
+39346137333164616234376434306262663631346438393366343633336431363765656432343763
+6463313061346438320a366136316661383037326165373061663336626362316437626137376665
+61363738643561306266346166633062303264376632396164616263363134626436346330653638
+32636333613562613639383665646163396662336330646533393030366533393762616263626333
+37646432386565383164313961333933393833633134336163393264393738626233363337363930
+34396236636639366638663931373731313433646438613763396638623136373566323536663533
+32363230303136333930363638373035323431336437663238623637346365653735643636613332
+61343237333932316136626234333635313361383931363836396538623532396433376465336662
+61666562396562333164306563376139343937393061633333313239613566633565336433366662
+62366436646463366534613037386636306461366161363965326333333231636466303938646337
+65653731326633363466656131666439656563333439353338663932343462633031643230376432
+6232623939643161396363343761363165376361333665393639
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/iugateway/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/iugateway/vars.yml
new file mode 100644
index 0000000..57c9a69
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/iugateway/vars.yml
@@ -0,0 +1,47 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "django.cybergateway.iu.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/django.cybergateway.iu.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/django.cybergateway.iu.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/django.cybergateway.iu.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "iugateway"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  external:
+    - name: "IU CAS"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "iugateway"
+experiment_data_dir: "{{ user_data_dir }}/iugateway"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCNmVTNvPmK0P4IL8TFSd6I7qwui3KK8I96AxS28kBcQMgfJHk4jIf9TFxXWmroMmMhALnbNi8S1+ltTFZTMgFZ61bWMSCEfw6J0EUKuc9Nk2SFAltvGwQPM/yQZV2l9Sp5Tvx5Ya0fwmcFL/J9GcQNgMtJNQk500fIzJPT6/IFtISSuaezjehyKfIbUesZBYM+LXVo25c+jZp7zYUwQ84Ow/DBh3CplXsYVa74LbQgV0ddoXtj5vOEvfEdGVpCRt177qo8O+XxapmG4Kc3n5YGAwMLDgx8Cj1TDoKruNx33BW6gcasps8hpcRmlt/HVMbDsFZzBKBRI4GWohiUuPev"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Abhinav Thota','athota@iu.edu')]"
+portal_title: "IU Gateway"
+
+django_google_analytics_tracking_id: "UA-111528347-9"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/iugateway/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/iugateway/vault.yml
new file mode 100644
index 0000000..b37f351
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/iugateway/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+62643632646533623063323837353230393239663137663966653066383938653263626132316366
+3862333861616136643930623034666537636436333264620a616666323337636165376239623336
+35343165613634356135616434626233393831353531393032623663383935333132363266356130
+6262316563653537350a336533633263663862323335623838343432653230366662353661656639
+62316464663536313865303339663233313464346633653431303032633432346433623536666439
+62333931393233353064326566306233656466313637313136333837643937326439626637636237
+37306564396665353766323435663830323930616436393464623239656364663139626565623663
+62376163343637316261333965633537616432613163666434356137306132656430353739633531
+34653838363836363238303434626561616666353234653563356464383162373135363464326564
+63393065316431376264613961613031656162336363393438353033313436653135343163363135
+66653663356234633938313237363334653038346637636461363564656564396264353731643330
+37646464383261333133326462373234393338313763393635633364636663633638653835383365
+39336166303861636538343635343435373565323736666233336363386663326233376437623263
+6336623936343061643366313530336237386635306430353030
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/kentucky/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/kentucky/vars.yml
new file mode 100644
index 0000000..e978f26
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/kentucky/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "hpcgateway.uky.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/hpcgateway.uky.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/hpcgateway.uky.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/hpcgateway.uky.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "university-of-kentucky-hpc-gateway"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "University of Kentucky HPC Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "university-of-kentucky-hpc-gateway"
+experiment_data_dir: "{{ user_data_dir }}/university-of-kentucky-hpc-gateway"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8nCMkOgELG+FgKIC5wTdGn6ZRlnCfhn5ebrpMDagXTM0lacLplKThhOg4EXFOjxGOW83f4HBjKBJXpqRUunCL053Foox9/xqtk6Sa7jwRugL0rIBQJC4hZiHin2W0zHseoIQtghz+AbyofjUABYxOCpbKUuR3plyVv/68iqZOscPmVDw2bS9MLBHRZI5BvZ8FwKSEtn7uEV+XXvI4FXaRQfTg/arbgLietD+y+EyxOkSW3PXtu4xvQ2e6AA9LTKn2fGLHS/atEXgS+pBxVKWcCgpOxUCgNq/F8OQWEVDGFG3Pz3b45n7O62YWUgbS1Jn+FQVRw5Pfb4P31+hF3EJX"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Vikram Gazula','vgazu2@uky.edu')]"
+portal_title: "University of Kentucky HPC Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/kentucky/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/kentucky/vault.yml
new file mode 100644
index 0000000..d253683
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/kentucky/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32623766326431363137326330303235623661636632643661353538653065653139623664363862
+6239376536316436666237326665336533656339386465380a313836393034306462333565616361
+64306636386239306632343662613964666435373339666132656338316234623034346666333365
+6334663063383561390a306538363234373765613963313537663337303237373961323631616334
+61636635393861386162343266313061343730306262363730613064303865396331383164613966
+37396261343865613833623238633861643830353234626434393836353537393562316331623662
+34656133666330353436353633363930386463396161653633393136623538323739376634306436
+37326565376331653463336437366239313461393033646361623735303337666138326262383230
+32333465353431333134343730366335306435633632346638333665396538663731666366376161
+34326531383663386564616336396137646338376534363736653333393663646361396165383938
+36316436666565616631316163353663623838306330366133363036393833666466363333336430
+36633462386132376437383466613964396332383330666235643966623661666466383165353832
+63653762326563613836653262613264363261633633646536383830383431363237613132663235
+3562663466356365626439633438336565316632666663656338
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/microbial-genomes/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/microbial-genomes/vars.yml
new file mode 100644
index 0000000..40e2091
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/microbial-genomes/vars.yml
@@ -0,0 +1,54 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+# TODO: remove next line once branch is merged to master
+airavata_django_git_branch: "AIRAVATA-3324-custom-input-editor-autocomplete-input-editor"
+airavata_django_extra_dependencies:
+  - "git+https://github.com/bio-miga/miga-autocomplete.git#egg=miga_djangoapp"
+
+vhost_servername: "clades.microbial-genomes.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/clades.microbial-genomes.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/clades.microbial-genomes.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/clades.microbial-genomes.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "microbial-genomes"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Microbial Genomes Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "microbial-genomes"
+experiment_data_dir: "{{ user_data_dir }}/microbial-genomes"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCG/syNtrxrgfdHpxln172epFN36uztXhblac4uqNYW9Qlp8K5YI1MICxCW+HJu1mOkIvOLseYaZm1m8Vt7KwTvp/RP6iyZ8M/fWMPO+v9ZLjGupi/iDLA8JNfD0trpwXzW4PCFaqPG2+LtpzsfsI8Bx6UwFXbHKdEo5eC548Cc5EVkZ9xFEChCQHdUcxWI7zs7+S9wsAOY3Qbsrg/UtLAe4P8ZFxABSgBdirKusxdbw/0LgVhkj1aTKIE7n+7b7b11m4A1bzvsvhNLBlN+hRXG9ZiOOYExO1T5p3rX+HHIeUNAi1AMlc6KTa833ni0FWK3EYbGEwC1og6hSfl2ZGRp"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Luis Rodriguez Rojas', 'lrr@gatech.edu')]"
+portal_title: "Microbial Genomes Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/microbial-genomes/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/microbial-genomes/vault.yml
new file mode 100644
index 0000000..d6a7b68
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/microbial-genomes/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+35326363653039353237353133343636613865633837376265633831353762656133316166323164
+3530333864373030353932313030613464303666643163340a366131386632626366643864643364
+65393861323131396535313137383037386231323536343134313631343039353135633766333234
+6262313139383534380a343739373962343433643634653935333634303965323332636139663130
+38646330376432666638353036343962626234383865313564613838383333643861323932363865
+63383664376437353037376433663464373831613163613632353739323537303539303161626139
+61396464343462653039376166626431663532643663633936316334396539373831656462633634
+37353064343231306135623039313563393362643766383031663064383832316564363135316635
+66316466393436616334323665626333636165623030393738363433323438373934396164623135
+32306531623162313435396539333836613932613565313866623964396433316561343037376130
+38346331646432333530623533656130366235313738363464313037633263393962633065373461
+39663265613562316638306561356162666538383433386463633162303037613965643665623039
+33346565333066336631386562306435643761323433656530343134636166663338363563393337
+3031636430366337323066356138306239333432373839326564
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/mines/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/mines/vars.yml
new file mode 100644
index 0000000..62f6f51
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/mines/vars.yml
@@ -0,0 +1,49 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "qusp.mines.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/qusp.mines.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/qusp.mines.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/qusp.mines.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "mines"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Mines Quantum Simulation Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "mines"
+experiment_data_dir: "{{ user_data_dir }}/mines"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCUEBwfmgyxXs1Yg3VOnBG7j/lTzwhQmc40PaWchTNM5xfWL1RnGQkVrSDIdSHZTIJ29DOfJxoLGlhdoK1vpGgBSbcdNEE/dVo/jpZbsKi5CNSOhMdYHmR4L3AjqS8sWxHu9kzkGuWhhmD2zDxA2lf3Aqs3rJvdvKJ97ZGToCbaQ0LamEy19B+Lj5ZF2ooyUWIx9kiqAZ7JmYllxCbWNnbdtnVl6TcHkVpF7PcXk92WUEB/0csAhcJ/ZxnQcWVglD4tNWjPLwEy8dAPPWkms+N8Ce/o+pPu58BBb9mDxDFkk4wAwjV17Lq3TpC+usxGItLvyUkttB2xPs6PoAxzwluL"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Matthew Jones','matjones@mymail.mines.edu')]"
+portal_title: "Mines Quantum Simulation Gateway"
+
+django_google_analytics_tracking_id: "UA-166738649-1"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/mines/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/mines/vault.yml
new file mode 100644
index 0000000..e8404d8
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/mines/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+62663766326464353337343335313761663065663736663065613137646339366661343038323262
+6131313964386664663032353830323439646434333366380a326562313631343233626561363538
+63303161626132663438383033326665343962353932623834306561626332363531663061633661
+6565356236356434620a373234376132373065636436386666623533613162666564643162643631
+62383030383562623633626438643033323333663130613739383530326461386434393562393830
+34366461663764653130383833356132623332646139316262663838666339356165643066326465
+36646633643935303761396635306164663936623863626263633064383261323533396336636364
+31656235393961383261353066613434353064643038363966343936366465366133393266663538
+37613030316635613963343237333164653565636165333532333664323365386462393937643263
+61386634623563303137376261353838373539393634353337386237333736626637346365376263
+61376633306434393234316336383763613234663761303039626430343734343731393837663033
+62626433613061346236303636386330326635393135613232383666626231623562333731323038
+38396235636137363032663730636162633236336237366436613930666535346630313033643039
+3762636139306436646336353762346361666461333634643462
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/nanoconfinement/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/nanoconfinement/vars.yml
new file mode 100644
index 0000000..829dc37
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/nanoconfinement/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "nanoconfinement.sciencegateways.iu.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/nanoconfinement.sciencegateways.iu.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/nanoconfinement.sciencegateways.iu.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/nanoconfinement.sciencegateways.iu.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "nanoconfinement"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Nano Confinement Science Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "nanoconfinement"
+experiment_data_dir: "{{ user_data_dir }}/nanoconfinement"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDdKakVGKVsEzdUnL34veOjBIkGlKfRdhADwQCYHSaTf5iT7PmCvtS+f9evb0XbSOyGsJ/w2Z33VgLztrqDTydE+oiuOrYpWqsBzU0c58v2JoPMN8ETd52MWP/Tig3mJXb47er51UbZV8/ST+j963kXJdOpNb8vAfb4wiwwLW+ipaw61hCLfh+somxMf5TUAEToUnW8+Qcm1VEmN87Jl9e/b1Alp7K7579hiUw+jHcSgw153yQj/qQHJQzOvPbCjmr/1Eyw/OP/a+MDZyDIJpkQkfMeH9KemFmlWM8TjOoDYn6S3jmfuFTR6A/mIkx6K551Zib4Kx82cgjMoNe6aqfb"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Jadhao, Vikram','vjadhao@iu.edu')]"
+portal_title: "Nano Confinement Science Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/nanoconfinement/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/nanoconfinement/vault.yml
new file mode 100644
index 0000000..1547882
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/nanoconfinement/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+33383734356439316338313738626338646263366232353137653464616364626632383164643631
+3633663263666430613636353137333731626439616632610a306663376366343064363665376365
+38383730653130396165633531393433313838386566613162326363363630616436343462353862
+6462643864316664650a636664303263353638653166303239633132383065343865336464353331
+37356263613538623065623031616332663433313732653537373333303531323564343736636239
+61363634393938353663383534326666613339343234386464306434626439373362626436313439
+35653831633031386263366339353833396262323664376238383663633263373666613531656561
+36393936386261366265656133373330623761666535313862646337633763323831343138663733
+33326463373162663764643032323137336630343735663366363532623231353764633135306635
+32396564343032663337663065323963326139383232303963333665653736393334356462623437
+37333933376536303361666465336536363330346137633832343765626233333136666666343038
+39656234663837633031343832656432376331393335343937346366666561653338363936303637
+35663535306235336161626265613433336566626532313338323865343638636436306164323466
+6565336434333234623962613430656163316336363064356434
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/nanoshape/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/nanoshape/vars.yml
new file mode 100644
index 0000000..811a83b
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/nanoshape/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "nanoshape.sciencegateways.iu.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/nanoshape.sciencegateways.iu.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/nanoshape.sciencegateways.iu.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/nanoshape.sciencegateways.iu.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "nano-shape"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Nano Shape Science Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "nano-shape"
+experiment_data_dir: "{{ user_data_dir }}/nanoshape"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdnkbcATgISewsDfUJaDwsQSswt7cWM//ONfTLhxlvFHe1NFdVk65of/tOwXIjp+037tpMMv8Pi3bc4OUmdlv3P9tPOBoDNoOb+CUpJ/6skEkiH+zgO+zLetVHLIS/UdgcSL7xdbj5RfoT13ksyRvdVYLGLq2S1t7p0s//FKcw7qdw/S2N3YiCQPpHq45C/r4GTHzRaIksiE2WnsuRbk0CmazIQDXwedFadJCUqM4SrFOdxGos9b++d1yS+I9GrVya/xDRtpDzWCpUrNPJc0BzRp1qIkUnmh52uApKyfJX82gMbAn62xmTZytdgk6BA3Za96lVvjJQ4CsD2wpS7qpp"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Jadhao, Vikram','vjadhao@iu.edu')]"
+portal_title: "Nano Shape Science Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/nanoshape/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/nanoshape/vault.yml
new file mode 100644
index 0000000..f96e009
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/nanoshape/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+62303139323536623961633461646332383136666363613633376261333438353661313830393136
+6161393330313364343561663264366133343239333366620a336161616264336335336236303063
+37643439616136616438653363383635666266333536313937666463636334623135623138373037
+3063376663653134370a663238386339373063633261393638633132313164343936653464636634
+31333135393038336334396539626633656666333363363830353834643863643662376230626366
+39343564313236313961333463643764333237633232613564386638353633353136366263346566
+33393465373239663663383239613536343065613530333762643832353364616332383835383338
+66363963316436373965323430666232333433336164623963646131386133393631346635653438
+65383866366238636633323765663139316131633831336563666337326662643831306363353636
+63653931353637636139616365386437323138353131386534383234303339656131343639376562
+33366431376661306634653536373165313266666362633438336161313036666264636161393038
+36363061343635323863303733396333343663353535663164356364323763653430303762626364
+37376333353034323438663262313237666338356638373339353334383830613263353063323333
+6439393934316165323133633461363164303932336464666236
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/ncsaindustry/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/ncsaindustry/vars.yml
new file mode 100644
index 0000000..3e9fc4d
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/ncsaindustry/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "ncsaindustry.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/ncsaindustry.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/ncsaindustry.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/ncsaindustry.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "ncsa-industry-gateway"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "NCSA Industry Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "ncsa-industry-gateway"
+experiment_data_dir: "{{ user_data_dir }}/ncsa-industry-gateway"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCajV9E/lBaAdpDecuhB2/Qv3losWr+zNVMwJcpq8ZPiWKA9AFJNT8TW3/VJC/RtrzVzmITMqJYOaQM5mPAOn5D6T7y2CvHxIFL5MktNc1dNiCXbg0nT+zQFirIGNskbs9xE5AWJDsNXOWj1Hjaffk80WjpRNvreXV3mrvdSi0BQYKxp0zIuXNgSR8/LjvYSWn+L/xhrP5eMYcOPlVsrkp1O7imeiib4je0ZNzsd6YXIfNhNoJIzod0AinpmM85zJ/OuemHePE0c4hiU7caOxhBiRxzNCSpN+IFLvo/l8txdnXP1nTwvahZtvVaxuj4OHEeaLSVU8CPxmwBGQEuN4AP"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "NCSA Industry Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/ncsaindustry/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/ncsaindustry/vault.yml
new file mode 100644
index 0000000..496128b
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/ncsaindustry/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+61313863633966633561613739306639653231366135353836313639356633393734333062323631
+6162616137636636373337636530353463323935346465320a353031623731383437323862633866
+39313130386463363334626261303233353031306162306337313238396365356534323363653332
+3334636163626364360a653663383739613037656163663238313734353762356535316666633133
+30353434623763386638333565373133613531663363363832303862633133663162646566666236
+39383530383162343636303034326330333462366365636330633433303332316434623863623938
+33663338363930323366613464626139323866363464316563313866303734396232643464343136
+36633938343232643733353533666437356465393638636136633565336461383738343261393933
+33316161333739366363333836386139326237383539303532666364313461393335623438363536
+31653436396262343235373035333431323133356262303364636365343132626235653736316335
+62643736303938626163653130613630343963346365313134316639316538313164623438306261
+37373562326262616531336262633234373036613730646363613233363766363838353734666433
+64353238343663666533636165316138396133333563326331333066633031656466396137323461
+6633306436306566303066376532383930343336643332323866
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/newmexicostate/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/newmexicostate/vars.yml
new file mode 100644
index 0000000..cb11ac6
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/newmexicostate/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "sciencegateway.nmsu.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/sciencegateway.nmsu.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/sciencegateway.nmsu.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/sciencegateway.nmsu.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "new-mexico-state"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "New Mexico State Science Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "new-mexico-state"
+experiment_data_dir: "{{ user_data_dir }}/new-mexico-state"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRYbUBGqEqUkcsAkQPetJDTTIWGGFbB7DBzvSQUT26SqHpRZQR3J4lCvzmH8/T3KoQC4uxnph5RpiemMeoQIxIJ8hH9Pod3Z0xK2qu6b/jDrbX+UbepkBl8Xc8aE6UWAX4C6rnn1X4ktqLp9GDE2G9CN4+pZxDanK5h7+68qsiz/rpzUEHVDPzo1A5YRPE2cFgOp4s207zE/GaXH2A/+vucdbTmoy2hND3uYkaaMe4ygMlakDDlkMTl5dlgaHuoqVu0pOSnsUimpxV87LpXqWaD1d6G+IVW1CNjKtVBvz/z4aFMLWhqWLYZlLpsoGi4ZqXf3u0A4ajL+6uXgiGuIRX"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Diana Toups Dugas','dugasdvt@ad.nmsu.edu')]"
+portal_title: "New Mexico State Science Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/newmexicostate/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/newmexicostate/vault.yml
new file mode 100644
index 0000000..d2ea04a
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/newmexicostate/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+64363433636434303033313036643361383638356562656262393135616231316261306432353532
+6365376564306435656261303061346339363833626563650a656633623464306662616434393938
+36303862656638656535393431306565343730353630613132636465626265313339613865653731
+6532633662316231660a613930613737343866303938646538636134633362343432306238313565
+64626334666530383737666130653835366436383231623361656535343537626462373539306233
+63663435393365646534666537363064373736626535383939333264663639336664343935303438
+61616139323736313962636261393261323036323930353539633731343737323538393765336532
+61626566653538383635343161623839393736663832653366346133306632383138336164383933
+62613533633337333034316438343534393935323265323039333030636661363138393037633533
+64316630396336666161303031643264373137643562363862393865633538663538326463366636
+39383864363735316563633238396630663334306230353031356632346139643963353130613630
+35663139303565666163663864663963306536303530386133396438393861393466313364316435
+34323532613564316237323665356262306363646139383436376430353036666232363836663732
+3838656236666362376263646166313865613665343363313864
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/nexttdb/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/nexttdb/vars.yml
new file mode 100644
index 0000000..7f76d88
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/nexttdb/vars.yml
@@ -0,0 +1,52 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "geochemsim.org"
+#vhost_servername: "nexttdb.sciencegateway.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/geochemsim.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/geochemsim.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/geochemsim.org/privkey.pem"
+
+django_file_upload_max_file_size_mb: 2500
+
+## Keycloak related variables
+tenant_domain: "nexttdb"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "NextGen Thermodynamics Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "nexttdb"
+experiment_data_dir: "{{ user_data_dir }}/nexttdb"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9jXb9oP4qh3S5Au98nYyV6rOfBXgnvq2asVuapb+a2zyzKKXVxl254IKvFC709F3U9i0re/Z+FQO9qDPZFAgQLps8anyE6+xKuU0DUvzk76OVX/ZMlHfSyRFqKuDBIln02M5rM6qLEUjh7INk1y6z0D1kPW3TsU7w7uY66k4FSAX9qAEZlemy4oCCIQVrege4ZWYSd02H/jXm6j6z7XPI63UbXhpFbZHwdGEAeiQaaas9fDDsy33lN66fC39qV80R5A/7rYQwhyfL1V3wic97lplNyPdZ2fGSUUtFLZxOtJQ1IhDq6kCSYVgQg8U3QviJ5QlYs2CSusshcWUkIZQ/"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Chen Zhu','chenzhu@indiana.edu'),('Lei Gong','lgong@indiana.edu'),('Kevin Tu','tuk@iu.edu')]"
+portal_title: "NextGen Thermodynamics Gateway"
+
+django_google_analytics_tracking_id: "UA-130014168-1"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/nexttdb/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/nexttdb/vault.yml
new file mode 100644
index 0000000..a2477e4
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/nexttdb/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32306464353765356662656234353635383234363137366566626331343137396630646463313333
+6164386230663738356565383762303638353238373762360a363332366264393963363039643364
+35626534393733386235326164643430623061636332633939333561393963303636336336303665
+3339653931303465650a653762303237396665653435623832373564663639333833373737376661
+62366435343737653166303634366432346339663939366637643566376162363931326233376333
+64343736636331396165363462356438323737663438396566616537303530316233386161303339
+38313564363631666436333236646564666333393761616564306238386432336364396233393966
+32633238663133366337393666306139653562313266613034336666346337386338666332656135
+64326135646232653435626434633466623435343935376236646563383439346337336463336536
+36616465613563393366343535626536376231363363303132363963396431333133393734633361
+34656265346365316561626132383364333734633934376432653761646232396331623263373163
+63343661383239363037613862306361383663646365363963333434386433396439383334376639
+37346633376433656436313061313762336666623534613864313337316631666562353237306363
+6236353966303736636261353163386434343861393163656235
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/oscer/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/oscer/vars.yml
new file mode 100644
index 0000000..4c5c311
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/oscer/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "sciencegateway.oscer.ou.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/sciencegateway.oscer.ou.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/sciencegateway.oscer.ou.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/sciencegateway.oscer.ou.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "oscer"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "OU Science Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "oscer"
+experiment_data_dir: "{{ user_data_dir }}/oscer"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZs3ErVmOoQ7GCRwsBJkh3BQVPaoeDw6cja67kXJPCBP7hQ1m9ld0h+PeIt/O8qwPgVN9kGf2fGeekJ9hTjAN8jk0xnU7og7F1RYg6+TqnugyfKZ22ZjfGf/tcc0Wd5BlokvMVJIsLCIv1N0OyxELrGi33y3U98egzn7r0j0uhtNZVN2AC4m1OpRJL7S9FRv9Z7CBXEs7x1j9ctyi3+Q8kBjWm7D78QPqCd2ODrHIDsPZpHm8CUOwHy9p7M+E2bbhkeGxExQhmBIFF75U4Lm3dzUzSmQGvUOppT+Nler8im7ArxS/8OJHEMOi4nW9J+BvtpDztQDAraJAX+VRNjaH5"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "OU Science Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/oscer/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/oscer/vault.yml
new file mode 100644
index 0000000..9837b72
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/oscer/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+65346638383236313362393634313966646164363434666139633865613338316431306137623661
+6638323737343831643366353762366331353239323536370a326330303864333138336431326262
+36366433613661343964326335373865323730363632653664623364353531383364646161303430
+3765626366343938610a383131633836313561353063666639376338313333363531663865386638
+61373762626534346430323261353162373931316166666136636639346238323663303736346434
+32633630306337663266643530333032346230353832366335373130346164366663616566373039
+62643534626166343231366539643264366430356330633164393036393065626337353863656538
+62646461356666336166313138633137316466623734383230363636343430363438343963306563
+34653838353033363433646564626166626238613037633035313038613964663464646365313964
+64383739306138323961646437333137656639316137356232303633646230353836333434323131
+65373665363762353263336336313235623836383235613766363865373764626138323535373263
+34646337383139346363393039343830316238383831343964656235346230643732396666356430
+66383835643038343565613938306462636432623066653161623464373963386635323965336265
+3335303966353433666131303533383732623065356464303561
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/pace-gatech/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/pace-gatech/vars.yml
new file mode 100644
index 0000000..eeb09e1
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/pace-gatech/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+
+vhost_servername: "gateway.hive.pace.gatech.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/gateway.hive.pace.gatech.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/gateway.hive.pace.gatech.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/gateway.hive.pace.gatech.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "pace-gatech"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "PACE Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "pace-gatech"
+experiment_data_dir: "{{ user_data_dir }}/pace-gatech"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCNOy82E44c+/64s1Gd/VeQ4CpcGuTHwodXd1sLKu9sUDVO3pH4oBIQi0SLAns7W9qG63mZWO7lh2lSpqVyVzPY8eN+s/9JcvdLpJaTD35mxIXFTzPjbaVczpSB7DVpwPeQkHysrFe4U3TDgZemmVtFEe0TwU6wmVA42XFZi9+Z+q+jEJuG6t4O4v25jqkX6pQPkfDzMWh8Wxu2jXoBVLYIkpl1hXVGx+xLZFsgPkpjI9/+e29TEfcHBocE2a0/rtRUEFZjYApg2zb8Zglq37c6y8NepT5YyznA0QJV/hr7BogVHqrLy1HL5MCTt83Yn8e5/srNq27yjow1Jy8UHlB3"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Semir Sarajlic', 'semir.sarajlic@oit.gatech.edu')]"
+portal_title: "PACE Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/pace-gatech/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/pace-gatech/vault.yml
new file mode 100644
index 0000000..b991f07
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/pace-gatech/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+61396663616563613966643131383933346439633939383036626435323332643535353132353539
+6161646138353530396537613565666666333033376664650a343466383466633838306337653764
+63323938656563336664343364646238353231316362333639663164373664356366306563363461
+6561393038383830380a346563333333333231656434316334636464623930393433623062336636
+37353730633432663736373564336463353536663238393636303834306661616466326337356333
+66353963353638303035303635386238393135616630656234373564616634623563623831373832
+39306430646538333331316631366635353766343334363033363037613262373836393339313462
+65343837333033323735303634323936633338613736653232646434623763636432636562656239
+32616131373532643835386235656437323330383139636430623030373163323735356630333138
+38636363303765313839626366333639623163643534333263323032623863636432306361636337
+34326366373366623737373061643835663766356534363737613361396661353234373963323730
+62346538616234643337613233326536386138333163646263336136666466393635333930656435
+33326364316232383139396335616635656335326465376533316435386565633664666530343131
+6633393939396237383635353762316165346365616163643933
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/pathogenomics/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/pathogenomics/vars.yml
new file mode 100644
index 0000000..a0e1771
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/pathogenomics/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+
+vhost_servername: "pathogenomics.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/pathogenomics.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/pathogenomics.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/pathogenomics.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "pathogenomics"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Pathogenomics Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "pathogenomics"
+experiment_data_dir: "{{ user_data_dir }}/pathogenomics"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdBkivRTDH/x7ajbhEY8b80WuxA11culrVUgH8x3GoVb0YT5VyrdLRPG/Nj2cFV2VrlGhvQg6gUv+WgIHvfp/hGFNzDH2REeZNcnvVk1LXbQm/kDl1yn+u56IcclUyi86SjLUrx89zhOg+Q5LlbpNX3LUirvbr197F6fVxprYGPsyI+abXcQWnHzW3LGocyYpYbZ+g1+nyBhA47VoWxkK278dWdZo/0XxzEKM0ZLHTplHOpx+vo1404GUvHFe1UD4rSR4o6n/7ep7D8XwjioWCrS/8bHbUHPZ8sOtM1H2qfonPUAkV3O82FiuElmKykApaaTo/UBtzMVNgq7edENfh"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Suresh Marru','smarru@iu.edu')]"
+portal_title: "Pathogenomics Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/pathogenomics/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/pathogenomics/vault.yml
new file mode 100644
index 0000000..cfc3f44
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/pathogenomics/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+36653439643931633766393033313165363539653838373236366430386334653064656265363364
+6636666333383565613865363532353035313939396564650a323136373666313762626337353165
+37653665346135343265313963386437336530623262316566316664363932316332313165303461
+6433303736643130310a666465333436633334613561623937646336303232346331613833356264
+38653530373936613138626131353966613837613266366432306662646561643531653164613639
+63626364336135333361336362633730376561613761666463343030613339386439336237353664
+62323131613764336134613061366637353436666438383764333133616538396533323436323034
+65663464633630646239623432636432623364383535363330396530656539363332623436356232
+30623530616164646131376338383736656231386263623431323134663037613531383633353831
+30386236376366653439613065353534666430336635373738613937373736323337653364666639
+30613562663335333938636664373332643138333039383839306261343061323136616437663936
+66346362643661623432306564656132316666343365303833666437303335623533306362643665
+39386637383632386431356661303737623338306463323331393532663939373362313437633262
+3039623030656238386466376132623434306236346163623139
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/phasta/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/phasta/vars.yml
new file mode 100644
index 0000000..2ba48e3
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/phasta/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "phasta.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/phasta.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/phasta.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/phasta.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "phasta"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Phasta Science Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "phasta"
+experiment_data_dir: "{{ user_data_dir }}/phasta"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCIvxQcdWfZPnXgM1mU++kTuX2ydkQ5BxK0w4stY9qEwJDUoRxF6nstTFBEDkhS34/oBYsJIH9IM4UPxiiplwoIPSYRpqI24pmVNnfJakcsFmxeSVmQRI7SztedXca9IAn9DelJZyORonYsfbsYIDQNzAiMUVs+K9l4flZUqVIZwYrrKfDbd2StC3DUvCugKgJk+v+XsRUxGsebk8wqE273GYPtMt4bdTQFZMfCLg52pXUqrK8RTbL+WdB7uCVXAGC2vu7OsI5+BJSVVUUPiA3vS9oiuZS9qPAYEwowEs+RMl56sGLh5udvhMxaSDn4zqWKTo/LNXcO2p2Y9sit90LD"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Cameron Smith','smithc11@rpi.edu')]"
+portal_title: "Phasta Science Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/phasta/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/phasta/vault.yml
new file mode 100644
index 0000000..acd147d
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/phasta/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+62363666653432366563333232386534316339643562656138373635363032613636636336393737
+6130353365343239346434363766323764643061316164630a376432663832666464336361376135
+64343435363636323037346263633137383232656232633133373137303466313363346537303336
+3662623530663038380a376331323865613435643064346636616561613430303161646134633634
+36663632363231363736333031303638646136396663386639346338366265653661303335616462
+35386336393337393365316338633739356531623932623130616234353034336665616635353265
+34613163303764646438316338393037326433623433313233393064316234623066653662396138
+33393037313866316163633137646632376165663731393561323731363031613362323634306131
+62386633656265666563353036393136653363623632316439386134643663633963303836393339
+36386137316631303531393532316430363334656637343730626631633763663535656562353335
+61363632623833313430633939666331616132363837666462343465313337666134313733313762
+66366537386362376164616363303434343235633630656166376366636632373031373437306530
+33636364623161326261646430313065303238613730306563663530616634363733666262356630
+6136373934333532666130346334636638633663393965366331
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/physicell/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/physicell/vars.yml
new file mode 100644
index 0000000..f83b413
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/physicell/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+
+vhost_servername: "gateway.physicell.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/gateway.physicell.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/gateway.physicell.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/gateway.physicell.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "physicell"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Physicell Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "physicell"
+experiment_data_dir: "{{ user_data_dir }}/physicell"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCagNzgz6E90G5LPsVNGvV45AOR5mtO9JN3ZAqEGp3a8k36IjFTOL5vF44cw0xLdWWDIZNLEd2ufJyTpdyrMPZrblh+z45U3YTiMcDvbtyxVypF84df00AnzvC5Vv2Hzc4v8cTXJyP9hsMQ/phnkbDGFSLEA5WveFkIH5CXMePQ4MjmmTi6eq8xPyjI3R1l4xG9MJQmFOdHT/IRvtUhT35qZDTnZA5LvYwynuyjdRUxNojZuhJAJVgMFEPdMSwB83T+sO/V7IZL8CF9L0179KTGk87gtis+NAhM4tn2CvSh1jvftoG7c67vOnRny5x3SI+pxDvulVEiUVw/xAMyMmyn"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Suresh Marru','smarru@iu.edu')]"
+portal_title: "Physicell Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/physicell/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/physicell/vault.yml
new file mode 100644
index 0000000..76f1278
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/physicell/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+62616363646566313537356163383238373366613335356634623563373761616433623865623131
+6437393238393238383832336534636533303932373234660a346232613732613433666236653736
+37636661383439626339376466643362653236366431643739616363646439333039373761326536
+3663613634353535330a316364396337663366393864396363613632653362336366616633626234
+31323962326363656162366364373139636636636637366337636663353036326666643563623832
+35396334633136666461353162376161633139393039663939656334616633623533383761666336
+61396334316163623663623061333161663362613438633937636162376364396334613861333065
+64656334326363623738656533633039373861303330393032346333616664333834363865303033
+32663137663733373632326632663963383639343235663338613634346338656165393036663338
+61656335336331393639663563363738666234336265363561633136646532383739643830313235
+65656338653230653434653566396462393937353231343637613832313234353364373634346230
+66646434643065353437353463623233313064323062613530663638386562343239643764666232
+61333931343766623036333034376630656439313331386437323236393462313765363166363435
+3033646665303738663330666333666332353930316465383136
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/r-hpc/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/r-hpc/vars.yml
new file mode 100644
index 0000000..a88a588
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/r-hpc/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "r-hpc.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/r-hpc.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/r-hpc.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/r-hpc.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "r-hpc"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "R-HPC Science Gateway"
+#  external:
+#    - name: "existing institution credentials"
+#      idp_alias: "cilogon"
+ #     logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "r-hpc"
+experiment_data_dir: "{{ user_data_dir }}/r-hpc"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCq78vXnKfEBQleOpj3UGEZE9VDkUk8zO2grZ+u4gGdfV5Wx7jE0453PdQAdOjGxrusP5ERzWtwgg3myVRPGoq7cZOFL/7N96l1a+IxOZuJnEcL47EAGniOohl9NMnE0URWN8GA06Ou2pCHzraVhffG/QQocXPLaWbV2RU7dwh35AylBVBoxDWrcQ2xs+AZZjFtRg+XQouVbd6cVIuP0JtNQWOUZPKBb97XIoq28jl1bNcBLjiiSZ5ki8G5YgGwFD/aWXei8bX/iNfKWuiCgDXOuGH0yNs9j+SRyphkY+j1607ShUMcFxiLe7VBOztfgW/dCeyNkuMRhk6J8K8HgRGb"
+
+admin_emails: "[('SGRC','sgrc-iu-group@iu.edu')]"
+portal_title: "R-HPC Science Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/r-hpc/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/r-hpc/vault.yml
new file mode 100644
index 0000000..7cab3d0
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/r-hpc/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+34636238666333343931646165616363393930366431323231363934633261376533326362623233
+3639313737393432303332363864316237616231333539370a643537333237376338333963366162
+63333738386461393765666664333032363563356535386236356133356639666639623533326565
+3638316339613763330a613834623633303533633262343632313531363239396236356539666335
+39313464373531373834383436333438383861383163343530346562376363623636633939373132
+64393364656238336430393963636530343138343039313034333931636232626538363036383636
+38313234613064363230636633643739623936323961346161323838353763616638343634386261
+64623639666438653138366461656630636634383030336434633432656439663437643165643132
+30303963343866656336373064356164313665316435653266366633623039663664633037343033
+66313539323631363830376561306337396133336236626336636261353466356561323764373237
+63373239663232366134373265343535633132363866303663306435353138363333653963633831
+36656537313034646363356432383233336633376332623139636635663632336235613831326464
+37363661386530656163313264366337396335616630633939646262353338613038663864643836
+3635313166396338383035353263396264616565386230633933
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/rutgersgemr/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/rutgersgemr/vars.yml
new file mode 100644
index 0000000..7e7ede2
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/rutgersgemr/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "gemr.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/gemr.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/gemr.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/gemr.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "prostate-cancer-prediction"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Prostate Cancer Prediction Gateway"
+  # external:
+  #  - name: "existing institution credentials"
+  #    idp_alias: "cilogon"
+  #    logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "prostate-cancer-prediction"
+experiment_data_dir: "{{ user_data_dir }}/prostate-cancer-prediction"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCaSojVxYa+6AS+jf+AyUnD0YqWisUeyiqjJ1Bi0p+d0FCAgxk2xyOX1m1eVvOLlxoL1KYzHV6cBqLyhSMMRsp1qiDrWkq9UdJiSywO/KvgjKfMrOrsgSj84BRo7ceJK5irAqeGIdAgDhGTJFuV+OEm+iDaRK1Om2QvkuGwEYQ1EZLY9H7JpGgU6Fw0Aoh4e2wYwp/RQ2QGNjc5EGddZJZil8W3NlibKJ+5Yl90kyX3s2tEUjQSBNYXcokUvc01ZdfAY3TUwQlTlMyJpjZyuTF8Ea4fw3p9sVHRNrLIyCmYHrMxGTNVapV5bk1NZd1LxhqRjhKvIP4kFNd7lW30k/sT"
+
+admin_emails: "[('SGRC','sgrc-iu-group@iu.edu'),('Kristina Plazonic','kp807@oarc.rutgers.edu')]"
+portal_title: "Prostate Cancer Prediction Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/rutgersgemr/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/rutgersgemr/vault.yml
new file mode 100644
index 0000000..755a82f
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/rutgersgemr/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32306130313732636537656435346434323632663564333832646665326639653166393263306235
+6530363831316437343936326364613438353164396231310a323833323535623566326437616166
+64336265383533373863396432356233623236363833613865373336336330343730366339363766
+3639376533616462340a656136313436353062386463613066653936356433623966383535613962
+37646565386434326666373232663562363561663164323564383265383232343337626363393731
+36613762306461353762353963613766323532623733643464616531646263663466636437633836
+30383233636132643264353665373339613333636463616665616664646231633238636534653735
+33626532383431313363393433356135333838303736363366393332346237353066323035323739
+32316337323165383864363038656234386636313961353365353036653132323034393963623730
+31323261613238626334623539393365306337613838386531353363386536613137316365333232
+35303339336161383431623531346663656633376466393364383961393436393338356165653561
+37336637336262633933363435333833653235643961616164383737306664363730643264333739
+30303166396566333962303633353038393630633337316330643231333463656637346632356663
+6231323363646663373563663332306539613364653662616139
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/saverx/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/saverx/vars.yml
new file mode 100644
index 0000000..ea1c265
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/saverx/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "singlecellgateway.wharton.upenn.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/singlecellgateway.wharton.upenn.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/singlecellgateway.wharton.upenn.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/singlecellgateway.wharton.upenn.edu/privkey.pem"
+
+django_file_upload_max_file_size_mb: 2500
+
+## Keycloak related variables
+tenant_domain: "saverx"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Saver-X Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "saverx"
+experiment_data_dir: "{{ user_data_dir }}/saverx"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCN80RHzcW1GuYt8e1G4XJJmufZ4QBq5XRJB17jsIhuNcpCishLXiaL7eR0qnkPPi8vyuU0MqZ7R81IV9lSp1nnYOxge7DSTAzt+mo1Sfmg/sgeClo+RhH3ZDxsya4nTrVzkYvKzJsu2dD1o7TBZnfKSvq8EhwaYbO7+OgvGc21ZJQYDSq02HrRE4p7toTMNptQEPZTCFalppEMzljvnn5VNOiH9PJyxwSjUFcR7+PTCR0v0m0bkP9nCOz+orIYSrf+Jw1UJJJ6AE26vmeKfMsJjkhmM+cNUEiPiVm8ZoE8IM2tl4BcKofA5JxciH33jG9FH04qmahq4jtAScJS8ty/"
+
+admin_emails: "[('SGRC','sgrc-iu-group@iu.edu'),('Bowei Kang','kbw@uchicago.edu'), ('Jingshu Wang','jingshuw@uchicago.edu'), ('Nancy Zhang','nzh@wharton.upenn.edu')]"
+portal_title: "Saver-X Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/saverx/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/saverx/vault.yml
new file mode 100644
index 0000000..9c1b2c3
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/saverx/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+33313965316334323266653236353064363965346633373935653561653839346433396138353162
+3737663631346138376337626539653636313838393061300a363038313335353436633461613363
+36353531326563386238366337386438363865303731313237613961643064376435353364346333
+6431353230643561300a663961616330653830313936306662653565663330353865616134393332
+37346139616263343931333862326563353336613430396130643533353136376436376236383538
+66386530393832316634353538626530616235336636396439356339613265663334343263326665
+36303530663934353136366162646538323335643539653764383164623435366533396566636163
+36363065396335366138666363333032613666336264316163636432346261313334646265396135
+61313430386531363231316136383838393064316130363861633063393266313936626332616339
+30333464633732313038663032663464363261373534303636636466313264623262353663326264
+66376338353362363063653562363666353962613665613862393366383764353530616664613765
+62623666353737346331613539393737353633613131633465393035333565353334613831393039
+33313939336462383466313962386231633836313830376165353039336634343733303434303861
+6234313964613862363162313361653165323031643932666463
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/sdstate/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/sdstate/vars.yml
new file mode 100644
index 0000000..3ffaecd
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/sdstate/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "sciencegateway.sdstate.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/sciencegateway.sdstate.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/sciencegateway.sdstate.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/sciencegateway.sdstate.edu/privkey.pem"
+
+django_file_upload_max_file_size_mb: 2500
+
+## Keycloak related variables
+tenant_domain: "sdstate"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "South Dakota State University Gateway"
+  external:
+    - name: "South Dakota Login"
+      idp_alias: "sdsu"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "sdstate"
+experiment_data_dir: "{{ user_data_dir }}/sdstate"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7vqwM+CWfqVWODe3iLsKN9leJ9nI+pKFZhrVUG8K/ODycXT5tQOxMhsC+HG6/wJ1W7+LeA6uvVnltnFlVozfTs2jeJzVQ71UvfUiZFVhXian3f8Nd4DXBvqPUY8dmhWP/UJCIKO47fSI/RC2ZlMa1K4yRYPdRgLRuSmtzG8Rb7YGVjkt1uDOLMh6hAS1KKpWVSxESFeqqoKj2xqOKBnbf2PdJt/D4/2R6H8D/WAM0cdZnls5fmiUysHK+bU8atzMukLQ6STglVv0WuqNGdAw6zWZH+Kaj8bP19jfkGCbMLP1vPYRkcxLmtnSzbg2Hams9npwdAA+xwwjuS6/tAX+p"
+
+admin_emails: "[('SGRC','sgrc-iu-group@iu.edu'),('Chad Julius','Chad.Julius@sdstate.edu'),('Kevin Brandt','Kevin.Brandt@sdstate.edu'),('Luke Gassman','luke.gassman@sdstate.edu')]"
+portal_title: "South Dakota State University Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/sdstate/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/sdstate/vault.yml
new file mode 100644
index 0000000..46ecd4c
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/sdstate/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+36366134623034343837653738303539356432636535666339393563373562666338616638363932
+3766633564323238326630643134656261616263356335310a653031306238656530386665313433
+61656139343961663235313366396239616436633163636165643136326633323638643766356465
+3135383964306230380a626337306165306165306365313461383734653830656565353962666333
+66356630623061653031343233656332393233356331386438336261613431363463343939333565
+30373661616531643536313039313565356238636238356233646132326131366164616532316234
+34666466663831646230336337333033663663646535313439326232646361313165646630633531
+38393739666365626564663762356436343231626261313561646531636563343566653930386132
+30626566313563636165623235336562663531383630623036323433363733616133323266613730
+39636538333032323438393534346530333663656137666363363962656462353236643235383530
+38393634373834323639653137616334386532373261623263373061343964343937656665343835
+31353762663063633265656163333534323038363930626535316433343033666362366331303731
+38656134313365656638366433303466373432656637313034313135303165343633326263326339
+3837316430383435666664346265633737386462363733633963
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/seagrid/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/seagrid/vars.yml
new file mode 100644
index 0000000..06f75d1
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/seagrid/vars.yml
@@ -0,0 +1,54 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "seagrid.org"
+vhost_ssl: True
+vhost_timeout: 300
+vhost_aliases:
+  - url: /seagrid-rich-client/
+    path: "{{ doc_root_dir }}/static/seagrid-rich-client/"
+ssl_certificate_file: "/etc/letsencrypt/live/seagrid.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/seagrid.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/seagrid.org/privkey.pem"
+
+django_file_upload_max_file_size_mb: 5500
+
+## Keycloak related variables
+tenant_domain: "seagrid"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "SEAGrid"
+  external:
+    - name: "CILogon"
+      idp_alias: "cilogon"
+
+gateway_id: "seagrid"
+experiment_data_dir: "{{ user_data_dir }}/seagrid"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCApfdud3cJ7rx44M41gEKVgRfefk/Vd/7dIp9Xr9juX4jqmGuLoZR+hk287Hmbps6hZv23Av97XkCLldH0pueDekthcBDo4cRiQMDBp9NLz/9muqYVBl985psEbazYygagy/q/3ebi4CVEYVd4cHBee1V3GYyuJS2RklF0s/Otyf8x8auJSMniHGbTbVqtFlEOYuPdXlRBfH37k55N7+2iXKsIVvgn1MDweHEbQWJMx2LDCkLfJitreTiwcuST55w6N/n8WYZM2t+ie3BJEr6tcGAVIuyxj7CbMYMziM/hM5J+oQGPY/IBtiNZoxiZ0DeAC9SiEvE9fbTEW2iRWnQL"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Sudhakar Pamidighantam', 'pamidigs@iu.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+portal_title: "SEAGrid Portal"
+
+django_google_analytics_tracking_id: "UA-110457476-1"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/seagrid/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/seagrid/vault.yml
new file mode 100644
index 0000000..4d51260
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/seagrid/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32633762353861333235303363393731636530656265326238316630646230613966613830346434
+3964626439616365396266353239613632356466343734370a616432396133303063303733623462
+35643566386562666164396434303637383965383337383637646665333365346434396239343238
+6635633665396439640a653730383539373630386638363933393661373030346132613331303866
+39396139383763623534333533353437623936623463346334626230663837613037613064303237
+33663966373536313335336137373834336238383465303366383466613161653436626330363435
+61396339363964363932306664393939323332636430396531373134343137323736366132363366
+33626430393165333135623764336136316538626532303066393337633065353564396538303039
+37636265646437643334363533383965633935393265636561323130346636333634633864383337
+34643965393462376533333235663338656434656633613034313337613566363962613930613834
+65323563636338363539316462663664393763346436326361646266633931343136646166613362
+34316233323762393134643335383034636433386138663436636338666566633563396336373935
+36636137323366346561323630653534373835353738363463333739306264353231303435633331
+3538333835393761643036393938623462663433386536613834
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/searchsra/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/searchsra/vars.yml
new file mode 100644
index 0000000..9c10836
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/searchsra/vars.yml
@@ -0,0 +1,51 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "www.searchsra.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/www.searchsra.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/www.searchsra.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/www.searchsra.org/privkey.pem"
+
+django_file_upload_max_file_size_mb: 60
+django_pga_url: "https://pga.searchsra.scigap.org"
+
+## Keycloak related variables
+tenant_domain: "searching-sra"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "SEARCH-SRA"
+#  external:
+#    - name: "existing institution credentials"
+#      idp_alias: "cilogon"
+#      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "searching-sra"
+experiment_data_dir: "{{ user_data_dir }}/searching-sra"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCx981DispO1AnkOAwq1oJ3iaYUW6KT4jn4OPSrvIb1fJyjkNdBK8KQUTviBMgqLH9+FlIx/FYjN7sVLelGUmfOgguIWB4Ea2epAyvGFfrVeF83w5A4uILfrd5AJQuk0sZkNjnnGmmpx6z60IThaof2f14uD7JPcn5Kf0xnfmhJGIo2DYJRp8DYJ4Upd1ENu4p3CqylZGBFTx0ROe3hCNj28BxCY+kTgKTQJQHdwuHK9WxovQHdv2ZrN9GeSyIPUX8W1PpYKqM2i8xGaagPUamHON9TonHyuAdd84CagonwuaG54+jbFbB9uW/zhhnP5vNRxK8aSNIhszOucE2g8xzL"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Robert Edwards', 'redwards@sdsu.edu'),('Mats Rynge','rynge@isi.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+portal_title: "Search-SRA Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/searchsra/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/searchsra/vault.yml
new file mode 100644
index 0000000..15c4e95
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/searchsra/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+31376431346634623538653338666363363330366137336331616461393637383861343731376431
+3963663666616133643533313061643364643237356266620a326337656337336436333233616139
+61626439636562333764336361656661323639636130303832613835326632343933356235303234
+6635616238613864640a306237323163316538336332633231343863303837386164376231383363
+34303862303137623566376462333762386236303134663336323066343431663036333463383266
+31353030333965323464326236633466346362356466363862366165363230373261356135643362
+34323131393638643539646265643366383636333236376235383331653330353661653731373362
+30383733613237383065313466393565396435666539363032663539376430616336353333333463
+61316138303065346230333635633361623338633763323539323032663061636633313238666633
+66383938396164346338626361626461343965396634616466366430373538353532303832386233
+61376566633732383431613035633437376135353965326662333635633764333336323764386366
+61353837613839363438393732623438313463343366393733646435633238363534633739376263
+33313837346562613833363437373530666533636463353534306432633638646466313336626231
+6566323761666139336631383839383234626363646362366666
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/simccs/files/django-ssl-vhost.conf.j2 b/dev-tools/ansible/inventories/scigap/production/host_vars/simccs/files/django-ssl-vhost.conf.j2
new file mode 100644
index 0000000..6090cd1
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/simccs/files/django-ssl-vhost.conf.j2
@@ -0,0 +1,83 @@
+{#
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+#}
+
+{% if vhost_server_redirect is defined %}
+<VirtualHost *:{{httpd_default_http_port}}>
+    ServerName {{ vhost_server_redirect }}
+    Redirect "/" "https://{{ vhost_servername }}"
+</VirtualHost>
+{% endif %}
+
+<VirtualHost *:{{ httpd_default_http_port }}>
+    ServerName {{ vhost_servername }}
+
+    ## Redirect all http traffic to https
+    RewriteEngine On
+    RewriteCond %{HTTPS} off
+    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
+</VirtualHost>
+
+<VirtualHost *:{{ httpd_default_https_port }}>
+    ServerName {{ vhost_servername }}
+    TimeOut {{ vhost_timeout }}
+
+    # Reverse proxy to geoserver on gf8
+    ProxyPass /geoserver "http://gf8.ucs.indiana.edu/geoserver"
+    ProxyPassReverse /geoserver "http://gf8.ucs.indiana.edu/geoserver"
+    
+    Alias /robots.txt {{ doc_root_dir }}/static/robots.txt
+    Alias /favicon.ico {{ doc_root_dir }}/static/favicon.ico
+
+    Alias /static/ {{ doc_root_dir }}/static/
+
+    <Directory {{ doc_root_dir }}/static>
+    Require all granted
+    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
+    </Directory>
+
+    Alias /media/ {{ airavata_django_checkout }}/django_airavata/media/
+
+    <Directory {{ airavata_django_checkout }}/django_airavata/media>
+        Require all granted
+    </Directory>
+
+    WSGIDaemonProcess {{ vhost_servername }} display-name=%{GROUP} python-home={{ doc_root_dir }}/venv python-path={{ doc_root_dir }}/airavata-django-portal processes={{ django_wsgi_processes }} user={{ user }} group={{ group }}
+    WSGIProcessGroup {{ vhost_servername }}
+
+    WSGIScriptAlias / {{ doc_root_dir }}/airavata-django-portal/django_airavata/wsgi.py
+
+    <Directory {{ doc_root_dir }}/airavata-django-portal/django_airavata>
+        <Files wsgi.py>
+        Require all granted
+        </Files>
+    </Directory>
+
+    ErrorLog {{ httpd_log_dir[ansible_os_family] }}/django-{{ gateway_id }}.error.log
+    CustomLog {{ httpd_log_dir[ansible_os_family] }}/django-{{ gateway_id }}.requests.log combined
+
+    SSLEngine on
+    # Disable SSLv3 which is vulnerable to the POODLE attack
+    SSLProtocol All -SSLv2 -SSLv3
+    SSLCertificateFile {{ ssl_certificate_file }}
+    SSLCertificateChainFile {{ ssl_certificate_chain_file }}
+    SSLCertificateKeyFile {{ ssl_certificate_key_file }}
+</VirtualHost>
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/simccs/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/simccs/vars.yml
new file mode 100644
index 0000000..705ba15
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/simccs/vars.yml
@@ -0,0 +1,77 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+# NOTE: simccs is deployed on scigap11
+gateway_data_store_hostname: "scigap11.sciencegateways.iu.edu"
+gateway_data_store_resource_id: "scigap11.sciencegateways.iu.edu_96b8dcec-ac84-438a-9927-91baaf87758b"
+
+django_tus_endpoint: "https://tus.simccs.scigap.org/files/"
+# simccs_maptool_branch: "master"
+simccs_maptool_branch: "dev"
+airavata_django_extra_dependencies:
+  # Need to separately install cython in the VM or do two deploys, one with
+  # just cython, then a second with the other dependencies. Reason: pyjnius
+  # requires that cython already be installed and they can't both be installed
+  # at the same time.
+  - cython
+  - "git+https://github.com/SciGaP/simccs-maptool.git@{{ simccs_maptool_branch }}#egg=simccs-maptool"
+  - pyjnius
+
+django_extra_settings:
+  JAVA_HOME: "/usr/java/default"
+  MAPTOOL_SETTINGS:
+    CPLEX_APPLICATION_ID: "cplex-solver_99721933-c9e4-4285-9ef1-d035ca82b541"
+    DATASETS_DIR: "/data/gateway-user-data/simccs-datasets"
+    JAVA_OPTIONS: "-Xmx4g"
+
+vhost_servername: "simccs.org"
+vhost_ssl: true
+# Some of the maptool views call into Java code and can take 2-3 minutes to execute
+vhost_timeout: 600
+ssl_certificate_file: "/etc/letsencrypt/live/simccs.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/simccs.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/simccs.org/privkey.pem"
+# Custom vhost config file to specify the geoserver reverse proxy
+django_ssl_vhost_template: "{{ inventory_dir }}/host_vars/simccs/files/django-ssl-vhost.conf.j2"
+
+## Keycloak related variables
+tenant_domain: "iu-geology-survey"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "SimCCS"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "iu-geology-survey"
+experiment_data_dir: "{{ user_data_dir }}/iu-geology-survey"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEuA1indjdczBXg2qrmD0bB0QfKq0u2q3o25DegTaty5LoogW+APEvXmwc2g6PzkM75MgfMsTErMQaQ3/PoElADQKg2/NePz05YWobn9zrPZFeRWfOqWMjFDx72cffHKBzgnahFDBlR/YJhf4IZJ+EOA1zMiMF2oZQmEYQtbQFhbKPF+jrScEQeuXVuXWSS2sKNAVKj3pY4kmi9kEOYELee/O6ghBUfrVhB95vDKJPgmQSuo3pgkLRdflTBSAQ54UchwjXi2RA9Xv0RXJF/JyyRGn6bSbRxYhsm5RJeiBVj4ua7p2b36rSYVqtVsTKEonx5kYdKzwyjJXWpjB2KtQp"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Kevin Ellett', 'kmellett@indiana.edu'),('Ryan Kammer', 'rkammer@indiana.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+portal_title: "SimCCS Portal"
+
+django_google_analytics_tracking_id: "UA-130065143-1"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/simccs/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/simccs/vault.yml
new file mode 100644
index 0000000..7de5f3c
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/simccs/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32303938663931376464373435373336356365613066333233363261633334333266633064633730
+3937316131366235636466623763333833326635376433630a613563623734333362333332346630
+34666338323132333037643337353962313165663762376462383962313537306662313665363063
+3337376331373535650a333936393135333364613764656362353731613135623363333330343031
+33343063333134393166393666336562646135333930346237316264333263363232653464353938
+31613062653563326564613237666338346564626136666362653463396435386565633537383363
+37306463663131333032663763383334373232316266343165636632336365353665313331393336
+62323262333633653930626536313839333562653062653834333163633833386131303332333031
+37303831376265313034373134666538333333656438306134653464306433326232356133353832
+65383062653265333966326631393666303032353937343835663636646439633738613266393430
+30363566383538373363653765326239393535373663616661393164373031356230356165386338
+37353261343463363635353131366232393532383930373734623036613234396531386538343834
+30353333653837346530376664373661363434373232396132666339313931323732666661373064
+3634393163613436326430353838363561633639353535633538
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/simvascular/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/simvascular/vars.yml
new file mode 100644
index 0000000..51acd22
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/simvascular/vars.yml
@@ -0,0 +1,52 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "django.simvascular.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/django.simvascular.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/django.simvascular.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/django.simvascular.scigap.org/privkey.pem"
+
+django_file_upload_max_file_size_mb: 2000
+django_pga_url: "https://gateway.simvascular.org"
+
+## Keycloak related variables
+tenant_domain: "simvascular"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "SimVascular"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "simvascular"
+experiment_data_dir: "{{ user_data_dir }}/simvascular"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCNdivlUyLh11poF2vufwa8pCjVY0/fkvym9qdpEeu6nS55CVZe5VXqA1NZ+IwVDabAFwoLrUvaWt7eE8POEZNiBgtonZ21x6KIK5/HilSM6jHds1u6NY436AiHqmcybO/u+NkUI8gUjWTbs4S/i/2WfvAHZc3dbcCHls3QgG55TqOdNnh2pjFLSA1wu0d1qRnrPwnje/yC4GD+3XU1HPLHb9FXLHO4umswKq8sDk2lOIN7u08pCF8Y+BPYfmEdvY8oFwdVsj3OoA3fWEE42xTjb3g65X2oCbhco1g1ya0cfJMgSUbHCcOc2D//rXD+L4/z0/A2VCiEFJtTllrws609"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Alison Marsden', 'amarsden@stanford.edu'), ('Nathan Wilson', 'nwilson@osmsc.com'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+portal_title: "SimVascular Gateway Portal"
+
+django_google_analytics_tracking_id: "UA-111528347-7"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/simvascular/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/simvascular/vault.yml
new file mode 100644
index 0000000..aecdd17
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/simvascular/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+33323735346138626633386636373833613861656535663834366466343266666239626466623062
+6237336437386537613964613233313965343632386430310a303532646239633533333631636236
+34333630363961663936663037643362316262386330313935666634653062623937356234306662
+3766366539316437300a633165313136623366663561633961383138626161333962303633363134
+31666430633339353838313931616164613832663031643939336339326135623761343264356430
+35363264326334623761643363386539326461303338633862333239363561326137616166376162
+39353837653565343837663063363330386538353334666162663838616263306364396339346338
+65303761376431313865323534656639346365633265303639396465656334636139383434626365
+31616430666437323162343135316435306231646630323364353962316135643262343634386530
+65663439643333393534343233343463356635323738383930613064633032333664386631383033
+66316165633930643664363531346164616632353533393436623230626162373965313366313832
+66633963613134366539306166343339623136336132373138353435613435326132663332373065
+38306164623938303133303866616231666136313434333835663264373536363663636538646536
+6134613564643561346338633932313739623431333530613465
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/smaltr/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/smaltr/vars.yml
new file mode 100644
index 0000000..820ff18
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/smaltr/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+
+vhost_servername: "smaltr.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/smaltr.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/smaltr.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/smaltr.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "smaltr"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "SMALTR Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "smaltr"
+experiment_data_dir: "{{ user_data_dir }}/smaltr"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtM2RTAS0ZnwJNjYEWjvt2JArjyoCZQzBJlXYvqeRyYTQPeSTH5nJP1VCkpJ4a7B44gHkcKGORkvNd+PrW7An8otTIGlXfbwn5L20CeKPsk6fWwF99fU4JFvakNANgAfefsQ3OrTgBBvZWkKeK7JztMHbEZw+SJoPZnjlxoKRib/Ymt6Bo/gh833eHth+Rvp2v3k4DPu6cTsOaTCv45JT8E3dBeERASZNdepKanxiQpz/QZg344JxYYQpJP5zKQ7jmfUphDkwFkp7RlAYgkSVC7yiQSgRqcKR38BXEAMqR/0eax/T1IujDKscSJpS/ibXToOl8qoRDwMStAi6Ym2wx"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Aaron Frank', 'afrankz@umich.edu')]"
+portal_title: "SMALTR Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/smaltr/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/smaltr/vault.yml
new file mode 100644
index 0000000..e4f35f2
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/smaltr/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+36623639353861623861666537626434646563323163643361383035363537336133356562396566
+3330613430623162303337653061653230353963373930620a663933386138303665643231663737
+66393734613436353532393832383033323538616235323634383238363933653537626235386266
+3466616133336331300a353738303733376666373164326238623739313038653866613332376565
+39363132323534323766633361616239366234613034346465303836633234313137623533326230
+61326134333434613061316433376337383830613737323936303133306339643239346531643962
+36373263653164666264353962643636326264386639613530393434326665356632373138326132
+34373261303632636133326261383766376631666566313632363931636236623064616232646561
+61663833643435343764623463666265346665376638633165653338393430313834633935313961
+30363437643064636638356536373030623237363134633433393937383365663065313566646664
+33336363326636646131333339346535633837656532643834633664313432306463663330346431
+35633466393631366666363564613766343534343435323635393031613162313532643764613238
+62616331346661303239396134313035303231306635306331346437653466633939393366336530
+3965323561623338393262623536383634313862353739363731
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/snowvision/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/snowvision/vars.yml
new file mode 100644
index 0000000..76fec55
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/snowvision/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "snowvision.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/snowvision.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/snowvision.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/snowvision.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "snowvision"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "SnowVision Gateway"
+  external:
+    - name: "University Account"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "snowvision"
+experiment_data_dir: "{{ user_data_dir }}/snowvision"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCovd8MvofK9SPJZiElqP4rd3xpaHZ7qXK0RFxRQxcCTcAJbDMGubZlo1+N0Io02ZIVkKfdtbee+sznpQ6ri6MMaK1xnYmfyMT5yj/pUZo+g/jIC0PMYQcHpnq49U7Fz2BBYqbc9EAAcU35X4ctof1/UwlWMFa+gegky8NngHBZmZSpgIzVb5jlgti14OD5ETVFG4YvZ2ZRhkQESSuZPFdjxiXoDqsJkF80cD+JTu5LWha1UwhAC2yrGZuI/16WABzx/zUGOS0NK0RYS/giIzVGQSYVp9S8GgZKuvJx3xk7nW6HOMbjpVeukjkWareIkVAWXgFIMptX0QRhL4mcjCIB"
+
+admin_emails: "[('SGRC','sgrc-iu-group@iu.edu')]"
+portal_title: "SnowVision Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/snowvision/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/snowvision/vault.yml
new file mode 100644
index 0000000..1d282f4
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/snowvision/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+31616131326562346337383031336261346161386665383037316533313731613736383766663432
+3338363262333663313031333333303335663564373638630a313735623362353464646138313731
+39663338316561626131366663376233643334623336393130633936653836623162323762323639
+3462323935653538390a663733633831396334633136646632383561646637303433376264626439
+35623363626536343839613632346163613265643432386561633239346266353230376438353866
+66623262623763626438643935616336356633393237366330393365613965393763333831663962
+32353533353965663231393237653764613737383734366231336163323835396666303536643065
+39386139373164343264653162623934306334613235333634363638363362626663323934666237
+36373765373037323938333764323030383863643937623436333966386535363533653234313363
+62373034653636353931373636383337646133326634633530373637393834396231363638383735
+64333035303662616134613638373636666666656565346264613933386430313139323637333536
+32373035343238656361616138336631653831613763613162373738623733393633303361383735
+32346634373966366266663264613435373564303266646664616535633466393465343133656464
+6138336230336464646565346135393030663364303237386666
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/southdakota/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/southdakota/vars.yml
new file mode 100644
index 0000000..5a3ba99
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/southdakota/vars.yml
@@ -0,0 +1,49 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "sciencegateway.usd.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/pki/tls/certs/sciencegateway_usd_edu_cert.cer"
+ssl_certificate_chain_file: "/etc/pki/tls/certs/sciencegateway_usd_edu_interm.cer"
+ssl_certificate_key_file: "/etc/pki/tls/private/sciencegateway.usd.edu.key"
+
+## Keycloak related variables
+tenant_domain: "southdakota"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Created Gateway Account (Users without University Account)"
+  external:
+    - name: "University Account"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "southdakota"
+experiment_data_dir: "{{ user_data_dir }}/southdakota"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCIUqpKWHwawFHnbWvs6pie+fDA9NlqMZNvzil7e8FQz7543+FOzdTl/octACjGnSTwHewpyTe9sAUVcnq6VJ5XYtApR68zMasEzyCZUMWhMqEuxopRZcUGDJVcq5hD4RZcer3aMPWSVmXVCNJeT4EsB52Zp2DfDVgfaOOfY8Ga4mcR2IdOyizV8HWXTH6vWFK+dD1GoPY0ECikwlsF1QA0vzqAcb1NYOTc70hZ9Pb0/78XF790joZ80hRsHGIc7IfncoLgRUkKSkMaoXbfy/tbqf76V0ZxaQOgayaLGF19oBlREO6ZQ3rDCOWgVJC32dCwAsaL9qWd0IZrprUEUQOd"
+
+admin_emails: "[('SGRC','sgrc-iu-group@iu.edu'),('Adison Kleinsasser','Adison.Kleinsasser@usd.edu'),('Bill James','CBill.Conn@usd.edu'),('Luke Gassman','luke.gassman@sdstate.edu')]"
+portal_title: "University of South Dakota Gateway"
+
+django_google_analytics_tracking_id: "UA-111528347-1"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/southdakota/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/southdakota/vault.yml
new file mode 100644
index 0000000..dc16a78
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/southdakota/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+64313730353530373465623461306430303335343231626238346562303634663166356662346531
+3234373963643831336165393763613963346364366462350a636336393763643636666531626539
+32623364373135346463386435636531383635363831396331653231663437373866326531363831
+6161663263653732640a613264633731363731623031343439626135333264373466623166323939
+36393932333134363839353730333731653032333839623866353962643631613031633135323163
+62343962643032643164303630656362636336326439346539626139616439366330386365656566
+64313964376432626538653334396431343032333033666664356534656664343430306331326537
+65653638306366353564353662663131386132363162623965653037643235326366623937666562
+32613961623164313766633163393535313163383635356638333430303361663966366633663835
+61643233663664613835356663346631376431656564643962323761386230363532346534373466
+61666536663632363662353663366434323335613137323830343835333830666430316262356461
+35636563666430373862393136623430373038363834343934653031336533313839393966343438
+66633034353862356237646261663136653433343236653332393032663831666336393564303235
+6266663632383264353261316564373539303734316430373335
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vars.yml
new file mode 100644
index 0000000..f3e6565
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vars.yml
@@ -0,0 +1,51 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+airavata_django_extra_dependencies:
+  - git+https://github.com/machristie/gateways19-tutorial.git@solution#egg=gateways19-tutorial
+vhost_servername: "testdrive.airavata.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/testdrive.airavata.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/testdrive.airavata.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/testdrive.airavata.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "default"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Airavata Test Drive Gateway"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "default"
+experiment_data_dir: "{{ user_data_dir }}/testdrive"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCUF51b2cYYqqadLHL9M/oPY0ZHZlWbdOdaIgjpzIzMnO7M9hKrHVY2pqyLPvqCLzaunxITPWsTqw0E8hwub4ttGLAx/O4kIf+BgyZK7iuwXWhI7u85/o58IfrD4B+jVCYKRNayuLR+lJWsiOeS6HSlunpTKTEhFGeOHn2UzdbLfgWYQ3VUFDtKN1oDPDT78ml5c2RCibJ21jltpevVfEtCUctERpTfniWSuQZggP1qiLNa1+PfiJ3mGsEzJFDntQvQetdinaAbEaT7+sctS8nBNjapkmYMf6tBl3S0bLttYPH51f8lUQAFaAzrestO1JpJNnIeY01/S3MWIlAWASnn"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "Airavata Test Drive Gateway"
+
+django_google_analytics_tracking_id: "UA-111528347-2"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vault.yml
new file mode 100644
index 0000000..5623841
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+37623936633663366663346435386565626133313036373264633162383430383635663666653638
+6664356436646561333165666331646138363231623634350a623339613336313562323061353336
+35383835613265306433633366386564653363326362623537353366356636326437653932613931
+6235323062356662630a333833373434623966396465623163633362663337386464616638613331
+63613966383363626238623733396161653832386235396462323534393537323936623134313339
+39393335303137613463326262373835373631393730633462623538356436326630663134356435
+32373838313437663337333962633534653330396566393339396435616665353666653330376637
+38663936646563356634666461326531653264366231646238656536653439613036333136363664
+66376437366437356235373665303031363766643137663931353863626139373235663662313133
+39643733333464373761376365336636376630656437303939373864656266323464633636653539
+66373161306532333263373136316566323537653465373030663364613832616265363434663465
+33613365343035376636316636633665663139373339396332393431316431353863353762333531
+33383435653364356632336435386465333630333063303033346162373035393034363664313637
+6237336561353036343134313561396132373237623833333162
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/toppic/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/toppic/vars.yml
new file mode 100644
index 0000000..9b33541
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/toppic/vars.yml
@@ -0,0 +1,52 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+
+vhost_servername: "toppic.sciencegateways.iu.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/toppic.sciencegateways.iu.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/toppic.sciencegateways.iu.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/toppic.sciencegateways.iu.edu/privkey.pem"
+
+django_file_upload_max_file_size_mb: 2500
+
+## Keycloak related variables
+tenant_domain: "toppic"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "TopPIC Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "toppic"
+experiment_data_dir: "{{ user_data_dir }}/toppic"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfQ9gNhK9Sbs/0uUL1i4xuIXqw+zW+cnKc6O7t1VC8jyGL/awc4tWoTDCyXhloKmxcfHw+ci769AXp8FxC74JE12HqmZ7gmujRrsLMhHpdA1GlptSMjdiQ9jUHp4z5UYEczATBL8EHKVHCFbWp48vZ8hsPaKUy9dWKuvFJ/Q7h0j2h40DtAfkJLLMhRiuShautRA3pwEXEyKwrQDNNi64am7bX7W8AczxWwijE1atXHdyC1CUm2Ni5b9DWAx2+Dc3COvEnEYFsh1Oov0JMf/KnAeNlJaq9cTR+YD///wHNlHJyzuSqfAW457u0teoACvmcBZgizjX8KweATXTVyANh"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Liu Xiaowen' 'xwliu@iupui.edu'),('In Kwon Choi','inkwchoi@iu.edu'),('Liu Xiaowen','xwliu@iu.edu')]"
+portal_title: "TopPIC Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/toppic/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/toppic/vault.yml
new file mode 100644
index 0000000..27deb40
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/toppic/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+37396438353837353136643238653338306234613666346335343637376563326637396537653737
+3135336136626639343439396463363965336364356662630a306334343434393134393134376439
+65636261366662653231336132363664613163363163393836353239633161643732303738356636
+3733663462393038640a383664363332386134326236323735663134396635643636643761333465
+65313663643863373639653730643436383331623936646338383166376237666630663664333335
+35353835343039663765303961313631303830313833393339653963646361393163366131653465
+33323433313138656566373238633839623664306234303939396134623536616530306136363534
+33646166346664313766383535393538626566353562623534623631396666346638396266353964
+37323634326266326534396466653730383164393863383663383937636535646134316663626566
+34346366383762373738636164313633336631316266383261376537346263343236396233376636
+65373336653865323063383131323633376337323065666436393165666635346130663463663630
+64656263303763343863646435333966643461383566353765613065363161613330656537306436
+30363738663265316665353034623536363065383138396566643134306131373230366436623264
+3633376365616334386337666630303933653264323564313431
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/uab/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/uab/vars.yml
new file mode 100644
index 0000000..2c4c227
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/uab/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "torana.rc.uab.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/torana.rc.uab.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/torana.rc.uab.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/torana.rc.uab.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "alabama-birmingham"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "University of Alabama at Birmingham Science Gateway"
+  external:
+    - name: "CILogon"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "alabama-birmingham"
+experiment_data_dir: "{{ user_data_dir }}/alabama-birmingham"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA5artIAZPYC9GmFvb7HpvwbHpYoSXN0xJkHWoz8joWWBA3wW2De2Q72Rk5CYElpOLbrjJCsFK3YxiCQYYRl5R4VFadw0agGIxn0PssCR5sIUDpEe4ezQmEx3rA3RUEvA3uZ6SjzjuwqQtEKMvARP4mCwEC/vR0eLWe1/ZDLF71w7zVZAmt+K/Z/Dnas/NTE7yV9XadD2TctFWmBwMNQSEfSsDfW39cabwEghanoUMGTYT9f4EL6x4zOzdbcHl1aF5QlGHf91hQCwfxH6FSZYmu+HhcKshbOI/I0u+UDKV+CX/1SxUZNpwpJ3ESR4ke7jdgP+GTwwl4bBSTn738m9t"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Thomas Anthony','tanthony@uab.edu')]"
+portal_title: "The University of Alabama at Birmingham Science Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/uab/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/uab/vault.yml
new file mode 100644
index 0000000..92e7f95
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/uab/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+33663064363839303862663937653738626265376266396363663366616366666230643232366333
+3961663139323961313637613262613664646561363331610a313865343339353332376336663264
+64326362336130343137653639363064643766633339363431613536366338613633396332393031
+6532353065613163640a386263336263313136356634356562643839333465383434393037653431
+64323363656134356535633438333737383062396431356536363335613363343937316263663163
+32383537646533306631613330656132333336656561346631303135343766383963306536643962
+32386365653835636163316431383234383035613434356462663732623837303936326334633765
+37633566356661666466646664623634663464366166663833326566303762303530346131623738
+61393435613136323163623863646639393333303266353335313632313362643962336236623030
+32373661353037356237323131633232653064323632303063636565313032303764313437623934
+34393935373131393630643834303335633036333838663735623938663462323636633930393430
+32383063313866333937653032616138333166363336373766383534333337376236346131653230
+63613833663262626461366532393231383861363166633263343038613566646233343765626461
+3766653539366366623732613138643732646462613132366161
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/v4i/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/v4i/vars.yml
new file mode 100644
index 0000000..2444f94
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/v4i/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+
+vhost_servername: "v4i.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/v4i.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/v4i.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/v4i.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "v4i"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "V4I Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "v4i"
+experiment_data_dir: "{{ user_data_dir }}/v4i"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCFUUsTVpp2eKER5bghuY+4cNYVuJnOpm0Cs01tpnCBve3ajADcLAogd33lytAk44v4Dk40dLpMeK08p0mNJSpdXFNnbuwB06iK22ygHoCF0zxdI8Dght9FVwbEq38BBFlk+9nxk30MpqDyUIKWwTpZFCwwyPSEjlIvX/ecRWmCIljgXBGs50bZeV7JVyRDoFnNOVAasjfXRdA70MxbbcZoZ9vTp4UUjIZv7PuPoVFsV0OCMcwz0Yp/6Pv24Y5j2PMIRSHFKkjz99mKu/6VTxpdmN8coSIYiU7AGUimi0L/RiOe4VLDdk/eOtTIezQlRBrDbWwUWe7l9tcHh3KwY0vx"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "V4I Gateway"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/v4i/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/v4i/vault.yml
new file mode 100644
index 0000000..fcda55b
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/v4i/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+65663664633661386462356639666165346363353863343333336161666535323235313330356233
+3734666333636464376131613030623336383733656362610a326365333239303730303064396433
+66363036396432633336653561663133663939623161356338353837663462663065343162633634
+6634636161353631380a643535326164343562663639666138653662333734363465663737633534
+39643739303030616665396430363038636636353765383232393435663538303330396464623262
+32626232656437663232373331626363623433613338313437636161636637613365303435333932
+62383764363637373231303733353661326562656362386532383666636331396665306536623736
+34643134396434386533376461393066323831646437383132626537653634333463656330613162
+65663565393333306339363534656638623339316265633963626331363265356364396663396166
+30383534383762656235333862366632646331313538306664613965623563353037363730363964
+34623432633834383864616336633764346165363963613963376262616538396436626366323064
+36373166323861383662656265653762346662333031656164316262383437323533376532303133
+30336263326339363834626665346634616435613435393137353639396537323930326335356132
+3133343737356364353534626566336534333362666262313063
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/wvsu/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/wvsu/vars.yml
new file mode 100644
index 0000000..e82ab46
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/wvsu/vars.yml
@@ -0,0 +1,48 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "sciencegateway.wvstateu.edu"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/sciencegateway.wvstateu.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/sciencegateway.wvstateu.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/sciencegateway.wvstateu.edu/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "wvirginia-state-university"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "WVirginia State University"
+#  external:
+#    - name: "CILogon"
+#      idp_alias: "cilogon"
+#      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "wvirginia-state-university"
+experiment_data_dir: "{{ user_data_dir }}/wvirginia-state-university"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCHm/f06vFCah0lVLnykei1cwkKMGwaCdn//BjZtG/9OnV7fjDzjISBCuz+LEC/FJKv3BaByAQ0Tvq0GxIgBzR31r2Qpp7yKJyl1THpftrshPOD2M1FOJfebc9QAnVKdQQpIGtA5/viOnZfV0nnEXqiKjafsAdwnSP3097XSvD7UvQGwkhmG4oIbs66RTh19gUB3/4QZZBEbUDBaeHrxzwS/NXaQorCfrZt2mJCNeFLdhiqqg2JbT4g4X/Crps6es/o3fN6mRsFnRu9Y5Xhh/FFyT/u8IiW18FzHaH9hfOhyxeKRQCk0nJV+aREcmJ3wIk7VRA/bKGWcVDqZRHRvcPR"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'),('Sridhar Acharya Malkaram','smalkaram@wvstateu.edu')]"
+portal_title: "WVirginia State University"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/wvsu/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/wvsu/vault.yml
new file mode 100644
index 0000000..abe008b
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/wvsu/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+35653933383164633431333561363666623666363832333635623938666433653332316532646236
+6137363639323166376137326436323034353631303061340a356561613862613634653665373163
+62663563623833356638636562323136353833653430333131656335663634656234616665393931
+3539316166313966660a636234303334326535373639653861623831656261326466623230363530
+31303866373535613135343835323231643135646633643432646531396361663337636337643638
+35346633653661396162646566623937636666653633323163613361666236636662393965363562
+33633563386637356663313262326264663232343334633932386465656265666436343263333366
+64656562313664366264373234306136663039653061336137653433353733336539336436333161
+34616631633732303437316532616331626335356462363263633633356130636133633264656666
+38636466356633313837323937636334363961656366613761356564343230656435643137343039
+65376531303366373434623062393864393338383864636134633038333766336237646530366331
+31386131323862396235393663616131326432666235623838306366666436396530333066626238
+36343239356632393164353336663163313530616537333433666562646132653961616435336466
+6435616439333363393932323132393833383765663963643638
diff --git a/dev-tools/ansible/inventories/scigap/production/hosts b/dev-tools/ansible/inventories/scigap/production/hosts
index 9321659..40c05a2 100644
--- a/dev-tools/ansible/inventories/scigap/production/hosts
+++ b/dev-tools/ansible/inventories/scigap/production/hosts
@@ -1,25 +1,77 @@
 # inventory file : scigap production deployment
 
 [zookeeper]
-scigap07.sciencegateways.iu.edu ansible_user=root
+scigap03.sciencegateways.iu.edu ansible_user=root
 
 [rabbitmq]
-scigap06.sciencegateways.iu.edu ansible_user=root
+scigap02.sciencegateways.iu.edu ansible_user=root
 
 [database]
-scigap05.sciencegateways.iu.edu ansible_user=root
+scigap01.sciencegateways.iu.edu ansible_user=root
 
 [api-orch]
-scigap06.sciencegateways.iu.edu ansible_user=root
+scigap02.sciencegateways.iu.edu ansible_user=root
 
 [helix]
-scigap07.sciencegateways.iu.edu ansible_user=root
+scigap03.sciencegateways.iu.edu ansible_user=root
 
 [kafka]
-scigap07.sciencegateways.iu.edu ansible_user=root
+scigap03.sciencegateways.iu.edu ansible_user=root
 
 [pga]
 gf4.ucs.indiana.edu ansible_user=root
 
 [keycloak]
 gf7.ucs.indiana.edu ansible_user=root
+
+[django]
+ampgateway ansible_host=156.56.104.84
+csbglsu ansible_host=156.56.104.84
+distantreader ansible_host=156.56.104.84
+epwgateway ansible_host=156.56.104.84
+georgiastate ansible_host=156.56.104.84
+hubzero ansible_host=156.56.104.84
+interactwel ansible_host=156.56.104.84
+iugateway ansible_host=156.56.104.84
+kentucky ansible_host=156.56.104.84
+mines ansible_host=156.56.104.84
+nanoconfinement ansible_host=156.56.104.84
+nanoshape ansible_host=156.56.104.84
+ncsaindustry ansible_host=156.56.104.84
+newmexicostate ansible_host=156.56.104.84
+nexttdb ansible_host=156.56.104.84
+oscer ansible_host=156.56.104.84
+phasta ansible_host=156.56.104.84
+r-hpc ansible_host=156.56.104.84
+rutgersgemr ansible_host=156.56.104.84
+saverx ansible_host=156.56.104.84
+sdstate ansible_host=156.56.104.84
+seagrid ansible_host=156.56.104.84
+searchsra ansible_host=156.56.104.84
+simvascular ansible_host=156.56.104.84
+snowvision ansible_host=156.56.104.84
+southdakota ansible_host=156.56.104.84
+testdrive ansible_host=156.56.104.84
+uab ansible_host=156.56.104.84
+wvsu ansible_host=156.56.104.84
+pace-gatech ansible_host=156.56.104.84
+cgpe ansible_host=156.56.104.84
+smaltr ansible_host=156.56.104.84
+toppic ansible_host=156.56.104.84
+microbial-genomes ansible_host=156.56.104.84
+v4i ansible_host=156.56.104.84
+physicell ansible_host=156.56.104.84
+pathogenomics ansible_host=156.56.104.84
+bcbportal ansible_host=156.56.104.84
+
+# dreg jetstream server
+dreg ansible_host=149.165.156.72 ansible_user=centos
+
+# futurewater jetstream server
+futurewater ansible_host=149.165.171.92 ansible_user=centos
+
+# Delta Jetstream server
+delta ansible_host=149.165.169.250 ansible_user=centos
+
+# simccs server
+simccs ansible_host=scigap11.sciencegateways.iu.edu ansible_user=root
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/distantreader/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/distantreader/vars.yml
index 084b0bc..2fda8a7 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/distantreader/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/distantreader/vars.yml
@@ -23,13 +23,13 @@
 user: "pga"
 group: "pga"
 doc_root_dir: "/var/www/portals/{{ gateway_id }}"
-vhost_servername: "distantreader.org"
+vhost_servername: "distantreader.scigap.org"
 #vhost_serveralias: "distantreader.scigap.org"
 vhost_ssl: true
 # TODO: have Ansible manage these files as well
-ssl_certificate_file: "/etc/letsencrypt/live/distantreader.org/cert.pem"
-ssl_certificate_chain_file: "/etc/letsencrypt/live/distantreader.org/fullchain.pem"
-ssl_certificate_key_file: "/etc/letsencrypt/live/distantreader.org/privkey.pem"
+ssl_certificate_file: "/etc/letsencrypt/live/distantreader.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/distantreader.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/distantreader.scigap.org/privkey.pem"
 
 ## Keycloak related variables
 tenant_domain: "{{ gateway_id }}"
@@ -54,6 +54,7 @@
 experiment_data_dir: "{{ user_data_dir }}/{{ gateway_id }}"
 gateway_data_store_resource_id: "gf4.ucs.indiana.edu_61552681-96f0-462a-a36c-a62a010bffc6"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCCgAWzF/GHT0ZesTM9JtUtvYBmaunOc5V4ab5//jUjC7vjF7s1fon4MvALvWCoC1uPvppG3NRzq4huAQCX89wu/9zJErpuKDpkjjTf90cHl+YxzHGGFUUtllSTZzhSyhUaMXC1qzeJg7TLdzOct+21HyoqSIJe86Aj8DQuAMXky6l7XFz5YqMkzY9kG/sS0rFRfpjz4K3zWe/Y7a0lQnKzePM/d6zrcdkiYhlMrCbEFcrWWMYNpIkWq7psjQiQ9SlICrNso6NQQSNy4CeoItDGSe7GsXdQLqdRMXUKua22G7wrq2ibh4Kqcid+mVJ8kyYQJO2UCdC2cOYd0EljmHh/"
+group_resource_profile_id: "505b44ef-2e4f-4f20-a7ee-3e0d0b088749"
 
 ## Portal related variables
 super_admin_portal: "false"
@@ -63,4 +64,6 @@
 portal_theme: "distantreader-gateway-theme"
 portal_theme_repo: "https://github.com/SciGaP/distantreader-gateway-theme"
 portal_title: "Distant Reader Gateway"
+pga_airavata_django_url: "https://distantreader.org"
+pga_reroute_to_django: true
 ...
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/epwgateway/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/epwgateway/vars.yml
index fd1cac7..23e0ea6 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/epwgateway/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/epwgateway/vars.yml
@@ -24,6 +24,7 @@
 group: "pga"
 doc_root_dir: "/var/www/portals/{{ gateway_id }}"
 vhost_servername: "epw-gateway.cs.binghamton.edu"
+vhost_serveralias: "www.epw-gateway.cs.binghamton.edu"
 vhost_ssl: true
 # TODO: have Ansible manage these files as well
 ssl_certificate_file: "/etc/letsencrypt/live/epw-gateway.cs.binghamton.edu/cert.pem"
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/iugateway/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/iugateway/vars.yml
index 033e037..d8fab40 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/iugateway/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/iugateway/vars.yml
@@ -26,9 +26,9 @@
 vhost_servername: "cybergateway.iu.edu"
 vhost_ssl: True
 # TODO: have Ansible manage these files as well
-ssl_certificate_file: "/etc/pki/tls/certs/cybergateway_iu_edu_cert.cer"
-ssl_certificate_chain_file: "/etc/pki/tls/certs/cybergateway_iu_edu_interm.cer"
-ssl_certificate_key_file: "/etc/pki/tls/private/iugateway.key"
+ssl_certificate_file: "/etc/letsencrypt/live/cybergateway.iu.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/cybergateway.iu.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/cybergateway.iu.edu/privkey.pem"
 
 ## Keycloak related variables
 tenant_domain: "{{ gateway_id }}"
@@ -52,6 +52,7 @@
 experiment_data_dir: "{{ user_data_dir }}/iugateway"
 gateway_data_store_resource_id: "gf4.ucs.indiana.edu_61552681-96f0-462a-a36c-a62a010bffc6"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjKGnDVSWXJynfzyOOcACuXG8KdIaPvx1idpsMeioYAX+T+W2wK86tHfD2B9QxzmrcjvAZD7/GvTcMotBUQ+5nJyFyYkRDKL5XtC2HWaMijCmsGFgODfc+i3E274Cw9oYAamRPTCUShoqogd9jzW8gaIzTy+2sU5R/dYAUeiHM2ov9SpIJXNuCoT12R948iUd3b2amnBIJvy/DnhorLXz7MQ70l9cWQp986ZVOS32JRUZhk/2nLHQLxP9cwjP3kVXEtoaOZc3lwypOzdA/xJq4pRTb4s8mZ4SaQIzHBPBYneU85+P6j7cjlV3UeN+0YwvnXe1iWaoUuoUFrNmzudlf"
+group_resource_profile_id: "f5e64678-ef87-45a3-b29e-34bf58011c3a"
 
 ## Portal related variables
 super_admin_portal: "false"
@@ -62,4 +63,6 @@
 portal_theme_repo: "https://github.com/SciGaP/iu-cybergateway-theme.git"
 portal_title: "IU Gateway"
 pga_google_analytics_id: "UA-111528347-9"
+pga_airavata_django_url: "https://django.cybergateway.iu.scigap.org"
+ga_reroute_to_django: true
 ...
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/pfec-hydro/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/pfec-hydro/vars.yml
index a192466..960927b 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/pfec-hydro/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/pfec-hydro/vars.yml
@@ -23,7 +23,7 @@
 user: "pga"
 group: "pga"
 doc_root_dir: "/var/www/portals/{{ gateway_id }}"
-vhost_servername: "futurewater.indiana.edu"
+#vhost_servername: "futurewater.indiana.edu"
 #vhost_serveralias: "www.mines.scigap.org"
 vhost_ssl: true
 # TODO: have Ansible manage these files as well
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/scigap/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/scigap/vars.yml
index 43c3b3c..d2dc7d4 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/scigap/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/scigap/vars.yml
@@ -27,12 +27,9 @@
 #vhost_servername: "beta.scigap.org"
 vhost_ssl: True
 # TODO: have Ansible manage these files as well
-ssl_certificate_file: "/etc/pki/tls/certs/scigap_org_cert.cer"
-ssl_certificate_chain_file: "/etc/pki/tls/certs/scigap_org_interm.cer"
-ssl_certificate_key_file: "/etc/pki/tls/private/scigap.key"
-#ssl_certificate_file: "/etc/letsencrypt/live/beta.scigap.org/cert.pem"
-#ssl_certificate_chain_file: "/etc/letsencrypt/live/beta.scigap.org/fullchain.pem"
-#ssl_certificate_key_file: "/etc/letsencrypt/live/beta.scigap.org/privkey.pem"
+ssl_certificate_file: "/etc/letsencrypt/live/scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/scigap.org/privkey.pem"
 
 ## Keycloak related variables
 tenant_domain: "{{ gateway_id }}"
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/sdstate/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/sdstate/vars.yml
index 2b11119..ad4cfca 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/sdstate/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/sdstate/vars.yml
@@ -31,6 +31,9 @@
 ssl_certificate_chain_file: "/etc/letsencrypt/live/sciencegateway.sdstate.edu/fullchain.pem"
 ssl_certificate_key_file: "/etc/letsencrypt/live/sciencegateway.sdstate.edu/privkey.pem"
 
+php_upload_max_filesize: "500M"
+php_post_max_size: "1000M"
+
 ## Keycloak related variables
 tenant_domain: "{{ gateway_id }}"
 admin_username: "admin"
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/seagrid/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/seagrid/vars.yml
index 1139c65..08ff32a 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/seagrid/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/seagrid/vars.yml
@@ -23,14 +23,14 @@
 user: "pga"
 group: "pga"
 doc_root_dir: "/var/www/portals/{{ gateway_id }}"
-vhost_servername: "seagrid.org"
-vhost_serveralias: "www.seagrid.org"
+vhost_servername: "pga.seagrid.org"
+#vhost_serveralias: "www.seagrid.org"
 #vhost_servername: "beta.seagrid.org"
 vhost_ssl: True
 # TODO: have Ansible manage these files as well
-ssl_certificate_file: "/etc/letsencrypt/live/seagrid.org/cert.pem"
-ssl_certificate_chain_file: "/etc/letsencrypt/live/seagrid.org/fullchain.pem"
-ssl_certificate_key_file: "/etc/letsencrypt/live/seagrid.org/privkey.pem"
+ssl_certificate_file: "/etc/letsencrypt/live/pga.seagrid.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/pga.seagrid.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/pga.seagrid.org/privkey.pem"
 #ssl_certificate_file: "/etc/pki/tls/certs/seagrid_org_cert.cer"
 #ssl_certificate_chain_file: "/etc/pki/tls/certs/seagrid_org_interm.cer"
 #ssl_certificate_key_file: "/etc/pki/tls/private/portal.seagrid.key"
@@ -63,6 +63,7 @@
 experiment_data_dir: "{{ user_data_dir }}/seagrid"
 gateway_data_store_resource_id: "gf4.ucs.indiana.edu_61552681-96f0-462a-a36c-a62a010bffc6"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCApfdud3cJ7rx44M41gEKVgRfefk/Vd/7dIp9Xr9juX4jqmGuLoZR+hk287Hmbps6hZv23Av97XkCLldH0pueDekthcBDo4cRiQMDBp9NLz/9muqYVBl985psEbazYygagy/q/3ebi4CVEYVd4cHBee1V3GYyuJS2RklF0s/Otyf8x8auJSMniHGbTbVqtFlEOYuPdXlRBfH37k55N7+2iXKsIVvgn1MDweHEbQWJMx2LDCkLfJitreTiwcuST55w6N/n8WYZM2t+ie3BJEr6tcGAVIuyxj7CbMYMziM/hM5J+oQGPY/IBtiNZoxiZ0DeAC9SiEvE9fbTEW2iRWnQL"
+group_resource_profile_id: "775fdca5-af1e-491d-95ef-bdc66b6ee4ca"
 
 ## Portal related variables
 super_admin_portal: "false"
@@ -73,4 +74,6 @@
 portal_theme_repo: "https://github.com/SciGaP/seagrid-website-theme.git"
 portal_title: "SEAGrid Portal"
 pga_google_analytics_id: "UA-110457476-1"
+pga_airavata_django_url: "https://seagrid.org"
+pga_reroute_to_django: true
 ...
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/searchingSRA/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/searchingSRA/vars.yml
index d89a5a9..8b6ab38 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/searchingSRA/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/searchingSRA/vars.yml
@@ -23,13 +23,13 @@
 user: "pga"
 group: "pga"
 doc_root_dir: "/var/www/portals/{{ gateway_id }}"
-vhost_servername: "www.searchsra.org"
-vhost_serveralias: "sciencegateway.searchsra.org"
+vhost_servername: "pga.searchsra.scigap.org"
+#vhost_serveralias: "sciencegateway.searchsra.org"
 vhost_ssl: true
 # TODO: have Ansible manage these files as well
-ssl_certificate_file: "/etc/letsencrypt/live/www.searchsra.org/cert.pem"
-ssl_certificate_chain_file: "/etc/letsencrypt/live/www.searchsra.org/fullchain.pem"
-ssl_certificate_key_file: "/etc/letsencrypt/live/www.searchsra.org/privkey.pem"
+ssl_certificate_file: "/etc/letsencrypt/live/pga.searchsra.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/pga.searchsra.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/pga.searchsra.scigap.org/privkey.pem"
 
 php_upload_max_filesize: "10M"
 php_post_max_size: "60M"
@@ -56,6 +56,7 @@
 experiment_data_dir: "{{ user_data_dir }}/searching-sra"
 gateway_data_store_resource_id: "gf4.ucs.indiana.edu_61552681-96f0-462a-a36c-a62a010bffc6"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCx981DispO1AnkOAwq1oJ3iaYUW6KT4jn4OPSrvIb1fJyjkNdBK8KQUTviBMgqLH9+FlIx/FYjN7sVLelGUmfOgguIWB4Ea2epAyvGFfrVeF83w5A4uILfrd5AJQuk0sZkNjnnGmmpx6z60IThaof2f14uD7JPcn5Kf0xnfmhJGIo2DYJRp8DYJ4Upd1ENu4p3CqylZGBFTx0ROe3hCNj28BxCY+kTgKTQJQHdwuHK9WxovQHdv2ZrN9GeSyIPUX8W1PpYKqM2i8xGaagPUamHON9TonHyuAdd84CagonwuaG54+jbFbB9uW/zhhnP5vNRxK8aSNIhszOucE2g8xzL"
+group_resource_profile_id: "f75b313c-aaad-4ab8-8089-ea042929aa7e"
 
 ## Portal related variables
 super_admin_portal: "false"
@@ -65,4 +66,6 @@
 portal_theme: "searchingsra-gateway-theme"
 #portal_theme_repo: "https://github.com/SciGaP/gsu-gateway-theme"
 portal_title: "Searching SRA"
+pga_airavata_django_url: "https://www.searchsra.org"
+pga_reroute_to_django: true
 ...
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/simvascular/files/pga_config.php.j2 b/dev-tools/ansible/inventories/scigap/production/pga_config/simvascular/files/pga_config.php.j2
index f44fcd2..373022a 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/simvascular/files/pga_config.php.j2
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/simvascular/files/pga_config.php.j2
@@ -97,7 +97,7 @@
         /**
          * Path to the server certificate file
          */
-        'cafile-path' => app_path() . '/resources/security/incommon_rsa_server_ca.pem',
+        // 'cafile-path' => app_path() . '/resources/security/incommon_rsa_server_ca.pem',
     ],
 
 
@@ -208,7 +208,14 @@
          /**
           * Data Sharing enabled
           */
-          'data-sharing-enabled' => {{ data_sharing_enabled }}
+          'data-sharing-enabled' => {{ data_sharing_enabled }},
+
+        {% if group_resource_profile_id is defined %}
+        /**
+         * Group Resource Profile ID to use when submitting experiments
+         */
+        'group-resource-profile-id' => '{{ group_resource_profile_id }}',
+        {% endif %}
     ],
 
     /**
@@ -258,6 +265,18 @@
          */
         'portal-smtp-server-port' => '587',
 
+        {% if pga_airavata_django_url is defined %}
+        /**
+         * Set the URL of the new Django portal for re-routing
+         */
+        'airavata-django-url' => "{{ pga_airavata_django_url }}",
+        {% endif %}
+
+        /**
+         * Set to true to enable reroute to the new Django portal
+         */
+        'reroute-to-django' => {{ pga_reroute_to_django | ternary("true", "false") }},
+
         /**
          * Set JIRA Issue Collector scripts here.
          */
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/simvascular/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/simvascular/vars.yml
index 307dc1a..cb286e7 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/simvascular/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/simvascular/vars.yml
@@ -58,6 +58,7 @@
 experiment_data_dir: "{{ user_data_dir }}/simvascular"
 gateway_data_store_resource_id: "gf4.ucs.indiana.edu_61552681-96f0-462a-a36c-a62a010bffc6"
 gateway_data_store_ssh_public_key: ""
+group_resource_profile_id: "6359d7f5-be13-4548-9762-943c1cc1a6f2"
 
 ## Portal related variables
 super_admin_portal: "false"
@@ -68,4 +69,6 @@
 portal_theme_repo: "https://github.com/SciGaP/simvascular-gateway-theme.git"
 portal_title: "SimVascular Gateway Portal"
 pga_google_analytics_id: "UA-111528347-7"
+pga_airavata_django_url: "https://django.simvascular.scigap.org"
+pga_reroute_to_django: true
 ...
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/snowvision/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/snowvision/vars.yml
new file mode 100644
index 0000000..e9f0b5b
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/snowvision/vars.yml
@@ -0,0 +1,65 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+pga_repo: "https://github.com/apache/airavata-php-gateway.git"
+user: "pga"
+group: "pga"
+doc_root_dir: "/var/www/portals/{{ gateway_id }}"
+vhost_servername: "snowvision.scigap.org"
+#vhost_serveralias: "www.mines.scigap.org"
+vhost_ssl: true
+# TODO: have Ansible manage these files as well
+ssl_certificate_file: "/etc/letsencrypt/live/snowvision.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/snowvision.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/snowvision.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "{{ gateway_id }}"
+admin_username: "admin"
+admin_password: "{{ vault_admin_password }}"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+oidc_discovery_url: "https://iam.scigap.org/auth/realms/{{ tenant_domain }}/.well-known/openid-configuration"
+
+auth_options:
+  - name: "SnowVision Gateway"
+    oauth_grant_type: "password"
+  - name: "Existing Institute Login"
+    oauth_grant_type: "authorization_code"
+    oauth_authorize_url_extra_params: "kc_idp_hint=cilogon"
+    logo: "/assets/cilogon-logo-24x24-b.png"
+oauth_callback_url: "https://{{ vhost_servername }}/callback-url"
+
+gateway_id: "snowvision"
+# relative to document root dir
+experiment_data_dir: "{{ user_data_dir }}/{{ gateway_id }}"
+gateway_data_store_resource_id: "gf4.ucs.indiana.edu_61552681-96f0-462a-a36c-a62a010bffc6"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCovd8MvofK9SPJZiElqP4rd3xpaHZ7qXK0RFxRQxcCTcAJbDMGubZlo1+N0Io02ZIVkKfdtbee+sznpQ6ri6MMaK1xnYmfyMT5yj/pUZo+g/jIC0PMYQcHpnq49U7Fz2BBYqbc9EAAcU35X4ctof1/UwlWMFa+gegky8NngHBZmZSpgIzVb5jlgti14OD5ETVFG4YvZ2ZRhkQESSuZPFdjxiXoDqsJkF80cD+JTu5LWha1UwhAC2yrGZuI/16WABzx/zUGOS0NK0RYS/giIzVGQSYVp9S8GgZKuvJx3xk7nW6HOMbjpVeukjkWareIkVAWXgFIMptX0QRhL4mcjCIB"
+
+## Portal related variables
+super_admin_portal: "false"
+admin_emails: "['sgrc-iu-group@iu.edu','smarru@iu.edu']"
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+#portal_theme: "qusp-gateway-theme"
+#portal_theme_repo: "https://github.com/SciGaP/qusp-gateway-theme.git"
+portal_title: "SnowVision Gateway"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/snowvision/vault.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/snowvision/vault.yml
new file mode 100644
index 0000000..64778b7
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/snowvision/vault.yml
@@ -0,0 +1,18 @@
+$ANSIBLE_VAULT;1.1;AES256
+66316537316562376233616136623265626131316637373234663861363661656239613438363031
+6434653039343731383464346637396636376633303332390a346631633936333234306533653530
+63363564343631316234626635633263356534626563353530343132636266616134346630633333
+3265656636363137310a633133656338613861626332646564333063386432623561643438613366
+39333066633330633064333763373862373663623565646565616330666138363835643934333565
+34306131646132303432636530353763656136313836336131363436333764623533363234383236
+63323065643837666330306230343830383363383233663461663738356665366265663266306461
+30306231653764633631363162383262373662643636376161383139666335373533333765653962
+34353637383935366161663432663961383634653032383036336134663034656331396634366239
+36353664336332666437323961616138646430326439343437363039363061663330356635643733
+36343664373839396266326539663930663536326536386330626637363465386463313839393131
+61343532656666636634643930323635363166346134663633373266663630323138353233306133
+65316439326264356130303266336662373361656434396234343861393430653433323566343133
+35373163626166343562626536343030353733653161393061316665353761326366633864383438
+38623866356462376662303736316464666637396566626635323866326166633438666634366461
+64666439323933336462623532636238343961306231396565613932666431306431653936356361
+3735
diff --git a/dev-tools/ansible/inventories/scigap/production/pga_config/southdakota/vars.yml b/dev-tools/ansible/inventories/scigap/production/pga_config/southdakota/vars.yml
index 7b1b127..4597702 100644
--- a/dev-tools/ansible/inventories/scigap/production/pga_config/southdakota/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/pga_config/southdakota/vars.yml
@@ -26,9 +26,9 @@
 vhost_servername: "sciencegateway.usd.edu"
 vhost_ssl: True
 # TODO: have Ansible manage these files as well
-ssl_certificate_file: "/etc/pki/tls/certs/sciencegateway_usd_edu_cert.cer"
-ssl_certificate_chain_file: "/etc/pki/tls/certs/sciencegateway_usd_edu_interm.cer"
-ssl_certificate_key_file: "/etc/pki/tls/private/southdakota-sg.key"
+ssl_certificate_file: "/etc/letsencrypt/live/sciencegateway.usd.edu/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/sciencegateway.usd.edu/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/sciencegateway.usd.edu/privkey.pem"
 
 ## Keycloak related variables
 tenant_domain: "{{ gateway_id }}"
diff --git a/dev-tools/ansible/inventories/scigap/staging/files/client_truststore.jks b/dev-tools/ansible/inventories/scigap/staging/files/client_truststore.jks
index 14967c6..a5939c8 100644
--- a/dev-tools/ansible/inventories/scigap/staging/files/client_truststore.jks
+++ b/dev-tools/ansible/inventories/scigap/staging/files/client_truststore.jks
Binary files differ
diff --git a/dev-tools/ansible/inventories/scigap/staging/group_vars/all/vars.yml b/dev-tools/ansible/inventories/scigap/staging/group_vars/all/vars.yml
index a49db72..69cdf57 100644
--- a/dev-tools/ansible/inventories/scigap/staging/group_vars/all/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/staging/group_vars/all/vars.yml
@@ -19,8 +19,7 @@
 #
 
 ---
-ansible_connection: ssh
-ansible_user: centos
+ansible_user: root
 
 user: airavata
 group: airavata
@@ -30,10 +29,9 @@
 deployment_dir: "{{ user_home }}/staging-deployment"
 airavata_source_dir: "{{ user_home }}/staging-source"
 airavata_repo: "https://github.com/apache/airavata.git"
-airavata_dist: "apache-airavata-server-0.17-SNAPSHOT"
+airavata_dist: "apache-airavata-api-server-0.19-SNAPSHOT"
 airavata_dist_name: "{{ airavata_dist }}-bin.tar.gz"
-old_airavata_dist: "apache-airavata-server-0.17-SNAPSHOT"
-git_branch: staging
+git_branch: master
 
 # Database related variables
 db_server: "{{ hostvars[groups['database'][0]]['ansible_default_ipv4']['address'] }}"
@@ -49,6 +47,9 @@
 credential_store: "credential_store"
 profile_service: "profile_service"
 
+django_db_username: "django"
+django_db_password: "{{ vault_db_password }}"
+
 # Rabbitmq related vareables
 rabbitmq_server: "{{ groups['rabbitmq'][0] }}"
 rabbitmq_vhost: "master"
@@ -65,7 +66,7 @@
 api_server_name: "apiserver-node0"
 api_server_host: "{{ groups['api-orch'][0] }}"
 api_server_port: "8930"
-api_secured: "false"
+api_secured: "true"
 tls_enable: "true"
 api_server_tls_port: "9930"
 enable_sharing: "true"
@@ -112,6 +113,7 @@
 
 # PGA variables
 pga_repo: "https://github.com/apache/airavata-php-gateway.git"
+pga_git_branch: "master"
 user_data_dir: "/var/www/portals/gateway-user-data"
 real_user_data_dir: "/data/gateway-user-data"
 ## Airavata Client related variables
@@ -138,19 +140,21 @@
 keycloak_db_password: "{{ vault_keycloak_db_password }}"
 keycloak_master_account_username: "AiravataAdmin"
 keycloak_master_account_password: "{{ vault_keycloak_master_account_password }}"
+keycloak_vhost_servername: "iam.scigap.org"
 
 # Helix
 helix_version: 0.7.1
 helix_url: http://www-us.apache.org/dist//helix/{{helix_version}}/binaries/helix-core-{{helix_version}}-pkg.tar
 helix_dir: "{{ deployment_dir }}/airavata-helix"
 helix_cluster_name: "AiravataDemoCluster"
-snapshot_version: "0.17-SNAPSHOT"
+snapshot_version: "0.19-SNAPSHOT"
 helix_controller_name: "helixcontroller"
 helix_participant_name: "helixparticipant"
 helix_pre_wm_name: "prewm"
 helix_pre_wm_load_balance_clusters: "false"
 helix_post_wm_name: "postwm"
 helix_post_wm_load_balance_clusters: "false"
+local_data_location: "/home/airavata/temp-storage"
 
 # Listening port for kafka installations
 kafka_listener_port: 9092
@@ -171,4 +175,15 @@
 platform_name: "Staging Environment"
 platform_monitor_email_address: "airavataplatformmonitor@gmail.com"
 platform_monitor_email_password: "{{ vault_platform_monitor_email_password }}"
-platform_monitor_target_email_addresses: "dimuthu.upeksha2@gmail.com,dwannipu@iu.edu"
\ No newline at end of file
+platform_monitor_target_email_addresses: "dimuthu.upeksha2@gmail.com,dwannipu@iu.edu"
+
+# Variables related to parser framework
+parser_broker_url: "{{ groups['kafka'][0] }}:{{ kafka_listener_port }}"
+parser_broker_topic: "completed-messages"
+parser_broker_consumer_group: "ParsingConsumer"
+# TODO: update storage resource id
+parser_storage_resource_id: "pga.staging.scigap.org_aa63ffa0-a99f-4885-8f4b-81e3c4c4d737"
+parser_broker_publisher_id: "ParserProducer"
+
+thrift_client_pool_abandoned_removal_enabled: true
+thrift_client_pool_abandoned_removal_logged: true
diff --git a/dev-tools/ansible/inventories/scigap/staging/group_vars/django/vars.yml b/dev-tools/ansible/inventories/scigap/staging/group_vars/django/vars.yml
new file mode 100644
index 0000000..861ca9e
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/group_vars/django/vars.yml
@@ -0,0 +1,41 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+user: "pga"
+group: "pga"
+gateway_data_store_hostname: "pga.staging.scigap.org"
+gateway_data_store_resource_id: "pga.staging.scigap.org_aa63ffa0-a99f-4885-8f4b-81e3c4c4d737"
+django_wsgi_processes: 2
+doc_root_dir: "/var/www/portals/django-{{gateway_id}}"
+django_database_name: "django_{{ inventory_hostname }}"
+django_hidden_airavata_apps: "['django_airavata_dataparsers']"
+django_tus_endpoint: "https://tus.staging.scigap.org/files/"
+# django_keycloak_ca_certfile_path: 'os.path.join(BASE_DIR, "django_airavata", "resources", "incommon_rsa_server_ca.pem")'
+
+# Default email settings
+portal_email_host: "smtp.gmail.com"
+portal_email_port: 587
+portal_email_tls: true
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+portal_server_email: "{{ portal_email_username }}"
+admin_emails: "[('SGRC Group', 'sgrc-iu-group@iu.edu')]"
+django_error_emails: "[('SciGaP Errors', 'bugs@scigap.org')]"
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/dreg/vars.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/dreg/vars.yml
new file mode 100644
index 0000000..660a93e
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/dreg/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+airavata_django_repo: "https://github.com/shivamriky/airavata-django-portal.git"
+airavata_django_git_branch: "dreg"
+airavata_django_extra_dependencies:
+  - git+https://github.com/SciGaP/dreg-djangoapp.git@gbrowser#egg=dreg-djangoapp
+
+vhost_servername: "beta.dreg.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/beta.dreg.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/beta.dreg.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/beta.dreg.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "cornelldna"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "dREG"
+  external:
+
+gateway_id: "cornelldna"
+experiment_data_dir: "{{ user_data_dir }}/cornelldna"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCTs6k2lSt5nn+UF3N1rAko9WjdtHZ1xLcKxCG4+4AVMdTIeng12g+1qB5hIFiDgesT/D/nzoA27EFj5nWiYanxBySNgl1Re8kR0nEqQbR0zj1dSibmfjW+vmOZzEiNSrNoLlc4KbFgqFCRGIlZ1bWZ7yHtJ3I7xxfKhvvxCTzJ4K71v1aovnDTUYophy2lUsdOcOq84Qhv3ITZafgblz3mJSwVpnnI72IepzonzDUdcf/w0lKCl70L9MgQAZ2V4e9sQZWJLI5s1VtJsqKggtgI4goPyxXROoH9PTUZFqvvYjLGW8JVS9eZKblSKil09yckPfZCSk1i/UD/uY6O7bjf"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "BETA dREG Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/dreg/vault.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/dreg/vault.yml
new file mode 100644
index 0000000..88a0956
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/dreg/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+66616265356461353939626135623233346630623331646636653131366435666235333065663861
+3766386133323366316130343166613330613734653835610a653632343762343830323732396439
+33636639623764663565323263323332656235363336653334613862316164346437363538313030
+3338653037653435650a643466326139616634373662343337646439623531393366396632383531
+36333530316465616364623461616666326463373965643336303462316364343165383534616261
+30393633333739383265633666313230643138323938353837633833393862356438653839653936
+65316535623739636366663639663636636239393365333063333935616361356636303833313366
+35333464613033346464326638653738373163613164333862316661363937636237636632643935
+36323664396338656665363365303434623831363137316138636164373734623634656332323835
+64313234346330623731653931313862626630626233303061346361383564623963646161646261
+39313436303939646438636264366265343130626331316139316639376565633965333962656337
+39306162643731323039623537616161353364623261623935393835383766356466666338663934
+39356332636361623037623766336166393231373065353133313934663130653434303830316636
+6239313439613465336338313663663962333137313963663866
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/gateways19/vars.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/gateways19/vars.yml
new file mode 100644
index 0000000..31e39e3
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/gateways19/vars.yml
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+airavata_django_extra_dependencies:
+  - git+https://github.com/machristie/gateways19-tutorial.git@solution#egg=gateways19-tutorial
+vhost_servername: "gateways19.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/gateways19.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/gateways19.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/gateways19.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "gateways19"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Gateways19"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "gateways19"
+experiment_data_dir: "{{ user_data_dir }}/gateways19"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCC3SyAjqDVPve0v8FKzWp6TAOOzh0p7BBZBMeH/PmP2Ao7CF2uPBQIzeb3zi52zC0pTn0LaQNFa5ZwUWrWb1xMIzjaX98u8Prz/uIhhOibAXmQ8KPSeY1WkBjXLlVgjsT0byD+/tKd3n+Bv5OYDMnwHdg5nnO/kQ8cdBUZa7qQV8gr8qak4Gyh4waMHgCJxHhEBlbaisQSzSsV68HXAjEgn/4k7GWQBW/3qTtjc+BHPItwqRdLU9VZAaLbb7bo4VEDSmpZyzvK0c5VhO5uZ+vEMZzxD2Vje36h8KVmljNRYJ1BoZgL6jjn7uzUqTfb2MOzCnH0R1rpWeif60FH2ROf"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Sudhakar Pamidighantam', 'pamidigs@iu.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+portal_title: "Gateways19 Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/gateways19/vault.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/gateways19/vault.yml
new file mode 100644
index 0000000..505a7bd
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/gateways19/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+61333732643335383961323435306532356336626634653334326162333038646339306366633237
+3432363766353963383661623338306633353033356638370a356134636363653339353730613139
+34313839386336303633343632643462336236343033373432666235336537663661326435343735
+3033336165326131330a626134313131323663363238653638356137366432393534653261303636
+31343963313562323031376561343730613966313765626461363938646335353338623730396333
+64376663346361373664613036656235356637393136653835396366386631313732363166326231
+30353964343832666134313831386264366466313931663335336434303138616136313464653830
+38373665616532323135656637353834343866356665393561343237663236333337666139333439
+39616262663435393934363439666136303061323033613561626637336163653733663236653036
+31356538663034353762346164353738326539333362386135373235623861383333343664346433
+38363335663661663066356366656432653735666331633137313333636265653563336566616361
+61366637326433333565326234303063376534653937666338366633336634656235363432653364
+37613834353762623861326361333564613466306532386366396636303862623637653136353337
+6461313733626262666561333566623264316437626563353931
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/pearc19/vars.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/pearc19/vars.yml
new file mode 100644
index 0000000..4d78d40
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/pearc19/vars.yml
@@ -0,0 +1,49 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "pearc19.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/pearc19.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/pearc19.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/pearc19.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "pearc19"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "PEARC19"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "pearc19"
+experiment_data_dir: "{{ user_data_dir }}/seagrid"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKSwBdz4ZKPTfcBci2wb3N49ybgcSL9JfpEBrs/REoF4UGiPe6MchmZumBMzAJl1fpgp4INYrlZqIcHjTdVm/Ok5YxixvaYUJyYqSnvVYfDzyHG0LB323PSaMc79Kyp1IReViSHg7bdd/AYSBs8hD5qc+VuYWDr9+bSL1OMzb5tVTJScoes4Ro1bJhsHn6WVA1QJKWnZj8B2mKKWBlPNl/ZU8F6fYzpPkKbCEI0DiNQUoETfqOVbvKVaG633ade3lewiYB3977aXS6iLYk3b1U89gNLDuduZkZij04NolD1fD4GoiCL/ougYFyTabfQUZwNjg3kjdFEWPiPFktikk5"
+django_hidden_airavata_apps: "[]"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Sudhakar Pamidighantam', 'pamidigs@iu.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+portal_title: "PEARC19 Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/pearc19/vault.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/pearc19/vault.yml
new file mode 100644
index 0000000..52fbe80
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/pearc19/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+33366335303335313561313662383638316638613061353631386132303032653664646438356133
+6263346137643161386130313562393461316435346561660a663338643331333530346432393363
+63336564306531306230376535306362363861623838336131663630346433643530326462393762
+6638616165316536630a643062383637653136643165643330386236366439353439386239376466
+39303933333038623762623661636364386136633833613430626664313865333462353038666161
+61316263613730623437386333613435306134396137353332383535323939633137623637353937
+31393437396232393531633133616236303936303637306464313137383539643064336634303262
+39383433326433373735646461346137346632386562663439613366646530633463643339373165
+65323538663035613966303566353363653961363335613834353931663130356263326637326533
+36383031323936336536336262316162363063303064623633363264323962323033623537626164
+62663238383332393935626264356238613534633537356365383231373733653562363336313831
+63633937633163336534636366356338393234643239393137346436366137323134643833356663
+62313764363462336131373432313464363335636332323862343739663865643031393634346438
+3464656363616364323535373637363762313130393030306134
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/seagrid/vars.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/seagrid/vars.yml
new file mode 100644
index 0000000..1ca5a87
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/seagrid/vars.yml
@@ -0,0 +1,54 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "django.staging.seagrid.org"
+vhost_ssl: True
+vhost_aliases:
+  - url: /seagrid-rich-client/
+    path: "{{ doc_root_dir }}/static/seagrid-rich-client/"
+ssl_certificate_file: "/etc/letsencrypt/live/django.staging.seagrid.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/django.staging.seagrid.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/django.staging.seagrid.org/privkey.pem"
+
+django_file_upload_max_file_size_mb: 5500
+django_pga_url: "https://staging.seagrid.org"
+
+## Keycloak related variables
+tenant_domain: "seagrid"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "SEAGrid"
+  external:
+    - name: "CILogon"
+      idp_alias: "cilogon"
+
+gateway_id: "seagrid"
+experiment_data_dir: "{{ user_data_dir }}/seagrid"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKWZUFlV3DJ+bHW0xb7VEplKhbHEZ/t0AE/HPmIk6MXOQnDa38gykd7ru9zoU7vuIqjouFyQKvVoQFZyMSnHX/dfcZRWRBRQn5+1+8n6dD6VMwuVtv9IfN1tuadZYsHOIVVDgd0jhWblLkGlwyi2jh2IHqWBxHNlKYMA60j2T1uNPz5tyQVxFQF0A0kbg0a9Bd19ac1b6Qryu07Ni+Y5BfJohrnwcYLDFlWfvmAUZRSMnHz9H1jyTJrSu1bsrekYzJhbz9yI0ZyJFOI/XvazUEERH5HltiFFnlQsyRZpqTLk6sWsWzIcHxsHdMwN7y5y3KnkdjGgkVDxUJCwSjKXt"
+django_hidden_airavata_apps: "[]"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Sudhakar Pamidighantam', 'pamidigs@iu.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+portal_title: "SEAGrid Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/seagrid/vault.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/seagrid/vault.yml
new file mode 100644
index 0000000..4d51260
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/seagrid/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32633762353861333235303363393731636530656265326238316630646230613966613830346434
+3964626439616365396266353239613632356466343734370a616432396133303063303733623462
+35643566386562666164396434303637383965383337383637646665333365346434396239343238
+6635633665396439640a653730383539373630386638363933393661373030346132613331303866
+39396139383763623534333533353437623936623463346334626230663837613037613064303237
+33663966373536313335336137373834336238383465303366383466613161653436626330363435
+61396339363964363932306664393939323332636430396531373134343137323736366132363366
+33626430393165333135623764336136316538626532303066393337633065353564396538303039
+37636265646437643334363533383965633935393265636561323130346636333634633864383337
+34643965393462376533333235663338656434656633613034313337613566363962613930613834
+65323563636338363539316462663664393763346436326361646266633931343136646166613362
+34316233323762393134643335383034636433386138663436636338666566633563396336373935
+36636137323366346561323630653534373835353738363463333739306264353231303435633331
+3538333835393761643036393938623462663433386536613834
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/searchsra/vars.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/searchsra/vars.yml
new file mode 100644
index 0000000..58b6ec0
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/searchsra/vars.yml
@@ -0,0 +1,49 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "beta.searchsra.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/beta.searchsra.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/beta.searchsra.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/beta.searchsra.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "searching-sra"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "SEARCH-SRA"
+  external:
+#    - name: "existing institution credentials"
+#      idp_alias: "cilogon"
+#      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "searching-sra"
+experiment_data_dir: "{{ user_data_dir }}/searching-sra"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDT8DxXNvFn8DUfe8t7VAPXnNIVOWCE4tYv59qY8uJU4BjnOtEnbDZAqrXuCCns9FsgxF6evftuXudzD/xa/yhSzKSlYv1kETFPrt8suW7h1iI6R1UlreacKnng4VqmveTsR/AoMpSP6YvRyXxf4J60QZylpmkfCoZq4fZjZz9mCme8cqBjakqF6EGnhL3k8e9yJ4PU8KWektcpegHIVajsNwIRsK1bxpLh0FocyQyC2u0Wsd2trIR9YjGAGfogB1/ifOvKTcxuYQQGfnj5fZyLz+sT7GOpb+i/CXLfURr9aIU4quuXh3FUB89u4dglQoDt7LDnkyazZI9ZIcBjCNvb"
+django_hidden_airavata_apps: "[]"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Marcus Christie', 'machrist@iu.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+portal_title: "Search-SRA Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/searchsra/vault.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/searchsra/vault.yml
new file mode 100644
index 0000000..15c4e95
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/searchsra/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+31376431346634623538653338666363363330366137336331616461393637383861343731376431
+3963663666616133643533313061643364643237356266620a326337656337336436333233616139
+61626439636562333764336361656661323639636130303832613835326632343933356235303234
+6635616238613864640a306237323163316538336332633231343863303837386164376231383363
+34303862303137623566376462333762386236303134663336323066343431663036333463383266
+31353030333965323464326236633466346362356466363862366165363230373261356135643362
+34323131393638643539646265643366383636333236376235383331653330353661653731373362
+30383733613237383065313466393565396435666539363032663539376430616336353333333463
+61316138303065346230333635633361623338633763323539323032663061636633313238666633
+66383938396164346338626361626461343965396634616466366430373538353532303832386233
+61376566633732383431613035633437376135353965326662333635633764333336323764386366
+61353837613839363438393732623438313463343366393733646435633238363534633739376263
+33313837346562613833363437373530666533636463353534306432633638646466313336626231
+6566323761666139336631383839383234626363646362366666
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/simccs/files/django-ssl-vhost.conf.j2 b/dev-tools/ansible/inventories/scigap/staging/host_vars/simccs/files/django-ssl-vhost.conf.j2
new file mode 100644
index 0000000..b6be6da
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/simccs/files/django-ssl-vhost.conf.j2
@@ -0,0 +1,82 @@
+{#
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+#}
+
+{% if vhost_server_redirect is defined %}
+<VirtualHost *:{{httpd_default_http_port}}>
+    ServerName {{ vhost_server_redirect }}
+    Redirect "/" "https://{{ vhost_servername }}"
+</VirtualHost>
+{% endif %}
+
+<VirtualHost *:{{ httpd_default_http_port }}>
+    ServerName {{ vhost_servername }}
+
+    ## Redirect all http traffic to https
+    RewriteEngine On
+    RewriteCond %{HTTPS} off
+    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
+</VirtualHost>
+
+<VirtualHost *:{{ httpd_default_https_port }}>
+    ServerName {{ vhost_servername }}
+
+    # Reverse proxy to geoserver on gf8
+    ProxyPass /geoserver "http://gf8.ucs.indiana.edu/geoserver"
+    ProxyPassReverse /geoserver "http://gf8.ucs.indiana.edu/geoserver"
+    
+    Alias /robots.txt {{ doc_root_dir }}/static/robots.txt
+    Alias /favicon.ico {{ doc_root_dir }}/static/favicon.ico
+
+    Alias /static/ {{ doc_root_dir }}/static/
+
+    <Directory {{ doc_root_dir }}/static>
+    Require all granted
+    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
+    </Directory>
+
+    Alias /media/ {{ airavata_django_checkout }}/django_airavata/media/
+
+    <Directory {{ airavata_django_checkout }}/django_airavata/media>
+        Require all granted
+    </Directory>
+
+    WSGIDaemonProcess {{ vhost_servername }} display-name=%{GROUP} python-home={{ doc_root_dir }}/venv python-path={{ doc_root_dir }}/airavata-django-portal processes={{ django_wsgi_processes }} user={{ user }} group={{ group }}
+    WSGIProcessGroup {{ vhost_servername }}
+
+    WSGIScriptAlias / {{ doc_root_dir }}/airavata-django-portal/django_airavata/wsgi.py
+
+    <Directory {{ doc_root_dir }}/airavata-django-portal/django_airavata>
+        <Files wsgi.py>
+        Require all granted
+        </Files>
+    </Directory>
+
+    ErrorLog {{ httpd_log_dir[ansible_os_family] }}/django-{{ gateway_id }}.error.log
+    CustomLog {{ httpd_log_dir[ansible_os_family] }}/django-{{ gateway_id }}.requests.log combined
+
+    SSLEngine on
+    # Disable SSLv3 which is vulnerable to the POODLE attack
+    SSLProtocol All -SSLv2 -SSLv3
+    SSLCertificateFile {{ ssl_certificate_file }}
+    SSLCertificateChainFile {{ ssl_certificate_chain_file }}
+    SSLCertificateKeyFile {{ ssl_certificate_key_file }}
+</VirtualHost>
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/simccs/vars.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/simccs/vars.yml
new file mode 100644
index 0000000..a9e3ae8
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/simccs/vars.yml
@@ -0,0 +1,63 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+airavata_django_extra_dependencies:
+  # Need to separately install cython in the VM or do two deploys, one with
+  # just cython, then a second with the other dependencies. Reason: pyjnius
+  # requires that cython already be installed and they can't both be installed
+  # at the same time.
+  - cython
+  - git+https://github.com/SciGaP/simccs-maptool.git#egg=simccs-maptool
+  - pyjnius
+
+django_extra_settings:
+  JAVA_HOME: "/usr/java/default"
+  MAPTOOL_SETTINGS:
+    CPLEX_APPLICATION_ID: "cplex-solver_99721933-c9e4-4285-9ef1-d035ca82b541"
+
+vhost_servername: "django.simccs.scigap.org"
+vhost_ssl: true
+ssl_certificate_file: "/etc/letsencrypt/live/django.simccs.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/django.simccs.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/django.simccs.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "iu-geology-survey"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "SimCCS"
+  external:
+    - name: "existing institution credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "iu-geology-survey"
+experiment_data_dir: "{{ user_data_dir }}/iu-geology-survey"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEuA1indjdczBXg2qrmD0bB0QfKq0u2q3o25DegTaty5LoogW+APEvXmwc2g6PzkM75MgfMsTErMQaQ3/PoElADQKg2/NePz05YWobn9zrPZFeRWfOqWMjFDx72cffHKBzgnahFDBlR/YJhf4IZJ+EOA1zMiMF2oZQmEYQtbQFhbKPF+jrScEQeuXVuXWSS2sKNAVKj3pY4kmi9kEOYELee/O6ghBUfrVhB95vDKJPgmQSuo3pgkLRdflTBSAQ54UchwjXi2RA9Xv0RXJF/JyyRGn6bSbRxYhsm5RJeiBVj4ua7p2b36rSYVqtVsTKEonx5kYdKzwyjJXWpjB2KtQp"
+django_hidden_airavata_apps: "[]"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Kevin Ellett', 'kmellett@indiana.edu'),('Ryan Kammer', 'rkammer@indiana.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+portal_title: "SimCCS Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/simccs/vault.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/simccs/vault.yml
new file mode 100644
index 0000000..7de5f3c
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/simccs/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+32303938663931376464373435373336356365613066333233363261633334333266633064633730
+3937316131366235636466623763333833326635376433630a613563623734333362333332346630
+34666338323132333037643337353962313165663762376462383962313537306662313665363063
+3337376331373535650a333936393135333364613764656362353731613135623363333330343031
+33343063333134393166393666336562646135333930346237316264333263363232653464353938
+31613062653563326564613237666338346564626136666362653463396435386565633537383363
+37306463663131333032663763383334373232316266343165636632336365353665313331393336
+62323262333633653930626536313839333562653062653834333163633833386131303332333031
+37303831376265313034373134666538333333656438306134653464306433326232356133353832
+65383062653265333966326631393666303032353937343835663636646439633738613266393430
+30363566383538373363653765326239393535373663616661393164373031356230356165386338
+37353261343463363635353131366232393532383930373734623036613234396531386538343834
+30353333653837346530376664373661363434373232396132666339313931323732666661373064
+3634393163613436326430353838363561633639353535633538
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/testdrive/vars.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/testdrive/vars.yml
new file mode 100644
index 0000000..0ec571c
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/testdrive/vars.yml
@@ -0,0 +1,47 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "django.testdrive.airavata.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/django.testdrive.airavata.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/django.testdrive.airavata.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/django.testdrive.airavata.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "default"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Test Drive"
+  external:
+    - name: "CILogon"
+      idp_alias: "cilogon"
+
+gateway_id: "default"
+experiment_data_dir: "{{ user_data_dir }}/testdrive"
+# gateway_data_store_ssh_public_key: "TODO"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "Airavata Test Drive"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/testdrive/vault.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/testdrive/vault.yml
new file mode 100644
index 0000000..5623841
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/testdrive/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+37623936633663366663346435386565626133313036373264633162383430383635663666653638
+6664356436646561333165666331646138363231623634350a623339613336313562323061353336
+35383835613265306433633366386564653363326362623537353366356636326437653932613931
+6235323062356662630a333833373434623966396465623163633362663337386464616638613331
+63613966383363626238623733396161653832386235396462323534393537323936623134313339
+39393335303137613463326262373835373631393730633462623538356436326630663134356435
+32373838313437663337333962633534653330396566393339396435616665353666653330376637
+38663936646563356634666461326531653264366231646238656536653439613036333136363664
+66376437366437356235373665303031363766643137663931353863626139373235663662313133
+39643733333464373761376365336636376630656437303939373864656266323464633636653539
+66373161306532333263373136316566323537653465373030663364613832616265363434663465
+33613365343035376636316636633665663139373339396332393431316431353863353762333531
+33383435653364356632336435386465333630333063303033346162373035393034363664313637
+6237336561353036343134313561396132373237623833333162
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/ultrascan/vars.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/ultrascan/vars.yml
new file mode 100644
index 0000000..f201d0a
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/ultrascan/vars.yml
@@ -0,0 +1,47 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "django.ultrascan.scigap.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/django.ultrascan.scigap.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/django.ultrascan.scigap.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/django.ultrascan.scigap.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "ultrascan"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Ultrascan Gateway"
+  external:
+    - name: "CILogon"
+      idp_alias: "cilogon"
+
+gateway_id: "ultrascan"
+experiment_data_dir: "{{ user_data_dir }}/ultrascan"
+# gateway_data_store_ssh_public_key: "TODO"
+
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
+portal_title: "Staging Ultrascan SciGaP Dashboard"
+
+...
diff --git a/dev-tools/ansible/inventories/scigap/staging/host_vars/ultrascan/vault.yml b/dev-tools/ansible/inventories/scigap/staging/host_vars/ultrascan/vault.yml
new file mode 100644
index 0000000..7d53ae0
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/staging/host_vars/ultrascan/vault.yml
@@ -0,0 +1,15 @@
+$ANSIBLE_VAULT;1.1;AES256
+35643935303863316237633334303531323632303233323330636339393262386337386337646536
+6637663464393732396266336433323164316437663266650a623266626163323237313436353164
+34363863363466633831653865623836616666656335373162633838363335613739616537316139
+6266643533663835660a636562373430633633303336353730653234366261653564633962363865
+64633461343365393838313438396530636131333430626238613863363139353230393062353230
+63356162623734393839346134333931613061346161376134623638366363353461303730636532
+36666165666439323638656261353336373365626464303164323235373237333837366566396631
+66616430353733353436393337326465373161306538363730623030646331623136666537313339
+65613163303864316334336135326261616438656263363536643633653132313431636237363066
+62313963613163393739366639643761646238313435653731366163386135366537386131396463
+38396438393465333938613833343836336434393635613663633561353738393366353531333035
+33303136333162663830653964313466396632633431333833613063366139613538613233633865
+38383635303931383165623130326365333133656431353531613963656535663531326361623739
+3939373637616632643766306639306662636530396137346263
diff --git a/dev-tools/ansible/inventories/scigap/staging/hosts b/dev-tools/ansible/inventories/scigap/staging/hosts
index 3508888..3d4cf32 100644
--- a/dev-tools/ansible/inventories/scigap/staging/hosts
+++ b/dev-tools/ansible/inventories/scigap/staging/hosts
@@ -1,27 +1,35 @@
 # inventory file : scigap staging deployment
 
 [zookeeper]
-api.staging.scigap.org
-#helix.staging.scigap.org
-#pga.staging.scigap.org
+scigap02.sciencegateways.iu.edu
 
 [rabbitmq]
-api.staging.scigap.org
+scigap02.sciencegateways.iu.edu
 
 [database]
-db.staging.scigap.org
+scigap01.sciencegateways.iu.edu
 
 [api-orch]
-api.staging.scigap.org
+scigap02.sciencegateways.iu.edu
 
 [helix]
-helix.staging.scigap.org ansible_user=root
+scigap03.sciencegateways.iu.edu
 
 [kafka]
-helix.staging.scigap.org ansible_user=root
+scigap03.sciencegateways.iu.edu
 
 [pga]
-pga.staging.scigap.org
+scigap08.sciencegateways.iu.edu
+
+[django]
+seagrid ansible_host=156.56.104.18
+ultrascan ansible_host=156.56.104.18
+testdrive ansible_host=156.56.104.18
+pearc19 ansible_host=156.56.104.18
+dreg ansible_host=156.56.104.18
+searchsra ansible_host=156.56.104.18
+gateways19 ansible_host=156.56.104.18
+simccs ansible_host=156.56.104.18
 
 # Using the same keycloak as production
 #[keycloak]
diff --git a/dev-tools/ansible/inventories/scigap/staging/pga_config/scigap/vars.yml b/dev-tools/ansible/inventories/scigap/staging/pga_config/scigap/vars.yml
index 09e2f2b..6ff109e 100644
--- a/dev-tools/ansible/inventories/scigap/staging/pga_config/scigap/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/staging/pga_config/scigap/vars.yml
@@ -19,8 +19,6 @@
 #
 
 ---
-pga_repo: "https://github.com/apache/airavata-php-gateway.git"
-pga_git_branch: "staging"
 user: "pga"
 group: "pga"
 doc_root_dir: "/var/www/portals/scigap"
diff --git a/dev-tools/ansible/inventories/scigap/staging/pga_config/seagrid/vars.yml b/dev-tools/ansible/inventories/scigap/staging/pga_config/seagrid/vars.yml
index a959b7f..b3fcc72 100644
--- a/dev-tools/ansible/inventories/scigap/staging/pga_config/seagrid/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/staging/pga_config/seagrid/vars.yml
@@ -19,8 +19,6 @@
 #
 
 ---
-pga_repo: "https://github.com/apache/airavata-php-gateway.git"
-pga_git_branch: "staging"
 user: "pga"
 group: "pga"
 doc_root_dir: "/var/www/portals/{{ gateway_id }}"
@@ -31,6 +29,8 @@
 ssl_certificate_chain_file: "/etc/letsencrypt/live/staging.seagrid.org/fullchain.pem"
 ssl_certificate_key_file: "/etc/letsencrypt/live/staging.seagrid.org/privkey.pem"
 
+php_upload_max_filesize: "5000M"
+php_post_max_size: "5500M"
 
 ## Keycloak related variables
 tenant_domain: "{{ gateway_id }}"
@@ -54,6 +54,7 @@
 experiment_data_dir: "{{ user_data_dir }}/seagrid"
 gateway_data_store_resource_id: "pga.staging.scigap.org_aa63ffa0-a99f-4885-8f4b-81e3c4c4d737"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCApfdud3cJ7rx44M41gEKVgRfefk/Vd/7dIp9Xr9juX4jqmGuLoZR+hk287Hmbps6hZv23Av97XkCLldH0pueDekthcBDo4cRiQMDBp9NLz/9muqYVBl985psEbazYygagy/q/3ebi4CVEYVd4cHBee1V3GYyuJS2RklF0s/Otyf8x8auJSMniHGbTbVqtFlEOYuPdXlRBfH37k55N7+2iXKsIVvgn1MDweHEbQWJMx2LDCkLfJitreTiwcuST55w6N/n8WYZM2t+ie3BJEr6tcGAVIuyxj7CbMYMziM/hM5J+oQGPY/IBtiNZoxiZ0DeAC9SiEvE9fbTEW2iRWnQL"
+group_resource_profile_id: "3069a9cb-1555-480e-a50f-bdf5b53e430a"
 
 ## Portal related variables
 super_admin_portal: "false"
@@ -63,5 +64,7 @@
 portal_theme: "seagrid"
 portal_theme_repo: "https://github.com/SciGaP/seagrid-website-theme.git"
 portal_title: "SEAGrid Portal"
+pga_reroute_to_django: true
+pga_airavata_django_url: "https://django.staging.seagrid.org"
 #pga_google_analytics_id: "UA-110457476-1"
 ...
diff --git a/dev-tools/ansible/inventories/scigap/staging/pga_config/testdrive/vars.yml b/dev-tools/ansible/inventories/scigap/staging/pga_config/testdrive/vars.yml
index 54e5f8c..84cc464 100644
--- a/dev-tools/ansible/inventories/scigap/staging/pga_config/testdrive/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/staging/pga_config/testdrive/vars.yml
@@ -19,8 +19,6 @@
 #
 
 ---
-pga_repo: "https://github.com/apache/airavata-php-gateway.git"
-pga_git_branch: "staging"
 user: "pga"
 group: "pga"
 doc_root_dir: "/var/www/portals/testdrive"
@@ -52,6 +50,7 @@
 experiment_data_dir: "{{ user_data_dir }}/testdrive"
 gateway_data_store_resource_id: "pga.staging.scigap.org_aa63ffa0-a99f-4885-8f4b-81e3c4c4d737"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCUF51b2cYYqqadLHL9M/oPY0ZHZlWbdOdaIgjpzIzMnO7M9hKrHVY2pqyLPvqCLzaunxITPWsTqw0E8hwub4ttGLAx/O4kIf+BgyZK7iuwXWhI7u85/o58IfrD4B+jVCYKRNayuLR+lJWsiOeS6HSlunpTKTEhFGeOHn2UzdbLfgWYQ3VUFDtKN1oDPDT78ml5c2RCibJ21jltpevVfEtCUctERpTfniWSuQZggP1qiLNa1+PfiJ3mGsEzJFDntQvQetdinaAbEaT7+sctS8nBNjapkmYMf6tBl3S0bLttYPH51f8lUQAFaAzrestO1JpJNnIeY01/S3MWIlAWASnn"
+group_resource_profile_id: "9261e53c-f793-44d2-8e21-7ca966c0a710"
 
 ## Portal related variables
 super_admin_portal: "false"
diff --git a/dev-tools/ansible/inventories/scigap/staging/pga_config/ultrascan/vars.yml b/dev-tools/ansible/inventories/scigap/staging/pga_config/ultrascan/vars.yml
index 28db5a4..b98a4b8 100644
--- a/dev-tools/ansible/inventories/scigap/staging/pga_config/ultrascan/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/staging/pga_config/ultrascan/vars.yml
@@ -19,8 +19,6 @@
 #
 
 ---
-pga_repo: "https://github.com/apache/airavata-php-gateway.git"
-pga_git_branch: "staging"
 user: "pga"
 group: "pga"
 doc_root_dir: "/var/www/portals/{{ gateway_id }}"
@@ -53,6 +51,7 @@
 gateway_data_store_resource_id: "pga.staging.scigap.org_aa63ffa0-a99f-4885-8f4b-81e3c4c4d737"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqFFN7+93U5cELQCdZl+XiXmFxiSnQDXJaIdTKML3X/KU/0GkwUOBkrKVJaJEgpt+cSPLIg/qM4nVjt3iTfBIx9SPb6q8sHxSKnnNS/mfFvSOn/mxdNVgqNgTlqRy5axaeTn8wxa0afihZZLhU0MvUl0rrAcsR2gBU2zWeE9t+gj/HQ5D/dNmKQUJpexyY79RQi6mDwUPwHPXcLs+6YrJ68kpjmGQgGXUvCK/29neRvKpOXKds8E1kaa9nouxiQDCwAQKtqg8VAtfgMOX8gjur9DC1s45Ryjv+bLDuQ7MFMf5wEWg6QKSYoF94/JX3bC9nVjlL2wGX9HsWPDpWY2K5"
 data_sharing_enabled: "false"
+group_resource_profile_id: "84a97a11-0169-4d33-aefd-9b7b85df296f"
 
 ## Portal related variables
 super_admin_portal: "false"
diff --git a/dev-tools/ansible/inventories/standalone/files/airavata.jks b/dev-tools/ansible/inventories/standalone/files/airavata.jks
new file mode 100644
index 0000000..68b6cdb
--- /dev/null
+++ b/dev-tools/ansible/inventories/standalone/files/airavata.jks
Binary files differ
diff --git a/dev-tools/ansible/inventories/standalone/files/client_truststore.jks b/dev-tools/ansible/inventories/standalone/files/client_truststore.jks
new file mode 100644
index 0000000..ec632fe
--- /dev/null
+++ b/dev-tools/ansible/inventories/standalone/files/client_truststore.jks
Binary files differ
diff --git a/dev-tools/ansible/inventories/standalone/files/cred_store.jks b/dev-tools/ansible/inventories/standalone/files/cred_store.jks
new file mode 100644
index 0000000..639391e
--- /dev/null
+++ b/dev-tools/ansible/inventories/standalone/files/cred_store.jks
Binary files differ
diff --git a/dev-tools/ansible/inventories/standalone/group_vars/all/vars.yml b/dev-tools/ansible/inventories/standalone/group_vars/all/vars.yml
index 0fdf791..afcbde7 100644
--- a/dev-tools/ansible/inventories/standalone/group_vars/all/vars.yml
+++ b/dev-tools/ansible/inventories/standalone/group_vars/all/vars.yml
@@ -32,16 +32,16 @@
 user_home: "/home/{{ user }}"
 
 # deployment related variables
-deployment_dir: "{{ user_home }}/master-deployment"
-airavata_source_dir: "{{ user_home }}/master-source"
+deployment_dir: "{{ user_home }}/develop-deployment"
+airavata_source_dir: "{{ user_home }}/develop-source"
 airavata_repo: "https://github.com/apache/airavata.git"
-airavata_dist: "apache-airavata-server-0.17-SNAPSHOT"
+airavata_dist: "apache-airavata-api-server-0.20-SNAPSHOT"
 airavata_dist_name: "{{ airavata_dist }}-bin.tar.gz"
-old_airavata_dist: "apache-airavata-server-0.17-SNAPSHOT"
-git_branch: "master"
+old_airavata_dist: "apache-airavata-server-0.20-SNAPSHOT"
+git_branch: "develop"
 
 # Database related variables
-db_server: "{{ groups['database'][0] }}"
+db_server: "localhost"
 db_server_port: "3306"
 db_user: "airavata"
 db_password: "123456"
@@ -54,6 +54,10 @@
 credential_store: "credential_store"
 profile_service: "profile_service"
 
+
+django_db_username: "django"
+django_db_password: "123456"
+
 mysql_connector_jar: "mysql-connector-java-5.1.37-bin.jar"
 
 # Rabbitmq related vareables
@@ -71,7 +75,7 @@
 # API Server related variables
 api_server_name: "apiserver-node0"
 api_server_host: "{{ groups['api-orch'][0] }}"
-api_server_bind_host: "{{ api_server_host }}"
+#api_server_bind_host: "{{ api_server_host }}"
 api_server_port: "8930"
 api_secured: "false"
 tls_enable: "true"
@@ -79,7 +83,7 @@
 enable_sharing: "true"
 iam_server_url: "https://{{ groups['keycloak'][0] }}/auth"
 iam_server_super_admin_username: "admin"
-iam_server_super_admin_password: "123456"
+iam_server_super_admin_password: "Kintetsu-Sambreville-Gameleira"
 
 # Orchestrator  related variables
 orchestrator_name: "orchestrator-node0"
@@ -87,16 +91,18 @@
 orchestrator_port: "8940"
 api_orch_dir: "{{ deployment_dir }}/api-orchestrator"
 api_orch_log_dir: "{{ api_orch_dir }}/logs"
-orchestrator_bind_host: "{{ orchestrator_host }}"
+#orchestrator_bind_host: "{{ orchestrator_host }}"
 
 # registry related variables
 registry_name: regserver-node0
 registry_host: "{{ groups['api-orch'][0] }}"
 registry_port: 8970
-default_gateway: "default"
-registry_bind_host: "{{ registry_host }}"
-default_registry_user: "default-admin"
+default_gateway: "airavata-custos-integration"
+#registry_bind_host: "{{ registry_host }}"
+default_registry_user: "admin"
 default_registry_password: "123456"
+default_iam_auth_id: "pga"
+default_iam_auth_secret: "df408bc7-39cd-4a9a-8638-256c681115f0"
 
 # Credential and keystore related variables
 keystore_src_path: "{{inventory_dir}}/files/airavata.jks"
@@ -109,7 +115,7 @@
 cred_store_server_host: "{{ groups['api-orch'][0] }}"
 cred_store_port: "8960"
 keystores_location: "{{ deployment_dir }}/keystores"
-cred_store_server_bind_host: "{{ cred_store_server_host }}"
+#cred_store_server_bind_host: "{{ cred_store_server_host }}"
 
 # Gfac related variables
 gfac_name: "gfac-node0"
@@ -119,14 +125,14 @@
 gfac_log_dir: "{{ gfac_dir }}/logs"
 
 # Monitoring variables
-monitor_email_address: ""
-monitor_email_password: ""
+monitor_email_address: "airavatatest123@gmail.com"
+monitor_email_password: "airavatatest12345678"
 
 # PGA variables
 pga_repo: "https://github.com/apache/airavata-php-gateway.git"
-user_data_dir: "/var/www/portals/gateway-user-data"
+user_data_dir: "/data/gateway-user-data"
 real_user_data_dir: "/data/gateway-user-data"
-airavata_server: "tls://{{ groups['api-orch'][0] }}"
+airavata_server: "tls://localhost"
 airavata_port: "9930"
 airavata_profile_service_server: "{{ groups['api-orch'][0] }}"
 auth_verify_peer: "false"
@@ -137,12 +143,12 @@
 # Sharing Registry related variables
 sharing_registry_host: "{{ groups['api-orch'][0] }}"
 sharing_registry_port: 7878
-sharing_registry_bind_host: "{{ sharing_registry_host }}"
+#sharing_registry_bind_host: "{{ sharing_registry_host }}"
 
 # Profile Service related variables
 profile_service_host: "{{ groups['api-orch'][0] }}"
 profile_service_port: 8962
-profile_service_bind_host: "{{ profile_service_host }}"
+#profile_service_bind_host: "{{ profile_service_host }}"
 
 # Keycloak
 keycloak_ssl_keystore_file: "{{ keystore_src_path }}"
diff --git a/dev-tools/ansible/inventories/standalone/group_vars/django/vars.yml b/dev-tools/ansible/inventories/standalone/group_vars/django/vars.yml
new file mode 100644
index 0000000..c90c742
--- /dev/null
+++ b/dev-tools/ansible/inventories/standalone/group_vars/django/vars.yml
@@ -0,0 +1,36 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+user: "pga"
+group: "pga"
+gateway_data_store_hostname: "pgadev.scigap.org"
+gateway_data_store_resource_id: "pgadev.scigap.org_7ddf28fd-d503-4ff8-bbc5-3279a7c3b99e"
+django_wsgi_processes: 2
+doc_root_dir: "/var/www/portals/django-{{gateway_id}}"
+admin_emails: "[('SGRC Group', 'sgrc-iu-group@iu.edu')]"
+django_error_emails: "[('Marcus Christie', 'machrist@iu.edu'), ('Eroma Abeysinghe', 'eabeysin@iu.edu')]"
+django_database_name: "django_{{ inventory_hostname }}"
+db_server: "localhost"
+django_hidden_airavata_apps: "['django_airavata_dataparsers']"
+# django_tus_endpoint: "https://tus.dev.scigap.org/files/"
+airavata_django_git_branch: "RPID+SEAGrid"
+api_server_host: "localhost"
+profile_service_host: "localhost"
diff --git a/dev-tools/ansible/inventories/standalone/group_vars/helix/vars.yml b/dev-tools/ansible/inventories/standalone/group_vars/helix/vars.yml
index 699ede2..fc1afe2 100644
--- a/dev-tools/ansible/inventories/standalone/group_vars/helix/vars.yml
+++ b/dev-tools/ansible/inventories/standalone/group_vars/helix/vars.yml
@@ -24,7 +24,7 @@
 helix_dir: "{{ deployment_dir }}/airavata-helix"
 helix_cluster_name: "AiravataDemoCluster"
 
-snapshot_version: "0.17-SNAPSHOT"
+snapshot_version: "0.20-SNAPSHOT"
 
 # Listening port for kafka installations
 kafka_listener_port: 9092
diff --git a/dev-tools/ansible/inventories/standalone/group_vars/pga/vars.yml b/dev-tools/ansible/inventories/standalone/group_vars/pga/vars.yml
index 333ef8d..68bd990 100644
--- a/dev-tools/ansible/inventories/standalone/group_vars/pga/vars.yml
+++ b/dev-tools/ansible/inventories/standalone/group_vars/pga/vars.yml
@@ -41,10 +41,10 @@
 
 ## Keycloak related variables
 tenant_domain: "{{ gateway_id }}"
-admin_username: "default-admin"
+admin_username: "admin"
 admin_password: "123456"
 oauth_client_key: "pga"
-oauth_client_secret: "6dd5c5ea-50ce-4a52-8c7c-b11ea80799ac"
+oauth_client_secret: "df408bc7-39cd-4a9a-8638-256c681115f0"
 oidc_discovery_url: "https://{{ groups['keycloak'][0] }}/auth/realms/{{ tenant_domain }}/.well-known/openid-configuration"
 
 auth_options:
@@ -54,7 +54,7 @@
 # or if SSL then:
 #oauth_callback_url: "https://{{ vhost_servername }}/callback-url"
 
-gateway_id: "default"
+gateway_id: "airavata-custos-integration"
 # relative to document root dir
 experiment_data_dir: "{{ user_data_dir }}/exp-dir"
 gateway_data_store_resource_id: "CHANGEME"
@@ -62,10 +62,10 @@
 
 ## Portal related variables
 super_admin_portal: "true"
-admin_emails: "['CHANGEME']"
+admin_emails: "['isjarana@iu.edu']"
 #example: admin_emails: "['emailaddress1@example.com', 'emailaddress2@example.com']"
-portal_email_username: ""
-portal_email_password: ""
+portal_email_username: "airavatatest123@gmail.com"
+portal_email_password: "airavatatest12345678"
 portal_theme: "base"
 portal_title: "Airavata"
 ...
diff --git a/dev-tools/ansible/inventories/standalone/host_vars/airavata-custos-integration/vars.yml b/dev-tools/ansible/inventories/standalone/host_vars/airavata-custos-integration/vars.yml
new file mode 100644
index 0000000..7b171d7
--- /dev/null
+++ b/dev-tools/ansible/inventories/standalone/host_vars/airavata-custos-integration/vars.yml
@@ -0,0 +1,53 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+vhost_servername: "rpid.seagrid.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/rpid.seagrid.org/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/rpid.seagrid.org/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/rpid.seagrid.org/privkey.pem"
+
+## Keycloak related variables
+tenant_domain: "default"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "RPID+SEAGrid"
+#  external:
+#    - name: "CILogon"
+#      idp_alias: "oidc"
+
+gateway_id: "default"
+experiment_data_dir: "{{ user_data_dir }}/django-rpid-seagrid"
+#gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCFgLWSw6Mf0tPbkeSyzPMxgT50cNEXFDiE9UnEx0tIm+is9C3hIK78Ct8NAWgPxdXy1vd/9NBVIqkR516NZ7VyGbUHkrtPLOYL+Of9IyvxOQmrLzTLQNS9yVkxwxykJzBePZySyLcOKQdG8YoNj6+2iRolzfo5/w4Gz+MSqKmPJcVH8hjwTdoE5s0hYU4MaLF966hh6LUH7SG31BcTadtEgnE8nYfxeoa20oj0h0n1LKO06OZgVXVN3iulHimQ1paQiW71X9UPUhgpLnYAiI99BmYOQqEM4IndwZLZPwDeb23A0Dh3bLO8CAPgPRcG5b1Da6kABi5i5gcIt3WCJzeP"
+
+portal_email_host: "smtp.gmail.com"
+portal_email_port: 587
+portal_email_tls: true
+portal_email_username: "pga.airavata@gmail.com"
+portal_email_password: "{{ vault_portal_email_password }}"
+admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu'), ('Sudhakar Pamidighantam', 'pamidigs@iu.edu'), ('Eroma Abeysinghe', 'eroma.abeysinghe@gmail.com')]"
+portal_server_email: "{{ portal_email_username }}"
+portal_title: "RPID+SEAGrid Portal"
+
+...
diff --git a/dev-tools/ansible/inventories/standalone/hosts b/dev-tools/ansible/inventories/standalone/hosts
index 47ea9fa..8cf43d6 100644
--- a/dev-tools/ansible/inventories/standalone/hosts
+++ b/dev-tools/ansible/inventories/standalone/hosts
@@ -3,28 +3,28 @@
 # NOTE: update the CHANGEMEs to the actual ip address or hostname.
 
 [zookeeper]
-192.168.99.102 ansible_connection=ssh ansible_user=root
+149.165.171.13 ansible_connection=ssh ansible_user=root
 
 [rabbitmq]
-192.168.99.102 ansible_connection=ssh ansible_user=root
+149.165.171.13 ansible_connection=ssh ansible_user=root
 
 [database]
-192.168.99.102 ansible_connection=ssh ansible_user=root
+149.165.171.13 ansible_connection=ssh ansible_user=root
 
 [api-orch]
-192.168.99.102 ansible_connection=ssh ansible_user=root
+149.165.171.13 ansible_connection=ssh ansible_user=root
 
 [gfac]
-192.168.99.102 ansible_connection=ssh ansible_user=root
+149.165.171.13 ansible_connection=ssh ansible_user=root
 
 [pga]
-192.168.99.102 ansible_user=root
+149.165.171.13 ansible_user=root
 
 [keycloak]
-192.168.99.102 ansible_connection=ssh ansible_user=root
+iamdev.scigap.org
 
 [kafka]
-192.168.99.102 ansible_connection=ssh ansible_user=root
+149.165.171.13 ansible_connection=ssh ansible_user=root
 
 [helix]
-192.168.99.102 ansible_connection=ssh ansible_user=root
\ No newline at end of file
+149.165.171.13 ansible_connection=ssh ansible_user=root
\ No newline at end of file
diff --git a/dev-tools/ansible/keycloak.yml b/dev-tools/ansible/keycloak.yml
index 292a821..8cca98b 100644
--- a/dev-tools/ansible/keycloak.yml
+++ b/dev-tools/ansible/keycloak.yml
@@ -24,6 +24,7 @@
   roles:
     - env_setup
     - java
+    - letsencrypt
     - keycloak
 
-...
\ No newline at end of file
+...
diff --git a/dev-tools/ansible/pga-scigap-prod.yml b/dev-tools/ansible/pga-scigap-prod.yml
index c913e75..6b557f2 100644
--- a/dev-tools/ansible/pga-scigap-prod.yml
+++ b/dev-tools/ansible/pga-scigap-prod.yml
@@ -19,46 +19,47 @@
 #
 
 ---
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/accord"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/accord"
 #- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/brandeis"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/gatech"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/georgiastate"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/gatech"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/georgiastate"
 - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/iugateway"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/lsu"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/nanoconfinement"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/nanoshape"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/newmexicostate"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/nsg"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/lsu"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/nanoconfinement"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/nanoshape"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/newmexicostate"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/nsg"
 #- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/oiitandy"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/oscer"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/phasta"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/oscer"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/phasta"
 - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/scigap"
 - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/seagrid"
 - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/simvascular"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/southdakota"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/southernillinois"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/testdrive"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/uab"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/ultrascan"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/southdakota"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/southernillinois"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/testdrive"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/uab"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/ultrascan"
 #- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/utah"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/wvsu"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/iugeosurvey"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/csbglsu"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/NCSAIndustry"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/Kentucky"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/wvsu"
+#- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/iugeosurvey"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/csbglsu"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/NCSAIndustry"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/Kentucky"
 - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/searchingSRA"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/r-hpc"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/rutgersgemr"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/nexttdb"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/interactwel"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/hubzero"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/epwgateway"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/ampgateway"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/hubzero"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/ddstudio"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/sdstate"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/saverx"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/mines"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/r-hpc"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/rutgersgemr"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/nexttdb"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/interactwel"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/hubzero"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/epwgateway"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/ampgateway"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/hubzero"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/ddstudio"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/sdstate"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/saverx"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/mines"
 - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/distantreader"
-- include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/pfec-hydro"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/pfec-hydro"
+# - include: pga-single-vhost.yml vars_dir="{{ inventory_dir }}/pga_config/snowvision"
 ...
diff --git a/dev-tools/ansible/pga-single-vhost.yml b/dev-tools/ansible/pga-single-vhost.yml
index eae17e2..cb0d2c1 100644
--- a/dev-tools/ansible/pga-single-vhost.yml
+++ b/dev-tools/ansible/pga-single-vhost.yml
@@ -32,6 +32,7 @@
     - "{{ vars_dir }}/vault.yml"
   roles:
     - env_setup
+    - letsencrypt
     - pga
 
 ...
diff --git a/dev-tools/ansible/pga.yml b/dev-tools/ansible/pga.yml
index efc0696..d86f82e 100644
--- a/dev-tools/ansible/pga.yml
+++ b/dev-tools/ansible/pga.yml
@@ -23,6 +23,7 @@
   tags: pga
   roles:
     - env_setup
+    - letsencrypt
     - pga
 
 ...
diff --git a/dev-tools/ansible/requirements.txt b/dev-tools/ansible/requirements.txt
index de84a27..dc30cfd 100644
--- a/dev-tools/ansible/requirements.txt
+++ b/dev-tools/ansible/requirements.txt
@@ -16,3 +16,4 @@
 # under the License.
 
 ansible~=2.3.1
+docker<3.0
diff --git a/dev-tools/ansible/roles/api-orch/defaults/main.yml b/dev-tools/ansible/roles/api-orch/defaults/main.yml
index 5855377..638eb95 100644
--- a/dev-tools/ansible/roles/api-orch/defaults/main.yml
+++ b/dev-tools/ansible/roles/api-orch/defaults/main.yml
@@ -44,3 +44,6 @@
 default_registry_password : "admin"
 
 api_orch_systemd_unit_file: "/etc/systemd/system/apiorch.service"
+
+thrift_client_pool_abandoned_removal_enabled: false
+thrift_client_pool_abandoned_removal_logged: false
diff --git a/dev-tools/ansible/roles/api-orch/templates/airavata-server.properties.j2 b/dev-tools/ansible/roles/api-orch/templates/airavata-server.properties.j2
index 7839b90..abb96dc 100644
--- a/dev-tools/ansible/roles/api-orch/templates/airavata-server.properties.j2
+++ b/dev-tools/ansible/roles/api-orch/templates/airavata-server.properties.j2
@@ -51,6 +51,8 @@
 default.registry.password.hash.method=SHA
 default.registry.gateway={{ default_gateway }}
 super.tenant.gatewayId={{ default_gateway }}
+default.registry.oauth.client.id={{default_iam_auth_id}}
+default.registry.oauth.client.secret={{default_iam_auth_secret}}
 
 # Properties for cluster status monitoring
 # cluster status monitoring job repeat time in seconds
@@ -323,3 +325,9 @@
 # DB Event Manager Runner
 ###########################################################################
 db_event_manager=org.apache.airavata.db.event.manager.DBEventManagerRunner
+
+###########################################################################
+# ThriftClientPool Configuration
+###########################################################################
+thrift.client.pool.abandoned.removal.enabled={{ thrift_client_pool_abandoned_removal_enabled }}
+thrift.client.pool.abandoned.removal.logged={{ thrift_client_pool_abandoned_removal_logged }}
diff --git a/dev-tools/ansible/roles/common/defaults/main.yml b/dev-tools/ansible/roles/common/defaults/main.yml
index afc80f5..881faeb 100644
--- a/dev-tools/ansible/roles/common/defaults/main.yml
+++ b/dev-tools/ansible/roles/common/defaults/main.yml
@@ -21,3 +21,6 @@
 keystore_src_path: "airavata.jks"
 client_truststore_src_path: "airavata.jks"
 cred_keystore_src_path: "airavata_sym.jks"
+
+apache_maven_version: "apache-maven-3.6.3"
+apache_maven_url: "https://www-eu.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz"
diff --git a/dev-tools/ansible/roles/common/tasks/main.yml b/dev-tools/ansible/roles/common/tasks/main.yml
index eb49946..f72118d 100644
--- a/dev-tools/ansible/roles/common/tasks/main.yml
+++ b/dev-tools/ansible/roles/common/tasks/main.yml
@@ -23,7 +23,26 @@
   yum: name={{ item }} state=latest update_cache=yes
   with_items:
     - git
-    - maven
+  become_user: root
+
+- name: download {{ apache_maven_version }}
+  get_url: url="{{ apache_maven_url }}" dest="/opt/{{ apache_maven_version }}-bin.tar.gz"
+  become: yes
+  become_user: root
+
+- name: unzip maven
+  unarchive:
+    src: /opt/{{ apache_maven_version }}-bin.tar.gz
+    dest: /opt
+    remote_src: yes
+  become: yes
+  become_user: root
+
+- name: add maven to PATH
+  template:
+    src: maven.sh
+    dest: /etc/profile.d/maven.sh
+  become: yes
   become_user: root
 
 # Setup airavata source
@@ -45,7 +64,7 @@
   tags: update
 
 - name: Run maven build
-  command: mvn clean install -Dmaven.test.skip=true chdir="{{ airavata_source_dir }}/"
+  command: /opt/{{apache_maven_version}}/bin/mvn clean install -Dmaven.test.skip=true chdir="{{ airavata_source_dir }}/"
   environment:
       MAVEN_OPTS: "-Xmx2048m"
   register: build
diff --git a/dev-tools/ansible/roles/common/templates/maven.sh b/dev-tools/ansible/roles/common/templates/maven.sh
new file mode 100644
index 0000000..d51dd7e
--- /dev/null
+++ b/dev-tools/ansible/roles/common/templates/maven.sh
@@ -0,0 +1 @@
+export PATH=/opt/{{ apache_maven_version }}/bin:${PATH}
diff --git a/dev-tools/ansible/roles/database/tasks/django.yml b/dev-tools/ansible/roles/database/tasks/django.yml
index 8751b60..7f2c864 100644
--- a/dev-tools/ansible/roles/database/tasks/django.yml
+++ b/dev-tools/ansible/roles/database/tasks/django.yml
@@ -22,7 +22,7 @@
 
 # Setup django user and databases
 - name: create django databases
-  mysql_db: name="django_{{ item }}" state=present encoding=utf8
+  mysql_db: name="{{ hostvars[item]['django_database_name'] }}" state=present encoding=utf8 collation=utf8_bin
   with_items:
   - "{{ groups['django'] }}"
 
@@ -36,11 +36,14 @@
   with_items:
   - "{{ groups['django'] }}"
 
+- name: give access to {{ django_db_username }} from localhost
+  mysql_user: name="{{ django_db_username }}" password="{{ django_db_password }}" host="localhost"
+
 - name: create new user {{ django_db_username }} with all privileges on all django databases
   mysql_user: name="{{ django_db_username }}"
               password="{{ django_db_password }}"
               append_privs=yes
               host_all=yes
-              priv=django_{{ item }}.*:ALL,GRANT state=present
+              priv={{ hostvars[item]['django_database_name'] }}.*:ALL,GRANT state=present
   with_items:
   - "{{ groups['django'] }}"
diff --git a/dev-tools/ansible/roles/django/defaults/main.yml b/dev-tools/ansible/roles/django/defaults/main.yml
index b4ff3e6..58f002a 100644
--- a/dev-tools/ansible/roles/django/defaults/main.yml
+++ b/dev-tools/ansible/roles/django/defaults/main.yml
@@ -20,13 +20,14 @@
 
 ---
 doc_root_dir: "/var/www/django-{{ gateway_id }}"
-static_root_dir: "{{ doc_root_dir }}/static/"
 user_data_dir: "/var/www/user_data"
 django_venv_dir: "{{ doc_root_dir }}/venv"
 # real_user_data_dir is the same as user_data_dir but without symbolic links in it
 real_user_data_dir: "{{ user_data_dir }}"
 vhost_servername: "{{ groups['django'][0] }}"
 vhost_ssl: False
+vhost_aliases: []
+vhost_timeout: 60
 httpd_confd_file_location:
  RedHat: "/etc/httpd/conf.d/django-{{ gateway_id }}.conf"
  Debian: "/etc/apache2/sites-available/django-{{ gateway_id }}.conf"
@@ -42,13 +43,33 @@
 django_settings_local_template: "settings_local.py.j2"
 django_extra_settings: {}
 django_database_name: "django_{{ gateway_id }}"
+django_hidden_airavata_apps: "[]"
+django_tus_data_dir: "{{user_data_dir}}/tus-temp-dir"
+django_file_upload_max_file_size_mb: 64
 
-django_wsgi_processes: 2
+# Should be a python expression that evaluates to a string representing a file path. For example:
+# django_keycloak_ca_certfile_path: "/etc/ca.pem"
+# or 
+# django_keycloak_ca_certfile_path: 'os.path.join(BASE_DIR, "django_airavata", "resources", "incommon_rsa_server_ca.pem")'
+# By default it has no value meaning system default CA certs will be used for validation.
+django_keycloak_ca_certfile_path:
+
+django_wsgi_processes: 1
 
 django_debug: false
 django_error_emails: "{{ admin_emails }}"
 python_virtualenv_command: "pyvenv-3.6"
 
+# These directories need to be copied out of the build container and then
+# separately rsynced to deployment
+django_portal_js_build_dirs:
+  - "django_airavata/apps/api/static/django_airavata_api/dist"
+  - "django_airavata/static/common/dist"
+  - "django_airavata/apps/admin/static/django_airavata_admin/dist"
+  - "django_airavata/apps/groups/static/django_airavata_groups/dist"
+  - "django_airavata/apps/workspace/static/django_airavata_workspace/dist"
+  - "django_airavata/apps/dataparsers/static/django_airavata_dataparsers/dist"
+
 ## Keycloak related variables
 tenant_domain: "{{ gateway_id }}"
 oauth_client_key: "RuLl_Uw7i_KXaLoAGJkiasTfyBYa"
@@ -72,6 +93,7 @@
 # relative to document root dir
 experiment_data_dir: "{{ user_data_dir }}"
 file_upload_tmp_dir: "{{ experiment_data_dir }}/tmp/"
+gateway_data_store_ssh_public_key: ""
 gateway_data_store_resource_id: "js-170-103.jetstream-cloud.org_6497a464-3121-4b64-a7cb-d195b0a26c19"
 gateway_data_store_hostname: "{{ groups['django'][0] }}"
 portal_email_tls: false
@@ -79,4 +101,8 @@
 
 httpd_default_http_port: 80
 httpd_default_https_port: 443
+
+# Google Analytics tracking id
+django_google_analytics_tracking_id:
+
 ...
diff --git a/dev-tools/ansible/roles/django/files/remove_old_js_css_files.py b/dev-tools/ansible/roles/django/files/remove_old_js_css_files.py
new file mode 100755
index 0000000..bed1444
--- /dev/null
+++ b/dev-tools/ansible/roles/django/files/remove_old_js_css_files.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+
+import argparse
+import glob
+import json
+import os
+import re
+import time
+
+BASE_DIR = "/var/www/portals"
+IGNORE_DIRS = ['node_modules', 'venv']
+REGEX = re.compile(r"^([\w-]+)\.([a-f0-9]{8})\.(js|js\.map|css|css\.map)$")
+MAX_ATIME_AGE_HOURS = 24
+
+parser = argparse.ArgumentParser()
+parser.add_argument("-b", "--basedir", default=BASE_DIR, help="base directory from which to look for older built JS/CSS files")
+args = parser.parse_args()
+
+for root, dirs, files in os.walk(args.basedir):
+    for i in IGNORE_DIRS:
+        if i in dirs:
+            dirs.remove(i)
+    if "webpack-stats.json" in files:
+        # print(f"Found webpack-stats.json in {root}")
+        with open(os.path.join(root, "webpack-stats.json")) as sf:
+            stats = json.load(sf)
+        for chunk, files in stats["chunks"].items():
+            for f in files:
+                dirname, filename = os.path.split(f["name"])
+                # capture base name and hash and extension
+                m = REGEX.match(filename)
+                if m is not None:
+                    basename, content_hash, file_ext = m.groups()
+                    other_files = glob.glob(os.path.join(root, dirname, basename + ".*." + file_ext))
+                    for other_file in other_files:
+                        m = REGEX.match(os.path.basename(other_file))
+                        other_hash = m.group(2)
+                        if other_hash != content_hash:
+                            # Check last accessed time and remove file if more than MAX_ATIME_AGE_HOURS old
+                            atime = os.stat(other_file).st_atime
+                            atime_hours = (time.time() - atime) / 3600
+                            if atime_hours > MAX_ATIME_AGE_HOURS:
+                                print(f"Deleting alternate of {filename} {file_ext}, {atime_hours} hours old: {other_file}")
+                                os.remove(other_file)
+                else:
+                    raise Exception(f"Regex failed on filename {filename} in {root}")
diff --git a/dev-tools/ansible/roles/django/handlers/main.yml b/dev-tools/ansible/roles/django/handlers/main.yml
index 808200f..237e3d2 100644
--- a/dev-tools/ansible/roles/django/handlers/main.yml
+++ b/dev-tools/ansible/roles/django/handlers/main.yml
@@ -31,3 +31,21 @@
     state: touch
   become: yes
   become_user: "{{ user }}"
+
+# Cleaning up older built files should come after uwsgi restart, restart will
+# pick up newer webpack-stats.json files and only serve newer JS/CSS files
+- name: copy remove_old_js_css_files.py script
+  copy:
+    src: remove_old_js_css_files.py
+    dest: /usr/local/bin/remove_old_js_css_files.py
+    owner: "{{ user }}"
+    group: "{{ group }}"
+    mode: 0755
+  become: yes
+  listen: "delete older files"
+
+- name: execute remove_old_js_css_files.py script
+  command: /usr/local/bin/remove_old_js_css_files.py -b "{{ doc_root_dir }}/static"
+  listen: "delete older files"
+  become: yes
+  become_user: "{{ user }}"
diff --git a/dev-tools/ansible/roles/django/tasks/main.yml b/dev-tools/ansible/roles/django/tasks/main.yml
index 0ae52bb..2e8124b 100644
--- a/dev-tools/ansible/roles/django/tasks/main.yml
+++ b/dev-tools/ansible/roles/django/tasks/main.yml
@@ -19,30 +19,138 @@
 #
 
 ---
+# Need database facts to populate db connection info in settings_local.py
+- name: Gather facts about database servers
+  setup:
+  delegate_to: "{{item}}"
+  delegate_facts: True
+  with_items:
+  - "{{ groups['database'] }}"
+
 - name: Create root directory
   file: path="{{ doc_root_dir }}" state=directory owner="{{user}}" group="{{group}}"
   become: yes
 
-- name: Git clone django portal
-  git:
-   repo: "{{ airavata_django_repo }}"
-   dest: "{{ airavata_django_checkout }}"
-   version: "{{ airavata_django_git_branch }}"
-   update: yes
-   force: yes
-  become: yes
-  become_user: "{{user}}"
+- name: Create local temp directory for django portal clone and build
+  local_action:
+    module: tempfile
+    # The temp directory must be in a location that allows it to be mounted
+    # into the Docker container. On macOS the default behavior creates temp
+    # directories in /var but /var isn't available to Docker containers.
+    path: /tmp
+    state: directory
+  register: airavata_django_portal_tempdir
+  run_once: true
+
+- name: Make local temp directory for django portal clone world readable
+  local_action:
+    module: file
+    # The Django portal clone directory needs to be world readable on the
+    # remote server and rsync preserves permissions, so make the local clone
+    # directory world readable
+    path: "{{ airavata_django_portal_tempdir.path }}"
+    mode: o+rx
+  run_once: true
+
+- name: git clone {{ airavata_django_git_branch }} branch of {{ airavata_django_repo }}
+  local_action:
+    module: git
+    repo: "{{ airavata_django_repo }}"
+    dest: "{{ airavata_django_portal_tempdir.path }}"
+    version: "{{ airavata_django_git_branch }}"
+    update: yes
+    force: yes
+  run_once: true
+
+# TODO: check if Docker is running (docker_host_info can_talk_to_docker https://docs.ansible.com/ansible/latest/modules/docker_host_info_module.html#return-values)
+# NOTE: docker_host_info only available from Ansible 2.8
+# - name: check if Docker is running
+#   local_action:
+#     module: docker_host_info
+#   register: docker_result
+#   run_once: true
+#
+# - name: Fail if Docker isn't running
+#   local_action:
+#     module: fail
+#     msg: Docker daemon isn't running or isn't accessible. Start Docker daemon and then rerun this playbook.
+#   when: not docker_result.can_talk_to_docker
+#   run_once: true
+
+- name: build airavata-django-portal Docker image
+  local_action:
+    module: docker_image
+    path: "{{ airavata_django_portal_tempdir.path }}/"
+    name: airavata-django-portal
+    force: true
+    # source: build
+  run_once: true
+
+- name: create Docker container so we can copy built files out of it
+  local_action:
+    module: docker_container
+    # Don't need to start the container, just create it
+    state: present
+    name: ansible-airavata-django-portal
+    image: airavata-django-portal
+  run_once: true
+
+- name: copy built JS files from Docker container
+  local_action: command docker cp ansible-airavata-django-portal:/code/{{ item }}/. {{ airavata_django_portal_tempdir.path }}/{{ item }}
+  run_once: true
+  with_items: "{{ django_portal_js_build_dirs }}"
+
+- name: remove Docker container
+  local_action:
+    module: docker_container
+    state: absent
+    name: ansible-airavata-django-portal
+  run_once: true
+
+- name: rsync built Django code to {{ airavata_django_checkout }}
+  synchronize:
+    src: "{{ airavata_django_portal_tempdir.path }}/"
+    dest: "{{ airavata_django_checkout }}"
+    rsync_opts:
+      - "--exclude=node_modules"
+      - "--exclude=.git"
+      # Don't copy over wsgi.py just yet since that triggers a restart of uwsgi
+      - "--exclude=wsgi.py"
+    # Bug: become_user doesn't work with synchronize: https://github.com/ansible/ansible/issues/29698
+    rsync_path: "sudo -u {{ user }} rsync"
+  # become: yes
+  # become_user: "{{user}}"
   notify:
     - restart uwsgi
+    - delete older files
+
+- name: rsync built Django code to {{ airavata_django_checkout }}, deleting older built files
+  synchronize:
+    src: "{{ airavata_django_portal_tempdir.path }}/{{ item }}/"
+    dest: "{{ airavata_django_checkout }}/{{ item }}"
+    delete: yes
+    rsync_opts:
+      - "--exclude=node_modules"
+    # Bug: become_user doesn't work with synchronize: https://github.com/ansible/ansible/issues/29698
+    rsync_path: "sudo -u {{ user }} rsync"
+  # become: yes
+  # become_user: "{{user}}"
+  notify:
+    - restart uwsgi
+    - delete older files
+  with_items: "{{ django_portal_js_build_dirs }}"
 
 - name: Create virtual environment for Django portal and install dependencies
   pip:
-    requirements: "{{ airavata_django_checkout }}/requirements.txt"
+    requirements: "{{ item }}"
     virtualenv: "{{ django_venv_dir }}"
     virtualenv_command: "{{ python_virtualenv_command }}"
     chdir: "{{ airavata_django_checkout }}"
   become: yes
   become_user: "{{user}}"
+  with_list:
+    - "{{ airavata_django_checkout }}/requirements.txt"
+    - "{{ airavata_django_checkout }}/requirements-mysql.txt"
 
 - name: Install additional dependencies
   pip:
@@ -66,12 +174,16 @@
   become: yes
   become_user: "{{user}}"
 
-- name: Build JS
-  command: bash {{ airavata_django_checkout }}/build_js.sh
-  environment:
-    STATIC_ROOT: "{{ static_root_dir }}"
+- name: Run Django's manage.py set_wagtail_site based on hostname
+  django_manage:
+    command: set_wagtail_site
+    app_path: "{{ airavata_django_checkout }}"
+    virtualenv: "{{ django_venv_dir }}"
   become: yes
   become_user: "{{user}}"
+  # if there are no Django Portal pages in Wagtail, then this command fails,
+  # but we can ignore it until Wagtail pages are created
+  ignore_errors: yes
 
 - name: Run Django's manage.py collectstatic
   django_manage:
@@ -82,9 +194,11 @@
   become_user: "{{user}}"
   notify:
     - restart uwsgi
+    - delete older files
 
+# TODO: this is really slow with lots of files
 - name: Create experiment data dir
-  file: path="{{ experiment_data_dir }}" state=directory owner="{{user}}" group="{{group}}" recurse=yes follow=yes
+  file: path="{{ experiment_data_dir }}" state=directory owner="{{user}}" group="{{group}}" recurse=no follow=yes
   become: yes
 
 - name: Create file upload tmp dir
@@ -127,6 +241,7 @@
     state: yes
     persistent: yes
   become: yes
+  when: ansible_os_family == "RedHat"
 
 - name: run restorecon on those directories
   command: restorecon -F -R {{ doc_root_dir }}
@@ -146,3 +261,27 @@
   notify:
     - restart httpd
   when: vhost_ssl
+
+- name: copy user's SSH key for the gateway data store
+  authorized_key:
+    user: "{{user}}"
+    key: "{{ gateway_data_store_ssh_public_key }}"
+  become: yes
+  when: gateway_data_store_ssh_public_key != ""
+
+- name: Copy the wsgi.py file
+  copy:
+    src: "{{ airavata_django_portal_tempdir.path }}/django_airavata/wsgi.py"
+    dest: "{{ airavata_django_checkout }}/django_airavata/wsgi.py"
+    owner: "{{ user }}"
+    group: "{{ group }}"
+  become: yes
+  notify:
+    - restart uwsgi
+
+- name: remove Django portal clone temp directory
+  local_action:
+    module: file
+    state: absent
+    path: "{{ airavata_django_portal_tempdir.path }}"
+  run_once: true
diff --git a/dev-tools/ansible/roles/django/templates/django-ssl-vhost.conf.j2 b/dev-tools/ansible/roles/django/templates/django-ssl-vhost.conf.j2
index 09d8b09..59268ce 100644
--- a/dev-tools/ansible/roles/django/templates/django-ssl-vhost.conf.j2
+++ b/dev-tools/ansible/roles/django/templates/django-ssl-vhost.conf.j2
@@ -38,6 +38,7 @@
 
 <VirtualHost *:{{ httpd_default_https_port }}>
     ServerName {{ vhost_servername }}
+    TimeOut {{ vhost_timeout }}
 
     Alias /robots.txt {{ doc_root_dir }}/static/robots.txt
     Alias /favicon.ico {{ doc_root_dir }}/static/favicon.ico
@@ -55,6 +56,14 @@
         Require all granted
     </Directory>
 
+    {# Additional aliases #}
+    {% for alias in vhost_aliases %}
+    Alias "{{ alias.url }}" "{{ alias.path }}"
+    <Directory "{{ alias.path }}">
+        Require all granted
+    </Directory>
+    {% endfor %}
+
     WSGIDaemonProcess {{ vhost_servername }} display-name=%{GROUP} python-home={{ doc_root_dir }}/venv python-path={{ doc_root_dir }}/airavata-django-portal processes={{ django_wsgi_processes }} user={{ user }} group={{ group }}
     WSGIProcessGroup {{ vhost_servername }}
 
diff --git a/dev-tools/ansible/roles/django/templates/django-vhost.conf.j2 b/dev-tools/ansible/roles/django/templates/django-vhost.conf.j2
index 995fdde..9f0bd55 100644
--- a/dev-tools/ansible/roles/django/templates/django-vhost.conf.j2
+++ b/dev-tools/ansible/roles/django/templates/django-vhost.conf.j2
@@ -29,6 +29,7 @@
 
 <VirtualHost *:{{ httpd_default_http_port }}>
     ServerName {{ vhost_servername }}
+    TimeOut {{ vhost_timeout }}
     
     Alias /robots.txt {{ doc_root_dir }}/static/robots.txt
     Alias /favicon.ico {{ doc_root_dir }}/static/favicon.ico
@@ -46,6 +47,14 @@
         Require all granted
     </Directory>
 
+    {# Additional aliases #}
+    {% for alias in vhost_aliases %}
+    Alias "{{ alias.url }}" "{{ alias.path }}"
+    <Directory "{{ alias.path }}">
+        Require all granted
+    </Directory>
+    {% endfor %}
+
     WSGIDaemonProcess {{ vhost_servername }} display-name=%{GROUP} python-home={{ doc_root_dir }}/venv python-path={{ doc_root_dir }}/airavata-django-portal processes={{ django_wsgi_processes }} user={{ user }} group={{ group }}
     WSGIProcessGroup {{ vhost_servername }}
 
diff --git a/dev-tools/ansible/roles/django/templates/settings_local.py.j2 b/dev-tools/ansible/roles/django/templates/settings_local.py.j2
index 1a29bbf..c7d7eb2 100644
--- a/dev-tools/ansible/roles/django/templates/settings_local.py.j2
+++ b/dev-tools/ansible/roles/django/templates/settings_local.py.j2
@@ -30,14 +30,12 @@
 
 import os
 
-from . import webpack_loader_util
-
 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 
 # Django - general settings
 DEBUG = {{ django_debug | ternary("True", "False") }}
-STATIC_ROOT = "{{ static_root_dir }}"
+STATIC_ROOT = "{{ doc_root_dir }}/static/"
 ALLOWED_HOSTS = ['{{ vhost_servername }}']
 
 DATABASES = {
@@ -77,22 +75,30 @@
 KEYCLOAK_TOKEN_URL = '{{ oauth_service_url }}/realms/{{ tenant_domain }}/protocol/openid-connect/token'
 KEYCLOAK_USERINFO_URL = '{{ oauth_service_url }}/realms/{{ tenant_domain }}/protocol/openid-connect/userinfo'
 KEYCLOAK_LOGOUT_URL = '{{ oauth_service_url }}/realms/{{ tenant_domain }}/protocol/openid-connect/logout'
-KEYCLOAK_CA_CERTFILE = os.path.join(BASE_DIR, "django_airavata", "resources", "incommon_rsa_server_ca.pem")
+{% if django_keycloak_ca_certfile_path %}
+KEYCLOAK_CA_CERTFILE = {{ django_keycloak_ca_certfile_path }}
+{% endif %}
 KEYCLOAK_VERIFY_SSL = True
 
 AUTHENTICATION_OPTIONS = {
 
-    {% if auth_options.password %}
+    {% if auth_options.password is defined %}
     'password': {
-        'name': '{{ auth_options.password.name }}'
+        'name': '{{ auth_options.password.name }}',
+        {% if auth_options.password.logo is defined %}
+        'logo': '{{ auth_options.password.logo }}',
+        {% endif %}
     },
     {% endif %}
-    {% if auth_options.external %}
+    {% if auth_options.external is defined and auth_options.external %}
     'external': [
         {% for external in auth_options.external %}
         {
             'idp_alias': '{{ external.idp_alias }}',
             'name': '{{ external.name }}',
+            {% if external.logo is defined %}
+            'logo': '{{ external.logo }}',
+            {% endif %}
         },
         {% endfor %}
     ]
@@ -127,10 +133,26 @@
 # Portal settings
 PORTAL_TITLE = '{{ portal_title }}'
 
-# webpack_loader override to load from STATIC_ROOT
-WEBPACK_LOADER = webpack_loader_util.create_webpack_loader_config(STATIC_ROOT)
+# Hidden Airavata apps (not all gateways need all functionality)
+HIDDEN_AIRAVATA_APPS = {{ django_hidden_airavata_apps }}
+
+{% if django_tus_endpoint is defined and django_tus_endpoint %}
+# Tus uploads
+TUS_ENDPOINT = "{{ django_tus_endpoint }}"
+TUS_DATA_DIR = "{{ django_tus_data_dir }}"
+{% endif %}
+
+FILE_UPLOAD_MAX_FILE_SIZE = {{ django_file_upload_max_file_size_mb }} * 1024 * 1024
+
+{% if django_pga_url is defined and django_pga_url %}
+PGA_URL = "{{ django_pga_url }}"
+{% endif %}
+
+{% if django_google_analytics_tracking_id %}
+GOOGLE_ANALYTICS_TRACKING_ID = "{{ django_google_analytics_tracking_id }}"
+{% endif %}
 
 # Extra settings
 {% for extra_setting in django_extra_settings.items() | list %}
-{{ extra_setting[0] }} = '{{ extra_setting[1] }}'
+{{ extra_setting[0] }} = {{ extra_setting[1] | to_nice_json }}
 {% endfor %}
diff --git a/dev-tools/ansible/roles/django_setup/defaults/main.yml b/dev-tools/ansible/roles/django_setup/defaults/main.yml
new file mode 100644
index 0000000..e09cec4
--- /dev/null
+++ b/dev-tools/ansible/roles/django_setup/defaults/main.yml
@@ -0,0 +1,28 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+mod_wsgi_dir: /opt/mod_wsgi
+mod_wsgi_url: https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.17.tar.gz
+mod_wsgi_tarball_dest: "{{ mod_wsgi_dir }}/{{ mod_wsgi_url | basename }}"
+mod_wsgi_unarchive_dir: "{{ mod_wsgi_dir }}/mod_wsgi-4.5.17"
+httpd_conf_modules_dir: "/etc/httpd/conf.modules.d"
+
+...
diff --git a/dev-tools/ansible/roles/django_setup/files/00-wsgi.conf b/dev-tools/ansible/roles/django_setup/files/00-wsgi.conf
new file mode 100644
index 0000000..19f3567
--- /dev/null
+++ b/dev-tools/ansible/roles/django_setup/files/00-wsgi.conf
@@ -0,0 +1 @@
+LoadModule wsgi_module modules/mod_wsgi.so
diff --git a/dev-tools/ansible/roles/django_setup/files/django-httpd.te b/dev-tools/ansible/roles/django_setup/files/django-httpd.te
new file mode 100644
index 0000000..610e5bc
--- /dev/null
+++ b/dev-tools/ansible/roles/django_setup/files/django-httpd.te
@@ -0,0 +1,30 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+module django-httpd 1.0;
+
+require {
+	type httpd_t;
+	type httpd_sys_rw_content_t;
+	class file { relabelfrom relabelto };
+}
+
+#============= httpd_t ==============
+allow httpd_t httpd_sys_rw_content_t:file { relabelfrom relabelto };
diff --git a/dev-tools/ansible/roles/django_setup/tasks/main.yml b/dev-tools/ansible/roles/django_setup/tasks/main.yml
index c4f86a4..408c8be 100644
--- a/dev-tools/ansible/roles/django_setup/tasks/main.yml
+++ b/dev-tools/ansible/roles/django_setup/tasks/main.yml
@@ -18,32 +18,92 @@
 # under the License.
 #
 ---
-# TODO: install python34
-# sudo yum -y install python34
-# sudo yum -y install httpd-devel
-# sudo yum -y install python34-devel
-# sudo yum -y install mysql-devel
 
-# TODO: fetch and build mod_wsgi
-# mkdir mod_wsgi
-# cd mod_wsgi/
-# curl -LO https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.17.tar.gz
-# tar zxf 4.5.17.tar.gz
-# cd mod_wsgi-4.5.17/
-# ./configure --with-python=/usr/bin/python3
-# make
-# sudo make install
+- name: Install Airavata Django Portal prerequisites
+  yum: name={{ item }} state=latest update_cache=yes
+  with_items:
+    - python36
+    - httpd-devel
+    - python36-devel
+    - mysql-devel
+    - gcc
+    - zlib-devel
+    - openssl-devel
+  become: yes
 
-# TODO: configure apache to load mod_wsgi
-# * configure Apache to load mod_wsgi
-# ```
-# sudo vim /etc/httpd/conf.modules.d/00-wsgi.conf
-# ```
-# * 00-wsgi.conf file contains
-# ```
-# LoadModule wsgi_module modules/mod_wsgi.so
-# ```
+- name: Create mod_wsgi directory
+  file: path={{ mod_wsgi_dir }} state=directory
+  become: yes
 
-# TODO: install Node.js EPEL repository and then install nodejs
-# sudo curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
-# sudo yum install nodejs
+- name: Fetch mod_wsgi
+  get_url:
+    url: "{{ mod_wsgi_url }}"
+    dest: "{{ mod_wsgi_tarball_dest }}"
+  become: yes
+
+- name: Untar mod_wsgi
+  unarchive:
+    src: "{{ mod_wsgi_tarball_dest }}"
+    remote_src: yes
+    dest: "{{ mod_wsgi_dir }}"
+    creates: "{{ mod_wsgi_unarchive_dir }}"
+  become: yes
+
+- name: Configure mod_wsgi
+  command: ./configure --with-python=/usr/bin/python3
+  args:
+    chdir: "{{ mod_wsgi_unarchive_dir }}"
+    creates: "{{ mod_wsgi_unarchive_dir }}/Makefile"
+  become: yes
+
+- name: make mod_wsgi
+  command: make
+  args:
+    chdir: "{{ mod_wsgi_unarchive_dir }}"
+    creates: "{{ mod_wsgi_unarchive_dir }}/src/server/mod_wsgi.la"
+  become: yes
+
+- name: make install mod_wsgi
+  command: make install
+  args:
+    chdir: "{{ mod_wsgi_unarchive_dir }}"
+  become: yes
+
+- name: Copy mod_wsgi config file
+  copy:
+    src: 00-wsgi.conf
+    dest: "{{ httpd_conf_modules_dir }}/00-wsgi.conf"
+  become: yes
+
+# Allow httpd to copy file attributes when handling uploaded files and moving
+# them from temporary to final destination (which may cross partitions)
+- name: double check policycoreutils installed
+  yum: name=policycoreutils-python state=installed
+  become: yes
+
+- name: Copy SELinux type enforcement file
+  copy: src=django-httpd.te dest=/tmp/
+
+- name: Compile SELinux module file
+  command: checkmodule -M -m -o /tmp/django-httpd.mod /tmp/django-httpd.te
+
+- name: Build SELinux policy package
+  command: semodule_package -o /tmp/django-httpd.pp -m /tmp/django-httpd.mod
+
+- name: unLoad SELinux policy package
+  command: semodule -r django-httpd
+  become: yes
+  ignore_errors: True
+
+- name: Load SELinux policy package
+  command: semodule -i /tmp/django-httpd.pp
+  become: yes
+
+- name: Remove temporary files
+  file: path={{ item }} state=absent
+  with_items:
+    - /tmp/django-httpd.mod
+    - /tmp/django-httpd.pp
+    - /tmp/django-httpd.te
+
+...
diff --git a/dev-tools/ansible/roles/helix_setup/defaults/main.yml b/dev-tools/ansible/roles/helix_setup/defaults/main.yml
index 83b5902..ee7e409 100644
--- a/dev-tools/ansible/roles/helix_setup/defaults/main.yml
+++ b/dev-tools/ansible/roles/helix_setup/defaults/main.yml
@@ -50,4 +50,9 @@
 
 kafka_listener_port: 9092
 kafka_rest_proxy_listener_port: 8082
+
+local_data_location: "/tmp"
+
+thrift_client_pool_abandoned_removal_enabled: false
+thrift_client_pool_abandoned_removal_logged: false
 ...
diff --git a/dev-tools/ansible/roles/helix_setup/templates/parser-wm/airavata-server.properties.j2 b/dev-tools/ansible/roles/helix_setup/templates/parser-wm/airavata-server.properties.j2
index 9b7de96..afb4a5d 100644
--- a/dev-tools/ansible/roles/helix_setup/templates/parser-wm/airavata-server.properties.j2
+++ b/dev-tools/ansible/roles/helix_setup/templates/parser-wm/airavata-server.properties.j2
@@ -58,3 +58,10 @@
 kafka.parser.topic={{ parser_broker_topic }}
 parser.storage.resource.id={{ parser_storage_resource_id }}
 kafka.parsing.broker.publisher.id={{ parser_broker_publisher_id }}
+post.workflow.manager.loadbalance.clusters=False
+
+###########################################################################
+# ThriftClientPool Configuration
+###########################################################################
+thrift.client.pool.abandoned.removal.enabled={{ thrift_client_pool_abandoned_removal_enabled }}
+thrift.client.pool.abandoned.removal.logged={{ thrift_client_pool_abandoned_removal_logged }}
diff --git a/dev-tools/ansible/roles/helix_setup/templates/participant/airavata-server.properties.j2 b/dev-tools/ansible/roles/helix_setup/templates/participant/airavata-server.properties.j2
index 639b7f8..5f842b5 100644
--- a/dev-tools/ansible/roles/helix_setup/templates/participant/airavata-server.properties.j2
+++ b/dev-tools/ansible/roles/helix_setup/templates/participant/airavata-server.properties.j2
@@ -27,6 +27,7 @@
 ###########################################################################
 credential.store.server.host={{ cred_store_server_host }}
 credential.store.server.port={{ cred_store_port }}
+security.manager.class=org.apache.airavata.service.security.KeyCloakSecurityManager
 
 ###########################################################################
 # Profile Server Configuration
@@ -80,4 +81,29 @@
 ###########################################################################
 # Job Submission Task Level Configurations
 ###########################################################################
-enable.realtime.monitor=False
\ No newline at end of file
+enable.realtime.monitor=true
+
+local.data.location={{ local_data_location }}
+
+###########################################################################
+# Data Parsing Task Level Configurations
+###########################################################################
+data.parser.delete.container=True
+
+###########################################################################
+# Data Staging Task Level Configurations
+###########################################################################
+enable.streaming.transfer=False
+
+###########################################################################
+# ThriftClientPool Configuration
+###########################################################################
+thrift.client.pool.abandoned.removal.enabled={{ thrift_client_pool_abandoned_removal_enabled }}
+thrift.client.pool.abandoned.removal.logged={{ thrift_client_pool_abandoned_removal_logged }}
+
+###########################################################################
+# Usage Reporting Configuration
+###########################################################################
+
+usage.reporting.key={{ usage_reporting_key }}
+usage.reporting.endpoint=https://xsede-xdcdb-api.xsede.org/gateway/v2/job_attributes
\ No newline at end of file
diff --git a/dev-tools/ansible/roles/helix_setup/templates/post-wm/airavata-server.properties.j2 b/dev-tools/ansible/roles/helix_setup/templates/post-wm/airavata-server.properties.j2
index 259e52c..33cb199 100644
--- a/dev-tools/ansible/roles/helix_setup/templates/post-wm/airavata-server.properties.j2
+++ b/dev-tools/ansible/roles/helix_setup/templates/post-wm/airavata-server.properties.j2
@@ -52,4 +52,10 @@
 # Zookeeper Server Configuration
 ###########################################################################
 zookeeper.server.connection={{ zookeeper_connection_url }}
-zookeeper.timeout=30000
\ No newline at end of file
+zookeeper.timeout=30000
+
+###########################################################################
+# ThriftClientPool Configuration
+###########################################################################
+thrift.client.pool.abandoned.removal.enabled={{ thrift_client_pool_abandoned_removal_enabled }}
+thrift.client.pool.abandoned.removal.logged={{ thrift_client_pool_abandoned_removal_logged }}
diff --git a/dev-tools/ansible/roles/helix_setup/templates/pre-wm/airavata-server.properties.j2 b/dev-tools/ansible/roles/helix_setup/templates/pre-wm/airavata-server.properties.j2
index cabede9..e854e8c 100644
--- a/dev-tools/ansible/roles/helix_setup/templates/pre-wm/airavata-server.properties.j2
+++ b/dev-tools/ansible/roles/helix_setup/templates/pre-wm/airavata-server.properties.j2
@@ -49,4 +49,10 @@
 # Zookeeper Server Configuration
 ###########################################################################
 zookeeper.server.connection={{ zookeeper_connection_url }}
-zookeeper.timeout=30000
\ No newline at end of file
+zookeeper.timeout=30000
+
+###########################################################################
+# ThriftClientPool Configuration
+###########################################################################
+thrift.client.pool.abandoned.removal.enabled={{ thrift_client_pool_abandoned_removal_enabled }}
+thrift.client.pool.abandoned.removal.logged={{ thrift_client_pool_abandoned_removal_logged }}
diff --git a/dev-tools/ansible/roles/httpd/defaults/main.yml b/dev-tools/ansible/roles/httpd/defaults/main.yml
index 77b94ad..1317100 100644
--- a/dev-tools/ansible/roles/httpd/defaults/main.yml
+++ b/dev-tools/ansible/roles/httpd/defaults/main.yml
@@ -19,19 +19,43 @@
 #
 
 ---
+doc_root_dir: "/var/www/{{ gateway_id }}"
+user_data_dir: "/var/www/user_data"
+# real_user_data_dir is the same as user_data_dir but without symbolic links in it
+real_user_data_dir: "{{ user_data_dir }}"
 httpd_default_conf_file_location:
- RedHat: "/etc/httpd/conf.d/default.conf"
- Debian: "/etc/apache2/sites-available/default.conf"
+ RedHat: "/etc/httpd/conf.d/000-default.conf"
+ Debian: "/etc/apache2/sites-available/000-default.conf"
 httpd_ssl_conf_file_location:
  RedHat: "/etc/httpd/conf.d/ssl.conf"
  # TODO: Debian file layout is different, so we really need a different ssl.conf for Debian
  Debian: "/etc/apache2/mods-available/ssl.conf"
+httpd_default_ssl_vhost_certificate_dir:
+ RedHat: "/etc/httpd/ssl"
+ Debian: "/etc/apache2/ssl"
+httpd_default_ssl_vhost_certificate_location:
+ RedHat: "/etc/httpd/ssl/default_vhost.crt"
+ Debian: "/etc/apache2/ssl/default_vhost.crt"
+httpd_default_ssl_vhost_certificate_key_dir:
+ RedHat: "/etc/httpd/ssl/private"
+ Debian: "/etc/apache2/ssl/private"
+httpd_default_ssl_vhost_certificate_key_location:
+ RedHat: "/etc/httpd/ssl/private/default_vhost.key"
+ Debian: "/etc/apache2/ssl/private/default_vhost.key"
+httpd_name:
+ Debian: apache2
+ RedHat: httpd
 
 httpd_default_conf_template: "default.conf.j2"
 httpd_ssl_conf_template: "ssl.conf.j2"
 
-gateway_data_store_ssh_public_key: ""
-
 httpd_default_http_port: 80
 httpd_default_https_port: 443
+
+# httpd_selinux_mode allowed values:
+# - disabled
+# - enforcing
+# - permissive
+# https://docs.ansible.com/ansible/latest/modules/selinux_module.html#parameter-state
+httpd_selinux_mode: "enforcing"
 ...
diff --git a/dev-tools/ansible/roles/httpd/handlers/main.yml b/dev-tools/ansible/roles/httpd/handlers/main.yml
index af37327..e5bfb0a 100644
--- a/dev-tools/ansible/roles/httpd/handlers/main.yml
+++ b/dev-tools/ansible/roles/httpd/handlers/main.yml
@@ -23,4 +23,4 @@
 # Gracefully reload httpd
 - name: restart httpd
   service: name={{ httpd_name[ansible_os_family] }} state=reloaded enabled=yes
-  become: yes
\ No newline at end of file
+  become: yes
diff --git a/dev-tools/ansible/roles/httpd/tasks/install_deps_CentOS_7.yml b/dev-tools/ansible/roles/httpd/tasks/install_deps_CentOS_7.yml
new file mode 100644
index 0000000..bc3dd91
--- /dev/null
+++ b/dev-tools/ansible/roles/httpd/tasks/install_deps_CentOS_7.yml
@@ -0,0 +1,35 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+- name: Install pre-requisites
+  yum: name="{{ item }}" state=latest update_cache=yes
+  with_items:
+    - git
+    - httpd
+    - mod_ssl
+    - libselinux-python
+    - policycoreutils-python
+  become: yes
+
+- name: install epel release
+  yum: name=epel-release state=present
+  become: yes
diff --git a/dev-tools/ansible/roles/httpd/tasks/install_deps_Ubuntu_16.yml b/dev-tools/ansible/roles/httpd/tasks/install_deps_Ubuntu_16.yml
new file mode 100644
index 0000000..7ceabda
--- /dev/null
+++ b/dev-tools/ansible/roles/httpd/tasks/install_deps_Ubuntu_16.yml
@@ -0,0 +1,64 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+- name: Install prerequisites
+  apt: name="{{ item }}" state=latest update_cache=yes
+  with_items:
+    - git
+    - apache2
+    - python-selinux
+    - python-apt
+    - unzip
+    - openssl
+    - curl
+    - python-software-properties
+  become: yes
+
+- name: get python2-firewalld module...
+  unarchive:
+    src: https://github.com/hryamzik/python-firewalld/files/182007/python-firewalld_0.1-0.deb.zip
+    dest: /tmp/
+    remote_src: true
+
+- name: install python-firewalld
+  apt: 
+   deb: /tmp/python-firewalld_0.1-0.deb
+#https://github.com/hryamzik/python-firewalld/files/182007/python-firewalld_0.1-0.deb.zip
+
+- name: enable apache rewrite
+  command: a2enmod rewrite
+  become: yes
+
+- name: create apache2 logdir
+  file:
+    path: /etc/apache2/logs
+    state: directory
+    owner: www-data
+    group: www-data
+    mode: 0775
+   
+- name: set DocumentRoot in default site-enabled
+  lineinfile: 
+    dest: /etc/apache2/sites-enabled/000-default.conf
+    line: '	DocumentRoot "/var/www/html/php-gateway/public"'
+    regexp: '^\s+DocumentRoot'
+    state: present
diff --git a/dev-tools/ansible/roles/httpd/tasks/main.yml b/dev-tools/ansible/roles/httpd/tasks/main.yml
index 469c105..eb9b406 100644
--- a/dev-tools/ansible/roles/httpd/tasks/main.yml
+++ b/dev-tools/ansible/roles/httpd/tasks/main.yml
@@ -1,10 +1,12 @@
 
 # SELinux configuration
 - name: set selinux to enforcing
-  selinux: state=enforcing policy=targeted
+  selinux: state={{ httpd_selinux_mode }} policy=targeted
   become: yes
   when: ansible_os_family == "RedHat"
 
+- include: install_deps_{{ ansible_distribution }}_{{ ansible_distribution_major_version }}.yml
+
 - name: allow httpd to connect out to the network
   seboolean:
     name: httpd_can_network_connect
@@ -15,6 +17,29 @@
     - restart httpd
   when: ansible_os_family == "RedHat"
 
+- name: Create directory for default ssl vhost certificate public cert
+  file: path="{{ httpd_default_ssl_vhost_certificate_dir[ansible_os_family] }}" state=directory owner="root" group="root" mode="755"
+  become: yes
+
+- name: Create directory for default ssl vhost certificate private key
+  file: path="{{ httpd_default_ssl_vhost_certificate_key_dir[ansible_os_family] }}" state=directory owner="root" group="root" mode="700"
+  become: yes
+
+- name: check default ssl vhost certificate for expiration in next 90 days (7776000s = 90d)
+  command: openssl x509 -checkend 7776000 -noout -in {{ httpd_default_ssl_vhost_certificate_location[ansible_os_family]}}
+  become: yes
+  register: default_vhost_ssl_cert_check
+  ignore_errors: yes
+
+- name: create default ssl vhost certificate
+  command: openssl req -x509 -sha256 -newkey rsa:2048 -keyout {{ httpd_default_ssl_vhost_certificate_key_location[ansible_os_family]}} -out {{ httpd_default_ssl_vhost_certificate_location[ansible_os_family]}} -days 1024 -nodes -subj '/CN={{ ansible_host }}'
+  become: yes
+  when: default_vhost_ssl_cert_check|failed
+
+- name: Change permissions for default ssl vhost certificate private key
+  file: path="{{ httpd_default_ssl_vhost_certificate_key_location[ansible_os_family] }}" state=file owner="root" group="root" mode="600"
+  become: yes
+
 - name: copy default virtual host file
   template: src={{ httpd_default_conf_template }} dest={{ httpd_default_conf_file_location[ansible_os_family] }} backup=yes
   become: yes
@@ -34,10 +59,10 @@
   file: path="{{ real_user_data_dir }}" state=directory owner="{{user}}" group="{{group}}"
   become: yes
 
-- name: Symlink user data dir {{ user_data_dir }} to {{ real_user_data_dir }}
-  file: src="{{ real_user_data_dir }}" dest="{{ user_data_dir }}" state=link owner="{{user}}" group="{{group}}"
-  become: yes
-  when: user_data_dir != real_user_data_dir
+#- name: Symlink user data dir {{ user_data_dir }} to {{ real_user_data_dir }}
+#  file: src="{{ real_user_data_dir }}" dest="{{ user_data_dir }}" state=link owner="{{user}}" group="{{group}}"
+#  become: yes
+#  when: user_data_dir != real_user_data_dir
 
 - name: set selinux context to allow read/write on the user data directory
   sefcontext:
@@ -55,13 +80,6 @@
   become: yes
   when: ansible_os_family == "RedHat"
 
-- name: copy pga user's SSH key for the gateway data store
-  authorized_key:
-    user: "{{user}}"
-    key: "{{ gateway_data_store_ssh_public_key }}"
-  become: yes
-  when: gateway_data_store_ssh_public_key != ""
-
 # Firewall settings
 - name: Enable https and http service on public zone
   firewalld: service="{{ item }}" permanent=true state=enabled zone=public immediate=True
diff --git a/dev-tools/ansible/roles/httpd/templates/default.conf.j2 b/dev-tools/ansible/roles/httpd/templates/default.conf.j2
index 6791fb0..1bf550d 100644
--- a/dev-tools/ansible/roles/httpd/templates/default.conf.j2
+++ b/dev-tools/ansible/roles/httpd/templates/default.conf.j2
@@ -1,5 +1,11 @@
 # Setup default virtual host as a catchall to prevent resolving to the first defined virtual host
 # This will show the welcome page when requesting on the ip address or server default hostname
-<VirtualHost _default_:{{ httpd_default_http_port }}>
+<VirtualHost *:{{ httpd_default_http_port }}>
     DocumentRoot "/www/default"
 </VirtualHost>
+<VirtualHost *:{{ httpd_default_https_port }}>
+    DocumentRoot "/www/default"
+    SSLEngine on
+    SSLCertificateFile "{{ httpd_default_ssl_vhost_certificate_location[ansible_os_family] }}"
+    SSLCertificateKeyFile "{{ httpd_default_ssl_vhost_certificate_key_location[ansible_os_family] }}"
+</VirtualHost>
diff --git a/dev-tools/ansible/roles/java/tasks/main.yml b/dev-tools/ansible/roles/java/tasks/main.yml
index e49d32f..bc04add 100644
--- a/dev-tools/ansible/roles/java/tasks/main.yml
+++ b/dev-tools/ansible/roles/java/tasks/main.yml
@@ -19,35 +19,20 @@
 #
 
 ---
-- name: Check if oracle java 8 rpm already downloaded
-  stat:
-    path: "{{ java_dir_source }}/{{ java_rpm_filename }}"
-  register: rpm_stat_result
+- name: Install OpenJDK 11
+  yum: name=java-11-openjdk-devel state=latest update_cache=yes
+  become: yes
   tags:
     - always
 
-# Install Oracle Java
-- name: download oracle java 8 rpm
-  get_url: url="{{ java_rpm_url }}" dest="{{ java_dir_source }}" headers='Cookie:oraclelicense=accept-securebackup-cookie'
-  become: yes
-  tags:
-       - always
-  when: not rpm_stat_result.stat.exists
-
-- name: Install oracle java 8
-  yum: name="{{ java_dir_source }}/{{ java_rpm_filename }}" state=present
-  become: yes
-  tags:
-       - always
-
-- name: set Oracle Java {{ java_version_string }} as default
+- name: set {{ java_home }} as default
   alternatives:
     name="{{ item.exe }}"
     link="/usr/bin/{{ item.exe }}"
     path="{{ item.path }}/{{ item.exe }}"
   with_items:
-    - { path: "{{ java_home }}/jre/bin", exe: 'java' }
-    - { path: "{{ java_home }}/jre/bin", exe: 'keytool' }
+    - { path: "{{ java_home }}/bin", exe: 'java' }
+    - { path: "{{ java_home }}/bin", exe: 'keytool' }
     - { path: "{{ java_home }}/bin", exe: 'javac' }
     - { path: "{{ java_home }}/bin", exe: 'javadoc' }
   become: yes
diff --git a/dev-tools/ansible/roles/java/vars/main.yml b/dev-tools/ansible/roles/java/vars/main.yml
index 10026c3..62152d1 100644
--- a/dev-tools/ansible/roles/java/vars/main.yml
+++ b/dev-tools/ansible/roles/java/vars/main.yml
@@ -20,18 +20,6 @@
 
 ---
 #Variables associated with this role
-# Oracle Java 8
-java_dir_source: "/usr/local/src"
 
-java_version: 8
-java_version_update: 131
-java_version_build: '11'
-java_version_string: "1.{{ java_version }}.0_{{ java_version_update }}"
-java_home: "/usr/java/jdk1.{{ java_version }}.0_{{ java_version_update }}"
-
-java_rpm_filename: "jdk-{{ java_version }}u{{ java_version_update }}-linux-x64.rpm"
-#java_rpm_url: "http://download.oracle.com/otn/java/jdk/{{ java_version }}u{{ java_version_update }}-b{{ java_version_build }}/{{ java_rpm_filename }}"
-# Format of URL changed, just hardcoding it here
-java_rpm_url: "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm"
-
+java_home: "/usr/lib/jvm/java-11"
 ...
diff --git a/dev-tools/ansible/roles/job_monitor/defaults/main.yml b/dev-tools/ansible/roles/job_monitor/defaults/main.yml
index 45a6a22..9aa419c 100644
--- a/dev-tools/ansible/roles/job_monitor/defaults/main.yml
+++ b/dev-tools/ansible/roles/job_monitor/defaults/main.yml
@@ -45,4 +45,7 @@
 
 helix_log_max_history: 30
 helix_log_total_size_cap: "1GB"
+
+thrift_client_pool_abandoned_removal_enabled: false
+thrift_client_pool_abandoned_removal_logged: false
 ...
diff --git a/dev-tools/ansible/roles/job_monitor/templates/email-monitor/airavata-server.properties.j2 b/dev-tools/ansible/roles/job_monitor/templates/email-monitor/airavata-server.properties.j2
index 1e2c85d..99eef24 100644
--- a/dev-tools/ansible/roles/job_monitor/templates/email-monitor/airavata-server.properties.j2
+++ b/dev-tools/ansible/roles/job_monitor/templates/email-monitor/airavata-server.properties.j2
@@ -39,4 +39,10 @@
 #  Registry Server Configurations
 ###########################################################################
 regserver.server.host={{ registry_host }}
-regserver.server.port={{ registry_port }}
\ No newline at end of file
+regserver.server.port={{ registry_port }}
+
+###########################################################################
+# ThriftClientPool Configuration
+###########################################################################
+thrift.client.pool.abandoned.removal.enabled={{ thrift_client_pool_abandoned_removal_enabled }}
+thrift.client.pool.abandoned.removal.logged={{ thrift_client_pool_abandoned_removal_logged }}
diff --git a/dev-tools/ansible/roles/job_monitor/templates/email-monitor/email-config.yaml.j2 b/dev-tools/ansible/roles/job_monitor/templates/email-monitor/email-config.yaml.j2
index 4bbdfb4..2c82597 100644
--- a/dev-tools/ansible/roles/job_monitor/templates/email-monitor/email-config.yaml.j2
+++ b/dev-tools/ansible/roles/job_monitor/templates/email-monitor/email-config.yaml.j2
@@ -73,6 +73,8 @@
        - slurm@thunder.jacks.local #RT at SDSU
        - Slurm on Mio <slurm@mio.mines.edu> # MIO from Mines
        - SLURM resource manager <slurm@helix-slurm-headnode.novalocal> # Jetstream Helix cluster
+       - SLURM resource manager <slurm@pearc19-headnode.novalocal>
+       - slurm@sdsc.edu
 
    - jobManagerType: UGE
      emailParser: org.apache.airavata.monitor.email.parser.UGEEmailParser
@@ -87,4 +89,4 @@
      emailParser: org.apache.airavata.monitor.email.parser.LSFEmailParser
      resourceEmailAddresses:
        - iu.xsede.edu # test resource mail address
-       - tcs.tulsahpc.org #Tandy
\ No newline at end of file
+       - tcs.tulsahpc.org #Tandy
diff --git a/dev-tools/ansible/roles/kafka/defaults/main.yml b/dev-tools/ansible/roles/kafka/defaults/main.yml
index c2ae8b9..c7752d8 100644
--- a/dev-tools/ansible/roles/kafka/defaults/main.yml
+++ b/dev-tools/ansible/roles/kafka/defaults/main.yml
@@ -21,8 +21,8 @@
 ---
 
 #Variables associated with this role
-kafka_package_name: "confluent-4.1.0"
-kafka_tgz_url: "http://packages.confluent.io/archive/4.1/confluent-oss-4.1.0-2.11.tar.gz"
+kafka_package_name: "confluent-5.3.1"
+kafka_tgz_url: "http://packages.confluent.io/archive/5.3/confluent-5.3.1-2.12.zip"
 kafka_dir: "{{ deployment_dir }}/{{ kafka_package_name }}"
 
 # Kafka related variables
diff --git a/dev-tools/ansible/roles/kafka/tasks/main.yml b/dev-tools/ansible/roles/kafka/tasks/main.yml
index c245eb5..f758b6f 100644
--- a/dev-tools/ansible/roles/kafka/tasks/main.yml
+++ b/dev-tools/ansible/roles/kafka/tasks/main.yml
@@ -60,7 +60,7 @@
   become: yes
 
 # Config rest proxy and start
-- name: Copy kafka server properties file
+- name: Copy kafka rest proxy properties file
   template: src=kafka-rest.properties.j2
             dest="{{ kafka_dir }}/etc/kafka-rest/kafka-rest.properties"
             owner={{ user }}
diff --git a/dev-tools/ansible/roles/kafka/templates/kafka-rest.properties.j2 b/dev-tools/ansible/roles/kafka/templates/kafka-rest.properties.j2
index d30c991..9f8d89a 100644
--- a/dev-tools/ansible/roles/kafka/templates/kafka-rest.properties.j2
+++ b/dev-tools/ansible/roles/kafka/templates/kafka-rest.properties.j2
@@ -1,18 +1,17 @@
-##
-# Copyright 2015 Confluent Inc.
 #
-# 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
+# Copyright 2018 Confluent Inc.
 #
-# http://www.apache.org/licenses/LICENSE-2.0
+# Licensed under the Confluent Community License (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.confluent.io/confluent-community-license
 #
 # 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.
-##
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
 
 #id=kafka-rest-test-server
 #schema.registry.url=http://localhost:8081
diff --git a/dev-tools/ansible/roles/kafka/templates/server.properties.j2 b/dev-tools/ansible/roles/kafka/templates/server.properties.j2
index 729630a..ae27bb4 100644
--- a/dev-tools/ansible/roles/kafka/templates/server.properties.j2
+++ b/dev-tools/ansible/roles/kafka/templates/server.properties.j2
@@ -1,22 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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.
-#
+# 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.
+
+# see kafka.server.KafkaConfig for additional details and defaults
 
 ############################# Server Basics #############################
 
@@ -128,6 +125,40 @@
 # Timeout in ms for connecting to zookeeper
 zookeeper.connection.timeout.ms=6000
 
+##################### Confluent Metrics Reporter #######################
+# Confluent Control Center and Confluent Auto Data Balancer integration
+#
+# Uncomment the following lines to publish monitoring data for
+# Confluent Control Center and Confluent Auto Data Balancer
+# If you are using a dedicated metrics cluster, also adjust the settings
+# to point to your metrics kakfa cluster.
+#metric.reporters=io.confluent.metrics.reporter.ConfluentMetricsReporter
+#confluent.metrics.reporter.bootstrap.servers=localhost:9092
+#
+# Uncomment the following line if the metrics cluster has a single broker
+#confluent.metrics.reporter.topic.replicas=1
+
+##################### Confluent Proactive Support ######################
+# If set to true, and confluent-support-metrics package is installed
+# then the feature to collect and report support metrics
+# ("Metrics") is enabled.  If set to false, the feature is disabled.
+#
+confluent.support.metrics.enable=true
+
+
+# The customer ID under which support metrics will be collected and
+# reported.
+#
+# When the customer ID is set to "anonymous" (the default), then only a
+# reduced set of metrics is being collected and reported.
+#
+# Confluent customers
+# -------------------
+# If you are a Confluent customer, then you should replace the default
+# value with your actual Confluent customer ID.  Doing so will ensure
+# that additional support metrics will be collected and reported.
+#
+confluent.support.customer.id=anonymous
 
 ############################# Group Coordinator Settings #############################
 
@@ -136,4 +167,29 @@
 # The default value for this is 3 seconds.
 # We override this to 0 here as it makes for a better out-of-the-box experience for development and testing.
 # However, in production environments the default value of 3 seconds is more suitable as this will help to avoid unnecessary, and potentially expensive, rebalances during application startup.
-group.initial.rebalance.delay.ms={{ grp_initial_rebalance_delay }}
\ No newline at end of file
+group.initial.rebalance.delay.ms={{ grp_initial_rebalance_delay }}
+
+
+############################# Confluent Authorizer Settings  #############################
+
+# Uncomment to enable Confluent Authorizer with support for ACLs, LDAP groups and RBAC
+#authorizer.class.name=io.confluent.kafka.security.authorizer.ConfluentServerAuthorizer
+# Semi-colon separated list of super users in the format <principalType>:<principalName>
+#super.users=
+# Specify a valid Confluent license. By default free-tier license will be used
+#confluent.license=
+# Replication factor for the topic used for licensing. Default is 3.
+confluent.license.topic.replication.factor=1
+
+# Uncomment the following lines and specify values where required to enable RBAC
+# Enable RBAC provider
+#confluent.authorizer.access.rule.providers=ACL,RBAC
+# Bootstrap servers for RBAC metadata. Must be provided if this broker is not in the metadata cluster
+#confluent.metadata.bootstrap.servers=PLAINTEXT://127.0.0.1:9092
+# Replication factor for the metadata topic used for authorization. Default is 3.
+confluent.metadata.topic.replication.factor=1
+
+# Listeners for metadata server
+#confluent.metadata.server.listeners=http://0.0.0.0:8090
+# Advertised listeners for metadata server
+#confluent.metadata.server.advertised.listeners=http://127.0.0.1:8090
diff --git a/dev-tools/ansible/roles/keycloak/README.md b/dev-tools/ansible/roles/keycloak/README.md
index f6f95d9..42f6bd9 100644
--- a/dev-tools/ansible/roles/keycloak/README.md
+++ b/dev-tools/ansible/roles/keycloak/README.md
@@ -6,9 +6,7 @@
 
 ###Running instructions:
 
-1. Make sure SSL certificates and keystore files are present in roles/keycloak/files directory
-2. Make sure all the variables are configured correctly
-3. Dont use the Database role, rather set up the VM with default version provided by centos, tested with MySql 5.6 & MariaDB 5.5.52), Ansible role for the same is coming soon.
-4. Ensure the host file: `inventories/airavata-iam/hosts` has correct IP address
-4. For Standalone mode deployment : `ansible-playbook -i inventories/airavata-iam airavata-iam-setup.yml -t "standalone"`
-5. For HaCluster mode deployment : `ansible-playbook -i inventories/airavata-iam airavata-iam-setup.yml -t "hacluster"`
\ No newline at end of file
+1. Make sure all the variables are configured correctly
+2. Dont use the Database role, rather set up the VM with default version provided by centos, tested with MySql 5.6 & MariaDB 5.5.52), Ansible role for the same is coming soon.
+3. Ensure the host file: `inventories/airavata-iam/hosts` has correct IP address
+4. For Standalone mode deployment : `ansible-playbook -i inventories/airavata-iam keycloak.yml`
diff --git a/dev-tools/ansible/roles/keycloak/defaults/main.yml b/dev-tools/ansible/roles/keycloak/defaults/main.yml
index a55be33..d94bfe7 100644
--- a/dev-tools/ansible/roles/keycloak/defaults/main.yml
+++ b/dev-tools/ansible/roles/keycloak/defaults/main.yml
@@ -23,13 +23,13 @@
 keycloak_downlaod_url: "https://downloads.jboss.org/keycloak/{{keycloak_version}}/keycloak-{{keycloak_version}}.tar.gz"
 keycloak_install_dir: "keycloak-{{keycloak_version}}"
 keycloak_db_connector_name: "mysql-connector-java-5.1.41"
-keycloak_ssl_keystore_file: "keycloak.jks"
-keycloak_ssl_keystore_file_name: "keycloak.jks"
-keycloak_ssl_keystore_password: "Airavata"
+# keycloak_ssl_keystore_file: "keycloak.jks"
+# keycloak_ssl_keystore_file_name: "keycloak.jks"
+# keycloak_ssl_keystore_password: "Airavata"
 mysql_db_connector_download_url: "https://dev.mysql.com/get/Downloads/Connector-J/{{keycloak_db_connector_name}}.tar.gz"
 keycloak_master_account_username: "username"
 keycloak_master_account_password: "password"
-keycloak_server_port: "443"
+# keycloak_server_port: "443"
 
 keycloak_db_host: "localhost"
 keycloak_db_port: "3306"
@@ -38,4 +38,9 @@
 keycloak_db_username: "username"
 keycloak_db_password: "password"
 keycloak_db_pool_size: "20"
-...
\ No newline at end of file
+
+keycloak_vhost_servername: "changeme.org"
+keycloak_ssl_certificate_file: "/etc/letsencrypt/live/{{ keycloak_vhost_servername }}/cert.pem"
+keycloak_ssl_certificate_chain_file: "/etc/letsencrypt/live/{{ keycloak_vhost_servername }}/fullchain.pem"
+keycloak_ssl_certificate_key_file: "/etc/letsencrypt/live/{{ keycloak_vhost_servername }}/privkey.pem"
+...
diff --git a/dev-tools/ansible/roles/keycloak/files/README.md b/dev-tools/ansible/roles/keycloak/files/README.md
deleted file mode 100644
index 6463636..0000000
--- a/dev-tools/ansible/roles/keycloak/files/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-## Generating Keystore for SSL certificates
-
-**Note:** will only work on Mac and Linux
-
-### Files Needed:
-1. SSL certificate for the domain (ex: .cer or .crt or .pem)
-2. Private key used to acquire that SSL Certificate, i.e. key used to create certificate request (.key).
-
-### Process:
-1. Place both file in airavata/dev-tools/roles/keycloak/files
-2. The first step is to convert them into a single PKCS12 file using the following command, You will be asked for various passwords (the password to access the key (if set) and then the password for the PKCS12 file being created): 
-``` 
-openssl pkcs12 -export -in host.crt -inkey host.key > host.p12
-```
-3. Then import the PKCS12 file into a keystore using the command: 
-``` 
-keytool -importkeystore -srckeystore host.p12 -destkeystore keycloak.jks -srcstoretype pkcs12 
-```
-
-###Sample output:
-```$shell
-$ openssl pkcs12 -export -in host.crt -inkey host.key > host.p12
-Enter pass phrase for host.key:
-Enter Export Password:
-Verifying - Enter Export Password:
-```
-```
-$ keytool -importkeystore -srckeystore host.p12 -destkeystore host.jks
--srcstoretype pkcs12
-Enter destination keystore password:  
-Re-enter new password: 
-Enter source keystore password:  
-Entry for alias 1 successfully imported.
-Import command completed:  1 entries successfully imported, 0 entries failed
-or cancelled
-```
\ No newline at end of file
diff --git a/dev-tools/ansible/roles/keycloak/handlers/main.yml b/dev-tools/ansible/roles/keycloak/handlers/main.yml
new file mode 100644
index 0000000..589bdab
--- /dev/null
+++ b/dev-tools/ansible/roles/keycloak/handlers/main.yml
@@ -0,0 +1,26 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+# Gracefully reload httpd
+- name: restart httpd
+  service: name=httpd state=reloaded enabled=yes
+  become: yes
diff --git a/dev-tools/ansible/roles/keycloak/tasks/main.yml b/dev-tools/ansible/roles/keycloak/tasks/main.yml
index ecab7db..44a5506 100644
--- a/dev-tools/ansible/roles/keycloak/tasks/main.yml
+++ b/dev-tools/ansible/roles/keycloak/tasks/main.yml
@@ -19,6 +19,50 @@
 #
 
 ---
+- name: Install httpd
+  yum: name="httpd" state=latest update_cache=yes
+  become: yes
+
+- name: allow httpd to proxy to Keycloak process
+  seboolean:
+    name: httpd_can_network_connect
+    state: yes
+    persistent: yes
+  become: yes
+
+- name: Enable http/s service on public zone (for certbot verification)
+  firewalld: service={{ item }} permanent=true state=enabled zone=public immediate=True
+  with_items:
+    - http
+    - https
+  become: yes
+
+# TODO: it seems like a virtual host config of some type is needed for the following to work
+- name: copy basic virtual host file so certbot can verify domain
+  template: src="basic-vhost.conf.j2" dest=/etc/httpd/conf.d/basic-vhost.conf backup=yes
+  become: yes
+
+- name: start httpd
+  service: name=httpd state=started enabled=yes
+  become: yes
+
+- name: check if SSL certificate exists
+  stat:
+    path: "{{ keycloak_ssl_certificate_file }}"
+  register: stat_ssl_cert_result
+  become: yes
+
+- name: generate certificate if it doesn't exist
+  command: certbot --apache -d {{ keycloak_vhost_servername }} certonly
+  become: yes
+  when: not stat_ssl_cert_result.stat.exists
+
+- name: Add keycloak virtual host config that proxies to the keycloak server
+  template: src="vhost.conf.j2" dest=/etc/httpd/conf.d/keycloak.conf backup=yes
+  become: yes
+  notify:
+    - restart httpd
+
 # Download keycloak distribution
 - name: Download and unarchive keycloak
   unarchive:  src="{{ keycloak_downlaod_url }}"
@@ -79,19 +123,6 @@
 
 # <---------------------------- Server Configuration -------------------------------->
 
-# Only Executed for haCluster mode (Mysql setup & without SSl configuration)
-- name: copy keycloak configuration file (HaCluster)
-  template: >
-    src=standalone-ha.xml.j2
-    dest="{{ user_home }}/{{ keycloak_install_dir }}/standalone/configuration/standalone-ha.xml"
-    owner="{{ user }}"
-    group="{{ group }}"
-    mode="u=rw,g=r,o=r"
-  become: true
-  become_user: "{{ user }}"
-  tags:
-       - hacluster
-
 # Only Executed for standalone mode (SSL Configuration & MySql)
 - name: copy keycloak configuration file (Standalone)
   template: >
@@ -105,36 +136,10 @@
   tags:
        - standalone
 
-# Copy the SSL certificate files to remote
-
-- name: copy ssl certificate files to remote
-  copy:
-    src: "{{keycloak_ssl_keystore_file}}"
-    dest: "{{ user_home }}/{{ keycloak_install_dir }}/standalone/configuration/{{keycloak_ssl_keystore_file_name}}"
-    owner: "{{ user }}"
-    group: "{{ group }}"
-    mode: 0644
-  become: true
-  become_user: "{{ user }}"
-  tags:
-        - standalone
 # </------------------------------ Server Configuration ends ---------------------------->
 
 # <---------- setup init script for keycloak, starts the server after reboot ----------->
 
-# Init script to start keycloak in HaCluster mode
-- name: copy init script file (HaCluster)
-  template: >
-    src=keycloak-hacluster-init.j2
-    dest="/etc/init.d/keycloak"
-    owner="{{ user }}"
-    group="{{ group }}"
-    mode="u=rwx,g=r,o=r"
-  become: yes
-  become_user: root
-  tags:
-       - hacluster
-
 # Init script to start keycloak in Standalone mode
 - name: copy init script file (Standalone)
   template: >
@@ -170,15 +175,6 @@
        - always
 
 
-# <--------------------------open keycloak Identity server firewall port------------------------------>
-- name: open firewall port {{ keycloak_server_port }}
-  firewalld: port="{{ keycloak_server_port }}/tcp"
-             zone=public permanent=true state=enabled immediate=yes
-  become: yes
-  become_user: root
-  tags:
-        - always
-
 # <--------------------------start keycloak Identity server------------------------------>
 - name: reload Keycloak init script
   command: systemctl daemon-reload
@@ -202,4 +198,4 @@
   become_user: root
   tags:
        - always
-...
\ No newline at end of file
+...
diff --git a/dev-tools/ansible/roles/keycloak/templates/basic-vhost.conf.j2 b/dev-tools/ansible/roles/keycloak/templates/basic-vhost.conf.j2
new file mode 100644
index 0000000..da78c4c
--- /dev/null
+++ b/dev-tools/ansible/roles/keycloak/templates/basic-vhost.conf.j2
@@ -0,0 +1,9 @@
+<VirtualHost *:80>
+    ServerName {{ groups['keycloak'][0] }}
+    DocumentRoot "/var/www/html"
+
+    <Directory /var/www/html>
+        Options -Indexes +FollowSymLinks
+        AllowOverride All
+    </Directory>
+</VirtualHost>
diff --git a/dev-tools/ansible/roles/keycloak/templates/standalone.xml.j2 b/dev-tools/ansible/roles/keycloak/templates/standalone.xml.j2
index cf4aebe..bd75c79 100644
--- a/dev-tools/ansible/roles/keycloak/templates/standalone.xml.j2
+++ b/dev-tools/ansible/roles/keycloak/templates/standalone.xml.j2
@@ -45,13 +45,6 @@
                     <properties path="application-roles.properties" relative-to="jboss.server.config.dir"/>
                 </authorization>
             </security-realm>
-	    <security-realm name="UndertowRealm">
-    		<server-identities>
-        		<ssl>
-            		<keystore path="{{keycloak_ssl_keystore_file_name}}" relative-to="jboss.server.config.dir" keystore-password="{{keycloak_ssl_keystore_password}}" />
-        		</ssl>
-    	    	</server-identities>
-	    </security-realm>
         </security-realms>
         <audit-log>
             <formatters>
@@ -377,8 +370,9 @@
         <subsystem xmlns="urn:jboss:domain:undertow:3.0">
             <buffer-cache name="default"/>
             <server name="default-server">
-                <http-listener name="default" socket-binding="http" redirect-socket="https"/>
-		<https-listener name="https" socket-binding="https" security-realm="UndertowRealm"/>
+                <http-listener name="default" socket-binding="http" redirect-socket="proxy-https" proxy-address-forwarding="true"/>
+                <!-- <http-listener name="default" socket-binding="http" redirect-socket="https"/> -->
+                <!-- <https-listener name="https" socket-binding="https" security-realm="UndertowRealm"/> -->
                 <host name="default-host" alias="localhost">
                     <location name="/" handler="welcome-content"/>
                     <filter-ref name="server-header"/>
@@ -489,7 +483,8 @@
         <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
         <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
         <socket-binding name="http" port="${jboss.http.port:8080}"/>
-        <socket-binding name="https" port="${jboss.https.port:443}"/>
+        <!-- <socket-binding name="https" port="${jboss.https.port:8443}"/> -->
+        <socket-binding name="proxy-https" port="443"/>
         <socket-binding name="txn-recovery-environment" port="4712"/>
         <socket-binding name="txn-status-manager" port="4713"/>
         <outbound-socket-binding name="mail-smtp">
diff --git a/dev-tools/ansible/roles/keycloak/templates/vhost.conf.j2 b/dev-tools/ansible/roles/keycloak/templates/vhost.conf.j2
new file mode 100644
index 0000000..4d7f40d
--- /dev/null
+++ b/dev-tools/ansible/roles/keycloak/templates/vhost.conf.j2
@@ -0,0 +1,52 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+
+<VirtualHost *:80>
+    ServerName {{ keycloak_vhost_servername }}
+    
+    ## Redirect all http traffic to https
+    RewriteEngine On
+    RewriteCond %{HTTPS} off
+    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
+</VirtualHost>
+
+<VirtualHost *:443>
+    ServerName {{ keycloak_vhost_servername }}
+
+    RequestHeader set X-Forwarded-Proto "https"
+    ProxyPass / "http://localhost:8080/"
+    ProxyPassReverse / "http://localhost:8080/"
+    ProxyPreserveHost On
+    # See https://issues.redhat.com/browse/KEYCLOAK-3067 for more info
+    LimitRequestFieldSize 32768
+
+    ErrorLog /var/log/httpd/keycloak.error.log
+    CustomLog /var/log/httpd/keycloak.requests.log combined
+
+    SSLEngine on
+    # Disable SSLv3 which is vulnerable to the POODLE attack
+    SSLProtocol All -SSLv2 -SSLv3
+    # Created cert with certbot:
+    #   certbot --apache certonly -d iamdev.scigap.org
+    SSLCertificateFile {{ keycloak_ssl_certificate_file }}
+    SSLCertificateChainFile {{ keycloak_ssl_certificate_chain_file }}
+    SSLCertificateKeyFile {{ keycloak_ssl_certificate_key_file }}
+</VirtualHost>
diff --git a/dev-tools/ansible/roles/letsencrypt/tasks/main.yml b/dev-tools/ansible/roles/letsencrypt/tasks/main.yml
new file mode 100644
index 0000000..0c46e46
--- /dev/null
+++ b/dev-tools/ansible/roles/letsencrypt/tasks/main.yml
@@ -0,0 +1,47 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+---
+
+- name: install certbot and dependencies
+  yum: name={{ item }} state=installed update_cache=yes
+  with_items:
+    - certbot
+    - python2-acme
+    - python2-certbot-apache
+  become_user: root
+
+- name: enable certbot (letsencrypt) renewal
+  systemd:
+    state: started
+    enabled: true
+    name: certbot-renew
+    daemon_reload: true
+  become: true
+  become_user: root
+
+- name: enable certbot (letsencrypt) renewal timer
+  systemd:
+    state: started
+    enabled: true
+    name: certbot-renew.timer
+    daemon_reload: true
+  become: true
+  become_user: root
diff --git a/dev-tools/ansible/roles/pga/defaults/main.yml b/dev-tools/ansible/roles/pga/defaults/main.yml
index 12317a4..96d6ee0 100644
--- a/dev-tools/ansible/roles/pga/defaults/main.yml
+++ b/dev-tools/ansible/roles/pga/defaults/main.yml
@@ -99,6 +99,8 @@
 portal_theme_repo: ""
 portal_title: "Airavata PHP Gateway"
 pga_google_analytics_id: ""
+# When pga_reroute_to_django is true, pga_airavata_django_url should also be set
+pga_reroute_to_django: false
 
 pga_default_http_port: 80
 pga_default_https_port: 443
diff --git a/dev-tools/ansible/roles/pga/tasks/main.yml b/dev-tools/ansible/roles/pga/tasks/main.yml
index 746a3b9..72f5d67 100644
--- a/dev-tools/ansible/roles/pga/tasks/main.yml
+++ b/dev-tools/ansible/roles/pga/tasks/main.yml
@@ -118,8 +118,8 @@
   file: path="{{ doc_root_dir }}/app/storage" state=directory mode=0777 owner="{{user}}" group="{{group}}" recurse=yes
   become: yes
 
-- name: Run composer update
-  composer: command=update working_dir="{{ doc_root_dir }}"
+- name: Run composer install
+  composer: command=install working_dir="{{ doc_root_dir }}"
   become: yes
   become_user: "{{user}}"
 
diff --git a/dev-tools/ansible/roles/pga/templates/pga-ssl-vhost.conf.j2 b/dev-tools/ansible/roles/pga/templates/pga-ssl-vhost.conf.j2
index 368a988..20c8f69 100644
--- a/dev-tools/ansible/roles/pga/templates/pga-ssl-vhost.conf.j2
+++ b/dev-tools/ansible/roles/pga/templates/pga-ssl-vhost.conf.j2
@@ -18,14 +18,12 @@
     ## Redirect all http traffic to https
     RewriteEngine On
     RewriteCond %{HTTPS} off
-    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
+    # Redirect to SSL domain name
+    RewriteRule (.*) https://{{ vhost_servername }}%{REQUEST_URI}
 </VirtualHost>
 
 <VirtualHost *:{{pga_default_https_port}}>
     ServerName {{ vhost_servername }}
-    {% if vhost_serveralias is defined %}
-    ServerAlias {{ vhost_serveralias }}
-    {% endif %}
 
     DocumentRoot {{ doc_root_dir }}/public
     <Directory "{{ doc_root_dir }}/public">
diff --git a/dev-tools/ansible/roles/pga/templates/pga_config.php.j2 b/dev-tools/ansible/roles/pga/templates/pga_config.php.j2
index 7d102ff..76679f6 100644
--- a/dev-tools/ansible/roles/pga/templates/pga_config.php.j2
+++ b/dev-tools/ansible/roles/pga/templates/pga_config.php.j2
@@ -97,7 +97,7 @@
         /**
          * Path to the server certificate file
          */
-        'cafile-path' => app_path() . '/resources/security/incommon_rsa_server_ca.pem',
+        //'cafile-path' => app_path() . '/resources/security/incommon_rsa_server_ca.pem',
     ],
 
 
@@ -250,6 +250,18 @@
          */
         'portal-smtp-server-port' => '587',
 
+        {% if pga_airavata_django_url is defined %}
+        /**
+         * Set the URL of the new Django portal for re-routing
+         */
+        'airavata-django-url' => "{{ pga_airavata_django_url }}",
+        {% endif %}
+
+        /**
+         * Set to true to enable reroute to the new Django portal
+         */
+        'reroute-to-django' => {{ pga_reroute_to_django | ternary("true", "false") }},
+
         /**
          * Set JIRA Issue Collector scripts here.
          */
diff --git a/modules/airavata-helix/agent-api/pom.xml b/modules/airavata-helix/agent-api/pom.xml
index 2fe9168..0a31c08 100644
--- a/modules/airavata-helix/agent-api/pom.xml
+++ b/modules/airavata-helix/agent-api/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata-helix</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -40,12 +40,12 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>registry-api-stubs</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-credential-store-stubs</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>log4j</groupId>
diff --git a/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/AgentAdaptor.java b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/AgentAdaptor.java
index 5355d5c..107b9ff 100644
--- a/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/AgentAdaptor.java
+++ b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/AgentAdaptor.java
@@ -20,6 +20,10 @@
 package org.apache.airavata.agents.api;
 
 import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
 import java.util.List;
 
 /**
@@ -40,13 +44,19 @@
 
     public void createDirectory(String path, boolean recursive) throws AgentException;
 
-    public void copyFileTo(String localFile, String remoteFile) throws AgentException;
+    public void uploadFile(String localFile, String remoteFile) throws AgentException;
 
-    public void copyFileFrom(String remoteFile, String localFile) throws AgentException;
+    public void uploadFile(InputStream localInStream, FileMetadata metadata, String remoteFile) throws AgentException;
+
+    public void downloadFile(String remoteFile, String localFile) throws AgentException;
+
+    public void downloadFile(String remoteFile, OutputStream localOutStream, FileMetadata metadata) throws AgentException;
 
     public List<String> listDirectory(String path) throws AgentException;
 
     public Boolean doesFileExist(String filePath) throws AgentException;
 
     public List<String> getFileNameFromExtension(String fileName, String parentPath) throws AgentException;
+
+    public FileMetadata getFileMetadata(String remoteFile) throws AgentException;
 }
diff --git a/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/FileMetadata.java b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/FileMetadata.java
new file mode 100644
index 0000000..e3c2b51
--- /dev/null
+++ b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/FileMetadata.java
@@ -0,0 +1,51 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.agents.api;
+
+public class FileMetadata {
+
+    private String name;
+    private long size;
+    private int permissions = 420;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public long getSize() {
+        return size;
+    }
+
+    public void setSize(long size) {
+        this.size = size;
+    }
+
+    public int getPermissions() {
+        return permissions;
+    }
+
+    public void setPermissions(int permissions) {
+        this.permissions = permissions;
+    }
+}
diff --git a/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/StorageResourceAdaptor.java b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/StorageResourceAdaptor.java
index 20fb43c..bd9404b 100644
--- a/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/StorageResourceAdaptor.java
+++ b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/api/StorageResourceAdaptor.java
@@ -19,16 +19,21 @@
  */
 package org.apache.airavata.agents.api;
 
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.List;
 
-public interface StorageResourceAdaptor {
+public interface StorageResourceAdaptor extends AgentAdaptor {
     public void init(String storageResourceId, String gatewayId, String loginUser, String token) throws AgentException;
-    public void uploadFile(String sourceFile, String destFile) throws AgentException;
-    public void downloadFile(String sourceFile, String destFile) throws AgentException;
+    public void uploadFile(String localFile, String remoteFile) throws AgentException;
+    public void uploadFile(InputStream localInStream, FileMetadata metadata, String remoteFile) throws AgentException;
+    public void downloadFile(String remoteFile, String localFile) throws AgentException;
+    public void downloadFile(String remoteFile, OutputStream localOutStream, FileMetadata metadata) throws AgentException;
     public CommandOutput executeCommand(String command, String workingDirectory) throws AgentException;
     public void createDirectory(String path) throws AgentException;
     public void createDirectory(String path, boolean recursive) throws AgentException;
     public List<String> listDirectory(String path) throws AgentException;
     public Boolean doesFileExist(String filePath) throws AgentException;
     public List<String> getFileNameFromExtension(String fileName, String parentPath) throws AgentException;
+    public FileMetadata getFileMetadata(String remoteFile) throws AgentException;
 }
diff --git a/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/TransferResult.java b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/TransferResult.java
new file mode 100644
index 0000000..d317142
--- /dev/null
+++ b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/TransferResult.java
@@ -0,0 +1,64 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.agents.streaming;
+
+public class TransferResult {
+
+    public static enum TransferStatus {
+        COMPLETED, FAILED, PAUSED
+    }
+
+    private String transferId;
+    private TransferStatus transferStatus;
+    private String message;
+    private Throwable error;
+
+    public String getTransferId() {
+        return transferId;
+    }
+
+    public void setTransferId(String transferId) {
+        this.transferId = transferId;
+    }
+
+    public TransferStatus getTransferStatus() {
+        return transferStatus;
+    }
+
+    public void setTransferStatus(TransferStatus transferStatus) {
+        this.transferStatus = transferStatus;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public Throwable getError() {
+        return error;
+    }
+
+    public void setError(Throwable error) {
+        this.error = error;
+    }
+}
diff --git a/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/VirtualInputStream.java b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/VirtualInputStream.java
new file mode 100644
index 0000000..3d49f23
--- /dev/null
+++ b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/VirtualInputStream.java
@@ -0,0 +1,82 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.agents.streaming;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+public class VirtualInputStream extends InputStream {
+
+    private BlockingQueue<Integer> queue;
+    private long byteCount;
+    private long streamLength;
+
+    public VirtualInputStream(BlockingQueue<Integer> queue, long streamLength) {
+        this.queue = queue;
+        this.streamLength = streamLength;
+    }
+
+    public int read(byte b[], int off, int len) throws IOException {
+        if (b == null) {
+            throw new NullPointerException();
+        } else if (off < 0 || len < 0 || len > b.length - off) {
+            throw new IndexOutOfBoundsException();
+        } else if (len == 0) {
+            return 0;
+        }
+
+        if (byteCount == streamLength) {
+            return -1;
+        }
+
+        int c = read();
+
+        b[off] = (byte)c;
+
+        int i = 1;
+        try {
+            for (; i < len ; i++) {
+                if (byteCount == streamLength) {
+                    break;
+                }
+                c = read();
+                b[off + i] = (byte)c;
+            }
+        } catch (IOException ee) {
+        }
+        return i;
+    }
+
+    @Override
+    public int read() throws IOException {
+        try {
+            Integer cont =  queue.poll(10, TimeUnit.SECONDS);
+            if (cont == null) {
+                throw new IOException("Timed out reading from the queue");
+            }
+            byteCount++;
+            return cont;
+        } catch (InterruptedException e) {
+            throw new IOException("Read was interrupted", e);
+        }
+    }
+}
diff --git a/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/VirtualOutputStream.java b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/VirtualOutputStream.java
new file mode 100644
index 0000000..b5d639d
--- /dev/null
+++ b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/VirtualOutputStream.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.agents.streaming;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+public class VirtualOutputStream extends OutputStream {
+
+    private BlockingQueue<Integer> queue;
+    private long byteCount;
+    private long streamLength;
+
+    public VirtualOutputStream(BlockingQueue<Integer> queue, long streamLength) {
+        this.queue = queue;
+        this.streamLength = streamLength;
+    }
+
+    @Override
+    public void write(int b) throws IOException {
+        try {
+            if (byteCount == streamLength) {
+                throw new IOException("Can not write more than the stream length " + streamLength);
+            }
+            boolean status = this.queue.offer(b, 10, TimeUnit.SECONDS);
+            if (!status) {
+                throw new IOException("Timed out writing into the queue");
+            }
+            byteCount++;
+            //System.out.println("Writing byte " + byteCount);
+        } catch (InterruptedException e) {
+            throw new IOException("Write was interrupted", e);
+        }
+    }
+}
diff --git a/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/VirtualStreamProducer.java b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/VirtualStreamProducer.java
new file mode 100644
index 0000000..c8b71ef
--- /dev/null
+++ b/modules/airavata-helix/agent-api/src/main/java/org/apache/airavata/agents/streaming/VirtualStreamProducer.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.agents.streaming;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class VirtualStreamProducer {
+
+    private InputStream inputStream;
+    private OutputStream outputStream;
+
+    public VirtualStreamProducer(int bufferSize, long streamLength) {
+        ConcurrentLinkedQueue q = new ConcurrentLinkedQueue();
+        BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(bufferSize);
+        inputStream = new VirtualInputStream(queue, streamLength);
+        outputStream = new VirtualOutputStream(queue, streamLength);
+    }
+
+    public InputStream getInputStream() {
+        return inputStream;
+    }
+
+    public void setInputStream(InputStream inputStream) {
+        this.inputStream = inputStream;
+    }
+
+    public OutputStream getOutputStream() {
+        return outputStream;
+    }
+
+    public void setOutputStream(OutputStream outputStream) {
+        this.outputStream = outputStream;
+    }
+}
diff --git a/modules/airavata-helix/agent-impl/pom.xml b/modules/airavata-helix/agent-impl/pom.xml
index cb94c9e..dc56be4 100644
--- a/modules/airavata-helix/agent-impl/pom.xml
+++ b/modules/airavata-helix/agent-impl/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata-helix</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -40,7 +40,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>agent-api</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/modules/airavata-helix/agent-impl/ssh-agent/pom.xml b/modules/airavata-helix/agent-impl/ssh-agent/pom.xml
index c232991..77f3dc8 100644
--- a/modules/airavata-helix/agent-impl/ssh-agent/pom.xml
+++ b/modules/airavata-helix/agent-impl/ssh-agent/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <artifactId>airavata-helix</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -19,7 +19,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>agent-api</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>commons-io</groupId>
diff --git a/modules/airavata-helix/agent-impl/ssh-agent/src/main/java/org/apache/airavata/helix/agent/ssh/SshAgentAdaptor.java b/modules/airavata-helix/agent-impl/ssh-agent/src/main/java/org/apache/airavata/helix/agent/ssh/SshAgentAdaptor.java
index e4cffe9..b7a6bad 100644
--- a/modules/airavata-helix/agent-impl/ssh-agent/src/main/java/org/apache/airavata/helix/agent/ssh/SshAgentAdaptor.java
+++ b/modules/airavata-helix/agent-impl/ssh-agent/src/main/java/org/apache/airavata/helix/agent/ssh/SshAgentAdaptor.java
@@ -27,6 +27,8 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.*;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
 import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
@@ -176,7 +178,7 @@
         }
     }
 
-    public void copyFileTo(String localFile, String remoteFile) throws AgentException {
+    public void uploadFile(String localFile, String remoteFile) throws AgentException {
 
         FileInputStream fis;
         boolean ptimestamp = true;
@@ -282,8 +284,13 @@
         }
     }
 
+    @Override
+    public void uploadFile(InputStream localInStream, FileMetadata metadata, String remoteFile) throws AgentException {
+        throw new AgentException("Operation not implemented");
+    }
+
     // TODO file not found does not return exception
-    public void copyFileFrom(String remoteFile, String localFile) throws AgentException {
+    public void downloadFile(String remoteFile, String localFile) throws AgentException {
         FileOutputStream fos = null;
         ChannelExec channelExec = null;
         try {
@@ -414,6 +421,11 @@
     }
 
     @Override
+    public void downloadFile(String remoteFile, OutputStream localOutStream, FileMetadata metadata) throws AgentException {
+        throw new AgentException("Operation not implemented");
+    }
+
+    @Override
     public List<String> listDirectory(String path) throws AgentException {
         String command = "ls " + path;
         ChannelExec channelExec = null;
@@ -515,6 +527,11 @@
         throw new AgentException("Operation not implemented");
     }
 
+    @Override
+    public FileMetadata getFileMetadata(String remoteFile) throws AgentException {
+        throw new AgentException("Operation not implemented");
+    }
+
     private static class DefaultUserInfo implements UserInfo, UIKeyboardInteractive {
 
         private String userName;
diff --git a/modules/airavata-helix/agent-impl/ssh-agent/src/main/java/org/apache/airavata/helix/agent/storage/StorageResourceAdaptorImpl.java b/modules/airavata-helix/agent-impl/ssh-agent/src/main/java/org/apache/airavata/helix/agent/storage/StorageResourceAdaptorImpl.java
index c36e34b..229f174 100644
--- a/modules/airavata-helix/agent-impl/ssh-agent/src/main/java/org/apache/airavata/helix/agent/storage/StorageResourceAdaptorImpl.java
+++ b/modules/airavata-helix/agent-impl/ssh-agent/src/main/java/org/apache/airavata/helix/agent/storage/StorageResourceAdaptorImpl.java
@@ -66,13 +66,13 @@
     }
 
     @Override
-    public void uploadFile(String sourceFile, String destFile) throws AgentException {
-        super.copyFileTo(sourceFile, destFile);
+    public void uploadFile(String localFile, String remoteFile) throws AgentException {
+        super.uploadFile(localFile, remoteFile);
     }
 
     @Override
-    public void downloadFile(String sourceFile, String destFile) throws AgentException {
-        super.copyFileFrom(sourceFile, destFile);
+    public void downloadFile(String remoteFile, String localFile) throws AgentException {
+        super.downloadFile(remoteFile, localFile);
     }
 
     @Override
diff --git a/modules/airavata-helix/agent-impl/sshj-agent/pom.xml b/modules/airavata-helix/agent-impl/sshj-agent/pom.xml
index 350ed94..aa689b2 100644
--- a/modules/airavata-helix/agent-impl/sshj-agent/pom.xml
+++ b/modules/airavata-helix/agent-impl/sshj-agent/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>agent-impl</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -39,7 +39,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>ssh-agent</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>com.jcraft</groupId>
diff --git a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/PoolingSSHJClient.java b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/PoolingSSHJClient.java
index 27ee4d6..d7caa29 100644
--- a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/PoolingSSHJClient.java
+++ b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/PoolingSSHJClient.java
@@ -22,7 +22,7 @@
 import net.schmizz.sshj.Config;
 import net.schmizz.sshj.SSHClient;
 import net.schmizz.sshj.common.DisconnectReason;
-import net.schmizz.sshj.connection.channel.direct.Session;
+import net.schmizz.sshj.connection.ConnectionException;
 import net.schmizz.sshj.sftp.RemoteFile;
 import net.schmizz.sshj.sftp.SFTPClient;
 import net.schmizz.sshj.transport.DisconnectListener;
@@ -32,6 +32,7 @@
 import net.schmizz.sshj.userauth.method.AuthMethod;
 import org.apache.airavata.helix.adaptor.wrapper.SCPFileTransferWrapper;
 import org.apache.airavata.helix.adaptor.wrapper.SFTPClientWrapper;
+import org.apache.airavata.helix.adaptor.wrapper.SSHClientWrapper;
 import org.apache.airavata.helix.adaptor.wrapper.SessionWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,7 +55,7 @@
     private final static Logger logger = LoggerFactory.getLogger(PoolingSSHJClient.class);
 
     private final ReadWriteLock lock = new ReentrantReadWriteLock();
-    private final Map<SSHClient, SSHClientInfo> clientInfoMap = new HashMap<>();
+    private final Map<SSHClientWrapper, SSHClientInfo> clientInfoMap = new HashMap<>();
 
     private HostKeyVerifier hostKeyVerifier;
     private String username;
@@ -96,50 +97,54 @@
 
     ////////////////// client specific operations ///////
 
-    private SSHClient leaseSSHClient() throws Exception {
+    private SSHClientWrapper newClientWithSessionValidation() throws IOException {
+        SSHClientWrapper newClient = createNewSSHClient();
+        SSHClientInfo info = new SSHClientInfo(1, System.currentTimeMillis(), clientInfoMap.size());
+        clientInfoMap.put(newClient, info);
+
+        /* if this is the very first connection that is created to the compute host, fetch the MaxSessions
+         * value form SSHD config file in order to tune the pool
+         */
+        logger.info("Fetching max sessions for the connection of " + host);
+        try (SFTPClient sftpClient = newClient.newSFTPClient()) {
+            RemoteFile remoteFile = sftpClient.open("/etc/ssh/sshd_config");
+            byte[] readContent = new byte[(int) remoteFile.length()];
+            remoteFile.read(0, readContent, 0, readContent.length);
+
+            if (logger.isTraceEnabled()) {
+                logger.trace("SSHD config file content : " + new String(readContent));
+            }
+            String[] lines = new String(readContent).split("\n");
+
+            for (String line : lines) {
+                if (line.trim().startsWith("MaxSessions")) {
+                    String[] splits = line.split(" ");
+                    if (splits.length == 2) {
+                        int sessionCount = Integer.parseInt(splits[1]);
+                        logger.info("Max session count is : " + sessionCount + " for " + host);
+                        setMaxSessionsForConnection(sessionCount);
+                    }
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            logger.warn("Failed to fetch max session count for " + host + ". Continuing with default value 1. " + e.getMessage() );
+        }
+        return newClient;
+    }
+
+    private SSHClientWrapper leaseSSHClient() throws Exception {
         lock.writeLock().lock();
 
         try {
             if (clientInfoMap.isEmpty()) {
-                SSHClient newClient = createNewSSHClient();
-                SSHClientInfo info = new SSHClientInfo(1, System.currentTimeMillis(), 0);
-                clientInfoMap.put(newClient, info);
-
-                /* if this is the very first connection that is created to the compute host, fetch the MaxSessions
-                 * value form SSHD config file in order to tune the pool
-                 */
-                logger.info("Fetching max sessions for the connection of " + host);
-                try (SFTPClient sftpClient = newClient.newSFTPClient()) {
-                    RemoteFile remoteFile = sftpClient.open("/etc/ssh/sshd_config");
-                    byte[] readContent = new byte[(int) remoteFile.length()];
-                    remoteFile.read(0, readContent, 0, readContent.length);
-
-                    if (logger.isTraceEnabled()) {
-                        logger.trace("SSHD config file content : " + new String(readContent));
-                    }
-                    String[] lines = new String(readContent).split("\n");
-
-                    for (String line : lines) {
-                        if (line.trim().startsWith("MaxSessions")) {
-                            String[] splits = line.split(" ");
-                            if (splits.length == 2) {
-                                int sessionCount = Integer.parseInt(splits[1]);
-                                logger.info("Max session count is : " + sessionCount + " for " + host);
-                                setMaxSessionsForConnection(sessionCount);
-                            }
-                            break;
-                        }
-                    }
-                } catch (Exception e) {
-                    logger.warn("Failed to fetch max session count for " + host + ". Continuing with default value 1. " + e.getMessage() );
-                }
-                return newClient;
+                return newClientWithSessionValidation();
 
             } else {
 
-                Optional<Map.Entry<SSHClient, SSHClientInfo>> minEntryOp = clientInfoMap.entrySet().stream().min(Comparator.comparing(entry -> entry.getValue().sessionCount));
+                Optional<Map.Entry<SSHClientWrapper, SSHClientInfo>> minEntryOp = clientInfoMap.entrySet().stream().min(Comparator.comparing(entry -> entry.getValue().sessionCount));
                 if (minEntryOp.isPresent()) {
-                    Map.Entry<SSHClient, SSHClientInfo> minEntry = minEntryOp.get();
+                    Map.Entry<SSHClientWrapper, SSHClientInfo> minEntry = minEntryOp.get();
                     // use the connection with least amount of sessions created.
 
                     logger.debug("Session count for selected connection {} is {}. Threshold {} for host {}",
@@ -148,17 +153,23 @@
                         // if it exceeds the maximum session count, create a new connection
                         logger.debug("Connection with least amount of sessions exceeds the threshold. So creating a new connection. " +
                                 "Current connection count {} for host {}", clientInfoMap.size(), host);
-                        SSHClient newClient = createNewSSHClient();
-                        SSHClientInfo info = new SSHClientInfo(1, System.currentTimeMillis(), clientInfoMap.size());
-                        clientInfoMap.put(newClient, info);
-                        return newClient;
+                        return newClientWithSessionValidation();
 
                     } else {
                         // otherwise reuse the same connetion
                         logger.debug("Reusing the same connection {} as it doesn't exceed the threshold for host {}", minEntry.getValue().getClientId(), host);
                         minEntry.getValue().setSessionCount(minEntry.getValue().getSessionCount() + 1);
                         minEntry.getValue().setLastAccessedTime(System.currentTimeMillis());
-                        return minEntry.getKey();
+
+                        SSHClientWrapper sshClient = minEntry.getKey();
+
+                        if (!sshClient.isConnected() || !sshClient.isAuthenticated() || !sshClient.isErrored()) {
+                            logger.warn("Client for host {} is not connected or not authenticated. Creating a new client", host);
+                            removeDisconnectedClients(sshClient, true);
+                            return newClientWithSessionValidation();
+                        } else {
+                            return sshClient;
+                        }
                     }
                 } else {
                     throw new Exception("Failed to find a connection in the pool for host " + host);
@@ -170,9 +181,18 @@
         }
     }
 
-    private void removeDisconnectedClients(SSHClient client) {
+    private void removeDisconnectedClients(SSHClientWrapper client, boolean doDisconnect) {
         lock.writeLock().lock();
 
+        if (doDisconnect) {
+            try {
+                client.disconnect();
+            } catch (Exception e) {
+                log.warn("Errored while disconnecting the client " + e.getMessage());
+                // Ignore
+            }
+        }
+
         try {
             if (clientInfoMap.containsKey(client)) {
                 logger.debug("Removing the disconnected connection {} for host {}", clientInfoMap.get(client).getClientId(), host);
@@ -184,7 +204,7 @@
         }
     }
 
-    private void untrackClosedSessions(SSHClient client, int sessionId) {
+    private void untrackClosedSessions(SSHClientWrapper client, int sessionId) {
         lock.writeLock().lock();
 
         try {
@@ -200,7 +220,7 @@
     }
 
     private void removeStaleConnections() {
-        List<Map.Entry<SSHClient, SSHClientInfo>> entriesTobeRemoved;
+        List<Map.Entry<SSHClientWrapper, SSHClientInfo>> entriesTobeRemoved;
         lock.writeLock().lock();
         logger.info("Current active connections for  {} @ {} : {} are {}", username, host, port, clientInfoMap.size());
         try {
@@ -224,20 +244,20 @@
         });
     }
 
-    private SSHClient createNewSSHClient() throws IOException {
+    private SSHClientWrapper createNewSSHClient() throws IOException {
 
-        SSHClient sshClient;
+        SSHClientWrapper sshClient;
         if (config != null) {
-            sshClient = new SSHClient(config);
+            sshClient = new SSHClientWrapper(config);
         } else {
-            sshClient = new SSHClient();
+            sshClient = new SSHClientWrapper();
         }
 
         sshClient.getConnection().getTransport().setDisconnectListener(new DisconnectListener() {
             @Override
             public void notifyDisconnect(DisconnectReason reason, String message) {
                 logger.warn("Connection disconnected " + message + " due to " + reason.name());
-                removeDisconnectedClients(sshClient);
+                removeDisconnectedClients(sshClient, false);
             }
         });
 
@@ -256,15 +276,20 @@
         return sshClient;
     }
 
-    public Session startSessionWrapper() throws Exception {
+    public SessionWrapper startSessionWrapper() throws Exception {
 
-        final SSHClient sshClient = leaseSSHClient();
+        final SSHClientWrapper sshClient = leaseSSHClient();
 
         try {
-            return new SessionWrapper(sshClient.startSession(), (id) -> untrackClosedSessions(sshClient, id));
+            return new SessionWrapper(sshClient.startSession(), (id) -> untrackClosedSessions(sshClient, id), sshClient);
 
         } catch (Exception e) {
             if (sshClient != null) {
+                // If it is a ConnectionExceptions, explicitly invalidate the client
+                if (e instanceof ConnectionException) {
+                    sshClient.setErrored(true);
+                }
+
                 untrackClosedSessions(sshClient, -1);
             }
             throw e;
@@ -273,28 +298,39 @@
 
     public SCPFileTransferWrapper newSCPFileTransferWrapper() throws Exception {
 
-        final SSHClient sshClient = leaseSSHClient();
+        final SSHClientWrapper sshClient = leaseSSHClient();
 
         try {
-            return new SCPFileTransferWrapper(sshClient.newSCPFileTransfer(), (id) -> untrackClosedSessions(sshClient, id));
+            return new SCPFileTransferWrapper(sshClient.newSCPFileTransfer(), (id) -> untrackClosedSessions(sshClient, id), sshClient);
 
         } catch (Exception e) {
+
             if (sshClient != null) {
+                // If it is a ConnectionExceptions, explicitly invalidate the client
+                if (e instanceof ConnectionException) {
+                    sshClient.setErrored(true);
+                }
+
                 untrackClosedSessions(sshClient, -1);
             }
             throw e;
         }
     }
 
-    public SFTPClient newSFTPClientWrapper() throws Exception {
+    public SFTPClientWrapper newSFTPClientWrapper() throws Exception {
 
-        final SSHClient sshClient = leaseSSHClient();
+        final SSHClientWrapper sshClient = leaseSSHClient();
 
         try {
-            return new SFTPClientWrapper(sshClient.newSFTPClient(), (id) -> untrackClosedSessions(sshClient, id));
+            return new SFTPClientWrapper(sshClient.newSFTPClient(), (id) -> untrackClosedSessions(sshClient, id), sshClient);
         } catch (Exception e) {
 
             if (sshClient != null) {
+                // If it is a ConnectionExceptions, explicitly invalidate the client
+                if (e instanceof ConnectionException) {
+                    sshClient.setErrored(true);
+                }
+
                 untrackClosedSessions(sshClient, -1);
             }
             throw e;
@@ -394,7 +430,7 @@
         return this;
     }
 
-    public Map<SSHClient, SSHClientInfo> getClientInfoMap() {
+    public Map<SSHClientWrapper, SSHClientInfo> getClientInfoMap() {
         return clientInfoMap;
     }
 }
diff --git a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/SSHJAgentAdaptor.java b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/SSHJAgentAdaptor.java
index edbd16e..07fb978 100644
--- a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/SSHJAgentAdaptor.java
+++ b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/SSHJAgentAdaptor.java
@@ -19,8 +19,10 @@
  */
 package org.apache.airavata.helix.adaptor;
 
+import com.google.common.collect.Lists;
 import net.schmizz.keepalive.KeepAliveProvider;
 import net.schmizz.sshj.DefaultConfig;
+import net.schmizz.sshj.connection.ConnectionException;
 import net.schmizz.sshj.connection.channel.direct.Session;
 import net.schmizz.sshj.sftp.*;
 import net.schmizz.sshj.userauth.keyprovider.KeyProvider;
@@ -31,11 +33,14 @@
 import net.schmizz.sshj.userauth.password.PasswordFinder;
 import net.schmizz.sshj.userauth.password.PasswordUtils;
 import net.schmizz.sshj.userauth.password.Resource;
-import org.apache.airavata.agents.api.AgentAdaptor;
-import org.apache.airavata.agents.api.AgentException;
-import org.apache.airavata.agents.api.AgentUtils;
-import org.apache.airavata.agents.api.CommandOutput;
+import net.schmizz.sshj.xfer.FilePermission;
+import net.schmizz.sshj.xfer.LocalDestFile;
+import net.schmizz.sshj.xfer.LocalFileFilter;
+import net.schmizz.sshj.xfer.LocalSourceFile;
+import org.apache.airavata.agents.api.*;
 import org.apache.airavata.helix.adaptor.wrapper.SCPFileTransferWrapper;
+import org.apache.airavata.helix.adaptor.wrapper.SFTPClientWrapper;
+import org.apache.airavata.helix.adaptor.wrapper.SessionWrapper;
 import org.apache.airavata.helix.agent.ssh.StandardOutReader;
 import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
@@ -45,11 +50,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Optional;
+import java.io.*;
+import java.util.*;
 import java.util.stream.Collectors;
 
 public class SSHJAgentAdaptor implements AgentAdaptor {
@@ -166,8 +168,9 @@
 
     @Override
     public CommandOutput executeCommand(String command, String workingDirectory) throws AgentException {
-        try (Session session = sshjClient.startSessionWrapper()) {
-
+        SessionWrapper session = null;
+        try {
+            session = sshjClient.startSessionWrapper();
             Session.Command exec = session.exec((workingDirectory != null ? "cd " + workingDirectory + "; " : "") + command);
             StandardOutReader standardOutReader = new StandardOutReader();
 
@@ -179,8 +182,21 @@
                 standardOutReader.setExitCode(Optional.ofNullable(exec.getExitStatus()).orElseThrow(() -> new Exception("Exit status received as null")));
             }
             return standardOutReader;
+
         } catch (Exception e) {
+            if (e instanceof ConnectionException) {
+                Optional.ofNullable(session).ifPresent(ft -> ft.setErrored(true));
+            }
             throw new AgentException(e);
+
+        } finally {
+            Optional.ofNullable(session).ifPresent(ss -> {
+                try {
+                    ss.close();
+                } catch (IOException e) {
+                    //Ignore
+                }
+            });
         }
     }
 
@@ -191,62 +207,307 @@
 
     @Override
     public void createDirectory(String path, boolean recursive) throws AgentException {
-        try (SFTPClient sftpClient = sshjClient.newSFTPClientWrapper()) {
+        SFTPClientWrapper sftpClient = null;
+        try {
+            sftpClient = sshjClient.newSFTPClientWrapper();
             if (recursive) {
                 sftpClient.mkdirs(path);
             } else {
                 sftpClient.mkdir(path);
             }
         } catch (Exception e) {
+            if (e instanceof ConnectionException) {
+                Optional.ofNullable(sftpClient).ifPresent(ft -> ft.setErrored(true));
+            }
             throw new AgentException(e);
+
+        } finally {
+            Optional.ofNullable(sftpClient).ifPresent(client -> {
+                try {
+                    client.close();
+                } catch (IOException e) {
+                    //Ignore
+                }
+            });
         }
     }
 
     @Override
-    public void copyFileTo(String localFile, String remoteFile) throws AgentException {
-        try(SCPFileTransferWrapper fileTransfer = sshjClient.newSCPFileTransferWrapper()) {
+    public void uploadFile(String localFile, String remoteFile) throws AgentException {
+        SCPFileTransferWrapper fileTransfer = null;
+        try {
+            fileTransfer = sshjClient.newSCPFileTransferWrapper();
             fileTransfer.upload(localFile, remoteFile);
+
         } catch (Exception e) {
+            if (e instanceof ConnectionException) {
+                Optional.ofNullable(fileTransfer).ifPresent(ft -> ft.setErrored(true));
+            }
             throw new AgentException(e);
+
+        } finally {
+            Optional.ofNullable(fileTransfer).ifPresent(scpFileTransferWrapper -> {
+                try {
+                    scpFileTransferWrapper.close();
+                } catch (IOException e) {
+                    //Ignore
+                }
+            });
         }
     }
 
     @Override
-    public void copyFileFrom(String remoteFile, String localFile) throws AgentException {
-        try(SCPFileTransferWrapper fileTransfer = sshjClient.newSCPFileTransferWrapper()) {
-            fileTransfer.download(remoteFile, localFile);
+    public void uploadFile(InputStream localInStream, FileMetadata metadata, String remoteFile) throws AgentException {
+        SCPFileTransferWrapper fileTransfer = null;
+
+        try {
+            fileTransfer = sshjClient.newSCPFileTransferWrapper();
+            fileTransfer.upload(new LocalSourceFile() {
+                @Override
+                public String getName() {
+                    return metadata.getName();
+                }
+
+                @Override
+                public long getLength() {
+                    return metadata.getSize();
+                }
+
+                @Override
+                public InputStream getInputStream() throws IOException {
+                    return localInStream;
+                }
+
+                @Override
+                public int getPermissions() throws IOException {
+                    return 420; //metadata.getPermissions();
+                }
+
+                @Override
+                public boolean isFile() {
+                    return true;
+                }
+
+                @Override
+                public boolean isDirectory() {
+                    return false;
+                }
+
+                @Override
+                public Iterable<? extends LocalSourceFile> getChildren(LocalFileFilter filter) throws IOException {
+                    return null;
+                }
+
+                @Override
+                public boolean providesAtimeMtime() {
+                    return false;
+                }
+
+                @Override
+                public long getLastAccessTime() throws IOException {
+                    return 0;
+                }
+
+                @Override
+                public long getLastModifiedTime() throws IOException {
+                    return 0;
+                }
+            }, remoteFile);
         } catch (Exception e) {
+            if (e instanceof ConnectionException) {
+                Optional.ofNullable(fileTransfer).ifPresent(ft -> ft.setErrored(true));
+            }
             throw new AgentException(e);
+
+        } finally {
+            Optional.ofNullable(fileTransfer).ifPresent(scpFileTransferWrapper -> {
+                try {
+                    scpFileTransferWrapper.close();
+                } catch (IOException e) {
+                    //Ignore
+                }
+            });
+        }
+    }
+
+    @Override
+    public void downloadFile(String remoteFile, String localFile) throws AgentException {
+        SCPFileTransferWrapper fileTransfer = null;
+        try {
+            fileTransfer = sshjClient.newSCPFileTransferWrapper();
+            fileTransfer.download(remoteFile, localFile);
+
+        } catch (Exception e) {
+            if (e instanceof ConnectionException) {
+                Optional.ofNullable(fileTransfer).ifPresent(ft -> ft.setErrored(true));
+            }
+            throw new AgentException(e);
+
+        } finally {
+            Optional.ofNullable(fileTransfer).ifPresent(scpFileTransferWrapper -> {
+                try {
+                    scpFileTransferWrapper.close();
+                } catch (IOException e) {
+                    //Ignore
+                }
+            });
+        }
+    }
+
+    @Override
+    public void downloadFile(String remoteFile, OutputStream localOutStream, FileMetadata metadata) throws AgentException {
+        SCPFileTransferWrapper fileTransfer = null;
+        try {
+            fileTransfer = sshjClient.newSCPFileTransferWrapper();
+            fileTransfer.download(remoteFile, new LocalDestFile() {
+                @Override
+                public OutputStream getOutputStream() throws IOException {
+                    return localOutStream;
+                }
+
+                @Override
+                public LocalDestFile getChild(String name) {
+                    return null;
+                }
+
+                @Override
+                public LocalDestFile getTargetFile(String filename) throws IOException {
+                    return this;
+                }
+
+                @Override
+                public LocalDestFile getTargetDirectory(String dirname) throws IOException {
+                    return null;
+                }
+
+                @Override
+                public void setPermissions(int perms) throws IOException {
+
+                }
+
+                @Override
+                public void setLastAccessedTime(long t) throws IOException {
+
+                }
+
+                @Override
+                public void setLastModifiedTime(long t) throws IOException {
+
+                }
+            });
+        } catch (Exception e) {
+            if (e instanceof ConnectionException) {
+                Optional.ofNullable(fileTransfer).ifPresent(ft -> ft.setErrored(true));
+            }
+            throw new AgentException(e);
+
+        } finally {
+            Optional.ofNullable(fileTransfer).ifPresent(scpFileTransferWrapper -> {
+                try {
+                    scpFileTransferWrapper.close();
+                } catch (IOException e) {
+                    //Ignore
+                }
+            });
         }
     }
 
     @Override
     public List<String> listDirectory(String path) throws AgentException {
-        try (SFTPClient sftpClient = sshjClient.newSFTPClientWrapper()) {
+        SFTPClientWrapper sftpClient = null;
+        try {
+            sftpClient = sshjClient.newSFTPClientWrapper();
             List<RemoteResourceInfo> ls = sftpClient.ls(path);
             return ls.stream().map(RemoteResourceInfo::getName).collect(Collectors.toList());
         } catch (Exception e) {
+            if (e instanceof ConnectionException) {
+                Optional.ofNullable(sftpClient).ifPresent(ft -> ft.setErrored(true));
+            }
             throw new AgentException(e);
+
+        } finally {
+            Optional.ofNullable(sftpClient).ifPresent(client -> {
+                try {
+                    client.close();
+                } catch (IOException e) {
+                    //Ignore
+                }
+            });
         }
     }
 
     @Override
     public Boolean doesFileExist(String filePath) throws AgentException {
-        try (SFTPClient sftpClient = sshjClient.newSFTPClientWrapper()) {
+        SFTPClientWrapper sftpClient = null;
+        try {
+            sftpClient = sshjClient.newSFTPClientWrapper();
             return sftpClient.statExistence(filePath) != null;
         } catch (Exception e) {
+            if (e instanceof ConnectionException) {
+                Optional.ofNullable(sftpClient).ifPresent(ft -> ft.setErrored(true));
+            }
             throw new AgentException(e);
+
+        } finally {
+            Optional.ofNullable(sftpClient).ifPresent(client -> {
+                try {
+                    client.close();
+                } catch (IOException e) {
+                    //Ignore
+                }
+            });
         }
     }
 
     @Override
     public List<String> getFileNameFromExtension(String fileName, String parentPath) throws AgentException {
 
-        try (SFTPClient sftpClient = sshjClient.newSFTPClientWrapper()) {
+        /*try (SFTPClient sftpClient = sshjClient.newSFTPClientWrapper()) {
             List<RemoteResourceInfo> ls = sftpClient.ls(parentPath, resource -> isMatch(resource.getName(), fileName));
             return ls.stream().map(RemoteResourceInfo::getPath).collect(Collectors.toList());
         } catch (Exception e) {
             throw new AgentException(e);
+        }*/
+        if (fileName.endsWith("*")) {
+            throw new AgentException("Wildcards that ends with * does not support for security reasons. Specify an extension");
+        }
+
+        CommandOutput commandOutput = executeCommand("ls " + fileName, parentPath); // This has a risk of returning folders also
+        String[] filesTmp = commandOutput.getStdOut().split("\n");
+        List<String> files = new ArrayList<>();
+        for (String f: filesTmp) {
+            if (!f.isEmpty()) {
+                files.add(f);
+            }
+        }
+        return files;
+    }
+
+    @Override
+    public FileMetadata getFileMetadata(String remoteFile) throws AgentException {
+        SFTPClientWrapper sftpClient = null;
+        try {
+            sftpClient = sshjClient.newSFTPClientWrapper();
+            FileAttributes stat = sftpClient.stat(remoteFile);
+            FileMetadata metadata = new FileMetadata();
+            metadata.setName(new File(remoteFile).getName());
+            metadata.setSize(stat.getSize());
+            metadata.setPermissions(FilePermission.toMask(stat.getPermissions()));
+            return metadata;
+        } catch (Exception e) {
+            if (e instanceof ConnectionException) {
+                Optional.ofNullable(sftpClient).ifPresent(ft -> ft.setErrored(true));
+            }
+            throw new AgentException(e);
+
+        } finally {
+            Optional.ofNullable(sftpClient).ifPresent(scpFileTransferWrapper -> {
+                try {
+                    scpFileTransferWrapper.close();
+                } catch (IOException e) {
+                    //Ignore
+                }
+            });
         }
     }
 
diff --git a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/SSHJStorageAdaptor.java b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/SSHJStorageAdaptor.java
index 0cc7ff9..c1656a0 100644
--- a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/SSHJStorageAdaptor.java
+++ b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/SSHJStorageAdaptor.java
@@ -80,13 +80,13 @@
     }
 
     @Override
-    public void uploadFile(String sourceFile, String destFile) throws AgentException {
-        super.copyFileTo(sourceFile, destFile);
+    public void uploadFile(String localFile, String remoteFile) throws AgentException {
+        super.uploadFile(localFile, remoteFile);
     }
 
     @Override
-    public void downloadFile(String sourceFile, String destFile) throws AgentException {
-        super.copyFileFrom(sourceFile, destFile);
+    public void downloadFile(String remoteFile, String localFile) throws AgentException {
+        super.downloadFile(remoteFile, localFile);
     }
 
     @Override
diff --git a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SCPFileTransferWrapper.java b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SCPFileTransferWrapper.java
index ff49e5b..2aaad74 100644
--- a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SCPFileTransferWrapper.java
+++ b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SCPFileTransferWrapper.java
@@ -33,10 +33,12 @@
 
     private SCPFileTransfer scpFileTransfer;
     private Consumer<Integer> onCloseFunction;
+    private SSHClientWrapper originalSSHClient;
 
-    public SCPFileTransferWrapper(SCPFileTransfer scpFileTransfer, Consumer<Integer> onCloseFunction) {
+    public SCPFileTransferWrapper(SCPFileTransfer scpFileTransfer, Consumer<Integer> onCloseFunction, SSHClientWrapper originalSSHClient) {
         this.scpFileTransfer = scpFileTransfer;
         this.onCloseFunction = onCloseFunction;
+        this.originalSSHClient = originalSSHClient;
     }
 
     @Override
@@ -73,4 +75,12 @@
     public void close() throws IOException {
         onCloseFunction.accept(-1);
     }
+
+    public boolean isErrored() {
+        return originalSSHClient.isErrored();
+    }
+
+    public void setErrored(boolean errored) {
+        this.originalSSHClient.setErrored(errored);
+    }
 }
diff --git a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SFTPClientWrapper.java b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SFTPClientWrapper.java
index ed21510..635ddfd 100644
--- a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SFTPClientWrapper.java
+++ b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SFTPClientWrapper.java
@@ -27,10 +27,12 @@
 public class SFTPClientWrapper extends SFTPClient {
     private SFTPClient sftpClient;
     private Consumer<Integer> onCloseFunction;
+    private SSHClientWrapper originalSSHClient;
 
-    public SFTPClientWrapper(SFTPClient sftpClient, Consumer<Integer> onCloseFunction) {
+    public SFTPClientWrapper(SFTPClient sftpClient, Consumer<Integer> onCloseFunction, SSHClientWrapper originalSSHClient) {
         super(sftpClient.getSFTPEngine());
         this.onCloseFunction = onCloseFunction;
+        this.originalSSHClient = originalSSHClient;
     }
 
     @Override
@@ -38,4 +40,12 @@
         onCloseFunction.accept(-1);
         super.close();
     }
+
+    public boolean isErrored() {
+        return originalSSHClient.isErrored();
+    }
+
+    public void setErrored(boolean errored) {
+        this.originalSSHClient.setErrored(errored);
+    }
 }
diff --git a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SSHClientWrapper.java b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SSHClientWrapper.java
new file mode 100644
index 0000000..ff66ca1
--- /dev/null
+++ b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SSHClientWrapper.java
@@ -0,0 +1,25 @@
+package org.apache.airavata.helix.adaptor.wrapper;
+
+import net.schmizz.sshj.Config;
+import net.schmizz.sshj.SSHClient;
+
+public class SSHClientWrapper extends SSHClient {
+
+    public SSHClientWrapper() {
+        super();
+    }
+
+    public SSHClientWrapper(Config config) {
+        super(config);
+    }
+
+    private boolean errored = false;
+
+    public boolean isErrored() {
+        return errored;
+    }
+
+    public void setErrored(boolean errored) {
+        this.errored = errored;
+    }
+}
diff --git a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SessionWrapper.java b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SessionWrapper.java
index a1899b1..6713d5f 100644
--- a/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SessionWrapper.java
+++ b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/wrapper/SessionWrapper.java
@@ -39,10 +39,12 @@
 
     private Session session;
     private Consumer<Integer> onCloseFunction;
+    private SSHClientWrapper originalSSHClient;
 
-    public SessionWrapper(Session session, Consumer<Integer> onCloseFunction) {
+    public SessionWrapper(Session session, Consumer<Integer> onCloseFunction, SSHClientWrapper originalSSHClient) {
         this.session = session;
         this.onCloseFunction = onCloseFunction;
+        this.originalSSHClient = originalSSHClient;
     }
 
     @Override
@@ -180,4 +182,12 @@
     public void handle(Message msg, SSHPacket buf) throws SSHException {
         session.handle(msg, buf);
     }
+
+    public boolean isErrored() {
+        return originalSSHClient.isErrored();
+    }
+
+    public void setErrored(boolean errored) {
+        this.originalSSHClient.setErrored(errored);
+    }
 }
diff --git a/modules/airavata-helix/helix-spectator/pom.xml b/modules/airavata-helix/helix-spectator/pom.xml
index 23f6557..7de7cc0 100644
--- a/modules/airavata-helix/helix-spectator/pom.xml
+++ b/modules/airavata-helix/helix-spectator/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata-helix</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -36,7 +36,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>task-core</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>commons-io</groupId>
@@ -47,32 +47,32 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>registry-api-service</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-registry-core</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>profile-service-stubs</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>services-security</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-messaging-core</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>workflow-impl</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.codehaus.groovy</groupId>
@@ -87,12 +87,22 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>job-monitor-api</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>profile-service-stubs</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>services-security</artifactId>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-messaging-core</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java
index 3e2d3f9..1379307 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java
@@ -39,27 +39,30 @@
 import org.apache.airavata.model.experiment.ExperimentModel;
 import org.apache.airavata.model.messaging.event.*;
 import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.security.AuthzToken;
 import org.apache.airavata.model.status.*;
-import org.apache.airavata.model.user.UserProfile;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.registry.api.client.RegistryServiceClientFactory;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.airavata.service.profile.client.ProfileServiceClientFactory;
 import org.apache.airavata.service.profile.user.cpi.UserProfileService;
 import org.apache.airavata.service.profile.user.cpi.exception.UserProfileServiceException;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.helix.HelixManager;
 import org.apache.helix.task.TaskResult;
 import org.apache.thrift.TException;
+import org.json.JSONException;
+import org.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
 
+import java.io.File;
+import java.io.IOException;
 import java.io.StringWriter;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Optional;
 import java.util.UUID;
 
 public abstract class AiravataTask extends AbstractTask {
@@ -168,12 +171,32 @@
                 logger.error("Failed to delete task specific nodes but continuing", e);
             }
 
+            cleanup();
+
             return onFail(errorMessage, fatal);
         } else {
             return onFail("Handover back to helix engine to retry", fatal);
         }
     }
 
+    protected void cleanup() {
+
+        try {
+            // cleaning up local data directory
+            String localDataPath = ServerSettings.getLocalDataLocation();
+            localDataPath = (localDataPath.endsWith(File.separator) ? localDataPath : localDataPath + File.separator);
+            localDataPath = localDataPath + getProcessId();
+
+            try {
+                FileUtils.deleteDirectory(new File(localDataPath));
+            } catch (IOException e) {
+                logger.error("Failed to delete local data directory " + localDataPath, e);
+            }
+        } catch (Exception e) {
+            logger.error("Failed to clean up", e);
+        }
+
+    }
     protected void saveAndPublishProcessStatus(ProcessState state) {
         ProcessStatus processStatus = new ProcessStatus(state);
         processStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
@@ -243,21 +266,7 @@
             if (experimentOutputs != null && !experimentOutputs.isEmpty()) {
                 for (OutputDataObjectType expOutput : experimentOutputs) {
                     if (expOutput.getName().equals(outputName)) {
-                        DataProductModel dataProductModel = new DataProductModel();
-                        dataProductModel.setGatewayId(getGatewayId());
-                        dataProductModel.setOwnerName(getProcessModel().getUserName());
-                        dataProductModel.setProductName(outputName);
-                        dataProductModel.setDataProductType(DataProductType.FILE);
-
-                        DataReplicaLocationModel replicaLocationModel = new DataReplicaLocationModel();
-                        replicaLocationModel.setStorageResourceId(getTaskContext().getStorageResourceDescription().getStorageResourceId());
-                        replicaLocationModel.setReplicaName(outputName + " gateway data store copy");
-                        replicaLocationModel.setReplicaLocationCategory(ReplicaLocationCategory.GATEWAY_DATA_STORE);
-                        replicaLocationModel.setReplicaPersistentType(ReplicaPersistentType.TRANSIENT);
-                        replicaLocationModel.setFilePath(outputVal);
-                        dataProductModel.addToReplicaLocations(replicaLocationModel);
-
-                        String productUri = getRegistryServiceClient().registerDataProduct(dataProductModel);
+                        String productUri = saveDataProduct(outputName, outputVal, expOutput.getMetaData());
                         expOutput.setValue(productUri);
                         getRegistryServiceClient().addExperimentProcessOutputs("EXPERIMENT_OUTPUT",
                                 Collections.singletonList(expOutput), experimentId);
@@ -270,6 +279,64 @@
             throw new TaskOnFailException(msg, true, e);
         }
     }
+    public void saveExperimentOutputCollection(String outputName, List<String> outputVals) throws TaskOnFailException {
+        try {
+            ExperimentModel experiment = getRegistryServiceClient().getExperiment(experimentId);
+            List<OutputDataObjectType> experimentOutputs = experiment.getExperimentOutputs();
+            if (experimentOutputs != null && !experimentOutputs.isEmpty()) {
+                for (OutputDataObjectType expOutput : experimentOutputs) {
+                    if (expOutput.getName().equals(outputName)) {
+                        List<String> productUris = new ArrayList<String>();
+                        for (String outputVal : outputVals) {
+                            String productUri = saveDataProduct(outputName, outputVal, expOutput.getMetaData());
+                            productUris.add(productUri);
+                        }
+                        expOutput.setValue(String.join(",", productUris));
+                        getRegistryServiceClient().addExperimentProcessOutputs("EXPERIMENT_OUTPUT",
+                                Collections.singletonList(expOutput), experimentId);
+                    }
+                }
+            }
+
+        } catch (TException e) {
+            String msg = "expId: " + getExperimentId() + " processId: " + getProcessId() + " : - Error while updating experiment outputs";
+            throw new TaskOnFailException(msg, true, e);
+        }
+    }
+
+    private String saveDataProduct(String outputName, String outputVal, String outputMetadata) throws TException {
+
+        DataProductModel dataProductModel = new DataProductModel();
+        dataProductModel.setGatewayId(getGatewayId());
+        dataProductModel.setOwnerName(getProcessModel().getUserName());
+        dataProductModel.setProductName(outputName);
+        dataProductModel.setDataProductType(DataProductType.FILE);
+        // Copy experiment output's file-metadata to data product's metadata
+        if (outputMetadata != null) {
+            try {
+                JSONObject outputMetadataJSON = new JSONObject(outputMetadata);
+                if (outputMetadataJSON.has("file-metadata")) {
+                    JSONObject fileMetadata = outputMetadataJSON.getJSONObject("file-metadata");
+                    for (Object key : fileMetadata.keySet()) {
+                        String k = key.toString();
+                        dataProductModel.putToProductMetadata(k, fileMetadata.getString(k));
+                    }
+                }
+            } catch (JSONException e) {
+                logger.warn("Failed to parse output metadata: [" + outputMetadata + "]", e);
+            }
+        }
+
+        DataReplicaLocationModel replicaLocationModel = new DataReplicaLocationModel();
+        replicaLocationModel.setStorageResourceId(getTaskContext().getStorageResourceDescription().getStorageResourceId());
+        replicaLocationModel.setReplicaName(outputName + " gateway data store copy");
+        replicaLocationModel.setReplicaLocationCategory(ReplicaLocationCategory.GATEWAY_DATA_STORE);
+        replicaLocationModel.setReplicaPersistentType(ReplicaPersistentType.TRANSIENT);
+        replicaLocationModel.setFilePath(outputVal);
+        dataProductModel.addToReplicaLocations(replicaLocationModel);
+
+        return getRegistryServiceClient().registerDataProduct(dataProductModel);
+    }
 
     @SuppressWarnings("WeakerAccess")
     private void saveExperimentError(ErrorModel errorModel) {
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java
index 98d01cb..7e32c00 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java
@@ -33,6 +33,7 @@
 import org.apache.airavata.model.appcatalog.computeresource.SSHJobSubmission;
 import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
 import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourceReservation;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
 import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
@@ -53,6 +54,7 @@
 import org.apache.airavata.model.status.TaskStatus;
 import org.apache.airavata.model.task.TaskModel;
 import org.apache.airavata.model.user.UserProfile;
+import org.apache.airavata.model.util.GroupComputeResourcePreferenceUtil;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.service.profile.user.cpi.UserProfileService;
 import org.apache.airavata.service.security.AiravataSecurityManager;
@@ -645,10 +647,6 @@
             reservation = userComputeResourcePreference.getReservation();
             start = userComputeResourcePreference.getReservationStartTime();
             end = userComputeResourcePreference.getReservationEndTime();
-        } else {
-            reservation = groupComputeResourcePreference.getReservation();
-            start = groupComputeResourcePreference.getReservationStartTime();
-            end = groupComputeResourcePreference.getReservationEndTime();
         }
         if (reservation != null && start > 0 && start < end) {
             long now = Calendar.getInstance().getTimeInMillis();
@@ -656,6 +654,12 @@
                 return reservation;
             }
         }
+        String queueName = getQueueName();
+        ComputeResourceReservation computeResourceReservation = GroupComputeResourcePreferenceUtil
+                .getActiveReservationForQueue(groupComputeResourcePreference, queueName);
+        if (computeResourceReservation != null) {
+            return computeResourceReservation.getReservationName();
+        }
         return null;
     }
 
@@ -798,27 +802,32 @@
                     Optional.ofNullable(registryClient.getGatewayResourceProfile(gatewayId))
                             .orElseThrow(() -> new Exception("Invalid GatewayResourceProfile")));
 
+            logger.debug("Using storage resource preference for storage " + processModel.getStorageResourceId());
             ctx.setGatewayStorageResourcePreference(
                     Optional.ofNullable(registryClient.getGatewayStoragePreference(
                             gatewayId,
                             processModel.getStorageResourceId()))
                             .orElseThrow(() -> new Exception("Invalid Gateway StoragePreference")));
 
+            logger.debug("Using application deployment " + processModel.getApplicationDeploymentId());
             ctx.setApplicationDeploymentDescription(
                     Optional.ofNullable(registryClient.getApplicationDeployment(
                             processModel.getApplicationDeploymentId()))
                             .orElseThrow(() -> new Exception("Invalid Application Deployment")));
 
+            logger.debug("Using application interface " + processModel.getApplicationInterfaceId());
             ctx.setApplicationInterfaceDescription(
                     Optional.ofNullable(registryClient.getApplicationInterface(
                             processModel.getApplicationInterfaceId()))
                             .orElseThrow(() -> new Exception("Invalid Application Interface")));
 
+            logger.debug("Using compute resource " + ctx.getComputeResourceId());
             ctx.setComputeResourceDescription(
                     Optional.ofNullable(registryClient.getComputeResource(
                             ctx.getComputeResourceId()))
                             .orElseThrow(() -> new Exception("Invalid Compute Resource Description")));
 
+            logger.debug("Using storage resource " + ctx.getStorageResourceId());
             ctx.setStorageResourceDescription(
                     Optional.ofNullable(registryClient.getStorageResource(
                             ctx.getStorageResourceId()))
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/cancel/RemoteJobCancellationTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/cancel/RemoteJobCancellationTask.java
index ad874eb..c824bb0 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/cancel/RemoteJobCancellationTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/cancel/RemoteJobCancellationTask.java
@@ -80,7 +80,8 @@
                                 // if the job already is in above states, there is no use of trying cancellation
                                 // setting context variable to be used in the Cancel Completing Task
                                 setContextVariable(JOB_ALREADY_CANCELLED_OR_NOT_AVAILABLE, "true");
-                                return onSuccess("Job already is in a saturated state according to monitoring");
+                                logger.warn("Job " + job.getJobId() + " already is in a saturated state according to monitoring");
+                                continue;
                         }
                     }
 
@@ -100,7 +101,8 @@
                                     // if the job already is in above states, there is no use of trying cancellation
                                     // setting context variable to be used in the Cancel Completing Task
                                     setContextVariable(JOB_ALREADY_CANCELLED_OR_NOT_AVAILABLE, "true");
-                                    return onSuccess("Job already is in a saturated state according to cluster");
+                                    logger.warn("Job " + job.getJobId() + " already is in a saturated state according to cluster");
+                                    continue;
                             }
                         } else {
                             logger.warn("Job status for job " + job.getJobId() + " is null. Std out " + jobMonitorOutput.getStdOut() +
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/completing/CompletingTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/completing/CompletingTask.java
index 4e97090..10e9790 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/completing/CompletingTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/completing/CompletingTask.java
@@ -40,6 +40,7 @@
         logger.info("Starting completing task for task " + getTaskId() + ", experiment id " + getExperimentId());
         logger.info("Process " + getProcessId() + " successfully completed");
         saveAndPublishProcessStatus(ProcessState.COMPLETED);
+        cleanup();
         return onSuccess("Process " + getProcessId() + " successfully completed");
     }
 
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
index 256ae82..b290f16 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
@@ -112,6 +112,7 @@
 
             Parser parser = getRegistryServiceClient().getParser(parserId, gatewayId);
             String containerId = getTaskId() + "_PARSER_"+ parser.getId();
+            containerId = containerId.replace(" ", "-");
 
             String localInputDir = createLocalInputDir(containerId);
             String localOutDir= createLocalOutputDir(containerId);
@@ -228,7 +229,7 @@
 
     }
 
-    private void runContainer(Parser parser, String containerId, String localInputDir, String localOutputDir, Map<String, String> properties) {
+    private void runContainer(Parser parser, String containerId, String localInputDir, String localOutputDir, Map<String, String> properties) throws ApplicationSettingsException {
         DefaultDockerClientConfig.Builder config = DefaultDockerClientConfig.createDefaultConfigBuilder();
 
         DockerClient dockerClient = DockerClientBuilder.getInstance(config).build();
@@ -256,7 +257,7 @@
 
         final StringBuilder dockerLogs = new StringBuilder();
 
-        if (containerResponse.getWarnings() != null) {
+        if (containerResponse.getWarnings() != null && containerResponse.getWarnings().length > 0) {
             StringBuilder warningStr = new StringBuilder();
             for (String w : containerResponse.getWarnings()) {
                 warningStr.append(w).append(",");
@@ -287,8 +288,12 @@
             logger.info("Container logs " + dockerLogs.toString());
         }
 
-        dockerClient.removeContainerCmd(containerResponse.getId()).exec();
-        logger.info("Successfully removed container with id " + containerResponse.getId());
+        if (ServerSettings.isSettingDefined("data.parser.delete.container") &&
+                Boolean.parseBoolean(ServerSettings.getSetting("data.parser.delete.container"))) {
+            dockerClient.removeContainerCmd(containerResponse.getId()).exec();
+            logger.info("Successfully removed container with id " + containerResponse.getId());
+        }
+
     }
 
     private StorageResourceAdaptor getStorageResourceAdaptor(String storageResourceId, AdaptorSupport adaptorSupport) throws TaskOnFailException, TException, AgentException {
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/ArchiveTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/ArchiveTask.java
index 4f1129f..7d4ffa0 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/ArchiveTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/ArchiveTask.java
@@ -19,10 +19,8 @@
  */
 package org.apache.airavata.helix.impl.task.staging;
 
-import org.apache.airavata.agents.api.AgentAdaptor;
-import org.apache.airavata.agents.api.AgentException;
-import org.apache.airavata.agents.api.CommandOutput;
-import org.apache.airavata.agents.api.StorageResourceAdaptor;
+import org.apache.airavata.agents.api.*;
+import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.helix.impl.task.TaskContext;
 import org.apache.airavata.helix.impl.task.TaskOnFailException;
 import org.apache.airavata.helix.task.api.TaskHelper;
@@ -41,6 +39,7 @@
 public class ArchiveTask extends DataStagingTask {
 
     private final static Logger logger = LoggerFactory.getLogger(ArchiveTask.class);
+    private final static long MAX_ARCHIVE_SIZE = 1024L * 1024L * 1024L * 20L; // 20GB
 
     @Override
     public TaskResult onRun(TaskHelper taskHelper, TaskContext taskContext) {
@@ -87,52 +86,63 @@
                 CommandOutput tarCommandOutput = adaptor.executeCommand(tarringCommand, null);
                 if (tarCommandOutput.getExitCode() != 0) {
                     throw new TaskOnFailException("Failed while running the tar command " + tarringCommand + ". Sout : " +
-                            tarCommandOutput.getStdOut() + ". Serr " + tarCommandOutput.getStdError(), true, null);
+                            tarCommandOutput.getStdOut() + ". Serr " + tarCommandOutput.getStdError(), false, null);
                 }
 
             } catch (AgentException e) {
                 throw new TaskOnFailException("Failed while running the tar command " + tarringCommand, true, null);
             }
 
-            boolean fileTransferred = transferFileToStorage(tarCreationAbsPath, destFilePath, archiveFileName, adaptor, storageResourceAdaptor);
-
-            if (!fileTransferred) {
-                logger.error("Failed to transfer created archive file " + tarCreationAbsPath);
-                throw new TaskOnFailException("Failed to transfer created archive file " + tarCreationAbsPath, true, null);
-            }
-
-            String deleteTarCommand = "rm " + tarCreationAbsPath;
-            logger.info("Running delete temporary tar command " + deleteTarCommand);
-
             try {
-                CommandOutput rmCommandOutput = adaptor.executeCommand(deleteTarCommand, null);
-                if (rmCommandOutput.getExitCode() != 0) {
-                    throw new TaskOnFailException("Failed while running the rm command " + deleteTarCommand + ". Sout : " +
-                            rmCommandOutput.getStdOut() + ". Serr " + rmCommandOutput.getStdError(), true, null);
+                FileMetadata fileMetadata = adaptor.getFileMetadata(tarCreationAbsPath);
+                long maxArchiveSize = Long.parseLong(ServerSettings.getSetting("max.archive.size", MAX_ARCHIVE_SIZE + ""));
+
+                if (fileMetadata.getSize() < maxArchiveSize) {
+                    boolean fileTransferred = transferFileToStorage(tarCreationAbsPath, destFilePath, archiveFileName, adaptor, storageResourceAdaptor);
+                    if (!fileTransferred) {
+                        logger.error("Failed to transfer created archive file " + tarCreationAbsPath);
+                        throw new TaskOnFailException("Failed to transfer created archive file " + tarCreationAbsPath, false, null);
+                    }
+
+                    String destParent = destFilePath.substring(0, destFilePath.lastIndexOf("/"));
+                    final String storageArchiveDir = "ARCHIVE";
+                    String unArchiveTarCommand = "mkdir -p " + storageArchiveDir + " && tar -xvf " + archiveFileName + " -C "
+                            + storageArchiveDir + " && rm " + archiveFileName + " && chmod 755 -f -R " + storageArchiveDir + "/*";
+                    logger.info("Running Un archiving command on storage resource " + unArchiveTarCommand);
+
+                    try {
+                        CommandOutput unTarCommandOutput = storageResourceAdaptor.executeCommand(unArchiveTarCommand, destParent);
+                        if (unTarCommandOutput.getExitCode() != 0) {
+                            throw new TaskOnFailException("Failed while running the untar command " + unTarCommandOutput + ". Sout : " +
+                                    unTarCommandOutput.getStdOut() + ". Serr " + unTarCommandOutput.getStdError(), false, null);
+                        }
+                    } catch (AgentException e) {
+                        throw new TaskOnFailException("Failed while running the untar command " + tarringCommand, false, null);
+                    }
+
+                    return onSuccess("Archival task successfully completed");
+                } else {
+                    logger.error("Archive size {} MB is larger than the maximum allowed size {} MB. So skipping the transfer.",
+                            fileMetadata.getSize() / (1024L * 1024L), maxArchiveSize / (1024L * 1024L));
+                    // This is not a recoverable issue. So mark it as critical
+                    throw new TaskOnFailException("Archive task was skipped as size is " + fileMetadata.getSize() / (1024L * 1024L) + " MB", true, null);
                 }
 
-            } catch (AgentException e) {
-                throw new TaskOnFailException("Failed while running the rm command " + tarringCommand, true, null);
-            }
+            } finally {
+                String deleteTarCommand = "rm " + tarCreationAbsPath;
+                logger.info("Running delete temporary tar command " + deleteTarCommand);
+                try {
+                    CommandOutput rmCommandOutput = adaptor.executeCommand(deleteTarCommand, null);
+                    if (rmCommandOutput.getExitCode() != 0) {
+                        logger.error("Failed while running the rm command " + deleteTarCommand + ". Sout : " +
+                                rmCommandOutput.getStdOut() + ". Serr " + rmCommandOutput.getStdError());
+                    }
 
-            String destParent = destFilePath.substring(0, destFilePath.lastIndexOf("/"));
-            final String storageArchiveDir = "ARCHIVE";
-            String unArchiveTarCommand = "mkdir " + storageArchiveDir + " && tar -xvf " + archiveFileName + " -C "
-                    + storageArchiveDir + " && rm " + archiveFileName + " && chmod 755 -R " + storageArchiveDir + "/*";
-            logger.info("Running Un archiving command on storage resource " + unArchiveTarCommand);
-
-            try {
-                CommandOutput unTarCommandOutput = storageResourceAdaptor.executeCommand(unArchiveTarCommand, destParent);
-                if (unTarCommandOutput.getExitCode() != 0) {
-                    throw new TaskOnFailException("Failed while running the untar command " + deleteTarCommand + ". Sout : " +
-                            unTarCommandOutput.getStdOut() + ". Serr " + unTarCommandOutput.getStdError(), true, null);
+                } catch (AgentException e) {
+                    logger.error("Failed while running the rm command " + tarringCommand, e);
                 }
-            } catch (AgentException e) {
-                throw new TaskOnFailException("Failed while running the untar command " + tarringCommand, true, null);
             }
 
-            return onSuccess("Archival task successfully completed");
-
         } catch (TaskOnFailException e) {
             if (e.getError() != null) {
                 logger.error(e.getReason(), e.getError());
@@ -142,8 +152,8 @@
             return onFail(e.getReason(), e.isCritical(), e.getError());
 
         } catch (Exception e) {
-            logger.error("Unknown error while executing output data staging task " + getTaskId(), e);
-            return onFail("Unknown error while executing output data staging task " + getTaskId(), false,  e);
+            logger.error("Unknown error while executing archiving staging task " + getTaskId(), e);
+            return onFail("Unknown error while executing archiving staging task " + getTaskId(), false,  e);
         }
     }
 
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/DataStagingTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/DataStagingTask.java
index abbcdb8..9258dd0 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/DataStagingTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/DataStagingTask.java
@@ -21,7 +21,10 @@
 
 import org.apache.airavata.agents.api.AgentAdaptor;
 import org.apache.airavata.agents.api.AgentException;
+import org.apache.airavata.agents.api.FileMetadata;
 import org.apache.airavata.agents.api.StorageResourceAdaptor;
+import org.apache.airavata.agents.streaming.TransferResult;
+import org.apache.airavata.agents.streaming.VirtualStreamProducer;
 import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.helix.impl.task.AiravataTask;
 import org.apache.airavata.helix.impl.task.TaskOnFailException;
@@ -34,12 +37,21 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.*;
 
 @SuppressWarnings("WeakerAccess")
 public abstract class DataStagingTask extends AiravataTask {
 
     private final static Logger logger = LoggerFactory.getLogger(DataStagingTask.class);
 
+    private final static ExecutorService PASS_THROUGH_EXECUTOR =
+            new ThreadPoolExecutor(10, 60, 0L, TimeUnit.MILLISECONDS,
+                    new LinkedBlockingQueue<>());
+
     @SuppressWarnings("WeakerAccess")
     protected DataStagingTaskModel getDataStagingTaskModel() throws TaskOnFailException {
         try {
@@ -47,10 +59,10 @@
             if (subTaskModel != null) {
                 return DataStagingTaskModel.class.cast(subTaskModel);
             } else {
-                throw new TaskOnFailException("Data staging task model can not be null for task " + getTaskId(), true, null);
+                throw new TaskOnFailException("Data staging task model can not be null for task " + getTaskId(), false, null);
             }
         } catch (Exception e) {
-            throw new TaskOnFailException("Failed while obtaining data staging task model for task " + getTaskId(), true, e);
+            throw new TaskOnFailException("Failed while obtaining data staging task model for task " + getTaskId(), false, e);
         }
     }
 
@@ -58,7 +70,7 @@
     protected StorageResourceDescription getStorageResource() throws TaskOnFailException {
         StorageResourceDescription storageResource = getTaskContext().getStorageResourceDescription();
         if (storageResource == null) {
-            throw new TaskOnFailException("Storage resource can not be null for task " + getTaskId(), true, null);
+            throw new TaskOnFailException("Storage resource can not be null for task " + getTaskId(), false, null);
         }
         return storageResource;
     }
@@ -79,7 +91,7 @@
             return storageResourceAdaptor;
         } catch (AgentException e) {
             throw new TaskOnFailException("Failed to obtain adaptor for storage resource " + getTaskContext().getStorageResourceId() +
-                    " in task " + getTaskId(), true, e);
+                    " in task " + getTaskId(), false, e);
         }
     }
 
@@ -94,7 +106,7 @@
                     getTaskContext().getComputeResourceLoginUserName());
         } catch (Exception e) {
             throw new TaskOnFailException("Failed to obtain adaptor for compute resource " + getTaskContext().getComputeResourceId() +
-                    " in task " + getTaskId(), true, e);
+                    " in task " + getTaskId(), false, e);
         }
     }
 
@@ -133,6 +145,173 @@
         return filePath;
     }
 
+    public void naiveTransfer(AgentAdaptor srcAdaptor, String sourceFile, AgentAdaptor destAdaptor, String destFile,
+                              String tempFile) throws TaskOnFailException {
+        logger.info("Using naive transfer to transfer " + sourceFile + " to " + destFile);
+        try {
+            try {
+                logger.info("Downloading file " + sourceFile + " to loacl temp file " + tempFile);
+                srcAdaptor.downloadFile(sourceFile, tempFile);
+            } catch (AgentException e) {
+                throw new TaskOnFailException("Failed downloading file " + sourceFile + " to the local path " +
+                        tempFile, false, e);
+            }
+
+            File localFile = new File(tempFile);
+            if (!localFile.exists()) {
+                throw new TaskOnFailException("Local file does not exist at " + tempFile, false, null);
+            }
+
+            try {
+                logger.info("Uploading file form local temp file " + tempFile + " to " + destFile);
+                destAdaptor.uploadFile(tempFile, destFile);
+            } catch (AgentException e) {
+                throw new TaskOnFailException("Failed uploading file to " + destFile + " from local path " +
+                        tempFile, false, e);
+            }
+        } finally {
+            logger.info("Deleting temporary file " + tempFile);
+            deleteTempFile(tempFile);
+        }
+    }
+
+    public static void passThroughTransfer(AgentAdaptor srcAdaptor, String sourceFile, AgentAdaptor destAdaptor,
+                                           String destFile) throws TaskOnFailException {
+        logger.info("Using pass through transfer to transfer " + sourceFile + " to " + destFile);
+
+        FileMetadata tempMetadata;
+        try {
+            tempMetadata = srcAdaptor.getFileMetadata(sourceFile);
+        } catch (AgentException e) {
+            throw new TaskOnFailException("Failed to obtain metadata for file " + sourceFile, false, e );
+        }
+
+        final FileMetadata fileMetadata = tempMetadata;
+
+        VirtualStreamProducer streamProducer = new VirtualStreamProducer(1024, fileMetadata.getSize());
+
+        OutputStream os = streamProducer.getOutputStream();
+        InputStream is = streamProducer.getInputStream();
+
+        Callable<TransferResult> inCallable = () -> {
+            TransferResult result = new TransferResult();
+            result.setTransferId("In");
+
+            try {
+                logger.info("Executing in-bound transfer for file " + sourceFile);
+                srcAdaptor.downloadFile(sourceFile, os, fileMetadata);
+                logger.info("Completed in-bound transfer for file " + sourceFile);
+                result.setTransferStatus(TransferResult.TransferStatus.COMPLETED);
+                result.setMessage("Successfully completed the transfer");
+
+            } catch (Exception e) {
+                result.setMessage("In-bound transfer failed for file " + sourceFile + ". Reason : " + e.getMessage());
+                result.setTransferStatus(TransferResult.TransferStatus.FAILED);
+                result.setError(e);
+            }
+            return result;
+        };
+
+        Callable<TransferResult> outCallable = () -> {
+            TransferResult result = new TransferResult();
+            result.setTransferId("Out");
+
+            try {
+                logger.info("Executing out-bound transfer for file " + destFile);
+                destAdaptor.uploadFile(is, fileMetadata, destFile);
+                logger.info("Completed out-bound transfer for file " + destFile);
+                result.setTransferStatus(TransferResult.TransferStatus.COMPLETED);
+                result.setMessage("Successfully completed the transfer");
+
+            } catch (Exception e) {
+                result.setMessage("Out-bound transfer failed for file " + destFile + ". Reason : " + e.getMessage());
+                result.setTransferStatus(TransferResult.TransferStatus.FAILED);
+                result.setError(e);
+            }
+
+            return result;
+        };
+
+        CompletionService<TransferResult> completionService = new ExecutorCompletionService<TransferResult>(PASS_THROUGH_EXECUTOR);
+
+        Map<String, Future<TransferResult>> unResolvedFutures = new HashMap<>();
+
+        unResolvedFutures.put("In", completionService.submit(inCallable));
+        unResolvedFutures.put("Out", completionService.submit(outCallable));
+
+        int completed = 0;
+        int failed = 0;
+        TransferResult failedResult = null;
+
+        try {
+            while (completed < 2 && failed == 0) {
+                try {
+                    Future<TransferResult> res = completionService.take();
+                    if (res.get().getTransferStatus() == TransferResult.TransferStatus.COMPLETED) {
+                        completed++;
+                        logger.debug("Transfer " + res.get().getTransferId() + " completed");
+                    } else {
+                        failed++;
+                        failedResult = res.get();
+                        logger.warn("Transfer " + res.get().getTransferId() + " failed", failedResult.getError());
+                    }
+                    unResolvedFutures.remove(res.get().getTransferId());
+
+                } catch (Exception e) {
+                    logger.error("Error occurred while monitoring transfers", e);
+                    throw new TaskOnFailException("Error occurred while monitoring transfers", false, e);
+                }
+            }
+
+            if (failed > 0) {
+                logger.error("Transfer from " + sourceFile + " to " + destFile + " failed. " + failedResult.getMessage(),
+                        failedResult.getError());
+                throw new TaskOnFailException("Pass through file transfer failed from " + sourceFile + " to " +
+                        destFile, false, failedResult.getError());
+            } else {
+                logger.info("Transfer from " + sourceFile + " to " + destFile + " completed");
+            }
+
+        } finally {
+            // Cleaning up unresolved transfers
+            if (unResolvedFutures.size() > 0) {
+                unResolvedFutures.forEach((id, future) -> {
+                    try {
+                        logger.warn("Cancelling transfer " + id);
+                        future.cancel(true);
+                    } catch (Exception e) {
+                        // Ignore
+                        logger.warn(e.getMessage());
+                    }
+                });
+            }
+        }
+    }
+
+    protected void transferFileToComputeResource(String sourcePath, String destPath, AgentAdaptor computeAdaptor,
+                                                 StorageResourceAdaptor storageAdaptor) throws TaskOnFailException {
+
+        try {
+            FileMetadata fileMetadata = storageAdaptor.getFileMetadata(sourcePath);
+            if (fileMetadata.getSize() == 0) {
+                logger.error("File " + sourcePath +" size is 0 so ignoring the upload");
+                throw new TaskOnFailException("Input staging has failed as file " + sourcePath + " size is 0", false, null);
+            }
+        } catch (AgentException e) {
+            logger.error("Failed to fetch metadata for file " + sourcePath, e);
+            throw new TaskOnFailException("Failed to fetch metadata for file " + sourcePath, false, e);
+        }
+
+        if  (ServerSettings.isSteamingEnabled()) {
+            passThroughTransfer(storageAdaptor, sourcePath, computeAdaptor, destPath);
+        } else {
+            String sourceFileName = sourcePath.substring(sourcePath.lastIndexOf(File.separator) + 1, sourcePath.length());
+            String tempPath = getLocalDataPath(sourceFileName);
+            naiveTransfer(storageAdaptor, sourcePath, computeAdaptor, destPath, tempPath);
+        }
+
+    }
+
     protected boolean transferFileToStorage(String sourcePath, String destPath, String fileName, AgentAdaptor adaptor,
                               StorageResourceAdaptor storageResourceAdaptor) throws TaskOnFailException {
 
@@ -163,42 +342,14 @@
             throw new TaskOnFailException("Error while checking the file " + sourcePath + " existence", false, e);
         }
 
-        String localSourceFilePath = getLocalDataPath(fileName);
 
-        try {
-            try {
-                logger.info("Downloading output file " + sourcePath + " to the local path " + localSourceFilePath);
-                adaptor.copyFileFrom(sourcePath, localSourceFilePath);
-                logger.info("Output file downloaded to " + localSourceFilePath);
-            } catch (AgentException e) {
-                throw new TaskOnFailException("Failed downloading output file " + sourcePath + " to the local path " +
-                        localSourceFilePath, false, e);
-            }
-
-            File localFile = new File(localSourceFilePath);
-            if (localFile.exists()) {
-                /*if (localFile.length() == 0) {
-                    logger.warn("Local file " + localSourceFilePath +" size is 0 so ignoring the upload");
-                    return false;
-                }*/
-            } else {
-                throw new TaskOnFailException("Local file does not exist at " + localSourceFilePath, false, null);
-            }
-            // Uploading output file to the storage resource
-            try {
-                logger.info("Uploading the output file to " + destPath + " from local path " + localSourceFilePath);
-                storageResourceAdaptor.uploadFile(localSourceFilePath, destPath);
-                logger.info("Output file uploaded to " + destPath);
-            } catch (AgentException e) {
-                throw new TaskOnFailException("Failed uploading the output file to " + destPath + " from local path " +
-                        localSourceFilePath, false, e);
-            }
-
-            return true;
-        } finally {
-            logger.info("Deleting temporary file " + localSourceFilePath);
-            deleteTempFile(localSourceFilePath);
+        if  (ServerSettings.isSteamingEnabled()) {
+            passThroughTransfer(adaptor, sourcePath, storageResourceAdaptor, destPath);
+        } else {
+            String tempPath = getLocalDataPath(fileName);
+            naiveTransfer(adaptor, sourcePath, storageResourceAdaptor, destPath, tempPath);
         }
+        return true;
     }
 
     protected void deleteTempFile(String filePath) {
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/InputDataStagingTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/InputDataStagingTask.java
index 60120aa..e7e9010 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/InputDataStagingTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/InputDataStagingTask.java
@@ -20,7 +20,6 @@
 package org.apache.airavata.helix.impl.task.staging;
 
 import org.apache.airavata.agents.api.AgentAdaptor;
-import org.apache.airavata.agents.api.AgentException;
 import org.apache.airavata.agents.api.StorageResourceAdaptor;
 import org.apache.airavata.helix.impl.task.TaskContext;
 import org.apache.airavata.helix.impl.task.TaskOnFailException;
@@ -34,7 +33,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
 import java.net.URI;
 import java.net.URISyntaxException;
 
@@ -70,7 +68,7 @@
 
             try {
 
-                String sourceUrls[];
+                String[] sourceUrls;
 
                 if (dataStagingTaskModel.getProcessInput().getType() == DataType.URI_COLLECTION) {
                     logger.info("Found a URI collection so splitting by comma for path " + dataStagingTaskModel.getSource());
@@ -79,12 +77,17 @@
                     sourceUrls = new String[]{dataStagingTaskModel.getSource()};
                 }
 
+                // Fetch and validate storage adaptor
+                StorageResourceAdaptor storageResourceAdaptor = getStorageAdaptor(taskHelper.getAdaptorSupport());
+                // Fetch and validate compute resource adaptor
+                AgentAdaptor adaptor = getComputeResourceAdaptor(taskHelper.getAdaptorSupport());
+
                 for (String url : sourceUrls) {
                     URI sourceURI = new URI(url);
                     URI destinationURI = new URI(dataStagingTaskModel.getDestination());
 
                     logger.info("Source file " + sourceURI.getPath() + ", destination uri " + destinationURI.getPath() + " for task " + getTaskId());
-                    copySingleFile(sourceURI, destinationURI, taskHelper);
+                    transferFileToComputeResource(sourceURI.getPath(), destinationURI.getPath(), adaptor, storageResourceAdaptor);
                 }
 
             } catch (URISyntaxException e) {
@@ -107,54 +110,6 @@
         }
     }
 
-    private void copySingleFile(URI sourceURI, URI destinationURI, TaskHelper taskHelper) throws TaskOnFailException {
-
-        String sourceFileName = sourceURI.getPath().substring(sourceURI.getPath().lastIndexOf(File.separator) + 1,
-                    sourceURI.getPath().length());
-
-        // Fetch and validate storage adaptor
-        StorageResourceAdaptor storageResourceAdaptor = getStorageAdaptor(taskHelper.getAdaptorSupport());
-
-        // Fetch and validate compute resource adaptor
-        AgentAdaptor adaptor = getComputeResourceAdaptor(taskHelper.getAdaptorSupport());
-
-        String localSourceFilePath = getLocalDataPath(sourceFileName);
-        // Downloading input file from the storage resource
-
-        try {
-            try {
-                logger.info("Downloading input file " + sourceURI.getPath() + " to the local path " + localSourceFilePath);
-                storageResourceAdaptor.downloadFile(sourceURI.getPath(), localSourceFilePath);
-                logger.info("Input file downloaded to " + localSourceFilePath);
-            } catch (AgentException e) {
-                throw new TaskOnFailException("Failed downloading input file " + sourceFileName + " to the local path " + localSourceFilePath, false, e);
-            }
-
-            File localFile = new File(localSourceFilePath);
-            if (localFile.exists()) {
-                if (localFile.length() == 0) {
-                    logger.error("Local file " + localSourceFilePath +" size is 0 so ignoring the upload");
-                    throw new TaskOnFailException("Input staging has failed as file " + localSourceFilePath + " size is 0", true, null);
-                }
-            } else {
-                throw new TaskOnFailException("Local file does not exist at " + localSourceFilePath, false, null);
-            }
-
-            // Uploading input file to the compute resource
-            try {
-                logger.info("Uploading the input file to " + destinationURI.getPath() + " from local path " + localSourceFilePath);
-                adaptor.copyFileTo(localSourceFilePath, destinationURI.getPath());
-                logger.info("Input file uploaded to " + destinationURI.getPath());
-            } catch (AgentException e) {
-                throw new TaskOnFailException("Failed uploading the input file to " + destinationURI.getPath() + " from local path " + localSourceFilePath, false, e);
-            }
-
-        } finally {
-            logger.info("Deleting temporary file " + localSourceFilePath);
-            deleteTempFile(localSourceFilePath);
-        }
-    }
-
     @Override
     public void onCancel(TaskContext taskContext) {
 
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/OutputDataStagingTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/OutputDataStagingTask.java
index 304b2ae..a5d9d74 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/OutputDataStagingTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/staging/OutputDataStagingTask.java
@@ -27,6 +27,7 @@
 import org.apache.airavata.helix.task.api.TaskHelper;
 import org.apache.airavata.helix.task.api.annotation.TaskDef;
 import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
+import org.apache.airavata.model.application.io.DataType;
 import org.apache.airavata.model.application.io.OutputDataObjectType;
 import org.apache.airavata.model.status.ProcessState;
 import org.apache.airavata.model.task.DataStagingTaskModel;
@@ -38,8 +39,10 @@
 import java.io.File;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @TaskDef(name = "Output Data Staging Task")
 public class OutputDataStagingTask extends DataStagingTask {
@@ -107,6 +110,8 @@
             // Fetch and validate compute resource adaptor
             AgentAdaptor adaptor = getComputeResourceAdaptor(taskHelper.getAdaptorSupport());
 
+            List<URI> destinationURIs = new ArrayList<URI>();
+
             if (sourceFileName.contains("*")) {
                 // if file is declared as a wild card
                 logger.info("Handling output files with " + sourceFileName + " extension for task " + getTaskId());
@@ -132,11 +137,11 @@
                         logger.warn("Ignoring file transfer as filename is empty or null");
                         continue;
                     }
-                    sourceFileName = new File(subFilePath).getName();
+                    sourceFileName = subFilePath;
                     if (destParentPath.endsWith(File.separator)) {
-                        destinationURI = new URI(destParentPath + sourceFileName);
+                        destinationURI = new URI(destParentPath + subFilePath);
                     } else {
-                        destinationURI = new URI(destParentPath + File.separator + sourceFileName);
+                        destinationURI = new URI(destParentPath + File.separator + subFilePath);
                     }
 
                     URI newSourceURI = new URI((sourceParentPath.endsWith(File.separator) ?
@@ -144,24 +149,27 @@
 
                     //Wildcard support is only enabled for output data staging
                     assert processOutput != null;
-                    processOutput.setName(sourceFileName);
-
-                    try {
-                        getTaskContext().getRegistryClient()
-                                .addExperimentProcessOutputs("EXPERIMENT_OUTPUT", Collections.singletonList(processOutput), getExperimentId());
-                        getTaskContext().getRegistryClient()
-                                .addExperimentProcessOutputs("PROCESS_OUTPUT", Collections.singletonList(processOutput), getProcessId());
-                    } catch (TException e) {
-                        throw new TaskOnFailException("Failed to update experiment or process outputs for task " + getTaskId(), true, e);
-                    }
-
                     logger.info("Transferring file " + sourceFileName);
                     boolean transferred = transferFileToStorage(newSourceURI.getPath(), destinationURI.getPath(), sourceFileName, adaptor, storageResourceAdaptor);
                     if (transferred) {
-                        saveExperimentOutput(processOutput.getName(), destinationURI.toString());
+                        destinationURIs.add(destinationURI);
                     } else {
                         logger.warn("File " + sourceFileName + " did not transfer");
                     }
+
+                    if (processOutput.getType() == DataType.URI) {
+                        if (filePaths.size() > 1) {
+                            logger.warn("More than one file matched wildcard, but output type is URI. Skipping remaining matches: " + filePaths.subList(1, filePaths.size()));
+                        }
+                        break;
+                    }
+                }
+                if (!destinationURIs.isEmpty()) {
+                    if (processOutput.getType() == DataType.URI) {
+                        saveExperimentOutput(processOutput.getName(), destinationURIs.get(0).toString());
+                    } else if (processOutput.getType() == DataType.URI_COLLECTION) {
+                        saveExperimentOutputCollection(processOutput.getName(), destinationURIs.stream().map(URI::toString).collect(Collectors.toList()));
+                    }
                 }
                 return onSuccess("Output data staging task " + getTaskId() + " successfully completed");
 
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
index 7904a7b..f1f877f 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
@@ -22,11 +22,10 @@
 import org.apache.airavata.agents.api.AgentAdaptor;
 import org.apache.airavata.agents.api.JobSubmissionOutput;
 import org.apache.airavata.common.utils.AiravataUtils;
-import org.apache.airavata.helix.core.util.MonitoringUtil;
+import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.helix.impl.task.TaskContext;
 import org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder;
 import org.apache.airavata.helix.impl.task.submission.config.GroovyMapData;
-import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
 import org.apache.airavata.helix.task.api.TaskHelper;
 import org.apache.airavata.helix.task.api.annotation.TaskDef;
 import org.apache.airavata.model.commons.ErrorModel;
@@ -37,9 +36,11 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 @TaskDef(name = "Default Job Submission")
 public class DefaultJobSubmissionTask extends JobSubmissionTask {
@@ -66,8 +67,14 @@
         }
 
         try {
-            saveAndPublishProcessStatus(ProcessState.EXECUTING);
+            List<JobModel> jobsOfTask = getTaskContext().getRegistryClient().getJobs("taskId", getTaskId());
 
+            if (jobsOfTask.size() > 0) {
+                logger.warn("A job is already available for task " + getTaskId());
+                return onSuccess("A job is already available for task " + getTaskId());
+            }
+
+            saveAndPublishProcessStatus(ProcessState.EXECUTING);
             GroovyMapData mapData = new GroovyMapBuilder(getTaskContext()).build();
 
             JobModel jobModel = new JobModel();
@@ -183,13 +190,59 @@
 
                 // usage reporting as the last step of job submission task
                 if (getComputeResourceDescription().isGatewayUsageReporting()){
-                    String loadCommand = getComputeResourceDescription().getGatewayUsageModuleLoadCommand();
-                    String usageExecutable = getComputeResourceDescription().getGatewayUsageExecutable();
-                    ExperimentModel experiment = getRegistryServiceClient().getExperiment(getExperimentId());
-                    String username = experiment.getUserName() + "@" + getTaskContext().getGroupComputeResourcePreference().getUsageReportingGatewayId();
-                    RawCommandInfo rawCommandInfo = new RawCommandInfo(loadCommand + " && " + usageExecutable + " -gateway_user " +  username  +
-                            " -submit_time \"`date '+%F %T %:z'`\"  -jobid " + jobId );
-                    adaptor.executeCommand(rawCommandInfo.getRawCommand(), null);
+
+                    try {
+                        ExperimentModel experiment = getRegistryServiceClient().getExperiment(getExperimentId());
+                        String usageReportingKey = ServerSettings.getSetting("usage.reporting.key");
+                        String username = URLEncoder.encode(
+                                experiment.getUserName(),
+                                StandardCharsets.UTF_8.toString()) + ":" +
+                                URLEncoder.encode(
+                                        getTaskContext().getGroupComputeResourcePreference().getUsageReportingGatewayId(),
+                                        StandardCharsets.UTF_8.toString());
+
+                        SimpleDateFormat gmtDateFormat = new SimpleDateFormat("yyyy-MM-dd+HH:mmZ");
+                        gmtDateFormat.setTimeZone(TimeZone.getTimeZone("EST"));
+
+                        String hostName = getComputeResourceDescription().getHostName();
+                        List<String> hostAliases = getComputeResourceDescription().getHostAliases();
+                        if (hostAliases != null && hostAliases.size() > 0) {
+                            // TODO this is a temporary fix. Properly add entries to API to fetch host specific xsederesourcename.
+                            hostName = hostAliases.get(0);
+                        }
+
+                        String command = String.format("curl -XPOST --data-urlencode apikey=%s " +
+                                        "--data-urlencode gatewayuser=%s " +
+                                        "--data-urlencode xsederesourcename=%s  " +
+                                        "--data-urlencode jobid=%s " +
+                                        "--data-urlencode submittime='%s' " +
+                                        "%s",
+                                usageReportingKey,
+                                username,
+                                hostName,
+                                jobId,
+                                gmtDateFormat.format(new Date()),
+                                ServerSettings.getSetting("usage.reporting.endpoint"));
+
+                        logger.info("Usage reporting CURL command " + command);
+                        Process curlSubmit = Runtime.getRuntime().exec(command);
+
+                        BufferedReader reader = new BufferedReader(new InputStreamReader(curlSubmit.getInputStream()));
+                        StringBuffer output = new StringBuffer();
+
+                        String line;
+                        while ((line = reader.readLine()) != null) {
+                            output.append(line);
+                            output.append("\n");
+                        }
+
+                        logger.info("Usage reporting output " + output.toString());
+                        curlSubmit.waitFor();
+                        logger.info("Usage reporting completed");
+
+                    } catch (Exception e) {
+                        logger.error("Usage reporting failed but continuing. ", e);
+                    }
                 }
 
                 return onSuccess("Submitted job to compute resource");
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/JobSubmissionTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/JobSubmissionTask.java
index 25e3592..93df582 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/JobSubmissionTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/JobSubmissionTask.java
@@ -31,12 +31,8 @@
 import org.apache.airavata.helix.impl.task.submission.config.JobFactory;
 import org.apache.airavata.helix.impl.task.submission.config.JobManagerConfiguration;
 import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
-import org.apache.airavata.messaging.core.MessageContext;
 import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManager;
 import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.messaging.event.JobIdentifier;
-import org.apache.airavata.model.messaging.event.JobStatusChangeEvent;
-import org.apache.airavata.model.messaging.event.MessageType;
 import org.apache.airavata.model.status.JobStatus;
 import org.apache.commons.io.FileUtils;
 import org.apache.helix.HelixManager;
@@ -77,7 +73,7 @@
 
         logger.info("Copying file form " + tempJobFile.getAbsolutePath() + " to remote path " + workingDirectory +
                 " of compute resource " + getTaskContext().getComputeResourceId());
-        agentAdaptor.copyFileTo(tempJobFile.getAbsolutePath(), workingDirectory);
+        agentAdaptor.uploadFile(tempJobFile.getAbsolutePath(), workingDirectory);
 
         RawCommandInfo submitCommand = jobManagerConfiguration.getSubmitCommand(workingDirectory, tempJobFile.getPath());
 
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java
index d849ba4..e76c6db 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java
@@ -80,10 +80,10 @@
         mapData.setTaskId(taskContext.getTaskId());
         mapData.setExperimentDataDir(taskContext.getProcessModel().getExperimentDataDir());
 
-        List<String> emails = taskContext.getUserProfile().getEmails();
-        if (emails != null && emails.size() > 0) {
-            mapData.setGatewayUserEmail(emails.get(0));
-        }
+        //List<String> emails = taskContext.getUserProfile().getEmails();
+        //if (emails != null && emails.size() > 0) {
+        //    mapData.setGatewayUserEmail(emails.get(0));
+        //}
 
         List<String> inputValues = getProcessInputValues(taskContext.getProcessModel().getProcessInputs(), true);
         inputValues.addAll(getProcessOutputValues(taskContext.getProcessModel().getProcessOutputs(), true));
@@ -251,6 +251,13 @@
                 if (commandLineOnly && !inputDataObjectType.isRequiredToAddedToCommandLine()) {
                     continue;
                 }
+
+                if (!inputDataObjectType.isIsRequired() &&
+                        (inputDataObjectType.getValue() == null || "".equals(inputDataObjectType.getValue()))) {
+                    // For URI/ Collection non required inputs, if the value is empty, ignore it. Fix for airavata-3276
+                    continue;
+                }
+
                 if (inputDataObjectType.getApplicationArgument() != null
                         && !inputDataObjectType.getApplicationArgument().equals("")) {
                     inputValues.add(inputDataObjectType.getApplicationArgument());
@@ -259,24 +266,23 @@
                 if (inputDataObjectType.getValue() != null
                         && !inputDataObjectType.getValue().equals("")) {
                     if (inputDataObjectType.getType() == DataType.URI) {
-                        // set only the relative path
-                        String filePath = inputDataObjectType.getValue();
-                        filePath = filePath.substring(filePath.lastIndexOf(File.separatorChar) + 1, filePath.length());
-                        inputValues.add(filePath);
+                        if (inputDataObjectType.getOverrideFilename() != null) {
+                            inputValues.add(inputDataObjectType.getOverrideFilename());
+                        } else {
+                            // set only the relative path
+                            String filePath = inputDataObjectType.getValue();
+                            filePath = filePath.substring(filePath.lastIndexOf(File.separatorChar) + 1, filePath.length());
+                            inputValues.add(filePath);
+                        }
                     } else if (inputDataObjectType.getType() == DataType.URI_COLLECTION) {
                         String filePaths = inputDataObjectType.getValue();
                         String[] paths = filePaths.split(MULTIPLE_INPUTS_SPLITTER);
-                        String filePath;
-                        String inputs = "";
-                        int i = 0;
-                        for (; i < paths.length - 1; i++) {
-                            filePath = paths[i];
-                            filePath = filePath.substring(filePath.lastIndexOf(File.separatorChar) + 1, filePath.length());
-                            // File names separate by a space
-                            inputs += filePath + " ";
+
+                        for (int i = 0; i < paths.length; i++) {
+                            paths[i] = paths[i].substring(paths[i].lastIndexOf(File.separatorChar) + 1);
                         }
-                        inputs += paths[i];
-                        inputValues.add(inputs);
+
+                        inputValues.add(String.join(" ", paths));
                     } else {
                         inputValues.add(inputDataObjectType.getValue());
                     }
@@ -383,6 +389,9 @@
             }
             if (processModel.isEnableEmailNotification()) {
                 List<String> emailList = processModel.getEmailAddresses();
+                if (emailList == null) {
+                    throw new TaskOnFailException("At least one email should be provided as the email notification is turned on", false, null);
+                }
                 String elist = listToCsv(emailList, ',');
                 if (elist != null && !elist.isEmpty()) {
                     if (emailIds != null && !emailIds.isEmpty()) {
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
index a86b8a4..772206c 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
@@ -55,13 +55,19 @@
 
     private final static Logger logger = LoggerFactory.getLogger(ParserWorkflowManager.class);
 
-    private String parserStorageResourceId = "pgadev.scigap.org_7ddf28fd-d503-4ff8-bbc5-3279a7c3b99e";
+    private String parserStorageResourceId = ServerSettings.getSetting("parser.storage.resource.id");
 
     public ParserWorkflowManager() throws ApplicationSettingsException {
         super(ServerSettings.getSetting("parser.workflow.manager.name"),
                 Boolean.parseBoolean(ServerSettings.getSetting("post.workflow.manager.loadbalance.clusters")));
     }
 
+    public static void main(String[] args) throws Exception {
+        ParserWorkflowManager manager = new ParserWorkflowManager();
+        manager.init();
+        manager.runConsumer();
+    }
+
     private void init() throws Exception {
         super.initComponents();
     }
@@ -87,7 +93,7 @@
             List<ParsingTemplate> parsingTemplates = registryClient.getParsingTemplatesForExperiment(completionMessage.getExperimentId(),
                     completionMessage.getGatewayId());
 
-            logger.info("Found " + parsingTemplates.size() + " parsing templated for experiment " + completionMessage.getExperimentId());
+            logger.info("Found " + parsingTemplates.size() + " parsing template for experiment " + completionMessage.getExperimentId());
 
             Map<String, Map<String, Set<ParserConnector>>> parentToChildParsers = new HashMap<>();
 
@@ -117,20 +123,24 @@
             for (ParsingTemplate template : parsingTemplates) {
 
                 logger.info("Launching parsing template " + template.getId());
-                String parentParserId = null;
-                for (String parentId : parentToChildParsers.get(template.getId()).keySet()) {
-                    boolean found = false;
-                    for (Set<ParserConnector> dagElements : parentToChildParsers.get(template.getId()).values()) {
-                        Optional<ParserConnector> first = dagElements.stream().filter(dagElement -> dagElement.getChildParserId().equals(parentId)).findFirst();
-                        if (first.isPresent()) {
-                            found = true;
+                ParserInput parserInput = registryClient.getParserInput(template.getInitialInputs().get(0).getTargetInputId(), template.getGatewayId());
+                String parentParserId = parserInput.getParserId();
+
+                if (!parentToChildParsers.isEmpty()) {
+                    for (String parentId : parentToChildParsers.get(template.getId()).keySet()) {
+                        boolean found = false;
+                        for (Set<ParserConnector> dagElements : parentToChildParsers.get(template.getId()).values()) {
+                            Optional<ParserConnector> first = dagElements.stream().filter(dagElement -> dagElement.getChildParserId().equals(parentId)).findFirst();
+                            if (first.isPresent()) {
+                                found = true;
+                                break;
+                            }
+                        }
+                        if (!found) {
+                            parentParserId = parentId;
                             break;
                         }
                     }
-                    if (!found) {
-                        parentParserId = parentId;
-                        break;
-                    }
                 }
 
                 if (parentParserId == null ) {
@@ -143,8 +153,10 @@
 
                 List<AbstractTask> allTasks = new ArrayList<>();
                 allTasks.add(parentParserTask);
-                createParserDagRecursively(allTasks, parentParser, parentParserTask, parentToChildParsers.get(template.getId()), completionMessage, registryClient);
 
+                if (parentToChildParsers.containsKey(template.getId())) {
+                    createParserDagRecursively(allTasks, parentParser, parentParserTask, parentToChildParsers.get(template.getId()), completionMessage, registryClient);
+                }
                 String workflow = getWorkflowOperator().launchWorkflow("Parser-" + completionMessage.getProcessId() + UUID.randomUUID().toString(),
                     allTasks, true, false);
                 // TODO: figure out processId and register
@@ -200,9 +212,14 @@
                 String applicationOutputName = templateInput.getApplicationOutputName();
                 try {
                     ExperimentModel experiment = registryClient.getExperiment(completionMessage.getExperimentId());
-                    Optional<OutputDataObjectType> expOutputData = experiment.getExperimentOutputs().stream()
-                            .filter(outputDataObjectType -> outputDataObjectType.getName().equals(applicationOutputName)).findFirst();
-
+                    Optional<OutputDataObjectType> expOutputData;
+                    if (applicationOutputName.contains("*")) {
+                        expOutputData = experiment.getExperimentOutputs().stream()
+                                .filter(outputDataObjectType -> isWildcardMatch(outputDataObjectType.getName(),applicationOutputName)).findFirst();
+                    } else {
+                        expOutputData = experiment.getExperimentOutputs().stream()
+                                .filter(outputDataObjectType -> outputDataObjectType.getName().equals(applicationOutputName)).findFirst();
+                    }
                     if (expOutputData.isPresent()) {
                         input.setValue(expOutputData.get().getValue());
                     } else {
@@ -234,20 +251,60 @@
         return parsingTask;
     }
 
-    private String processExpression(String expression, ProcessCompletionMessage completionMessage) {
-        if (expression != null) {
-            if (expression.startsWith("{{") && expression.endsWith("}}")) {
-                switch (expression) {
-                    case "{{experimentId}}":
-                        return completionMessage.getExperimentId();
-                    case "{{processId}}":
-                        return completionMessage.getProcessId();
-                    case "{{gateway}}":
-                        return completionMessage.getGatewayId();
-                }
+    private boolean isWildcardMatch(String s, String p) {
+        int i = 0;
+        int j = 0;
+        int starIndex = -1;
+        int iIndex = -1;
+
+        while (i < s.length()) {
+            if (j < p.length() && (p.charAt(j) == '?' || p.charAt(j) == s.charAt(i))) {
+                ++i;
+                ++j;
+            } else if (j < p.length() && p.charAt(j) == '*') {
+                starIndex = j;
+                iIndex = i;
+                j++;
+            } else if (starIndex != -1) {
+                j = starIndex + 1;
+                i = iIndex+1;
+                iIndex++;
+            } else {
+                return false;
             }
         }
-        return expression;
+        while (j < p.length() && p.charAt(j) == '*') {
+            ++j;
+        }
+        return j == p.length();
+    }
+
+    private String processExpression(String expression, ProcessCompletionMessage completionMessage) throws Exception {
+        RegistryService.Client registryClient = getRegistryClientPool().getResource();
+
+        try {
+            if (expression != null) {
+                if (expression.startsWith("{{") && expression.endsWith("}}")) {
+                    switch (expression) {
+                        case "{{experiment}}":
+                            return completionMessage.getExperimentId();
+                        case "{{process}}":
+                            return completionMessage.getProcessId();
+                        case "{{gateway}}":
+                            return completionMessage.getGatewayId();
+                        case "{{user}}":
+                            return registryClient.getProcess(completionMessage.getProcessId()).getUserName();
+                        case "{{project}}":
+                            return registryClient.getExperiment(completionMessage.getExperimentId()).getProjectId();
+                    }
+                }
+            }
+            getRegistryClientPool().returnResource(registryClient);
+            return expression;
+        } catch (Exception e) {
+            getRegistryClientPool().returnBrokenResource(registryClient);
+            throw new Exception("Failed to resolve expression " + expression, e);
+        }
     }
 
     private void createParserDagRecursively(List<AbstractTask> allTasks, Parser parentParserInfo, DataParsingTask parentTask, Map<String, Set<ParserConnector>> parentToChild,
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
index dea7d39..f3b9dea 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
@@ -55,12 +55,15 @@
 import org.slf4j.LoggerFactory;
 
 import java.util.*;
+import java.util.concurrent.*;
 import java.util.stream.Collectors;
 
 public class PostWorkflowManager extends WorkflowManager {
 
     private final static Logger logger = LoggerFactory.getLogger(PostWorkflowManager.class);
 
+    private ExecutorService processingPool = Executors.newFixedThreadPool(10);
+
     public PostWorkflowManager() throws ApplicationSettingsException {
         super(ServerSettings.getSetting("post.workflow.manager.name"),
                 Boolean.parseBoolean(ServerSettings.getSetting("post.workflow.manager.loadbalance.clusters")));
@@ -77,6 +80,7 @@
         props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
         props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JobStatusResultDeserializer.class.getName());
         props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");
+        props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 20);
         // Create the consumer using props.
         final Consumer<String, JobStatusResult> consumer = new KafkaConsumer<>(props);
         // Subscribe to the topic.
@@ -302,22 +306,39 @@
         new Thread(() -> {
 
             while (true) {
+
                 final ConsumerRecords<String, JobStatusResult> consumerRecords = consumer.poll(Long.MAX_VALUE);
+                CompletionService<Boolean> executorCompletionService= new ExecutorCompletionService<>(processingPool);
+                List<Future<Boolean>> processingFutures = new ArrayList<>();
 
                 for (TopicPartition partition : consumerRecords.partitions()) {
                     List<ConsumerRecord<String, JobStatusResult>> partitionRecords = consumerRecords.records(partition);
+                    logger.info("Received job records {}", partitionRecords.size());
+
                     for (ConsumerRecord<String, JobStatusResult> record : partitionRecords) {
-                        boolean success = process(record.value());
-                        logger.info("Status of processing " + record.value().getJobId() + " : " + success);
-                        if (success) {
-                            consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(record.offset() + 1)));
-                        }
+                        logger.info("Submitting {} to process in thread pool", record.value().getJobId());
+
+                        // This avoids kafka read thread to wait until processing is completed before committing
+                        // There is a risk of missing 20 messages in case of a restart but this improves the robustness
+                        // of the kafka read thread by avoiding wait timeouts
+                        processingFutures.add(executorCompletionService.submit(() -> {
+                            boolean success = process(record.value());
+                            logger.info("Status of processing " + record.value().getJobId() + " : " + success);
+                            return success;
+                        }));
+
+                        consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(record.offset() + 1)));
                     }
                 }
 
-                consumerRecords.forEach(record -> process(record.value()));
-
-                consumer.commitAsync();
+                for (Future<Boolean> f: processingFutures) {
+                    try {
+                        executorCompletionService.take().get();
+                    } catch (Exception e) {
+                        logger.error("Failed processing job", e);
+                    }
+                }
+                logger.info("All messages processed. Moving to next round");
             }
         }).start();
     }
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
index a7de7ad..9423854 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
@@ -160,22 +160,28 @@
         }
 
         String experimentId = processModel.getExperimentId();
-
-        List<String> workflows = processModel.getProcessWorkflows().stream().map(ProcessWorkflow::getWorkflowId).collect(Collectors.toList());
         final List<AbstractTask> allTasks = new ArrayList<>();
-        if (workflows != null && workflows.size() > 0) {
-            for (String wf : workflows) {
-                logger.info("Creating cancellation task for workflow " + wf + " of process " + processId);
-                WorkflowCancellationTask wfct = new WorkflowCancellationTask();
-                wfct.setTaskId(UUID.randomUUID().toString());
-                wfct.setCancellingWorkflowName(wf);
 
-                if (allTasks.size() > 0) {
-                    allTasks.get(allTasks.size() -1).setNextTask(new OutPort(wfct.getTaskId(), wfct));
+        Optional<List<String>> workflowsOpt = Optional.ofNullable(processModel.getProcessWorkflows()).map(wfs -> wfs.stream().map(ProcessWorkflow::getWorkflowId).collect(Collectors.toList()));
+
+        if (workflowsOpt.isPresent()) {
+            List<String> workflows = workflowsOpt.get();
+            if (workflows.size() > 0) {
+                for (String wf : workflows) {
+                    logger.info("Creating cancellation task for workflow " + wf + " of process " + processId);
+                    WorkflowCancellationTask wfct = new WorkflowCancellationTask();
+                    wfct.setTaskId(UUID.randomUUID().toString());
+                    wfct.setCancellingWorkflowName(wf);
+
+                    if (allTasks.size() > 0) {
+                        allTasks.get(allTasks.size() - 1).setNextTask(new OutPort(wfct.getTaskId(), wfct));
+                    }
+                    allTasks.add(wfct);
                 }
-                allTasks.add(wfct);
-            }
 
+            } else {
+                logger.warn("No workflow registered with process " + processId + " to cancel");
+            }
         } else {
             logger.warn("No workflow registered with process " + processId + " to cancel");
         }
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
index ac21d2e..48eb3aa 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
@@ -17,7 +17,7 @@
 import org.apache.airavata.model.status.ProcessState;
 import org.apache.airavata.model.status.ProcessStatus;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -98,14 +98,16 @@
     }
     private void initRegistryClientPool() throws ApplicationSettingsException {
 
-        GenericObjectPool.Config poolConfig = new GenericObjectPool.Config();
-        poolConfig.maxActive = 100;
-        poolConfig.minIdle = 5;
-        poolConfig.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
-        poolConfig.testOnBorrow = true;
-        poolConfig.testWhileIdle = true;
-        poolConfig.numTestsPerEvictionRun = 10;
-        poolConfig.maxWait = 3000;
+        GenericObjectPoolConfig<RegistryService.Client> poolConfig = new GenericObjectPoolConfig<>();
+        poolConfig.setMaxTotal(100);
+        poolConfig.setMinIdle(5);
+        poolConfig.setBlockWhenExhausted(true);
+        poolConfig.setTestOnBorrow(true);
+        poolConfig.setTestWhileIdle(true);
+        // must set timeBetweenEvictionRunsMillis since eviction doesn't run unless that is positive
+        poolConfig.setTimeBetweenEvictionRunsMillis(5L * 60L * 1000L);
+        poolConfig.setNumTestsPerEvictionRun(10);
+        poolConfig.setMaxWaitMillis(3000);
 
         this.registryClientPool = new ThriftClientPool<>(
                 RegistryService.Client::new, poolConfig, ServerSettings.getRegistryServerHost(),
diff --git a/modules/airavata-helix/platform-monitor/pom.xml b/modules/airavata-helix/platform-monitor/pom.xml
index 2b8c5ca..9b850c0 100644
--- a/modules/airavata-helix/platform-monitor/pom.xml
+++ b/modules/airavata-helix/platform-monitor/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <artifactId>airavata-helix</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -13,7 +13,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>helix-spectator</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>javax.mail</groupId>
diff --git a/modules/airavata-helix/pom.xml b/modules/airavata-helix/pom.xml
index a65335a..b878d2e 100644
--- a/modules/airavata-helix/pom.xml
+++ b/modules/airavata-helix/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <artifactId>airavata</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <packaging>pom</packaging>
-    <version>0.19-SNAPSHOT</version>
+    <version>0.20-SNAPSHOT</version>
     <modelVersion>4.0.0</modelVersion>
     <name>Airavata Helix</name>
     <artifactId>airavata-helix</artifactId>
diff --git a/modules/airavata-helix/task-api/pom.xml b/modules/airavata-helix/task-api/pom.xml
index 7636c7a..791db13 100644
--- a/modules/airavata-helix/task-api/pom.xml
+++ b/modules/airavata-helix/task-api/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata-helix</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -50,7 +50,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>agent-api</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/modules/airavata-helix/task-core/pom.xml b/modules/airavata-helix/task-core/pom.xml
index 2143d6a..e4745bf 100644
--- a/modules/airavata-helix/task-core/pom.xml
+++ b/modules/airavata-helix/task-core/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata-helix</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -35,17 +35,17 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>task-api</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>agent-api</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>sshj-agent</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/modules/airavata-helix/workflow-impl/pom.xml b/modules/airavata-helix/workflow-impl/pom.xml
index 1acc3b9..ae5a269 100644
--- a/modules/airavata-helix/workflow-impl/pom.xml
+++ b/modules/airavata-helix/workflow-impl/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata-helix</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -35,12 +35,12 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>task-core</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>task-api</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/modules/cluster-monitoring/pom.xml b/modules/cluster-monitoring/pom.xml
index 937dfb4..bbbd0ae 100644
--- a/modules/cluster-monitoring/pom.xml
+++ b/modules/cluster-monitoring/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/modules/commons/pom.xml b/modules/commons/pom.xml
index 68fedfc..f76d193 100644
--- a/modules/commons/pom.xml
+++ b/modules/commons/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
@@ -57,6 +57,10 @@
             <version>1.4</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
@@ -100,11 +104,12 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
         </dependency>
         <dependency>
             <groupId>net.sf.dozer</groupId>
             <artifactId>dozer</artifactId>
-            <version>5.4.0</version>
+            <version>${dozer.version}</version>
             <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
@@ -129,6 +134,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.jmockit</groupId>
+            <artifactId>jmockit</artifactId>
+            <version>${jmockit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-framework</artifactId>
             <version>${curator.version}</version>
@@ -158,6 +169,16 @@
             <artifactId>airavata-base-api</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+            <version>${jaxb.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>custos-java-sdk</artifactId>
+            <version>${org.apache.custos.version}</version>
+        </dependency>
     </dependencies>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/AiravataUtils.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/AiravataUtils.java
index 21292b5..fc61153 100644
--- a/modules/commons/src/main/java/org/apache/airavata/common/utils/AiravataUtils.java
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/AiravataUtils.java
@@ -39,7 +39,7 @@
     }
 
     public static String getId (String name){
-        String id = name.trim().replaceAll("\\s|\\.", "_");
+        String id = name.trim().replaceAll("\\s|\\.|/|\\\\", "_");
         return id + "_" + UUID.randomUUID();
     }
 }
diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java
index 036d6bf..f78b196 100644
--- a/modules/commons/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java
@@ -52,6 +52,10 @@
     private final static Logger logger = LoggerFactory.getLogger(ApplicationSettings.class);
 
     private static final String SHUTDOWN_STATEGY_STRING="shutdown.strategy";
+
+    // ThriftClientPool Constants
+    private static final String THRIFT_CLIENT_POOL_ABANDONED_REMOVAL_ENABLED = "thrift.client.pool.abandoned.removal.enabled";
+    private static final String THRIFT_CLIENT_POOL_ABANDONED_REMOVAL_LOGGED = "thrift.client.pool.abandoned.removal.logged";
     
     protected static ApplicationSettings INSTANCE;
     public static enum ShutdownStrategy{
@@ -435,6 +439,14 @@
         return getSetting(ServerSettings.IAM_SERVER_URL);
     }
 
+    public static boolean isThriftClientPoolAbandonedRemovalEnabled() {
+        return Boolean.valueOf(getSetting(THRIFT_CLIENT_POOL_ABANDONED_REMOVAL_ENABLED, "false"));
+    }
+
+    public static boolean isThriftClientPoolAbandonedRemovalLogged() {
+        return Boolean.valueOf(getSetting(THRIFT_CLIENT_POOL_ABANDONED_REMOVAL_LOGGED, "false"));
+    }
+
     /**
      * @deprecated use {{@link #getSetting(String)}}
      * @return
diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/Constants.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/Constants.java
index 8820d45..cfddd35 100644
--- a/modules/commons/src/main/java/org/apache/airavata/common/utils/Constants.java
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/Constants.java
@@ -65,8 +65,12 @@
     public static final String EMAIL = "email";
     public static final String ROLE = "role";
 
+    public static final String CUSTOS_ID = "custosId";
+
     public static final String TRUSTED_CERT_LOCATION = "trusted.cert.location";
     public static final String TRUSTED_CERTIFICATE_SYSTEM_PROPERTY = "X509_CERT_DIR";
 
     public static final String NEWLINE = System.getProperty("line.separator");
+
+    public static final String ENABLE_STREAMING_TRANSFER = "enable.streaming.transfer";
 }
diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/CustosToAiravataDataModelMapper.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/CustosToAiravataDataModelMapper.java
new file mode 100644
index 0000000..e885819
--- /dev/null
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/CustosToAiravataDataModelMapper.java
@@ -0,0 +1,128 @@
+package org.apache.airavata.common.utils;
+
+import jdk.dynalink.beans.StaticClass;
+import org.apache.airavata.model.credential.store.CredentialSummary;
+import org.apache.airavata.model.credential.store.SSHCredential;
+import org.apache.airavata.model.credential.store.SummaryType;
+import org.apache.airavata.model.user.Status;
+import org.apache.airavata.model.user.UserProfile;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.GatewayApprovalStatus;
+import org.apache.custos.iam.service.UserRepresentation;
+import org.apache.custos.resource.secret.service.ResourceSecretType;
+import org.apache.custos.resource.secret.service.SecretMetadata;
+import org.apache.custos.tenant.profile.service.Tenant;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A class responsible for map Airavarta data model to Custos data model
+ */
+public class CustosToAiravataDataModelMapper {
+    private final static Logger logger = LoggerFactory.getLogger(CustosToAiravataDataModelMapper.class);
+
+
+    public static UserProfile transform(UserRepresentation custosUserProfile, String gatewayId) {
+        UserProfile userProfile = new UserProfile();
+        userProfile.setUserId(custosUserProfile.getUsername());
+        userProfile.setFirstName(custosUserProfile.getFirstName());
+        userProfile.setAiravataInternalUserId(custosUserProfile.getUsername());
+        userProfile.setLastName(custosUserProfile.getLastName());
+        userProfile.setCreationTime(Double.valueOf(custosUserProfile.getCreationTime()).longValue());
+        userProfile.setLastAccessTime(Double.valueOf(custosUserProfile.getLastLoginAt()).longValue());
+        userProfile.setValidUntil(-1);
+        List<String> emails = new ArrayList<>();
+        emails.add(custosUserProfile.getEmail());
+        userProfile.setEmails(emails);
+        userProfile.setGatewayId(gatewayId);
+        if (custosUserProfile.getState().equals(Status.ACTIVE.name())) {
+            userProfile.setState(Status.ACTIVE);
+        } else {
+            userProfile.setState(Status.PENDING_CONFIRMATION);
+        }
+        return userProfile;
+
+    }
+
+
+    public static UserProfile transform(org.apache.custos.user.profile.service.UserProfile custosUserProfile, String gatewayId) throws ParseException {
+        UserProfile userProfile = new UserProfile();
+        userProfile.setUserId(custosUserProfile.getUsername());
+        userProfile.setFirstName(custosUserProfile.getFirstName());
+        userProfile.setAiravataInternalUserId(custosUserProfile.getUsername());
+        userProfile.setLastName(custosUserProfile.getLastName());
+        userProfile.setCreationTime(custosUserProfile.getCreatedAt());
+        userProfile.setLastAccessTime(custosUserProfile.getLastModifiedAt());
+        userProfile.setValidUntil(-1);
+        List<String> emails = new ArrayList<>();
+        emails.add(custosUserProfile.getEmail());
+        userProfile.setEmails(emails);
+        userProfile.setGatewayId(gatewayId);
+        if (custosUserProfile.getStatus().equals(Status.ACTIVE.name())) {
+            userProfile.setState(Status.ACTIVE);
+        } else {
+            userProfile.setState(Status.PENDING_CONFIRMATION);
+        }
+        return userProfile;
+
+    }
+
+    public static CredentialSummary transform(SecretMetadata secretMetadata, String gatewayId) throws ParseException {
+        CredentialSummary credentialSummary = new CredentialSummary();
+        credentialSummary.setDescription(secretMetadata.getDescription());
+        credentialSummary.setGatewayId(gatewayId);
+        credentialSummary.setToken(secretMetadata.getToken());
+        credentialSummary.setPersistedTime(secretMetadata.getPersistedTime());
+        credentialSummary.setUsername(secretMetadata.getOwnerId());
+
+        if (secretMetadata.getType().equals(ResourceSecretType.PASSWORD)) {
+            credentialSummary.setType(SummaryType.PASSWD);
+
+        } else if (secretMetadata.getType().equals(ResourceSecretType.SSH)) {
+            credentialSummary.setType(SummaryType.SSH);
+        } else {
+            credentialSummary.setType(SummaryType.CERT);
+        }
+        return credentialSummary;
+    }
+
+    public static SSHCredential transform(org.apache.custos.resource.secret.service.SSHCredential sshCredential,
+                                          String gatewayId) {
+
+        SSHCredential sshCredential1 = new SSHCredential();
+        sshCredential1.setGatewayId(gatewayId);
+        sshCredential1.setPrivateKey(sshCredential.getPrivateKey());
+        sshCredential1.setPublicKey(sshCredential.getPublicKey());
+        sshCredential1.setPassphrase(sshCredential.getPassphrase());
+        sshCredential1.setPersistedTime(sshCredential.getMetadata().getPersistedTime());
+        sshCredential1.setUsername(sshCredential.getMetadata().getOwnerId());
+        sshCredential1.setDescription(sshCredential.getMetadata().getDescription());
+        sshCredential1.setToken(sshCredential.getMetadata().getToken());
+
+        return sshCredential1;
+
+    }
+
+
+    public static Gateway transform(Tenant tenant, String gatewayId, String internalId) {
+        Gateway gateway = new Gateway();
+        gateway.setOauthClientId(tenant.getClientId());
+        gateway.setEmailAddress(tenant.getAdminEmail());
+        gateway.setDomain(tenant.getDomain());
+        gateway.setGatewayAdminFirstName(tenant.getAdminFirstName());
+        gateway.setGatewayAdminLastName(tenant.getAdminLastName());
+        gateway.setAiravataInternalGatewayId(internalId);
+        gateway.setGatewayId(gatewayId);
+        gateway.setGatewayURL(tenant.getClientUri());
+        gateway.setScope(tenant.getScope());
+        gateway.setGatewayApprovalStatus(GatewayApprovalStatus.valueOf(tenant.getTenantStatus().name()));
+        gateway.setRedirectURLs(tenant.getRedirectUrisList());
+        gateway.setRequesterUsername(tenant.getRequesterEmail());
+        return gateway;
+
+    }
+}
diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/CustosUtils.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/CustosUtils.java
new file mode 100644
index 0000000..fae18d3
--- /dev/null
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/CustosUtils.java
@@ -0,0 +1,29 @@
+package org.apache.airavata.common.utils;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.custos.clients.CustosClientProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+public class CustosUtils {
+
+    private final static Logger logger = LoggerFactory.getLogger(CustosUtils.class);
+
+    public static CustosClientProvider getCustosClientProvider() throws ApplicationSettingsException, IOException {
+        try {
+
+            return new CustosClientProvider.Builder()
+                    .setServerHost(ServerSettings.getCustosServerHost())
+                    .setServerPort(ServerSettings.getCustosServerPort())
+                    .setClientId(ServerSettings.getCustosClientId())
+                    .setClientSec(ServerSettings.getCustosClientSec()).build();
+
+        } catch (ApplicationSettingsException e) {
+            logger.error("Failed to create Custos client provider", e);
+            throw e;
+        }
+
+    }
+}
diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/DBEventService.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/DBEventService.java
index 626fc9f..b700720 100644
--- a/modules/commons/src/main/java/org/apache/airavata/common/utils/DBEventService.java
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/DBEventService.java
@@ -28,7 +28,8 @@
     USER_PROFILE("user.profile"),
     SHARING("sharing"),
     REGISTRY("registry"),
-    TENANT("tenant");
+    TENANT("tenant"),
+    IAM_ADMIN("iam.admin");
 
     private final String name;
     DBEventService(String name) {
diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/JPAUtils.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/JPAUtils.java
index 49c0686..6ec2b67 100644
--- a/modules/commons/src/main/java/org/apache/airavata/common/utils/JPAUtils.java
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/JPAUtils.java
@@ -24,6 +24,9 @@
         properties.put("openjpa.RuntimeUnenhancedClasses", "unsupported");
         properties.put("openjpa.RemoteCommitProvider", "sjvm");
         properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO, SQL=INFO");
+        // use the following to enable logging of all SQL statements
+        // properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO,
+        // SQL=TRACE");
         properties.put("openjpa.jdbc.SynchronizeMappings", "validate");
         properties.put("openjpa.jdbc.QuerySQLCache", "false");
         properties.put("openjpa.DetachState", "all");
@@ -34,23 +37,27 @@
 
     /**
      * Create an {@link EntityManagerFactory} with the default settings.
+     * 
      * @param persistenceUnitName
      * @param jdbcConfig
      * @return {@link EntityManagerFactory}
      */
-    public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig){
+    public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig) {
 
         return getEntityManagerFactory(persistenceUnitName, jdbcConfig, Collections.emptyMap());
     }
 
     /**
-     * Create an {@link EntityManagerFactory}. The given properties will override the default properties.
+     * Create an {@link EntityManagerFactory}. The given properties will override
+     * the default properties.
+     * 
      * @param persistenceUnitName
      * @param jdbcConfig
      * @param properties
      * @return {@link EntityManagerFactory}
      */
-    public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig, Map<String, String> properties) {
+    public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig,
+            Map<String, String> properties) {
 
         Map<String, String> finalProperties = new HashMap<>(DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES);
         finalProperties.putAll(createConnectionProperties(jdbcConfig));
@@ -58,7 +65,7 @@
         return Persistence.createEntityManagerFactory(persistenceUnitName, finalProperties);
     }
 
-    private static Map<String, String> createConnectionProperties(JDBCConfig jdbcConfig) {
+    public static Map<String, String> createConnectionProperties(JDBCConfig jdbcConfig) {
         String connectionProperties = "DriverClassName=" + jdbcConfig.getDriver() + "," + "Url=" + jdbcConfig.getURL()
                 + "?autoReconnect=true," + "Username=" + jdbcConfig.getUser() + "," + "Password="
                 + jdbcConfig.getPassword() + ",validationQuery=" + jdbcConfig.getValidationQuery();
diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/ServerSettings.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/ServerSettings.java
index e8ff43f..75bd447 100644
--- a/modules/commons/src/main/java/org/apache/airavata/common/utils/ServerSettings.java
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/ServerSettings.java
@@ -1,5 +1,4 @@
 /**
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -7,9 +6,9 @@
  * to you 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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
@@ -35,6 +34,7 @@
     private static final String DEFAULT_USER = "default.registry.user";
     private static final String DEFAULT_USER_PASSWORD = "default.registry.password";
     private static final String DEFAULT_USER_GATEWAY = "default.registry.gateway";
+    private static final String DEFAULT_GATEWAY_CUSTOS_CLIENT_ID = "default.gateway.custos.id";
     private static final String ENABLE_SHARING = "enable.sharing";
 
     public static final String IP = "ip";
@@ -64,10 +64,10 @@
 
     // Aurora Scheduler Constants
     public static final String AURORA_SCHEDULER_HOSTS = "aurora.scheduler.hosts";
-	public static final String AURORA_EXECUTOR_NAME = "aurora.executor.name";
-	public static final String MESOS_CLUSTER_NAME = "mesos.cluster.name";
-	public static final String AURORA_SCHEDULER_CONNECT_TIMEOUT_MS = "aurora.scheduler.timeoutms";
-	public static final String AURORA_EXECUTOR_CONFIG_TEMPLATE_FILE = "aurora.executor.config.template.filename";
+    public static final String AURORA_EXECUTOR_NAME = "aurora.executor.name";
+    public static final String MESOS_CLUSTER_NAME = "mesos.cluster.name";
+    public static final String AURORA_SCHEDULER_CONNECT_TIMEOUT_MS = "aurora.scheduler.timeoutms";
+    public static final String AURORA_EXECUTOR_CONFIG_TEMPLATE_FILE = "aurora.executor.config.template.filename";
 
     private static final String CREDENTIAL_STORE_DB_URL = "credential.store.jdbc.url";
     private static final String CREDENTIAL_STORE_DB_USER = "credential.store.jdbc.user";
@@ -97,8 +97,8 @@
     public static final String RABBITMQ_EXPERIMENT_EXCHANGE_NAME = "rabbitmq.experiment.exchange.name";
     public static final String RABBITMQ_PROCESS_LAUNCH_QUEUE_NAME = "process.launch.queue.name";
     public static final String RABBITMQ_EXPERIMENT_LAUNCH_QUEUE_NAME = "experiment.launch.queue.name";
-    public static final String RABBITMQ_DURABLE_QUEUE="durable.queue";
-    public static final String RABBITMQ_PREFETCH_COUNT="prefetch.count";
+    public static final String RABBITMQ_DURABLE_QUEUE = "durable.queue";
+    public static final String RABBITMQ_PREFETCH_COUNT = "prefetch.count";
 
 
     //    Workflow Enactment Service component configuration.
@@ -136,6 +136,13 @@
     public static final String IAM_SERVER_SUPER_ADMIN_PASSWORD = "iam.server.super.admin.password";
 
 
+    //Custos Server Settings
+    public static final String CUSTOS_SERVER_HOST = "custos.server.host";
+    public static final String CUSTOS_SERVER_PORT = "custos.server.port";
+    public static final String CUSTOS_CLIENT_ID = "custos.client.id";
+    public static final String CUSTOS_CLIENT_SEC = "custos.client.sec";
+
+
     /* Caching */
     private static final String SESSION_CACHE_ACCESS_TIME_OUT = "ssh.session.cache.access.timeout";
 
@@ -162,11 +169,11 @@
         return getSetting(RABBITMQ_BROKER_URL, "amqp://localhost:5672");
     }
 
-    public static String getRabbitmqStatusExchangeName(){
+    public static String getRabbitmqStatusExchangeName() {
         return getSetting(RABBITMQ_STATUS_EXCHANGE_NAME, "status_exchange");
     }
 
-    public static String getRabbitmqProcessExchangeName(){
+    public static String getRabbitmqProcessExchangeName() {
         return getSetting(RABBITMQ_PROCESS_EXCHANGE_NAME, "process_exchange");
     }
 
@@ -174,11 +181,11 @@
         return getSetting(RABBITMQ_EXPERIMENT_EXCHANGE_NAME, "experiment_exchange");
     }
 
-    public static boolean getRabbitmqDurableQueue(){
+    public static boolean getRabbitmqDurableQueue() {
         return Boolean.valueOf(getSetting(RABBITMQ_DURABLE_QUEUE, "false"));
     }
 
-    public static int getRabbitmqPrefetchCount(){
+    public static int getRabbitmqPrefetchCount() {
         return Integer.valueOf(getSetting(RABBITMQ_PREFETCH_COUNT, "200"));
     }
 
@@ -231,11 +238,11 @@
         }
     }
 
-    public static String getApiServerKeystorePasswd() throws ApplicationSettingsException{
+    public static String getApiServerKeystorePasswd() throws ApplicationSettingsException {
         return getSetting(API_SERVER_KEYSTORE_PASSWD);
     }
 
-    public static String getApiServerKeystore() throws ApplicationSettingsException{
+    public static String getApiServerKeystore() throws ApplicationSettingsException {
         return getSetting(API_SERVER_KEYSTORE);
     }
 
@@ -348,6 +355,28 @@
         return getSetting(ServerSettings.IAM_SERVER_SUPER_ADMIN_PASSWORD);
     }
 
+
+    public static String getCustosServerHost() throws ApplicationSettingsException {
+        return getSetting(ServerSettings.CUSTOS_SERVER_HOST);
+    }
+
+    public static int getCustosServerPort() throws ApplicationSettingsException {
+        return Integer.parseInt(getSetting(ServerSettings.CUSTOS_SERVER_PORT));
+    }
+
+    public static String getCustosClientId() throws ApplicationSettingsException {
+        return getSetting(ServerSettings.CUSTOS_CLIENT_ID);
+    }
+
+    public static String getCustosClientSec() throws ApplicationSettingsException {
+        return getSetting(ServerSettings.CUSTOS_CLIENT_SEC);
+    }
+
+    public static String getDefaultGatewayCustosClientId() throws ApplicationSettingsException {
+        return getSetting(ServerSettings.DEFAULT_GATEWAY_CUSTOS_CLIENT_ID);
+    }
+
+
     public static String getAuthorizationPoliyName() throws ApplicationSettingsException {
         return getSetting(Constants.AUTHORIZATION_POLICY_NAME);
     }
@@ -447,6 +476,7 @@
     public static Boolean isEnableSharing() throws ApplicationSettingsException {
         return Boolean.parseBoolean(getSetting(ENABLE_SHARING));
     }
+
     public static boolean isRunningOnAws() {
         return Boolean.valueOf(getSetting(IS_RUNNING_ON_AWS, "false"));
     }
@@ -470,25 +500,25 @@
     public static String[] getServerRoles() {
         return listConfigurations.get(SERVER_ROLES);
     }
-    
+
     public static String getAuroraSchedulerHosts() throws ApplicationSettingsException {
-    	return getSetting(AURORA_SCHEDULER_HOSTS);
+        return getSetting(AURORA_SCHEDULER_HOSTS);
     }
-    
+
     public static String getMesosClusterName() throws ApplicationSettingsException {
-    	return getSetting(MESOS_CLUSTER_NAME);
+        return getSetting(MESOS_CLUSTER_NAME);
     }
-    
+
     public static String getAuroraExecutorName() throws ApplicationSettingsException {
-    	return getSetting(AURORA_EXECUTOR_NAME);
+        return getSetting(AURORA_EXECUTOR_NAME);
     }
-    
+
     public static String getAuroraExecutorConfigTemplateFileName() throws ApplicationSettingsException {
-    	return getSetting(AURORA_EXECUTOR_CONFIG_TEMPLATE_FILE);
+        return getSetting(AURORA_EXECUTOR_CONFIG_TEMPLATE_FILE);
     }
-    
+
     public static int getAuroraSchedulerTimeout() throws ApplicationSettingsException {
-    	return Integer.valueOf(getSetting(AURORA_SCHEDULER_CONNECT_TIMEOUT_MS));
+        return Integer.valueOf(getSetting(AURORA_SCHEDULER_CONNECT_TIMEOUT_MS));
     }
 
     public static int getSessionCacheAccessTimeout() {
@@ -502,4 +532,8 @@
     public static String getSharingRegistryHost() {
         return getSetting(SHARING_REGISTRY_HOST, "localhost");
     }
+
+    public static Boolean isSteamingEnabled() {
+        return Boolean.valueOf(getSetting(Constants.ENABLE_STREAMING_TRANSFER, "True"));
+    }
 }
diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/ThriftClientPool.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/ThriftClientPool.java
index 43dd926..1cbfee6 100644
--- a/modules/commons/src/main/java/org/apache/airavata/common/utils/ThriftClientPool.java
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/ThriftClientPool.java
@@ -19,9 +19,16 @@
  */
 package org.apache.airavata.common.utils;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
 import org.apache.airavata.base.api.BaseAPI;
-import org.apache.commons.pool.BasePoolableObjectFactory;
-import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.commons.pool2.BasePooledObjectFactory;
+import org.apache.commons.pool2.PooledObject;
+import org.apache.commons.pool2.impl.AbandonedConfig;
+import org.apache.commons.pool2.impl.DefaultPooledObject;
+import org.apache.commons.pool2.impl.GenericObjectPool;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.transport.TSocket;
@@ -34,44 +41,83 @@
 
     private static final Logger logger = LoggerFactory.getLogger(ThriftClientPool.class);
 
-    private final GenericObjectPool internalPool;
+    private final GenericObjectPool<T> internalPool;
 
-    public ThriftClientPool(ClientFactory<T> clientFactory,
-                            GenericObjectPool.Config poolConfig, String host, int port) {
-        this(clientFactory, new BinaryOverSocketProtocolFactory(host, port),
-                poolConfig);
+    /**
+     * StringWriter that flushes to SLF4J logger.
+     */
+    private static class ErrorLoggingStringWriter extends StringWriter {
+
+        @Override
+        public void flush() {
+            logger.error(this.toString());
+            // Reset buffer
+            this.getBuffer().setLength(0);
+        }
     }
 
-    public ThriftClientPool(ClientFactory<T> clientFactory,
-                            ProtocolFactory protocolFactory, GenericObjectPool.Config poolConfig) {
-        this.internalPool = new GenericObjectPool(new ThriftClientFactory(
-                clientFactory, protocolFactory), poolConfig);
+    public ThriftClientPool(ClientFactory<T> clientFactory, GenericObjectPoolConfig<T> poolConfig, String host,
+            int port) {
+        this(clientFactory, new BinaryOverSocketProtocolFactory(host, port), poolConfig);
     }
 
-    class ThriftClientFactory extends BasePoolableObjectFactory {
+    public ThriftClientPool(ClientFactory<T> clientFactory, ProtocolFactory protocolFactory,
+            GenericObjectPoolConfig<T> poolConfig) {
+
+        AbandonedConfig abandonedConfig = null;
+        if (ApplicationSettings.isThriftClientPoolAbandonedRemovalEnabled()) {
+            abandonedConfig = new AbandonedConfig();
+            abandonedConfig.setRemoveAbandonedOnBorrow(true);
+            abandonedConfig.setRemoveAbandonedOnMaintenance(true);
+            if (ApplicationSettings.isThriftClientPoolAbandonedRemovalLogged()) {
+                abandonedConfig.setLogAbandoned(true);
+                abandonedConfig.setLogWriter(new PrintWriter(new ErrorLoggingStringWriter()));
+            } else {
+                abandonedConfig.setLogAbandoned(false);
+            }
+        }
+        this.internalPool = new GenericObjectPool<T>(new ThriftClientFactory(clientFactory, protocolFactory),
+                poolConfig, abandonedConfig);
+    }
+
+    public ThriftClientPool(ClientFactory<T> clientFactory, ProtocolFactory protocolFactory,
+            GenericObjectPoolConfig<T> poolConfig, AbandonedConfig abandonedConfig) {
+
+        if (abandonedConfig != null && abandonedConfig.getRemoveAbandonedOnMaintenance()
+                && poolConfig.getTimeBetweenEvictionRunsMillis() <= 0) {
+            logger.warn("Abandoned removal is enabled but"
+                    + " removeAbandonedOnMaintenance won't run since"
+                    + " timeBetweenEvictionRunsMillis is not positive, current value: {}",
+                    poolConfig.getTimeBetweenEvictionRunsMillis());
+        }
+        this.internalPool = new GenericObjectPool<T>(new ThriftClientFactory(clientFactory, protocolFactory),
+                poolConfig, abandonedConfig);
+    }
+
+    class ThriftClientFactory extends BasePooledObjectFactory<T> {
 
         private ClientFactory<T> clientFactory;
         private ProtocolFactory protocolFactory;
 
-        public ThriftClientFactory(ClientFactory<T> clientFactory,
-                                   ProtocolFactory protocolFactory) {
+        public ThriftClientFactory(ClientFactory<T> clientFactory, ProtocolFactory protocolFactory) {
             this.clientFactory = clientFactory;
             this.protocolFactory = protocolFactory;
         }
 
         @Override
-        public T makeObject() throws Exception {
+        public T create() throws Exception {
             try {
                 TProtocol protocol = protocolFactory.make();
                 return clientFactory.make(protocol);
             } catch (Exception e) {
                 logger.warn(e.getMessage(), e);
-                throw new ThriftClientException(
-                        "Can not make a new object for pool", e);
+                throw new ThriftClientException("Can not make a new object for pool", e);
             }
         }
 
-        public void destroyObject(T obj) throws Exception {
+        @Override
+        public void destroyObject(PooledObject<T> pooledObject) throws Exception {
+            T obj = pooledObject.getObject();
             if (obj.getOutputProtocol().getTransport().isOpen()) {
                 obj.getOutputProtocol().getTransport().close();
             }
@@ -79,6 +125,11 @@
                 obj.getInputProtocol().getTransport().close();
             }
         }
+
+        @Override
+        public PooledObject<T> wrap(T obj) {
+            return new DefaultPooledObject<T>(obj);
+        }
     }
 
     public static interface ClientFactory<T> {
@@ -129,7 +180,7 @@
         try {
             for( int i = 0; i < 10 ; i++) {
                 // This tries to fetch a client from the pool and validate it before returning.
-                final T client = (T) internalPool.borrowObject();
+                final T client = internalPool.borrowObject();
                 try {
                     String apiVersion = client.getAPIVersion();
                     logger.debug("Validated client and fetched api version " + apiVersion);
@@ -183,4 +234,4 @@
             throw new ThriftClientException("Could not destroy the pool", e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/commons/src/test/java/org/apache/airavata/common/utils/ThriftClientPoolTest.java b/modules/commons/src/test/java/org/apache/airavata/common/utils/ThriftClientPoolTest.java
new file mode 100644
index 0000000..1f24db8
--- /dev/null
+++ b/modules/commons/src/test/java/org/apache/airavata/common/utils/ThriftClientPoolTest.java
@@ -0,0 +1,202 @@
+package org.apache.airavata.common.utils;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.apache.airavata.base.api.BaseAPI;
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.commons.pool2.impl.AbandonedConfig;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.apache.thrift.TException;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import mockit.Expectations;
+import mockit.Mocked;
+import mockit.Verifications;
+
+public class ThriftClientPoolTest {
+
+    @Mocked
+    private BaseAPI.Client mockClient;
+
+    @Test
+    public void testWithDefaultConfig() throws TException {
+        new Expectations() {
+            {
+                mockClient.getAPIVersion();
+                result = "0.19";
+                mockClient.getInputProtocol().getTransport().isOpen();
+                result = true;
+                mockClient.getOutputProtocol().getTransport().isOpen();
+                result = true;
+            }
+        };
+
+        GenericObjectPoolConfig<BaseAPI.Client> poolConfig = new GenericObjectPoolConfig<>();
+        ThriftClientPool<BaseAPI.Client> thriftClientPool = new ThriftClientPool<>((protocol) -> mockClient, () -> null,
+                poolConfig);
+        BaseAPI.Client client = thriftClientPool.getResource();
+        thriftClientPool.returnResource(client);
+        thriftClientPool.close();
+
+        new Verifications() {
+            {
+                mockClient.getInputProtocol().getTransport().close();
+                mockClient.getOutputProtocol().getTransport().close();
+            }
+        };
+    }
+
+    @Test
+    public void testWithAbandonConfigAndAbandoned() throws TException {
+
+        new Expectations() {
+            {
+                mockClient.getAPIVersion();
+                result = "0.19";
+                mockClient.getInputProtocol().getTransport().isOpen();
+                result = true;
+                mockClient.getOutputProtocol().getTransport().isOpen();
+                result = true;
+            }
+        };
+
+        GenericObjectPoolConfig<BaseAPI.Client> poolConfig = new GenericObjectPoolConfig<>();
+        // timeBetweenEvictionRunsMillis must be positive for abandoned removal on
+        // maintenance to run
+        poolConfig.setTimeBetweenEvictionRunsMillis(1);
+        AbandonedConfig abandonedConfig = new AbandonedConfig();
+        abandonedConfig.setRemoveAbandonedTimeout(1);
+        abandonedConfig.setRemoveAbandonedOnMaintenance(true);
+        abandonedConfig.setLogAbandoned(true);
+        StringWriter log = new StringWriter();
+        Assert.assertEquals("Initial length of log is 0", 0, log.toString().length());
+        PrintWriter logWriter = new PrintWriter(log);
+        abandonedConfig.setLogWriter(logWriter);
+        ThriftClientPool<BaseAPI.Client> thriftClientPool = new ThriftClientPool<>((protocol) -> mockClient, () -> null,
+                poolConfig, abandonedConfig);
+        thriftClientPool.getResource();
+        try {
+            // Sleep long enough for the client to be considered abandoned
+            Thread.sleep(1001);
+            thriftClientPool.close();
+        } catch (InterruptedException e) {
+            Assert.fail("sleep interrupted");
+        }
+
+        Assert.assertTrue(log.toString().length() > 0);
+        // The stack trace should contain this method's name
+        Assert.assertTrue(log.toString().contains("testWithAbandonConfigAndAbandoned"));
+
+        new Verifications() {
+            {
+                // Verify client is destroyed when abandoned
+                mockClient.getInputProtocol().getTransport().close();
+                times = 1;
+                mockClient.getOutputProtocol().getTransport().close();
+                times = 1;
+            }
+        };
+    }
+
+    @Test
+    public void testWithAbandonConfigAndAbandonedAndNotLogged() throws TException {
+
+        new Expectations() {
+            {
+                mockClient.getAPIVersion();
+                result = "0.19";
+                mockClient.getInputProtocol().getTransport().isOpen();
+                result = true;
+                mockClient.getOutputProtocol().getTransport().isOpen();
+                result = true;
+            }
+        };
+
+        GenericObjectPoolConfig<BaseAPI.Client> poolConfig = new GenericObjectPoolConfig<>();
+        // timeBetweenEvictionRunsMillis must be positive for abandoned removal on
+        // maintenance to run
+        poolConfig.setTimeBetweenEvictionRunsMillis(1);
+        AbandonedConfig abandonedConfig = new AbandonedConfig();
+        abandonedConfig.setRemoveAbandonedTimeout(1);
+        abandonedConfig.setRemoveAbandonedOnMaintenance(true);
+        abandonedConfig.setLogAbandoned(false);
+        // Setup log writer so we can verify that nothing was logged
+        StringWriter log = new StringWriter();
+        Assert.assertEquals("Initial length of log is 0", 0, log.toString().length());
+        PrintWriter logWriter = new PrintWriter(log);
+        abandonedConfig.setLogWriter(logWriter);
+        ThriftClientPool<BaseAPI.Client> thriftClientPool = new ThriftClientPool<>((protocol) -> mockClient, () -> null,
+                poolConfig, abandonedConfig);
+        thriftClientPool.getResource();
+        try {
+            // Sleep long enough for the client to be considered abandoned
+            Thread.sleep(1001);
+            thriftClientPool.close();
+        } catch (InterruptedException e) {
+            Assert.fail("sleep interrupted");
+        }
+
+        // Verify that nothing was logged
+        Assert.assertEquals(0, log.toString().length());
+
+        new Verifications() {
+            {
+                // Verify client is destroyed when abandoned
+                mockClient.getInputProtocol().getTransport().close();
+                times = 1;
+                mockClient.getOutputProtocol().getTransport().close();
+                times = 1;
+            }
+        };
+    }
+
+    /**
+     * Just like #{@link #testWithAbandonConfigAndAbandoned()} but using default
+     * configuration.
+     * 
+     * @throws TException
+     * @throws ApplicationSettingsException
+     */
+    @Test
+    @Ignore("Test requires long wait time to account for default removeAbandonedTimeout")
+    public void testWithDefaultAbandonedRemovalEnabled() throws TException, ApplicationSettingsException {
+
+        new Expectations() {
+            {
+                mockClient.getAPIVersion();
+                result = "0.19";
+                mockClient.getInputProtocol().getTransport().isOpen();
+                result = true;
+                mockClient.getOutputProtocol().getTransport().isOpen();
+                result = true;
+            }
+        };
+
+        GenericObjectPoolConfig<BaseAPI.Client> poolConfig = new GenericObjectPoolConfig<>();
+        // timeBetweenEvictionRunsMillis must be positive for abandoned removal on
+        // maintenance to run
+        poolConfig.setTimeBetweenEvictionRunsMillis(1);
+        ServerSettings.setSetting("thrift.client.pool.abandoned.removal.enabled", "true");
+        ThriftClientPool<BaseAPI.Client> thriftClientPool = new ThriftClientPool<>((protocol) -> mockClient, () -> null,
+                poolConfig);
+        thriftClientPool.getResource();
+        try {
+            // Sleep long enough for the client to be considered abandoned
+            // Default removeAbandonedTimeout is 300 seconds
+            Thread.sleep(new AbandonedConfig().getRemoveAbandonedTimeout() * 1000 + 1);
+            thriftClientPool.close();
+        } catch (InterruptedException e) {
+            Assert.fail("sleep interrupted");
+        }
+
+        new Verifications() {{
+            // Verify client is destroyed when abandoned
+            mockClient.getInputProtocol().getTransport().close(); times = 1;
+            mockClient.getOutputProtocol().getTransport().close(); times = 1;
+        }};
+    }
+}
diff --git a/modules/compute-account-provisioning/pom.xml b/modules/compute-account-provisioning/pom.xml
index 2da8554..00d16b0 100644
--- a/modules/compute-account-provisioning/pom.xml
+++ b/modules/compute-account-provisioning/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/modules/configuration/client/pom.xml b/modules/configuration/client/pom.xml
index 331499a..0413d88 100644
--- a/modules/configuration/client/pom.xml
+++ b/modules/configuration/client/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-configuration</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/configuration/pom.xml b/modules/configuration/pom.xml
index 2b1b5d1..380d647 100644
--- a/modules/configuration/pom.xml
+++ b/modules/configuration/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/configuration/server/pom.xml b/modules/configuration/server/pom.xml
index efdaf43..149c791 100644
--- a/modules/configuration/server/pom.xml
+++ b/modules/configuration/server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-configuration</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/configuration/server/src/main/resources/airavata-server.properties b/modules/configuration/server/src/main/resources/airavata-server.properties
index e431f13..ec18c3f 100644
--- a/modules/configuration/server/src/main/resources/airavata-server.properties
+++ b/modules/configuration/server/src/main/resources/airavata-server.properties
@@ -357,3 +357,8 @@
 # DB Event Manager Runner
 ###########################################################################
 db_event_manager=org.apache.airavata.db.event.manager.DBEventManagerRunner
+
+###########################################################################
+# ThriftClientPool Configuration
+###########################################################################
+thrift.client.pool.abandoned.removal.enabled=false
diff --git a/modules/credential-store/credential-store-service/pom.xml b/modules/credential-store/credential-store-service/pom.xml
index 9e015ba..33dcd51 100644
--- a/modules/credential-store/credential-store-service/pom.xml
+++ b/modules/credential-store/credential-store-service/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
 
@@ -122,6 +122,11 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>registry-api-stubs</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>com.jcraft</groupId>
             <artifactId>jsch</artifactId>
             <version>0.1.50</version>
@@ -142,6 +147,11 @@
             <artifactId>commons-io</artifactId>
             <version>1.3.2</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>custos-java-sdk</artifactId>
+            <version>${org.apache.custos.version}</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
@@ -154,6 +164,11 @@
                     <systemPropertyVariables>
                         <credential.module.directory>${basedir}</credential.module.directory>
                     </systemPropertyVariables>
+                    <useSystemClassLoader>false</useSystemClassLoader>
+                    <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
+
+                    <reuseForks>false</reuseForks>
+
                     <excludes>
                         <exclude>**/DAOBaseTestCase.java</exclude>
                         <exclude>**/MappingDAOTest.java</exclude>
diff --git a/modules/credential-store/credential-store-service/src/main/java/org/apache/airavata/credential/store/server/CredentialStoreServerHandler.java b/modules/credential-store/credential-store-service/src/main/java/org/apache/airavata/credential/store/server/CredentialStoreServerHandler.java
index 4290884..a795840 100644
--- a/modules/credential-store/credential-store-service/src/main/java/org/apache/airavata/credential/store/server/CredentialStoreServerHandler.java
+++ b/modules/credential-store/credential-store-service/src/main/java/org/apache/airavata/credential/store/server/CredentialStoreServerHandler.java
@@ -1,5 +1,4 @@
 /**
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -7,9 +6,9 @@
  * to you 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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
@@ -20,9 +19,7 @@
 package org.apache.airavata.credential.store.server;
 
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.utils.DBInitializer;
-import org.apache.airavata.common.utils.DBUtil;
-import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.common.utils.*;
 import org.apache.airavata.credential.store.cpi.CredentialStoreService;
 import org.apache.airavata.credential.store.cpi.credential_store_cpiConstants;
 import org.apache.airavata.credential.store.credential.CommunityUser;
@@ -36,11 +33,14 @@
 import org.apache.airavata.credential.store.util.TokenGenerator;
 import org.apache.airavata.credential.store.util.Utility;
 import org.apache.airavata.model.credential.store.*;
+import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.registry.api.RegistryService;
 import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.apache.custos.resource.secret.management.client.ResourceSecretManagementClient;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import sun.security.provider.X509Factory;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -50,6 +50,8 @@
 import java.util.*;
 import java.util.stream.Collectors;
 
+//import sun.security.provider.X509Factory;
+
 public class CredentialStoreServerHandler implements CredentialStoreService.Iface {
     protected static Logger log = LoggerFactory.getLogger(CredentialStoreServerHandler.class);
     private DBUtil dbUtil;
@@ -57,6 +59,11 @@
     private CertificateCredentialWriter certificateCredentialWriter;
     private CredentialReaderImpl credentialReader;
 
+    private ResourceSecretManagementClient resourceSecretManagementClient;
+
+    private ThriftClientPool<RegistryService.Client> registryClientPool;
+
+
     public CredentialStoreServerHandler() throws ApplicationSettingsException, IllegalAccessException,
             ClassNotFoundException, InstantiationException, SQLException, IOException {
         String jdbcUrl = ServerSettings.getCredentialStoreDBURL();
@@ -71,6 +78,30 @@
         sshCredentialWriter = new SSHCredentialWriter(dbUtil);
         certificateCredentialWriter = new CertificateCredentialWriter(dbUtil);
         credentialReader = new CredentialReaderImpl(dbUtil);
+
+        resourceSecretManagementClient = CustosUtils.getCustosClientProvider().getResourceSecretManagementClient();
+
+        registryClientPool = new ThriftClientPool<>(
+                tProtocol -> new RegistryService.Client(tProtocol),
+                this.<RegistryService.Client>createGenericObjectPoolConfig(),
+                ServerSettings.getRegistryServerHost(),
+                Integer.parseInt(ServerSettings.getRegistryServerPort()));
+
+    }
+
+    private <T> GenericObjectPoolConfig<T> createGenericObjectPoolConfig() {
+
+        GenericObjectPoolConfig<T> poolConfig = new GenericObjectPoolConfig<T>();
+        poolConfig.setMaxTotal(100);
+        poolConfig.setMinIdle(5);
+        poolConfig.setBlockWhenExhausted(true);
+        poolConfig.setTestOnBorrow(true);
+        poolConfig.setTestWhileIdle(true);
+        // must set timeBetweenEvictionRunsMillis since eviction doesn't run unless that is positive
+        poolConfig.setTimeBetweenEvictionRunsMillis(5L * 60L * 1000L);
+        poolConfig.setNumTestsPerEvictionRun(10);
+        poolConfig.setMaxWaitMillis(3000);
+        return poolConfig;
     }
 
     @Override
@@ -91,7 +122,7 @@
             if (sshCredential.getPrivateKey() != null) {
                 credential.setPrivateKey(sshCredential.getPrivateKey().getBytes());
             }
-            if(sshCredential.getDescription() != null){
+            if (sshCredential.getDescription() != null) {
                 credential.setDescription(sshCredential.getDescription());
             }
             if (sshCredential.getPublicKey() != null) {
@@ -122,9 +153,9 @@
             String token = TokenGenerator.generateToken(certificateCredential.getCommunityUser().getGatewayName(), null);
             credential.setToken(token);
             Base64 encoder = new Base64(64);
-            byte [] decoded = encoder.decode(certificateCredential.getX509Cert().replaceAll(X509Factory.BEGIN_CERT, "").replaceAll(X509Factory.END_CERT, ""));
+            byte[] decoded = encoder.decode(certificateCredential.getX509Cert().replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""));
             CertificateFactory cf = CertificateFactory.getInstance("X.509");
-            X509Certificate certificate = (X509Certificate)cf.generateCertificate(new ByteArrayInputStream(decoded));
+            X509Certificate certificate = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(decoded));
             X509Certificate[] certificates = new X509Certificate[1];
             certificates[0] = certificate;
             credential.setCertificates(certificates);
@@ -164,29 +195,29 @@
     @Override
     public SSHCredential getSSHCredential(String tokenId, String gatewayId) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException {
         try {
-            Credential credential = credentialReader.getCredential(gatewayId, tokenId);
-            if (credential instanceof org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential
-                    && !(credential instanceof org.apache.airavata.credential.store.credential.impl.password
-                            .PasswordCredential)) {
-                org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential credential1 = (org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential) credential;
-                SSHCredential sshCredential = new SSHCredential();
-                sshCredential.setUsername(credential1.getPortalUserName());
-                sshCredential.setGatewayId(credential1.getGateway());
-                sshCredential.setPublicKey(new String(credential1.getPublicKey()));
-                sshCredential.setPrivateKey(new String(credential1.getPrivateKey()));
-                sshCredential.setPassphrase(credential1.getPassphrase());
-                sshCredential.setToken(credential1.getToken());
-                sshCredential.setPersistedTime(credential1.getCertificateRequestedTime().getTime());
-                sshCredential.setDescription(credential1.getDescription());
-                return sshCredential;
-            } else {
-                log.info("Could not find SSH credentials for token - " + tokenId + " and "
-                        + "gateway id - " + gatewayId);
-                return null;
-            }
-        } catch (CredentialStoreException e) {
-            log.error("Error occurred while retrieving SSH credentialfor token - " +  tokenId + " and gateway id - " + gatewayId, e);
-            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving SSH credential for token - " +  tokenId + " and gateway id - " + gatewayId);
+
+            RegistryService.Client registryClient = registryClientPool.getResource();
+            Gateway result = registryClient.getGateway(gatewayId);
+
+            String custosId = result.getOauthClientId();
+
+            org.apache.custos.resource.secret.service.SSHCredential custosSSHCredential = resourceSecretManagementClient
+                    .getSSHCredential(custosId, tokenId, false);
+
+            SSHCredential sshCredential = new SSHCredential();
+            sshCredential.setUsername(custosSSHCredential.getMetadata().getOwnerId());
+            sshCredential.setGatewayId(gatewayId);
+            sshCredential.setPublicKey(custosSSHCredential.getPublicKey());
+            sshCredential.setPrivateKey(custosSSHCredential.getPrivateKey());
+            sshCredential.setPassphrase(custosSSHCredential.getPassphrase());
+            sshCredential.setToken(tokenId);
+            sshCredential.setPersistedTime(custosSSHCredential.getMetadata().getPersistedTime());
+            sshCredential.setDescription(custosSSHCredential.getMetadata().getDescription());
+            return sshCredential;
+
+        } catch (Exception e) {
+            log.error("Error occurred while retrieving SSH credentialfor token - " + tokenId + " and gateway id - " + gatewayId, e);
+            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving SSH credential for token - " + tokenId + " and gateway id - " + gatewayId);
         }
     }
 
@@ -204,7 +235,7 @@
             throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Unrecognized type of credential for token: " + tokenId);
         } catch (CredentialStoreException e) {
             final String msg = "Error occurred while retrieving credential summary for token - " + tokenId + " and gateway id - " + gatewayId;
-            log.error(msg , e);
+            log.error(msg, e);
             throw new org.apache.airavata.credential.store.exception.CredentialStoreException(msg);
         }
     }
@@ -236,7 +267,7 @@
             }
         } catch (CredentialStoreException e) {
             final String msg = "Error occurred while retrieving " + type + " credential Summary for tokens - " + accessibleTokenIds + " and gateway id - " + gatewayId;
-            log.error(msg , e);
+            log.error(msg, e);
             throw new org.apache.airavata.credential.store.exception.CredentialStoreException(msg);
         }
     }
@@ -308,7 +339,7 @@
                 certificateCredential.setNotAfter(credential1.getNotAfter());
                 certificateCredential.setNotBefore(credential1.getNotBefore());
                 certificateCredential.setPersistedTime(credential1.getCertificateRequestedTime().getTime());
-                if (credential1.getPrivateKey() != null){
+                if (credential1.getPrivateKey() != null) {
                     certificateCredential.setPrivateKey(credential1.getPrivateKey().toString());
                 }
                 certificateCredential.setX509Cert(credential1.getCertificates()[0].toString());
@@ -319,8 +350,8 @@
                 return null;
             }
         } catch (CredentialStoreException e) {
-            log.error("Error occurred while retrieving Certificate credential for token - " +  tokenId + " and gateway id - " + gatewayId, e);
-            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving Certificate credential for token - " +  tokenId + " and gateway id - " + gatewayId);
+            log.error("Error occurred while retrieving Certificate credential for token - " + tokenId + " and gateway id - " + gatewayId, e);
+            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving Certificate credential for token - " + tokenId + " and gateway id - " + gatewayId);
         }
     }
 
@@ -346,20 +377,20 @@
                 return null;
             }
         } catch (CredentialStoreException e) {
-            log.error("Error occurred while retrieving PWD credentialfor token - " +  tokenId + " and gateway id - " + gatewayId, e);
-            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving PWD credential for token - " +  tokenId + " and gateway id - " + gatewayId);
+            log.error("Error occurred while retrieving PWD credentialfor token - " + tokenId + " and gateway id - " + gatewayId, e);
+            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving PWD credential for token - " + tokenId + " and gateway id - " + gatewayId);
         }
     }
 
     @Override
     @Deprecated
     public List<CredentialSummary> getAllCredentialSummaryForGateway(SummaryType type, String gatewayId) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException {
-        if(type.equals(SummaryType.SSH)){
+        if (type.equals(SummaryType.SSH)) {
             Map<String, String> sshKeyMap = new HashMap<>();
             List<CredentialSummary> summaryList = new ArrayList<>();
             try {
                 List<Credential> allCredentials = credentialReader.getAllCredentialsPerGateway(gatewayId);
-                if (allCredentials != null && !allCredentials.isEmpty()){
+                if (allCredentials != null && !allCredentials.isEmpty()) {
                     for (Credential credential : allCredentials) {
                         if (credential instanceof org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential
                                 && !(credential instanceof org.apache.airavata.credential.store.credential.impl
@@ -382,8 +413,8 @@
                 throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving credential Summary");
             }
             return summaryList;
-        }else{
-            log.info("Summay Type"+ type.toString() + " not supported for gateway id - " + gatewayId);
+        } else {
+            log.info("Summay Type" + type.toString() + " not supported for gateway id - " + gatewayId);
             return null;
         }
     }
@@ -391,19 +422,19 @@
     @Override
     @Deprecated
     public List<CredentialSummary> getAllCredentialSummaryForUserInGateway(SummaryType type, String gatewayId, String userId) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException {
-        if(type.equals(SummaryType.SSH)){
+        if (type.equals(SummaryType.SSH)) {
             Map<String, String> sshKeyMap = new HashMap<>();
             List<CredentialSummary> summaryList = new ArrayList<>();
             try {
                 List<Credential> allCredentials = credentialReader.getAllCredentials();
-                if (allCredentials != null && !allCredentials.isEmpty()){
+                if (allCredentials != null && !allCredentials.isEmpty()) {
                     for (Credential credential : allCredentials) {
                         if (credential instanceof org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential
                                 && !(credential instanceof org.apache.airavata.credential.store.credential.impl.password.PasswordCredential)) {
                             org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential sshCredential = (org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential) credential;
                             String portalUserName = sshCredential.getPortalUserName();
                             String gateway = sshCredential.getGateway();
-                            if (portalUserName != null && gateway != null){
+                            if (portalUserName != null && gateway != null) {
                                 if (portalUserName.equals(userId) && gateway.equals(gatewayId) && sshCredential.getCredentialOwnerType() == CredentialOwnerType.USER) {
                                     org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential sshCredentialKey = (org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential) credential;
                                     CredentialSummary sshCredentialSummary = new CredentialSummary();
@@ -424,8 +455,8 @@
                 throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving credential Summary");
             }
             return summaryList;
-        }else{
-            log.info("Summay Type"+ type.toString() + " not supported for user Id - " + userId + " and "
+        } else {
+            log.info("Summay Type" + type.toString() + " not supported for user Id - " + userId + " and "
                     + "gateway id - " + gatewayId);
             return null;
         }
@@ -438,11 +469,11 @@
         Map<String, String> pwdCredMap = new HashMap<>();
         try {
             List<Credential> allCredentials = credentialReader.getAllCredentialsPerGateway(gatewayId);
-            if (allCredentials != null && !allCredentials.isEmpty()){
+            if (allCredentials != null && !allCredentials.isEmpty()) {
                 for (Credential credential : allCredentials) {
                     if (credential instanceof org.apache.airavata.credential.store.credential.impl.password.PasswordCredential) {
                         org.apache.airavata.credential.store.credential.impl.password.PasswordCredential pwdCredential = (org.apache.airavata.credential.store.credential.impl.password.PasswordCredential) credential;
-                        pwdCredMap.put(pwdCredential.getToken(),pwdCredential.getDescription() == null ? "" : pwdCredential.getDescription());
+                        pwdCredMap.put(pwdCredential.getToken(), pwdCredential.getDescription() == null ? "" : pwdCredential.getDescription());
                     }
                 }
             }
@@ -459,8 +490,8 @@
             credentialReader.removeCredentials(gatewayId, tokenId);
             return true;
         } catch (CredentialStoreException e) {
-            log.error("Error occurred while deleting SSH credential for token - " +  tokenId + " and gateway id - " + gatewayId, e);
-            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while deleting SSH credential for token - " +  tokenId + " and gateway id - " + gatewayId);
+            log.error("Error occurred while deleting SSH credential for token - " + tokenId + " and gateway id - " + gatewayId, e);
+            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while deleting SSH credential for token - " + tokenId + " and gateway id - " + gatewayId);
         }
     }
 
@@ -470,8 +501,8 @@
             credentialReader.removeCredentials(gatewayId, tokenId);
             return true;
         } catch (CredentialStoreException e) {
-            log.error("Error occurred while deleting PWD credential for token - " +  tokenId + " and gateway id - " + gatewayId, e);
-            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while deleting PWD credential for token - " +  tokenId + " and gateway id - " + gatewayId);
+            log.error("Error occurred while deleting PWD credential for token - " + tokenId + " and gateway id - " + gatewayId, e);
+            throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while deleting PWD credential for token - " + tokenId + " and gateway id - " + gatewayId);
         }
     }
 
diff --git a/modules/credential-store/credential-store-stubs/pom.xml b/modules/credential-store/credential-store-stubs/pom.xml
index 9f71e3f..5bd5063 100644
--- a/modules/credential-store/credential-store-stubs/pom.xml
+++ b/modules/credential-store/credential-store-stubs/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>credential-store</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/cpi/CredentialStoreService.java b/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/cpi/CredentialStoreService.java
index 8dbb7c5..7307631 100644
--- a/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/cpi/CredentialStoreService.java
+++ b/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/cpi/CredentialStoreService.java
@@ -1,19 +1,20 @@
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one or more
-     * contributor license agreements.  See the NOTICE file distributed with
-     * this work for additional information regarding copyright ownership.
-     * The ASF licenses this file to You 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.
-     */
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
 /**
  * Autogenerated by Thrift Compiler (0.10.0)
  *
diff --git a/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/cpi/credential_store_cpiConstants.java b/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/cpi/credential_store_cpiConstants.java
index 586313e..a837b08 100644
--- a/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/cpi/credential_store_cpiConstants.java
+++ b/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/cpi/credential_store_cpiConstants.java
@@ -1,19 +1,20 @@
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one or more
-     * contributor license agreements.  See the NOTICE file distributed with
-     * this work for additional information regarding copyright ownership.
-     * The ASF licenses this file to You 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.
-     */
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
 /**
  * Autogenerated by Thrift Compiler (0.10.0)
  *
diff --git a/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/exception/CredentialStoreException.java b/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/exception/CredentialStoreException.java
index 23c6982..9244930 100644
--- a/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/exception/CredentialStoreException.java
+++ b/modules/credential-store/credential-store-stubs/src/main/java/org/apache/airavata/credential/store/exception/CredentialStoreException.java
@@ -1,19 +1,20 @@
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one or more
-     * contributor license agreements.  See the NOTICE file distributed with
-     * this work for additional information regarding copyright ownership.
-     * The ASF licenses this file to You 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.
-     */
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
 /**
  * Autogenerated by Thrift Compiler (0.10.0)
  *
diff --git a/modules/credential-store/pom.xml b/modules/credential-store/pom.xml
index 9f7cbfd..374de2f 100644
--- a/modules/credential-store/pom.xml
+++ b/modules/credential-store/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/db-event-manager/pom.xml b/modules/db-event-manager/pom.xml
index 06ff99b..f0c31d1 100644
--- a/modules/db-event-manager/pom.xml
+++ b/modules/db-event-manager/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <artifactId>airavata</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
@@ -44,7 +44,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-messaging-core</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/modules/distribution/pom.xml b/modules/distribution/pom.xml
index b403bf7..706f0a3 100644
--- a/modules/distribution/pom.xml
+++ b/modules/distribution/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
@@ -328,17 +328,17 @@
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
-            <version>2.5.4</version>
+            <version>2.9.4</version>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-core</artifactId>
-            <version>2.5.4</version>
+            <version>2.9.4</version>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-annotations</artifactId>
-            <version>2.5.4</version>
+            <version>2.9.4</version>
         </dependency>
         <!-- zookeeper dependencies -->
 
@@ -441,6 +441,12 @@
             <artifactId>realtime-monitor</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <!-- For thrift client pool -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
     </dependencies>
 
     <url>http://airavata.apache.org/</url>
diff --git a/modules/distribution/src/main/assembly/controller-bin-assembly.xml b/modules/distribution/src/main/assembly/controller-bin-assembly.xml
index 8d90709..1c325a1 100644
--- a/modules/distribution/src/main/assembly/controller-bin-assembly.xml
+++ b/modules/distribution/src/main/assembly/controller-bin-assembly.xml
@@ -157,6 +157,8 @@
                 <include>org.ogce:xpp5:jar</include>
                 <include>com.101tec:zkclient:jar</include>
                 <include>org.apache.zookeeper:zookeeper:jar</include>
+                <include>org.apache.commons:commons-pool2:jar</include>
+                <include>org.json:json:jar</include>
             </includes>
             <excludes>
                 <exclude>mysql:mysql-connector-java:jar</exclude>
diff --git a/modules/distribution/src/main/assembly/email-monitor-bin-assembly.xml b/modules/distribution/src/main/assembly/email-monitor-bin-assembly.xml
index 9b9ca22..ae976f2 100644
--- a/modules/distribution/src/main/assembly/email-monitor-bin-assembly.xml
+++ b/modules/distribution/src/main/assembly/email-monitor-bin-assembly.xml
@@ -118,6 +118,8 @@
                 <include>org.slf4j:log4j-over-slf4j:jar</include>
                 <include>com.github.danielwegener:logback-kafka-appender:jar</include>
                 <include>net.logstash.logback:logstash-logback-encoder:jar</include>
+                <include>org.apache.commons:commons-pool2:jar</include>
+                <include>org.json:json:jar</include>
             </includes>
         </dependencySet>
     </dependencySets>
diff --git a/modules/distribution/src/main/assembly/parser-wm-bin-assembly.xml b/modules/distribution/src/main/assembly/parser-wm-bin-assembly.xml
index 1f7a683..511c998 100644
--- a/modules/distribution/src/main/assembly/parser-wm-bin-assembly.xml
+++ b/modules/distribution/src/main/assembly/parser-wm-bin-assembly.xml
@@ -157,6 +157,9 @@
                 <include>org.ogce:xpp5:jar</include>
                 <include>com.101tec:zkclient:jar</include>
                 <include>org.apache.zookeeper:zookeeper:jar</include>
+                <include>com.github.docker-java:docker-java:jar</include>
+                <include>org.apache.commons:commons-pool2:jar</include>
+                <include>org.json:json:jar</include>
             </includes>
             <excludes>
                 <exclude>mysql:mysql-connector-java:jar</exclude>
diff --git a/modules/distribution/src/main/assembly/participant-bin-assembly.xml b/modules/distribution/src/main/assembly/participant-bin-assembly.xml
index ce15e4c..a20e6ee 100644
--- a/modules/distribution/src/main/assembly/participant-bin-assembly.xml
+++ b/modules/distribution/src/main/assembly/participant-bin-assembly.xml
@@ -85,6 +85,7 @@
                 <include>org.apache.airavata:airavata-registry-core:jar</include>
                 <include>org.apache.airavata:airavata-registry-cpi:jar</include>
                 <include>org.apache.airavata:airavata-server-configuration:jar</include>
+                <include>org.apache.airavata:profile-service-stubs:jar</include>
                 <include>com.rabbitmq:amqp-client:jar</include>
                 <include>asm:asm:jar</include>
                 <include>org.bouncycastle:bcpkix-jdk15on:jar</include>
@@ -158,7 +159,57 @@
                 <include>org.ogce:xpp5:jar</include>
                 <include>com.101tec:zkclient:jar</include>
                 <include>org.apache.zookeeper:zookeeper:jar</include>
+                <include>org.apache.airavata:profile-service-stubs:jar</include>
+                <include>org.apache.airavata:services-security:jar</include>
+                <include>org.apache.airavata:airavata-sharing-registry-stubs:jar</include>
+                <include>org.apache.airavata:airavata-security:jar</include>
+                <include>org.apache.airavata:airavata-model-utils:jar</include>
+
+                <!-- Docker Java dependencies -->
+
                 <include>com.github.docker-java:docker-java:jar</include>
+                <include>com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:jar</include>
+                <include>com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:jar</include>
+                <include>com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar</include>
+                <include>org.glassfish.jersey.connectors:jersey-apache-connector:jar</include>
+                <include>org.glassfish.jersey.core:jersey-common:jar</include>
+                <include>javax.annotation:javax.annotation-api:jar</include>
+                <include>org.glassfish.jersey.bundles.repackaged:jersey-guava:jar</include>
+                <include>org.glassfish.hk2:osgi-resource-locator:jar</include>
+                <include>javax.ws.rs:javax.ws.rs-api:jar</include>
+                <include>org.apache.httpcomponents:httpcore:jar</include>
+                <include>org.glassfish.jersey.core:jersey-client:jar</include>
+                <include>org.glassfish.hk2:hk2-api:jar</include>
+                <include>org.glassfish.hk2:hk2-utils:jar</include>
+                <include>org.glassfish.hk2.external:aopalliance-repackaged:jar</include>
+                <include>org.glassfish.hk2.external:javax.inject:jar</include>
+                <include>org.glassfish.hk2:hk2-locator:jar</include>
+                <include>org.javassist:javassist:jar</include>
+                <include>com.kohlschutter.junixsocket:junixsocket-common:jar</include>
+                <include>com.kohlschutter.junixsocket:junixsocket-native-common:jar</include>
+                <include>org.scijava:native-lib-loader:jar</include>
+                <include>org.apache.commons:commons-compress:jar</include>
+                <include>commons-lang:commons-lang:jar</include>
+                <include>commons-io:commons-io:jar</include>
+                <include>org.slf4j:jcl-over-slf4j:jar</include>
+                <include>com.google.guava:guava:jar</include>
+                <include>org.bouncycastle:bcpkix-jdk15on:jar</include>
+                <include>org.bouncycastle:bcprov-jdk15on:jar</include>
+                <include>io.netty:netty-codec-http:jar</include>
+                <include>io.netty:netty-codec:jar</include>
+                <include>io.netty:netty-handler:jar</include>
+                <include>io.netty:netty-buffer:jar</include>
+                <include>io.netty:netty-transport:jar</include>
+                <include>io.netty:netty-resolver:jar</include>
+                <include>io.netty:netty-handler-proxy:jar</include>
+                <include>io.netty:netty-codec-socks:jar</include>
+                <include>io.netty:netty-transport-native-epoll:jar</include>
+                <include>io.netty:netty-common:jar</include>
+                <include>io.netty:netty-transport-native-unix-common:jar</include>
+                <include>io.netty:netty-transport-native-kqueue:jar</include>
+
+                <include>org.apache.commons:commons-pool2:jar</include>
+                <include>org.json:json:jar</include>
             </includes>
             <excludes>
                 <exclude>mysql:mysql-connector-java:jar</exclude>
diff --git a/modules/distribution/src/main/assembly/platform-monitor-bin-assembly.xml b/modules/distribution/src/main/assembly/platform-monitor-bin-assembly.xml
index 4fc0a9d..a898c13 100644
--- a/modules/distribution/src/main/assembly/platform-monitor-bin-assembly.xml
+++ b/modules/distribution/src/main/assembly/platform-monitor-bin-assembly.xml
@@ -157,6 +157,8 @@
                 <include>org.ogce:xpp5:jar</include>
                 <include>com.101tec:zkclient:jar</include>
                 <include>org.apache.zookeeper:zookeeper:jar</include>
+                <include>org.apache.commons:commons-pool2:jar</include>
+                <include>org.json:json:jar</include>
             </includes>
             <excludes>
                 <exclude>mysql:mysql-connector-java:jar</exclude>
diff --git a/modules/distribution/src/main/assembly/post-wm-bin-assembly.xml b/modules/distribution/src/main/assembly/post-wm-bin-assembly.xml
index 83de543..3d46ec6 100644
--- a/modules/distribution/src/main/assembly/post-wm-bin-assembly.xml
+++ b/modules/distribution/src/main/assembly/post-wm-bin-assembly.xml
@@ -147,16 +147,23 @@
                 <include>org.yaml:snakeyaml:jar</include>
                 <include>org.xerial.snappy:snappy-java:jar</include>
                 <include>org.apache.airavata:ssh-agent:jar</include>
+                <include>org.apache.airavata:profile-service-stubs:jar</include>
+                <include>org.apache.airavata:services-security:jar</include>
+                <include>org.apache.airavata:airavata-sharing-registry-stubs:jar</include>
                 <include>com.hierynomus:sshj:jar</include>
                 <include>org.apache.airavata:sshj-agent:jar</include>
                 <include>org.apache.airavata:task-api:jar</include>
                 <include>org.apache.airavata:task-core:jar</include>
+                <include>org.apache.airavata:profile-service-stubs:jar</include>
                 <include>org.apache.tomcat.embed:tomcat-embed-core:jar</include>
                 <include>org.apache.airavata:workflow-impl:jar</include>
                 <include>org.ogce:xpp3:jar</include>
                 <include>org.ogce:xpp5:jar</include>
                 <include>com.101tec:zkclient:jar</include>
                 <include>org.apache.zookeeper:zookeeper:jar</include>
+                <include>org.apache.airavata:airavata-security:jar</include>
+                <include>org.apache.commons:commons-pool2:jar</include>
+                <include>org.json:json:jar</include>
             </includes>
             <excludes>
                 <exclude>mysql:mysql-connector-java:jar</exclude>
diff --git a/modules/distribution/src/main/assembly/pre-wm-bin-assembly.xml b/modules/distribution/src/main/assembly/pre-wm-bin-assembly.xml
index cc00f1a..2b26851 100644
--- a/modules/distribution/src/main/assembly/pre-wm-bin-assembly.xml
+++ b/modules/distribution/src/main/assembly/pre-wm-bin-assembly.xml
@@ -151,12 +151,19 @@
                 <include>org.apache.airavata:sshj-agent:jar</include>
                 <include>org.apache.airavata:task-api:jar</include>
                 <include>org.apache.airavata:task-core:jar</include>
+                <include>org.apache.airavata:profile-service-stubs:jar</include>
                 <include>org.apache.tomcat.embed:tomcat-embed-core:jar</include>
                 <include>org.apache.airavata:workflow-impl:jar</include>
                 <include>org.ogce:xpp3:jar</include>
                 <include>org.ogce:xpp5:jar</include>
                 <include>com.101tec:zkclient:jar</include>
                 <include>org.apache.zookeeper:zookeeper:jar</include>
+                <include>org.apache.airavata:profile-service-stubs:jar</include>
+                <include>org.apache.airavata:services-security:jar</include>
+                <include>org.apache.airavata:airavata-sharing-registry-stubs:jar</include>
+                <include>org.apache.airavata:airavata-security:jar</include>
+                <include>org.apache.commons:commons-pool2:jar</include>
+                <include>org.json:json:jar</include>
             </includes>
             <excludes>
                 <exclude>mysql:mysql-connector-java:jar</exclude>
diff --git a/modules/distribution/src/main/assembly/realtime-monitor-bin-assembly.xml b/modules/distribution/src/main/assembly/realtime-monitor-bin-assembly.xml
index f198106..e1caef9 100644
--- a/modules/distribution/src/main/assembly/realtime-monitor-bin-assembly.xml
+++ b/modules/distribution/src/main/assembly/realtime-monitor-bin-assembly.xml
@@ -113,6 +113,9 @@
                 <include>org.slf4j:log4j-over-slf4j:jar</include>
                 <include>com.github.danielwegener:logback-kafka-appender:jar</include>
                 <include>net.logstash.logback:logstash-logback-encoder:jar</include>
+
+                <include>org.apache.commons:commons-pool2:jar</include>
+                <include>org.json:json:jar</include>
             </includes>
         </dependencySet>
     </dependencySets>
diff --git a/modules/distribution/src/main/resources/api-server/bin/airavata-server-start.sh b/modules/distribution/src/main/resources/api-server/bin/airavata-server-start.sh
index 4812995..cbaefaa 100644
--- a/modules/distribution/src/main/resources/api-server/bin/airavata-server-start.sh
+++ b/modules/distribution/src/main/resources/api-server/bin/airavata-server-start.sh
@@ -40,7 +40,7 @@
     case ${var} in
         -xdebug)
         	AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8000"
+            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
             shift
         ;;
         -security)
diff --git a/modules/distribution/src/main/resources/controller/bin/controller.sh b/modules/distribution/src/main/resources/controller/bin/controller.sh
index 6e1fb7c..dfd6d9f 100644
--- a/modules/distribution/src/main/resources/controller/bin/controller.sh
+++ b/modules/distribution/src/main/resources/controller/bin/controller.sh
@@ -38,7 +38,7 @@
     case ${var} in
         -xdebug)
         	AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8000"
+            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
             shift
 	    ;;
         -log)
diff --git a/modules/distribution/src/main/resources/email-monitor/bin/email-monitor.sh b/modules/distribution/src/main/resources/email-monitor/bin/email-monitor.sh
index 0d58079..662e215 100644
--- a/modules/distribution/src/main/resources/email-monitor/bin/email-monitor.sh
+++ b/modules/distribution/src/main/resources/email-monitor/bin/email-monitor.sh
@@ -38,7 +38,7 @@
     case ${var} in
         -xdebug)
         	AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8000"
+            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
             shift
 	    ;;
         -log)
diff --git a/modules/distribution/src/main/resources/parser-wm/bin/parser-wm.sh b/modules/distribution/src/main/resources/parser-wm/bin/parser-wm.sh
index 127068a..352e3d7 100644
--- a/modules/distribution/src/main/resources/parser-wm/bin/parser-wm.sh
+++ b/modules/distribution/src/main/resources/parser-wm/bin/parser-wm.sh
@@ -38,7 +38,7 @@
     case ${var} in
         -xdebug)
         	AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8000"
+            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
             shift
 	    ;;
         -log)
diff --git a/modules/distribution/src/main/resources/participant/bin/participant.sh b/modules/distribution/src/main/resources/participant/bin/participant.sh
index 9150228..bd14fd5 100644
--- a/modules/distribution/src/main/resources/participant/bin/participant.sh
+++ b/modules/distribution/src/main/resources/participant/bin/participant.sh
@@ -38,7 +38,7 @@
     case ${var} in
         -xdebug)
         	AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8000"
+            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
             shift
 	    ;;
         -log)
diff --git a/modules/distribution/src/main/resources/platform-monitor/bin/platform-monitor.sh b/modules/distribution/src/main/resources/platform-monitor/bin/platform-monitor.sh
index 2aa3546..263f88e 100644
--- a/modules/distribution/src/main/resources/platform-monitor/bin/platform-monitor.sh
+++ b/modules/distribution/src/main/resources/platform-monitor/bin/platform-monitor.sh
@@ -38,7 +38,7 @@
     case ${var} in
         -xdebug)
         	AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8000"
+            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
             shift
 	    ;;
         -log)
diff --git a/modules/distribution/src/main/resources/post-wm/bin/post-wm.sh b/modules/distribution/src/main/resources/post-wm/bin/post-wm.sh
index 72d908f..24c9fe8 100644
--- a/modules/distribution/src/main/resources/post-wm/bin/post-wm.sh
+++ b/modules/distribution/src/main/resources/post-wm/bin/post-wm.sh
@@ -38,7 +38,7 @@
     case ${var} in
         -xdebug)
         	AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8000"
+            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
             shift
 	    ;;
         -log)
diff --git a/modules/distribution/src/main/resources/pre-wm/bin/pre-wm.sh b/modules/distribution/src/main/resources/pre-wm/bin/pre-wm.sh
index a002aff..8c297e8 100644
--- a/modules/distribution/src/main/resources/pre-wm/bin/pre-wm.sh
+++ b/modules/distribution/src/main/resources/pre-wm/bin/pre-wm.sh
@@ -38,7 +38,7 @@
     case ${var} in
         -xdebug)
         	AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8000"
+            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
             shift
 	    ;;
         -log)
diff --git a/modules/distribution/src/main/resources/realtime-monitor/bin/realtime-monitor.sh b/modules/distribution/src/main/resources/realtime-monitor/bin/realtime-monitor.sh
index e9f814e..48c513d 100644
--- a/modules/distribution/src/main/resources/realtime-monitor/bin/realtime-monitor.sh
+++ b/modules/distribution/src/main/resources/realtime-monitor/bin/realtime-monitor.sh
@@ -38,7 +38,7 @@
     case ${var} in
         -xdebug)
         	AIRAVATA_COMMAND="${AIRAVATA_COMMAND}"
-            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8000"
+            JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=*:8000"
             shift
 	    ;;
         -log)
diff --git a/modules/ide-integration/README.md b/modules/ide-integration/README.md
index c905f13..4eead3a 100644
--- a/modules/ide-integration/README.md
+++ b/modules/ide-integration/README.md
@@ -57,6 +57,12 @@
   docker-compose up
   ```
 
+* Apply any database migrations. Go to src/main/resources directory and run
+
+  ```
+  cat ./database_scripts/init/*-migrations.sql | docker exec -i resources_db_1 mysql -p123456
+  ```
+
 * Wait until all the services come up. This will initialize all utilities required to start Airavata server
 
 ### Starting API Server
@@ -170,3 +176,44 @@
   ```
   docker-compose rm
   ```
+  
+### NOTE: (Optional) Creating certificates if expired 
+  
+  * This is required only when the self signed certificate for keycloak is expired
+  * Go to src/main/resources/keystores
+  * Provide password as airavata for all key stores
+
+  ```  
+  rm airavata.jks
+  
+  rm client_truststore.jks
+  
+  keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass airavata -validity 360 -keysize 2048
+  What is your first and last name?
+    [Unknown]:  airavata.host
+  What is the name of your organizational unit?
+    [Unknown]:  airavata.host
+  What is the name of your organization?
+    [Unknown]:  airavata.host
+  What is the name of your City or Locality?
+    [Unknown]:  airavata.host
+  What is the name of your State or Province?
+    [Unknown]:  airavata.host
+  What is the two-letter country code for this unit?
+    [Unknown]:  airavata.host
+  Is CN=airavata.host, OU=airavata.host, O=airavata.host, L=airavata.host, ST=airavata.host, C=airavata.host correct?
+    [no]:  yes
+
+
+  keytool -importkeystore -srckeystore keystore.jks -destkeystore airavata.jks -deststoretype pkcs12
+
+  rm keystore.jks
+
+  keytool  -export -alias selfsigned -file root.cer -keystore airavata.jks -storepass airavata
+
+  keytool -import -alias mykey -file root.cer -keystore client_truststore.jks -storepass airavata
+
+  rm root.cer
+
+```
+
diff --git a/modules/ide-integration/pom.xml b/modules/ide-integration/pom.xml
index f9462ca..9d19e9d 100644
--- a/modules/ide-integration/pom.xml
+++ b/modules/ide-integration/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <artifactId>airavata</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -14,17 +14,17 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>db-event-manager</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>registry-api-service</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-credential-store</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>commons-io</groupId>
@@ -35,12 +35,12 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-sharing-registry-server</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-api-server</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>bouncycastle</groupId>
@@ -51,12 +51,12 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-orchestrator-service</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>profile-service-server</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.mariadb.jdbc</groupId>
@@ -66,13 +66,13 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>helix-spectator</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>email-monitor</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/modules/ide-integration/src/main/resources/META-INF/generate-sql-persistence.xml b/modules/ide-integration/src/main/resources/META-INF/generate-sql-persistence.xml
deleted file mode 100644
index 944413d..0000000
--- a/modules/ide-integration/src/main/resources/META-INF/generate-sql-persistence.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<!--*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
-* -->
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
-    <!-- openjpa:sql doesn't work well with multiple persistence-unit's in persistence.xml, so
-    use this single persistence-unit persistence.xml to list any classes for which SQL schema
-    generation is desired -->
-    <persistence-unit name="generate-sql">
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.HandlerInputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.HandlerOutputEntity</class>
-    </persistence-unit>
-</persistence>
diff --git a/modules/ide-integration/src/main/resources/META-INF/persistence.xml b/modules/ide-integration/src/main/resources/META-INF/persistence.xml
deleted file mode 100644
index 7ace098..0000000
--- a/modules/ide-integration/src/main/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0"?>
-<!--*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
-* -->
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
-    <persistence-unit name="appcatalog_data_new">
-        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GridftpDataMovementEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ResourceJobManagerEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ComputeResourceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ApplicationModuleEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ApplicationDeploymentEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ApplicationInterfaceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GatewayGroupsEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GatewayProfileEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.StorageResourceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ScpDataMovementEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.SshJobSubmissionEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GlobusSubmissionEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GsisshSubmissionEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GridftpEndpointEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ComputeResourcePreferenceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.JobSubmissionInterfaceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.DataMovementInterfaceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.StorageInterfaceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.LocalSubmissionEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GlobusGkEndpointEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.UnicoreDatamovementEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.UnicoreSubmissionEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GsisshPostjobcommandEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GsisshPrejobcommandEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GsisshExportEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.LibraryApendPathEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.LibraryPrependPathEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.AppEnvironmentEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.PrejobCommandEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.PostjobCommandEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.AppModuleMappingEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ApplicationInputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ApplicationOutputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.BatchQueueEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ComputeResourceFileSystemEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.CloudJobSubmissionEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.JobManagerCommandEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ParallelismCommandEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.LocalDataMovementEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.StoragePreferenceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.SSHAccountProvisionerConfiguration</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.BatchQueueResourcePolicyEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ComputeResourcePolicyEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GroupComputeResourcePrefEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GroupSSHAccountProvisionerConfig</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.GroupResourceProfileEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ModuleLoadCmdEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.UserResourceProfileEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.UserComputeResourcePreferenceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.UserStoragePreferenceEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ParserEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ParserInputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ParserOutputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ParsingTemplateEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ParsingTemplateInputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ParserConnectorInputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.appcatalog.ParserConnectorEntity</class>
-        <exclude-unlisted-classes>true</exclude-unlisted-classes>
-    </persistence-unit>
-    <persistence-unit name="replicacatalog_data_new">
-        <class>org.apache.airavata.registry.core.entities.replicacatalog.ConfigurationEntity</class>
-        <class>org.apache.airavata.registry.core.entities.replicacatalog.DataProductEntity</class>
-        <class>org.apache.airavata.registry.core.entities.replicacatalog.DataProductMetadataEntity</class>
-        <class>org.apache.airavata.registry.core.entities.replicacatalog.DataReplicaLocationEntity</class>
-        <class>org.apache.airavata.registry.core.entities.replicacatalog.DataReplicaMetadataEntity</class>
-        <exclude-unlisted-classes>true</exclude-unlisted-classes>
-    </persistence-unit>
-    <persistence-unit name="workflowcatalog_data_new">
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.AiravataWorkflowEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.AiravataWorkflowErrorEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.AiravataWorkflowStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.ApplicationErrorEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.ApplicationStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.HandlerErrorEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.HandlerInputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.HandlerOutputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.HandlerStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.WorkflowApplicationEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.WorkflowConnectionEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.WorkflowDataBlockEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.WorkflowHandlerEntity</class>
-        <exclude-unlisted-classes>true</exclude-unlisted-classes>
-    </persistence-unit>
-    <persistence-unit name="experiment_data_new">
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentErrorEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentInputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentOutputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ExperimentSummaryEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.GatewayEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.GatewayWorkerEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.JobEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.JobStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.NotificationEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessErrorEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessInputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessOutputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessResourceScheduleEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProcessWorkflowEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProjectEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.ProjectUserEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.QueueStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.TaskEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.TaskErrorEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.TaskStatusEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.UserConfigurationDataEntity</class>
-        <class>org.apache.airavata.registry.core.entities.expcatalog.UserEntity</class>
-        <exclude-unlisted-classes>true</exclude-unlisted-classes>
-    </persistence-unit>
-</persistence>
diff --git a/modules/ide-integration/src/main/resources/airavata-server.properties b/modules/ide-integration/src/main/resources/airavata-server.properties
index 735d359..c0d3e56 100644
--- a/modules/ide-integration/src/main/resources/airavata-server.properties
+++ b/modules/ide-integration/src/main/resources/airavata-server.properties
@@ -275,5 +275,18 @@
 email.expiration.minutes=60
 email.based.monitoring.period=10000
 
-email.based.monitor.address=CHANGEME
-email.based.monitor.password=CHANGEME
\ No newline at end of file
+email.based.monitor.address=airavatatest123@gmail.com
+email.based.monitor.password=airavatatest12345678
+
+###########################################################################
+# ThriftClientPool Configuration
+###########################################################################
+thrift.client.pool.abandoned.removal.enabled=true
+
+
+###########################################################################
+# WorkFlow Configuration
+###########################################################################
+pre.workflow.manager.loadbalance.clusters=false
+post.workflow.manager.loadbalance.clusters=false
+
diff --git a/modules/ide-integration/src/main/resources/database_scripts/airavataworkflowcatalog-derby.sql b/modules/ide-integration/src/main/resources/database_scripts/airavataworkflowcatalog-derby.sql
deleted file mode 100644
index bce4bd9..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/airavataworkflowcatalog-derby.sql
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE AIRAVATA_WORKFLOW
-(
-        ID VARCHAR (255) NOT NULL,
-        EXPERIMENT_ID varchar(255),
-        DESCRIPTION VARCHAR (255),
-        CREATED_AT timestamp DEFAULT CURRENT_TIMESTAMP,
-        UPDATED_AT timestamp,
-        PRIMARY KEY (ID)
-);
-
-CREATE TABLE AIRAVATA_WORKFLOW_ERROR
-(
-        ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        ACTUAL_ERROR_MESSAGE CLOB,
-        USER_FRIENDLY_MESSAGE CLOB,
-        TRANSIENT_OR_PERSISTENT SMALLINT,
-        ROOT_CAUSE_ERROR_ID_LIST CLOB,
-        PRIMARY KEY (ID, WORKFLOW_ID),
-        FOREIGN KEY (WORKFLOW_ID) REFERENCES AIRAVATA_WORKFLOW(ID) ON DELETE CASCADE
-);
-
-CREATE TABLE AIRAVATA_WORKFLOW_STATUS
-(
-        ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        STATE VARCHAR (255) NOT NULL,
-        DESCRIPTION VARCHAR (255),
-        UPDATED_AT timestamp DEFAULT CURRENT_TIMESTAMP,
-        PRIMARY KEY (ID, WORKFLOW_ID),
-        FOREIGN KEY (WORKFLOW_ID) REFERENCES AIRAVATA_WORKFLOW(ID) ON DELETE CASCADE
-);
-
-CREATE TABLE WORKFLOW_APPLICATION
-(
-        ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        EXPERIMENT_ID varchar(255),
-        APPLICATION_INTERFACE_ID VARCHAR (255),
-        COMPUTE_RESOURCE_ID VARCHAR (255),
-        QUEUE_NAME VARCHAR (255),
-        NODE_COUNT INTEGER,
-        CORE_COUNT INTEGER,
-        WALL_TIME_LIMIT INTEGER,
-        PHYSICAL_MEMORY INTEGER,
-        CREATED_AT timestamp DEFAULT CURRENT_TIMESTAMP,
-        UPDATED_AT timestamp,
-        PRIMARY KEY (ID, WORKFLOW_ID),
-        FOREIGN KEY (WORKFLOW_ID) REFERENCES AIRAVATA_WORKFLOW(ID) ON DELETE CASCADE
-);
-
-CREATE TABLE APPLICATION_ERROR
-(
-        ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        ACTUAL_ERROR_MESSAGE CLOB,
-        USER_FRIENDLY_MESSAGE CLOB,
-        TRANSIENT_OR_PERSISTENT SMALLINT,
-        ROOT_CAUSE_ERROR_ID_LIST CLOB,
-        PRIMARY KEY (ID, WORKFLOW_ID),
-        FOREIGN KEY (WORKFLOW_ID) REFERENCES AIRAVATA_WORKFLOW(ID) ON DELETE CASCADE
-);
-
-CREATE TABLE APPLICATION_STATUS
-(
-        ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        STATE VARCHAR (255) NOT NULL,
-        DESCRIPTION VARCHAR (255),
-        UPDATED_AT timestamp DEFAULT CURRENT_TIMESTAMP,
-        PRIMARY KEY (ID, WORKFLOW_ID),
-        FOREIGN KEY (WORKFLOW_ID) REFERENCES AIRAVATA_WORKFLOW(ID) ON DELETE CASCADE
-);
-
-CREATE TABLE WORKFLOW_HANDLER
-(
-        ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        TYPE VARCHAR (255),
-        CREATED_AT timestamp DEFAULT CURRENT_TIMESTAMP,
-        UPDATED_AT timestamp,
-        PRIMARY KEY (ID, WORKFLOW_ID),
-        FOREIGN KEY (WORKFLOW_ID) REFERENCES AIRAVATA_WORKFLOW(ID) ON DELETE CASCADE
-);
-
-CREATE TABLE HANDLER_ERROR
-(
-        ERROR_ID VARCHAR (255) NOT NULL,
-        HANDLER_ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        ACTUAL_ERROR_MESSAGE CLOB,
-        USER_FRIENDLY_MESSAGE CLOB,
-        TRANSIENT_OR_PERSISTENT SMALLINT,
-        ROOT_CAUSE_ERROR_ID_LIST CLOB,
-        PRIMARY KEY (ERROR_ID, HANDLER_ID),
-        FOREIGN KEY (WORKFLOW_ID) REFERENCES AIRAVATA_WORKFLOW(ID) ON DELETE CASCADE,
-        FOREIGN KEY (HANDLER_ID, WORKFLOW_ID) REFERENCES WORKFLOW_HANDLER(ID, WORKFLOW_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE HANDLER_INPUT (
-        HANDLER_ID VARCHAR(255) NOT NULL,
-        NAME VARCHAR(255) NOT NULL,
-        APPLICATION_ARGUMENT VARCHAR(255),
-        DATA_STAGED SMALLINT,
-        INPUT_ORDER INTEGER,
-        IS_READ_ONLY SMALLINT,
-        IS_REQUIRED SMALLINT,
-        METADATA VARCHAR(4096),
-        REQUIRED_TO_ADDED_TO_COMMAND_LINE SMALLINT,
-        STANDARD_INPUT SMALLINT,
-        STORAGE_RESOURCE_ID VARCHAR(255),
-        TYPE VARCHAR(20),
-        USER_FRIENDLY_DESCRIPTION VARCHAR(255),
-        VALUE CLOB,
-        WORKFLOW_ID VARCHAR(255),
-        PRIMARY KEY (HANDLER_ID, NAME),
-        FOREIGN KEY (HANDLER_ID, WORKFLOW_ID) REFERENCES WORKFLOW_HANDLER(ID, WORKFLOW_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE HANDLER_OUTPUT (HANDLER_ID VARCHAR(255) NOT NULL,
-        NAME VARCHAR(255) NOT NULL,
-        APPLICATION_ARGUMENT VARCHAR(255),
-        DATA_MOVEMENT SMALLINT,
-        IS_REQUIRED SMALLINT,
-        LOCATION VARCHAR(255),
-        OUTPUT_STREAMING SMALLINT,
-        REQUIRED_TO_ADDED_TO_COMMAND_LINE SMALLINT,
-        SEARCH_QUERY VARCHAR(255),
-        STORAGE_RESOURCE_ID VARCHAR(255),
-        TYPE VARCHAR(20),
-        VALUE CLOB,
-        WORKFLOW_ID VARCHAR(255),
-        PRIMARY KEY (HANDLER_ID, NAME),
-        FOREIGN KEY (HANDLER_ID, WORKFLOW_ID) REFERENCES WORKFLOW_HANDLER(ID, WORKFLOW_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE HANDLER_STATUS
-(
-        ID VARCHAR (255) NOT NULL,
-        HANDLER_ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        STATE VARCHAR (255) NOT NULL,
-        DESCRIPTION VARCHAR (255),
-        UPDATED_AT timestamp DEFAULT CURRENT_TIMESTAMP,
-        PRIMARY KEY (HANDLER_ID, ID),
-        FOREIGN KEY (HANDLER_ID, WORKFLOW_ID) REFERENCES WORKFLOW_HANDLER(ID, WORKFLOW_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE WORKFLOW_DATA_BLOCK
-(
-        ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        VALUE VARCHAR (255),
-        DATA_TYPE VARCHAR (255),
-        CREATED_AT timestamp DEFAULT CURRENT_TIMESTAMP,
-        UPDATED_AT timestamp,
-        PRIMARY KEY (ID),
-        FOREIGN KEY (WORKFLOW_ID) REFERENCES AIRAVATA_WORKFLOW(ID) ON DELETE CASCADE
-);
-
-CREATE TABLE WORKFLOW_CONNECTION
-(
-        ID VARCHAR (255) NOT NULL,
-        WORKFLOW_ID VARCHAR (255) NOT NULL,
-        DATA_BLOCK_ID VARCHAR (255),
-        FROM_TYPE VARCHAR (255),
-        FROM_ID VARCHAR (255),
-        FROM_OUTPUT_NAME VARCHAR (255),
-        TO_TYPE VARCHAR (255),
-        TO_ID VARCHAR (255),
-        TO_INPUT_NAME VARCHAR (255),
-        CREATED_AT timestamp DEFAULT CURRENT_TIMESTAMP,
-        UPDATED_AT timestamp,
-        PRIMARY KEY (ID, WORKFLOW_ID),
-        FOREIGN KEY (WORKFLOW_ID) REFERENCES AIRAVATA_WORKFLOW(ID) ON DELETE CASCADE,
-        FOREIGN KEY (DATA_BLOCK_ID) REFERENCES WORKFLOW_DATA_BLOCK(ID) ON DELETE CASCADE
-);
-
-CREATE TABLE CONFIGURATION
-(
-        CONFIG_KEY VARCHAR(255),
-        CONFIG_VAL VARCHAR(255),
-        EXPIRE_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        CATEGORY_ID VARCHAR (255),
-        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL, CATEGORY_ID)
-);
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL, EXPIRE_DATE, CATEGORY_ID) VALUES('airavata.workflow.version', '0.17', CURRENT_TIMESTAMP ,'SYSTEM');
diff --git a/modules/ide-integration/src/main/resources/database_scripts/appcatalog-derby.sql b/modules/ide-integration/src/main/resources/database_scripts/appcatalog-derby.sql
deleted file mode 100644
index 3cf7ea8..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/appcatalog-derby.sql
+++ /dev/null
@@ -1,737 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE COMPUTE_RESOURCE
-(
-        RESOURCE_ID VARCHAR (255) NOT NULL,
-        HOST_NAME VARCHAR (255) NOT NULL,
-        RESOURCE_DESCRIPTION VARCHAR (255),
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        MAX_MEMORY_NODE INTEGER,
-        CPUS_PER_NODE INTEGER,
-        DEFAULT_NODE_COUNT INTEGER,
-        DEFAULT_CPU_COUNT INTEGER,
-        DEFAULT_WALLTIME INTEGER,
-        ENABLED SMALLINT,
-        GATEWAY_USAGE_REPORTING SMALLINT,
-        GATEWAY_USAGE_MODULE_LOAD_CMD VARCHAR(500),
-        GATEWAY_USAGE_EXECUTABLE VARCHAR(255),
-        PRIMARY KEY (RESOURCE_ID)
-);
-
-CREATE TABLE HOST_ALIAS
-(
-         RESOURCE_ID VARCHAR(255) NOT NULL,
-         ALIAS VARCHAR(255),
-         PRIMARY KEY(RESOURCE_ID,ALIAS),
-         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE HOST_IPADDRESS
-(
-         RESOURCE_ID VARCHAR(255) NOT NULL,
-         IP_ADDRESS VARCHAR(255),
-         PRIMARY KEY(RESOURCE_ID,IP_ADDRESS),
-         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE GSISSH_SUBMISSION
-(
-         SUBMISSION_ID VARCHAR(255),
-         RESOURCE_JOB_MANAGER VARCHAR(255),
-         SSH_PORT INTEGER,
-         INSTALLED_PATH VARCHAR(255),
-         MONITOR_MODE VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID)
-);
-
-CREATE TABLE GSISSH_EXPORT
-(
-         SUBMISSION_ID VARCHAR(255) NOT NULL,
-         EXPORT VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID, EXPORT),
-         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE GSISSH_PREJOBCOMMAND
-(
-         SUBMISSION_ID VARCHAR(255) NOT NULL,
-         COMMAND VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID, COMMAND),
-         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE GSISSH_POSTJOBCOMMAND
-(
-         SUBMISSION_ID VARCHAR(255) NOT NULL,
-         COMMAND VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID, COMMAND),
-         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE GLOBUS_SUBMISSION
-(
-         SUBMISSION_ID VARCHAR(255),
-         RESOURCE_JOB_MANAGER VARCHAR(255),
-         SECURITY_PROTOCAL VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID)
-);
-
-CREATE TABLE UNICORE_SUBMISSION
-(
-         SUBMISSION_ID VARCHAR(255),
-         SECURITY_PROTOCAL VARCHAR(255),
-         UNICORE_ENDPOINT_URL VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID)
-);
-
-CREATE TABLE UNICORE_DATAMOVEMENT
-(
-         DATAMOVEMENT_ID VARCHAR(255),
-         SECURITY_PROTOCAL VARCHAR(255),
-         UNICORE_ENDPOINT_URL VARCHAR(255),
-         PRIMARY KEY(DATAMOVEMENT_ID)
-);
-
-
-CREATE TABLE GLOBUS_GK_ENDPOINT
-(
-         SUBMISSION_ID VARCHAR(255) NOT NULL,
-         ENDPOINT VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID, ENDPOINT),
-         FOREIGN KEY (SUBMISSION_ID) REFERENCES GLOBUS_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE RESOURCE_JOB_MANAGER
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        PUSH_MONITORING_ENDPOINT VARCHAR (255),
-        JOB_MANAGER_BIN_PATH VARCHAR (255),
-        RESOURCE_JOB_MANAGER_TYPE VARCHAR (255) NOT NULL,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID)
-);
-
-
-
-CREATE TABLE SSH_JOB_SUBMISSION
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
-        ALTERNATIVE_SSH_HOSTNAME VARCHAR (255),
-        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
-        SSH_PORT INTEGER,
-        MONITOR_MODE VARCHAR (255),
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID),
-        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID)
-);
-
-CREATE TABLE SCP_DATA_MOVEMENT
-(
-        QUEUE_DESCRIPTION VARCHAR (255),
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
-        ALTERNATIVE_SCP_HOSTNAME VARCHAR (255),
-        SSH_PORT INTEGER,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
-);
-
-CREATE TABLE GRIDFTP_DATA_MOVEMENT
-(
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
-);
-
-CREATE TABLE GRIDFTP_ENDPOINT
-(
-        ENDPOINT VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID,ENDPOINT),
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        FOREIGN KEY (DATA_MOVEMENT_INTERFACE_ID) REFERENCES GRIDFTP_DATA_MOVEMENT(DATA_MOVEMENT_INTERFACE_ID) ON DELETE CASCADE
-);
-
---CREATE TABLE JOB_SUBMISSION_PROTOCOL
---(
---         RESOURCE_ID VARCHAR(255),
---         SUBMISSION_ID VARCHAR(255),
---         JOB_TYPE VARCHAR(255),
---         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
---         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
---         PRIMARY KEY(RESOURCE_ID,SUBMISSION_ID,JOB_TYPE),
---         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
---);
---
---CREATE TABLE DATA_MOVEMENT_PROTOCOL
---(
---         RESOURCE_ID VARCHAR(255),
---         DATA_MOVE_ID VARCHAR(255),
---         DATA_MOVE_TYPE VARCHAR(255),
---         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
---         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
---         PRIMARY KEY(RESOURCE_ID,DATA_MOVE_ID,DATA_MOVE_TYPE),
---         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
---);
-
-CREATE TABLE APPLICATION_MODULE
-(
-         MODULE_ID VARCHAR(255),
-         MODULE_NAME VARCHAR(255),
-         MODULE_VERSION VARCHAR(255),
-         MODULE_DESC VARCHAR(500),
-         GATEWAY_ID VARCHAR (255) NOT NULL,
-         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
-         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL,
-         PRIMARY KEY(MODULE_ID)
-);
-
-CREATE TABLE APPLICATION_DEPLOYMENT
-(
-         DEPLOYMENT_ID VARCHAR(255),
-         APP_MODULE_ID VARCHAR(255) NOT NULL,
-         COMPUTE_HOSTID VARCHAR(255) NOT NULL,
-         EXECUTABLE_PATH VARCHAR(255),
-	       PARALLELISM VARCHAR(255),
-         APPLICATION_DESC VARCHAR(255),
-         ENV_MODULE_LOAD_CMD VARCHAR(255),
-         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
-         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL,
-         GATEWAY_ID VARCHAR(255) NOT NULL,
-         DEFAULT_QUEUE_NAME VARCHAR(255),
-         DEFAULT_NODE_COUNT INTEGER,
-         DEFAULT_CPU_COUNT INTEGER,
-         DEFAULT_WALLTIME INTEGER,
-         EDITABLE_BY_USER SMALLINT,
-         PRIMARY KEY(DEPLOYMENT_ID),
-         FOREIGN KEY (COMPUTE_HOSTID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-         FOREIGN KEY (APP_MODULE_ID) REFERENCES APPLICATION_MODULE(MODULE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE MODULE_LOAD_CMD
-(
-        CMD VARCHAR (255) NOT NULL,
-        APP_DEPLOYMENT_ID VARCHAR (255) NOT NULL,
-        COMMAND_ORDER INTEGER,
-        PRIMARY KEY (APP_DEPLOYMENT_ID,CMD),
-        FOREIGN KEY (APP_DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PREJOB_COMMAND
-(
-         APPDEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         COMMAND VARCHAR(255),
-         COMMAND_ORDER INTEGER,
-         PRIMARY KEY(APPDEPLOYMENT_ID, COMMAND),
-         FOREIGN KEY (APPDEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE POSTJOB_COMMAND
-(
-         APPDEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         COMMAND VARCHAR(255),
-         COMMAND_ORDER INTEGER,
-         PRIMARY KEY(APPDEPLOYMENT_ID, COMMAND),
-         FOREIGN KEY (APPDEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE LIBRARY_PREPAND_PATH
-(
-         DEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         NAME VARCHAR(255),
-         VALUE VARCHAR(255),
-         PRIMARY KEY(DEPLOYMENT_ID, NAME),
-         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE LIBRARY_APEND_PATH
-(
-         DEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         NAME VARCHAR(255),
-         VALUE VARCHAR(255),
-         PRIMARY KEY(DEPLOYMENT_ID, NAME),
-         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE APP_ENVIRONMENT
-(
-         DEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         NAME VARCHAR(255),
-         VALUE VARCHAR(255),
-         ENV_ORDER INTEGER,
-         PRIMARY KEY(DEPLOYMENT_ID, NAME),
-         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE APPLICATION_INTERFACE
-(
-         INTERFACE_ID VARCHAR(255),
-         APPLICATION_NAME VARCHAR(255),
-         APPLICATION_DESCRIPTION VARCHAR(500),
-         GATEWAY_ID VARCHAR(255) NOT NULL,
-         ARCHIVE_WORKING_DIRECTORY SMALLINT,
-         HAS_OPTIONAL_FILE_INPUTS SMALLINT,
-         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
-         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL,
-         PRIMARY KEY(INTERFACE_ID)
-);
-
-CREATE TABLE APP_MODULE_MAPPING
-(
-         INTERFACE_ID VARCHAR(255) NOT NULL,
-         MODULE_ID VARCHAR(255) NOT NULL,
-         PRIMARY KEY(INTERFACE_ID, MODULE_ID),
-         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE,
-         FOREIGN KEY (MODULE_ID) REFERENCES APPLICATION_MODULE(MODULE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE APPLICATION_INPUT
-(
-         INTERFACE_ID VARCHAR(255) NOT NULL,
-         INPUT_KEY VARCHAR(255),
-         INPUT_VALUE VARCHAR(255),
-         DATA_TYPE VARCHAR(255),
-         METADATA VARCHAR(4096),
-         APP_ARGUMENT VARCHAR(255),
-         STANDARD_INPUT SMALLINT,
-         USER_FRIENDLY_DESC VARCHAR(255),
-         INPUT_ORDER INTEGER,
-         IS_REQUIRED SMALLINT,
-         REQUIRED_TO_COMMANDLINE SMALLINT,
-         DATA_STAGED SMALLINT,
-         IS_READ_ONLY SMALLINT,
-         PRIMARY KEY(INTERFACE_ID,INPUT_KEY),
-         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE APPLICATION_OUTPUT
-(
-         INTERFACE_ID VARCHAR(255) NOT NULL,
-         OUTPUT_KEY VARCHAR(255),
-         OUTPUT_VALUE VARCHAR(255),
-         DATA_TYPE VARCHAR(255),
-         IS_REQUIRED SMALLINT,
-         REQUIRED_TO_COMMANDLINE SMALLINT,
-         DATA_MOVEMENT SMALLINT,
-         DATA_NAME_LOCATION VARCHAR(255),
-         SEARCH_QUERY VARCHAR(255),
-         APP_ARGUMENT VARCHAR(255),
-         OUTPUT_STREAMING SMALLINT,
-         PRIMARY KEY(INTERFACE_ID,OUTPUT_KEY),
-         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE GATEWAY_PROFILE
-(
-         GATEWAY_ID VARCHAR(255),
-         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-         CS_TOKEN VARCHAR (255),
-         IDENTITY_SERVER_TENANT VARCHAR (255),
-         IDENTITY_SERVER_PWD_CRED_TOKEN VARCHAR (255),
-         PRIMARY KEY(GATEWAY_ID)
-);
-
-CREATE TABLE COMPUTE_RESOURCE_PREFERENCE
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        RESOURCE_ID VARCHAR(255) NOT NULL,
-        OVERRIDE_BY_AIRAVATA SMALLINT,
-        PREFERED_JOB_SUB_PROTOCOL VARCHAR(255),
-        PREFERED_DATA_MOVE_PROTOCOL VARCHAR(255),
-        PREFERED_BATCH_QUEUE VARCHAR(255),
-        SCRATCH_LOCATION VARCHAR(255),
-        ALLOCATION_PROJECT_NUMBER VARCHAR(255),
-        LOGIN_USERNAME VARCHAR(255),
-        RESOURCE_CS_TOKEN VARCHAR(255),
-        USAGE_REPORTING_GATEWAY_ID VARCHAR(255),
-        QUALITY_OF_SERVICE VARCHAR(255),
-        RESERVATION VARCHAR (255),
-        RESERVATION_START_TIME timestamp,
-        RESERVATION_END_TIME timestamp,
-        SSH_ACCOUNT_PROVISIONER VARCHAR(255),
-        SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO VARCHAR(1000),
-        PRIMARY KEY(GATEWAY_ID,RESOURCE_ID),
-        FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE SSH_ACCOUNT_PROVISIONER_CONFIG
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        RESOURCE_ID VARCHAR(255) NOT NULL,
-        CONFIG_NAME VARCHAR(255) NOT NULL,
-        CONFIG_VALUE VARCHAR(255),
-        PRIMARY KEY (GATEWAY_ID, RESOURCE_ID, CONFIG_NAME),
-        FOREIGN KEY (GATEWAY_ID, RESOURCE_ID) REFERENCES COMPUTE_RESOURCE_PREFERENCE (GATEWAY_ID, RESOURCE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE BATCH_QUEUE
-(
-        COMPUTE_RESOURCE_ID VARCHAR(255) NOT NULL,
-        MAX_RUNTIME INTEGER,
-        MAX_JOB_IN_QUEUE INTEGER,
-        QUEUE_DESCRIPTION VARCHAR(255),
-        QUEUE_NAME VARCHAR(255) NOT NULL,
-        MAX_PROCESSORS INTEGER,
-        MAX_NODES INTEGER,
-        MAX_MEMORY INTEGER,
-        CPU_PER_NODE INTEGER,
-        DEFAULT_NODE_COUNT INTEGER,
-        DEFAULT_CPU_COUNT INTEGER,
-        DEFAULT_WALLTIME INTEGER,
-        QUEUE_SPECIFIC_MACROS VARCHAR(255),
-        IS_DEFAULT_QUEUE SMALLINT,
-        PRIMARY KEY (COMPUTE_RESOURCE_ID,QUEUE_NAME),
-        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE COMPUTE_RESOURCE_FILE_SYSTEM
-(
-        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        PATH VARCHAR (255),
-        FILE_SYSTEM VARCHAR (255) NOT NULL,
-        PRIMARY KEY (COMPUTE_RESOURCE_ID,FILE_SYSTEM),
-        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-  );
-
-CREATE TABLE JOB_SUBMISSION_INTERFACE
-(
-        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
-        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        JOB_SUBMISSION_PROTOCOL VARCHAR (255) NOT NULL,
-        PRIORITY_ORDER INTEGER,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (COMPUTE_RESOURCE_ID,JOB_SUBMISSION_INTERFACE_ID),
-        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-);
- 
-CREATE TABLE DATA_MOVEMENT_INTERFACE
-(
-        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_PROTOCOL VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        PRIORITY_ORDER INTEGER,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (COMPUTE_RESOURCE_ID,DATA_MOVEMENT_INTERFACE_ID),
-        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE STORAGE_RESOURCE
-(
-        STORAGE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        HOST_NAME VARCHAR (255) NOT NULL,
-        DESCRIPTION VARCHAR (255),
-        ENABLED SMALLINT ,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (STORAGE_RESOURCE_ID)
-);
-
-CREATE TABLE STORAGE_INTERFACE
-(
-        STORAGE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_PROTOCOL VARCHAR (255) NOT NULL,
-        PRIORITY_ORDER INTEGER,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (STORAGE_RESOURCE_ID,DATA_MOVEMENT_INTERFACE_ID),
-        FOREIGN KEY (STORAGE_RESOURCE_ID) REFERENCES STORAGE_RESOURCE(STORAGE_RESOURCE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE JOB_MANAGER_COMMAND
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        COMMAND_TYPE VARCHAR (255) NOT NULL,
-        COMMAND VARCHAR (255),
-        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID,COMMAND_TYPE),
-        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PARALLELISM_COMMAND
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        COMMAND_TYPE VARCHAR (255) NOT NULL,
-        COMMAND VARCHAR (255),
-        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID,COMMAND_TYPE),
-        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE LOCAL_SUBMISSION
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
-        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID),
-        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID)
-);
-
-CREATE TABLE LOCAL_DATA_MOVEMENT
-(
-  DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-  PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
-);
-
-CREATE TABLE STORAGE_PREFERENCE
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        STORAGE_RESOURCE_ID VARCHAR(255) NOT NULL,
-        LOGIN_USERNAME VARCHAR(255),
-        FS_ROOT_LOCATION VARCHAR(255),
-        RESOURCE_CS_TOKEN VARCHAR(255),
-        PRIMARY KEY(GATEWAY_ID,STORAGE_RESOURCE_ID),
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE USER_RESOURCE_PROFILE (
-  USER_ID varchar(255) NOT NULL,
-  CREATION_TIME TIMESTAMP DEFAULT NULL,
-  CS_TOKEN varchar(255) DEFAULT NULL,
-  GATEWAY_ID varchar(255) DEFAULT NULL,
-  IDENTITY_SERVER_PWD_CRED_TOKEN varchar(255) DEFAULT NULL,
-  IDENTITY_SERVER_TENANT varchar(255) DEFAULT NULL,
-  UPDATE_TIME TIMESTAMP DEFAULT NULL,
-  PRIMARY KEY (USER_ID,GATEWAY_ID)
-);
-
-CREATE TABLE USER_STORAGE_PREFERENCE (
-  STORAGE_RESOURCE_ID varchar(255) NOT NULL,
-  USER_ID varchar(255) NOT NULL,
-  RESOURCE_CS_TOKEN varchar(255) DEFAULT NULL,
-  FS_ROOT_LOCATION varchar(255) DEFAULT NULL,
-  GATEWAY_ID varchar(255) DEFAULT NULL,
-  LOGIN_USERNAME varchar(255) DEFAULT NULL,
-  PRIMARY KEY (STORAGE_RESOURCE_ID,USER_ID,GATEWAY_ID)
-);
-
-CREATE TABLE USER_COMPUTE_RESOURCE_PREFERENCE (
-  RESOURCE_ID varchar(255) NOT NULL,
-  USER_ID varchar(255) NOT NULL,
-  PREFERED_BATCH_QUEUE varchar(255) DEFAULT NULL,
-  RESOURCE_CS_TOKEN varchar(255) DEFAULT NULL,
-  GATEWAY_ID varchar(255) DEFAULT NULL,
-  LOGIN_USERNAME varchar(255) DEFAULT NULL,
-  ALLOCATION_PROJECT_NUMBER varchar(255) DEFAULT NULL,
-  QUALITY_OF_SERVICE varchar(255) DEFAULT NULL,
-  RESERVATION varchar(255) DEFAULT NULL,
-  RESERVATION_END_TIME TIMESTAMP DEFAULT NULL,
-  RESERVATION_START_TIME TIMESTAMP DEFAULT NULL,
-  SCRATCH_LOCATION varchar(255) DEFAULT NULL,
-  VALIDATED SMALLINT NOT NULL DEFAULT 0,
-  PRIMARY KEY (RESOURCE_ID,USER_ID,GATEWAY_ID)
-);
-
-CREATE TABLE GROUP_RESOURCE_PROFILE (
-  GATEWAY_ID varchar(255) NOT NULL,
-  GROUP_RESOURCE_PROFILE_ID varchar(255) NOT NULL,
-  GROUP_RESOURCE_PROFILE_NAME varchar(255) DEFAULT NULL,
-  CREATION_TIME BIGINT NOT NULL,
-  UPDATE_TIME BIGINT NOT NULL,
-  DEFAULT_CREDENTIAL_STORE_TOKEN varchar(255) DEFAULT NULL,
-  PRIMARY KEY (GROUP_RESOURCE_PROFILE_ID),
-  UNIQUE (GATEWAY_ID, GROUP_RESOURCE_PROFILE_NAME)
-);
-
-CREATE TABLE BATCH_QUEUE_RESOURCE_POLICY (
-  RESOURCE_POLICY_ID varchar(255) NOT NULL,
-  COMPUTE_RESOURCE_ID varchar(255) NOT NULL,
-  GROUP_RESOURCE_PROFILE_ID varchar(255) NOT NULL,
-  QUEUE_NAME varchar(255) NOT NULL,
-  MAX_ALLOWED_NODES INTEGER,
-  MAX_ALLOWED_CORES INTEGER,
-  MAX_ALLOWED_WALLTIME INTEGER,
-  PRIMARY KEY (RESOURCE_POLICY_ID),
-  FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-  FOREIGN KEY (GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_RESOURCE_PROFILE(GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE COMPUTE_RESOURCE_POLICY (
-    RESOURCE_POLICY_ID varchar(255) NOT NULL,
-    COMPUTE_RESOURCE_ID varchar(255) NOT NULL,
-    GROUP_RESOURCE_PROFILE_ID varchar(255) NOT NULL,
-    PRIMARY KEY (RESOURCE_POLICY_ID),
-    FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-    FOREIGN KEY (GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_RESOURCE_PROFILE(GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE COMPUTE_RESOURCE_POLICY_QUEUES (
-    RESOURCE_POLICY_ID varchar(255) NOT NULL,
-    QUEUE_NAME varchar(255) NOT NULL,
-    PRIMARY KEY (RESOURCE_POLICY_ID, QUEUE_NAME),
-    FOREIGN KEY (RESOURCE_POLICY_ID) REFERENCES COMPUTE_RESOURCE_POLICY(RESOURCE_POLICY_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE GROUP_COMPUTE_RESOURCE_PREFERENCE
-(
-        RESOURCE_ID VARCHAR(255) NOT NULL,
-        GROUP_RESOURCE_PROFILE_ID varchar(255) NOT NULL,
-        OVERRIDE_BY_AIRAVATA SMALLINT,
-        PREFERED_JOB_SUB_PROTOCOL VARCHAR(255),
-        PREFERED_DATA_MOVE_PROTOCOL VARCHAR(255),
-        PREFERED_BATCH_QUEUE VARCHAR(255),
-        SCRATCH_LOCATION VARCHAR(255),
-        ALLOCATION_PROJECT_NUMBER VARCHAR(255),
-        LOGIN_USERNAME VARCHAR(255),
-        RESOURCE_CS_TOKEN VARCHAR(255),
-        USAGE_REPORTING_GATEWAY_ID VARCHAR(255),
-        QUALITY_OF_SERVICE VARCHAR(255),
-        RESERVATION VARCHAR (255),
-        RESERVATION_START_TIME timestamp,
-        RESERVATION_END_TIME timestamp,
-        SSH_ACCOUNT_PROVISIONER VARCHAR(255),
-        SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO VARCHAR(1000),
-        PRIMARY KEY(RESOURCE_ID,GROUP_RESOURCE_PROFILE_ID),
-        FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-        FOREIGN KEY (GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_RESOURCE_PROFILE(GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE GRP_SSH_ACC_PROV_CONFIG
-(
-        RESOURCE_ID VARCHAR(255) NOT NULL,
-        GROUP_RESOURCE_PROFILE_ID VARCHAR(255) NOT NULL,
-        CONFIG_NAME VARCHAR(255) NOT NULL,
-        CONFIG_VALUE VARCHAR(255),
-        PRIMARY KEY (RESOURCE_ID, CONFIG_NAME, GROUP_RESOURCE_PROFILE_ID),
-        FOREIGN KEY (RESOURCE_ID,GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_COMPUTE_RESOURCE_PREFERENCE (RESOURCE_ID,GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PARSING_TEMPLATE
-(
-        PARSING_TEMPLATE_ID VARCHAR(255) NOT NULL,
-        APP_INTERFACE_ID VARCHAR(255) NOT NULL,
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSING_TEMPLATE_ID)
-);
-
-CREATE TABLE PARSER
-(
-        PARSER_ID VARCHAR(255) NOT NULL,
-        IMAGE_NAME VARCHAR(255) NOT NULL,
-        OUTPUT_DIR_PATH VARCHAR(255) NOT NULL,
-        INPUT_DIR_PATH VARCHAR(255) NOT NULL,
-        EXECUTION_COMMAND VARCHAR(255) NOT NULL,
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_ID)
-);
-
-CREATE TABLE PARSER_OUTPUT
-(
-        PARSER_OUTPUT_ID VARCHAR(255) NOT NULL,
-        PARSER_OUTPUT_NAME VARCHAR(255) NOT NULL,
-        PARSER_OUTPUT_REQUIRED SMALLINT NOT NULL,
-        PARSER_ID VARCHAR(255) NOT NULL,
-        OUTPUT_TYPE VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_OUTPUT_ID),
-        FOREIGN KEY (PARSER_ID) REFERENCES PARSER (PARSER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PARSER_INPUT
-(
-        PARSER_INPUT_ID VARCHAR(255) NOT NULL,
-        PARSER_INPUT_NAME VARCHAR(255) NOT NULL,
-        PARSER_INPUT_REQUIRED SMALLINT NOT NULL,
-        PARSER_ID VARCHAR(255) NOT NULL,
-        INPUT_TYPE VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_INPUT_ID),
-        FOREIGN KEY (PARSER_ID) REFERENCES PARSER (PARSER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PARSING_TEMPLATE_INPUT
-(
-        PARSING_TEMPLATE_INPUT_ID VARCHAR(255) NOT NULL,
-        TARGET_PARSER_INPUT_ID VARCHAR(255) NOT NULL,
-        APPLICATION_OUTPUT_NAME VARCHAR(255),
-        VALUE VARCHAR(255),
-        PARSING_TEMPLATE_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSING_TEMPLATE_INPUT_ID),
-        FOREIGN KEY (TARGET_PARSER_INPUT_ID) REFERENCES PARSER_INPUT (PARSER_INPUT_ID) ON DELETE CASCADE,
-        FOREIGN KEY (PARSING_TEMPLATE_ID) REFERENCES PARSING_TEMPLATE (PARSING_TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PARSER_CONNECTOR
-(
-        PARSER_CONNECTOR_ID VARCHAR(255) NOT NULL,
-        PARENT_PARSER_ID VARCHAR(255) NOT NULL,
-        CHILD_PARSER_ID VARCHAR(255) NOT NULL,
-        PARSING_TEMPLATE_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_CONNECTOR_ID),
-        FOREIGN KEY (PARENT_PARSER_ID) REFERENCES PARSER (PARSER_ID) ON DELETE CASCADE,
-        FOREIGN KEY (CHILD_PARSER_ID) REFERENCES PARSER (PARSER_ID) ON DELETE CASCADE,
-        FOREIGN KEY (PARSING_TEMPLATE_ID) REFERENCES PARSING_TEMPLATE (PARSING_TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PARSER_CONNECTOR_INPUT
-(
-        PARSER_CONNECTOR_INPUT_ID VARCHAR(255) NOT NULL,
-        PARSER_INPUT_ID VARCHAR(255) NOT NULL,
-        PARSER_OUTPUT_ID VARCHAR(255),
-        VALUE VARCHAR(255),
-        PARSER_CONNECTOR_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_CONNECTOR_INPUT_ID),
-        FOREIGN KEY (PARSER_INPUT_ID) REFERENCES PARSER_INPUT (PARSER_INPUT_ID) ON DELETE CASCADE,
-        FOREIGN KEY (PARSER_OUTPUT_ID) REFERENCES PARSER_OUTPUT (PARSER_OUTPUT_ID) ON DELETE CASCADE,
-        FOREIGN KEY (PARSER_CONNECTOR_ID) REFERENCES PARSER_CONNECTOR (PARSER_CONNECTOR_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE GATEWAY_GROUPS
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        ADMINS_GROUP_ID VARCHAR(255),
-        READ_ONLY_ADMINS_GROUP_ID VARCHAR(255),
-        DEFAULT_GATEWAY_USERS_GROUP_ID VARCHAR(255),
-        PRIMARY KEY(GATEWAY_ID)
-);
-
-CREATE TABLE CLOUD_JOB_SUBMISSION (
-  JOB_SUBMISSION_INTERFACE_ID varchar(255) NOT NULL,
-  EXECUTABLE_TYPE VARCHAR(255) DEFAULT NULL,
-  NODE_ID VARCHAR(255) DEFAULT NULL,
-  PROVIDER_NAME VARCHAR(255) DEFAULT NULL,
-  SECURITY_PROTOCOL VARCHAR(255) DEFAULT NULL,
-  USER_ACCOUNT_NAME VARCHAR(255) DEFAULT NULL,
-  PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID)
-);
-
-CREATE TABLE CONFIGURATION
-(
-  CONFIG_KEY VARCHAR(255),
-  CONFIG_VAL VARCHAR(255),
-  PRIMARY KEY(CONFIG_KEY, CONFIG_VAL)
-);
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL) VALUES('app_catalog_version', '0.16');
-
-
-
diff --git a/modules/ide-integration/src/main/resources/database_scripts/appcatalog-mysql.sql b/modules/ide-integration/src/main/resources/database_scripts/appcatalog-mysql.sql
deleted file mode 100644
index 6c0359c..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/appcatalog-mysql.sql
+++ /dev/null
@@ -1,728 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE COMPUTE_RESOURCE
-(
-          RESOURCE_ID VARCHAR (255) NOT NULL,
-          HOST_NAME VARCHAR (255) NOT NULL,
-          RESOURCE_DESCRIPTION VARCHAR (255),
-          CREATION_TIME TIMESTAMP DEFAULT NOW(),
-          UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-          MAX_MEMORY_NODE INTEGER,
-          CPUS_PER_NODE INTEGER,
-          DEFAULT_NODE_COUNT INTEGER,
-          DEFAULT_CPU_COUNT INTEGER,
-          DEFAULT_WALLTIME INTEGER,
-          ENABLED SMALLINT,
-          GATEWAY_USAGE_REPORTING TINYINT(1),
-          GATEWAY_USAGE_MODULE_LOAD_CMD VARCHAR(500),
-          GATEWAY_USAGE_EXECUTABLE VARCHAR(255),
-          PRIMARY KEY (RESOURCE_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE HOST_ALIAS
-(
-         RESOURCE_ID VARCHAR(255) NOT NULL,
-         ALIAS VARCHAR(255),
-         PRIMARY KEY(RESOURCE_ID,ALIAS),
-         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE HOST_IPADDRESS
-(
-         RESOURCE_ID VARCHAR(255) NOT NULL,
-         IP_ADDRESS VARCHAR(255),
-         PRIMARY KEY(RESOURCE_ID,IP_ADDRESS),
-         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GSISSH_SUBMISSION
-(
-         SUBMISSION_ID VARCHAR(255),
-         RESOURCE_JOB_MANAGER VARCHAR(255),
-         SSH_PORT INTEGER,
-         INSTALLED_PATH VARCHAR(255),
-         MONITOR_MODE VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GSISSH_EXPORT
-(
-         SUBMISSION_ID VARCHAR(255) NOT NULL,
-         EXPORT VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID, EXPORT),
-         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GSISSH_PREJOBCOMMAND
-(
-         SUBMISSION_ID VARCHAR(255) NOT NULL,
-         COMMAND VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID, COMMAND),
-         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GSISSH_POSTJOBCOMMAND
-(
-         SUBMISSION_ID VARCHAR(255) NOT NULL,
-         COMMAND VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID, COMMAND),
-         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GLOBUS_SUBMISSION
-(
-         SUBMISSION_ID VARCHAR(255),
-         RESOURCE_JOB_MANAGER VARCHAR(255),
-         SECURITY_PROTOCAL VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE UNICORE_SUBMISSION
-(
-         SUBMISSION_ID VARCHAR(255),
-         SECURITY_PROTOCAL VARCHAR(255),
-         UNICORE_ENDPOINT_URL VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE UNICORE_DATAMOVEMENT
-(
-         DATAMOVEMENT_ID VARCHAR(255),
-         SECURITY_PROTOCAL VARCHAR(255),
-         UNICORE_ENDPOINT_URL VARCHAR(255),
-         PRIMARY KEY(DATAMOVEMENT_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GLOBUS_GK_ENDPOINT
-(
-         SUBMISSION_ID VARCHAR(255) NOT NULL,
-         ENDPOINT VARCHAR(255),
-         PRIMARY KEY(SUBMISSION_ID, ENDPOINT),
-         FOREIGN KEY (SUBMISSION_ID) REFERENCES GLOBUS_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE RESOURCE_JOB_MANAGER
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        PUSH_MONITORING_ENDPOINT VARCHAR (255),
-        JOB_MANAGER_BIN_PATH VARCHAR (255),
-        RESOURCE_JOB_MANAGER_TYPE VARCHAR (255) NOT NULL,
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE SSH_JOB_SUBMISSION
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
-        ALTERNATIVE_SSH_HOSTNAME VARCHAR (255),
-        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
-        SSH_PORT INTEGER,
-        MONITOR_MODE VARCHAR (255),
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
-        PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID),
-        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE SCP_DATA_MOVEMENT
-(
-        QUEUE_DESCRIPTION VARCHAR (255),
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
-        ALTERNATIVE_SCP_HOSTNAME VARCHAR (255),
-        SSH_PORT INTEGER,
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
-        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GRIDFTP_DATA_MOVEMENT
-(
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
-        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GRIDFTP_ENDPOINT
-(
-        ENDPOINT VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID,ENDPOINT),
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
-        FOREIGN KEY (DATA_MOVEMENT_INTERFACE_ID) REFERENCES GRIDFTP_DATA_MOVEMENT(DATA_MOVEMENT_INTERFACE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
---CREATE TABLE JOB_SUBMISSION_PROTOCOL
---(
---         RESOURCE_ID VARCHAR(255),
---         SUBMISSION_ID VARCHAR(255),
---         JOB_TYPE VARCHAR(255),
---         PRIMARY KEY(RESOURCE_ID,SUBMISSION_ID,JOB_TYPE),
---         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
---);
---
---CREATE TABLE DATA_MOVEMENT_PROTOCOL
---(
---         RESOURCE_ID VARCHAR(255),
---         DATA_MOVE_ID VARCHAR(255),
---         DATA_MOVE_TYPE VARCHAR(255),
---         PRIMARY KEY(RESOURCE_ID,DATA_MOVE_ID,DATA_MOVE_TYPE),
---         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
---);
-
-CREATE TABLE APPLICATION_MODULE
-(
-         MODULE_ID VARCHAR(255),
-         MODULE_NAME VARCHAR(255),
-         MODULE_VERSION VARCHAR(255),
-         MODULE_DESC VARCHAR(500),
-         GATEWAY_ID VARCHAR (255) NOT NULL,
-         CREATION_TIME TIMESTAMP DEFAULT NOW() NOT NULL,
-         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL,
-         PRIMARY KEY(MODULE_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE APPLICATION_DEPLOYMENT
-(
-         DEPLOYMENT_ID VARCHAR(255),
-         APP_MODULE_ID VARCHAR(255) NOT NULL,
-         COMPUTE_HOSTID VARCHAR(255) NOT NULL,
-         EXECUTABLE_PATH VARCHAR(255),
-	       PARALLELISM VARCHAR(255),
-         APPLICATION_DESC VARCHAR(255),
-         ENV_MODULE_LOAD_CMD VARCHAR(255),
-         CREATION_TIME TIMESTAMP DEFAULT NOW() NOT NULL,
-         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL,
-         GATEWAY_ID VARCHAR(255) NOT NULL,
-         DEFAULT_QUEUE_NAME VARCHAR(255),
-         DEFAULT_NODE_COUNT INTEGER,
-         DEFAULT_CPU_COUNT INTEGER,
-         DEFAULT_WALLTIME INTEGER,
-         EDITABLE_BY_USER TINYINT(1),
-         PRIMARY KEY(DEPLOYMENT_ID),
-         FOREIGN KEY (COMPUTE_HOSTID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-         FOREIGN KEY (APP_MODULE_ID) REFERENCES APPLICATION_MODULE(MODULE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE MODULE_LOAD_CMD
-(
-        CMD VARCHAR (255) NOT NULL,
-        APP_DEPLOYMENT_ID VARCHAR (255) NOT NULL,
-        COMMAND_ORDER INTEGER,
-        PRIMARY KEY (APP_DEPLOYMENT_ID,CMD),
-        FOREIGN KEY (APP_DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PREJOB_COMMAND
-(
-         APPDEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         COMMAND VARCHAR(255),
-         COMMAND_ORDER INTEGER,
-         PRIMARY KEY(APPDEPLOYMENT_ID, COMMAND),
-         FOREIGN KEY (APPDEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE POSTJOB_COMMAND
-(
-         APPDEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         COMMAND VARCHAR(255),
-         COMMAND_ORDER INTEGER,
-         PRIMARY KEY(APPDEPLOYMENT_ID, COMMAND),
-         FOREIGN KEY (APPDEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE LIBRARY_PREPAND_PATH
-(
-         DEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         NAME VARCHAR(255),
-         VALUE VARCHAR(255),
-         PRIMARY KEY(DEPLOYMENT_ID, NAME),
-         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE LIBRARY_APEND_PATH
-(
-         DEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         NAME VARCHAR(255),
-         VALUE VARCHAR(255),
-         PRIMARY KEY(DEPLOYMENT_ID, NAME),
-         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE APP_ENVIRONMENT
-(
-         DEPLOYMENT_ID VARCHAR(255) NOT NULL,
-         NAME VARCHAR(255),
-         VALUE VARCHAR(255),
-         ENV_ORDER INTEGER,
-         PRIMARY KEY(DEPLOYMENT_ID, NAME),
-         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE APPLICATION_INTERFACE
-(
-         INTERFACE_ID VARCHAR(255),
-         APPLICATION_NAME VARCHAR(255),
-         APPLICATION_DESCRIPTION VARCHAR(500),
-         GATEWAY_ID VARCHAR(255) NOT NULL,
-         ARCHIVE_WORKING_DIRECTORY SMALLINT,
-         HAS_OPTIONAL_FILE_INPUTS TINYINT(1),
-         CREATION_TIME TIMESTAMP DEFAULT NOW() NOT NULL,
-         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL,
-         PRIMARY KEY(INTERFACE_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE APP_MODULE_MAPPING
-(
-         INTERFACE_ID VARCHAR(255) NOT NULL,
-         MODULE_ID VARCHAR(255) NOT NULL,
-         PRIMARY KEY(INTERFACE_ID, MODULE_ID),
-         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE,
-         FOREIGN KEY (MODULE_ID) REFERENCES APPLICATION_MODULE(MODULE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE APPLICATION_INPUT
-(
-         INTERFACE_ID VARCHAR(255) NOT NULL,
-         INPUT_KEY VARCHAR(255),
-         INPUT_VALUE VARCHAR(255),
-         DATA_TYPE VARCHAR(255),
-         METADATA VARCHAR(4096),
-         APP_ARGUMENT VARCHAR(255),
-         STANDARD_INPUT SMALLINT,
-         USER_FRIENDLY_DESC VARCHAR(255),
-         INPUT_ORDER INTEGER,
-         IS_REQUIRED SMALLINT,
-         REQUIRED_TO_COMMANDLINE SMALLINT,
-         DATA_STAGED SMALLINT,
-         IS_READ_ONLY SMALLINT,
-         PRIMARY KEY(INTERFACE_ID,INPUT_KEY),
-         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE APPLICATION_OUTPUT
-(
-         INTERFACE_ID VARCHAR(255) NOT NULL,
-         OUTPUT_KEY VARCHAR(255),
-         OUTPUT_VALUE VARCHAR(255),
-         DATA_TYPE VARCHAR(255),
-         IS_REQUIRED SMALLINT,
-         REQUIRED_TO_COMMANDLINE SMALLINT,
-         DATA_MOVEMENT SMALLINT,
-         DATA_NAME_LOCATION VARCHAR(255),
-         SEARCH_QUERY VARCHAR(255),
-         APP_ARGUMENT VARCHAR(255),
-         OUTPUT_STREAMING SMALLINT,
-         PRIMARY KEY(INTERFACE_ID,OUTPUT_KEY),
-         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GATEWAY_PROFILE
-(
-         GATEWAY_ID VARCHAR(255),
-	       CREATION_TIME TIMESTAMP DEFAULT NOW(),
-         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
-         CS_TOKEN VARCHAR (255),
-         IDENTITY_SERVER_TENANT VARCHAR (255),
-         IDENTITY_SERVER_PWD_CRED_TOKEN VARCHAR (255),
-         PRIMARY KEY(GATEWAY_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE COMPUTE_RESOURCE_PREFERENCE
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        RESOURCE_ID VARCHAR(255) NOT NULL,
-        OVERRIDE_BY_AIRAVATA SMALLINT,
-        PREFERED_JOB_SUB_PROTOCOL VARCHAR(255),
-        PREFERED_DATA_MOVE_PROTOCOL VARCHAR(255),
-        PREFERED_BATCH_QUEUE VARCHAR(255),
-        SCRATCH_LOCATION VARCHAR(255),
-        ALLOCATION_PROJECT_NUMBER VARCHAR(255),
-        LOGIN_USERNAME VARCHAR(255),
-        RESOURCE_CS_TOKEN VARCHAR(255),
-        USAGE_REPORTING_GATEWAY_ID VARCHAR(255),
-        QUALITY_OF_SERVICE VARCHAR(255),
-        RESERVATION VARCHAR (255),
-        RESERVATION_START_TIME timestamp,
-        RESERVATION_END_TIME timestamp,
-        SSH_ACCOUNT_PROVISIONER VARCHAR(255),
-        SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO VARCHAR(1000),
-        PRIMARY KEY(GATEWAY_ID,RESOURCE_ID),
-        FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE SSH_ACCOUNT_PROVISIONER_CONFIG
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        RESOURCE_ID VARCHAR(255) NOT NULL,
-        CONFIG_NAME VARCHAR(255) NOT NULL,
-        CONFIG_VALUE VARCHAR(255),
-        PRIMARY KEY (GATEWAY_ID, RESOURCE_ID, CONFIG_NAME),
-        FOREIGN KEY (GATEWAY_ID, RESOURCE_ID) REFERENCES COMPUTE_RESOURCE_PREFERENCE (GATEWAY_ID, RESOURCE_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE BATCH_QUEUE
-(
-        COMPUTE_RESOURCE_ID VARCHAR(255) NOT NULL,
-        MAX_RUNTIME INTEGER,
-        MAX_JOB_IN_QUEUE INTEGER,
-        QUEUE_DESCRIPTION VARCHAR(255),
-        QUEUE_NAME VARCHAR(255) NOT NULL,
-        MAX_PROCESSORS INTEGER,
-        MAX_NODES INTEGER,
-        MAX_MEMORY INTEGER,
-        CPU_PER_NODE INTEGER,
-        DEFAULT_NODE_COUNT INTEGER,
-        DEFAULT_CPU_COUNT INTEGER,
-        DEFAULT_WALLTIME INTEGER,
-        QUEUE_SPECIFIC_MACROS VARCHAR(255),
-        IS_DEFAULT_QUEUE TINYINT(1),
-        PRIMARY KEY (COMPUTE_RESOURCE_ID,QUEUE_NAME),
-        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE COMPUTE_RESOURCE_FILE_SYSTEM
-(
-        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        PATH VARCHAR (255),
-        FILE_SYSTEM VARCHAR (255) NOT NULL,
-        PRIMARY KEY (COMPUTE_RESOURCE_ID,FILE_SYSTEM),
-        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE JOB_SUBMISSION_INTERFACE
-(
-        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
-        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        JOB_SUBMISSION_PROTOCOL VARCHAR (255) NOT NULL,
-        PRIORITY_ORDER INTEGER,
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (COMPUTE_RESOURCE_ID,JOB_SUBMISSION_INTERFACE_ID),
-        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
- 
-CREATE TABLE DATA_MOVEMENT_INTERFACE
-(
-        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_PROTOCOL VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        PRIORITY_ORDER INTEGER,
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (COMPUTE_RESOURCE_ID,DATA_MOVEMENT_INTERFACE_ID),
-        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE STORAGE_RESOURCE
-(
-        STORAGE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        HOST_NAME VARCHAR (255) NOT NULL,
-        DESCRIPTION VARCHAR (255),
-        ENABLED SMALLINT,
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (STORAGE_RESOURCE_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE STORAGE_INTERFACE
-(
-        STORAGE_RESOURCE_ID VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        DATA_MOVEMENT_PROTOCOL VARCHAR (255) NOT NULL,
-        PRIORITY_ORDER INTEGER,
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (STORAGE_RESOURCE_ID,DATA_MOVEMENT_INTERFACE_ID),
-        FOREIGN KEY (STORAGE_RESOURCE_ID) REFERENCES STORAGE_RESOURCE(STORAGE_RESOURCE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE JOB_MANAGER_COMMAND
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        COMMAND_TYPE VARCHAR (255) NOT NULL,
-        COMMAND VARCHAR (255),
-        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID,COMMAND_TYPE),
-        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PARALLELISM_COMMAND
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        COMMAND_TYPE VARCHAR (255) NOT NULL,
-        COMMAND VARCHAR (255),
-        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID,COMMAND_TYPE),
-        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE LOCAL_SUBMISSION
-(
-        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
-        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
-        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID),
-        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE LOCAL_DATA_MOVEMENT
-(
-        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
-        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE STORAGE_PREFERENCE
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        STORAGE_RESOURCE_ID VARCHAR(255) NOT NULL,
-        LOGIN_USERNAME VARCHAR(255),
-        FS_ROOT_LOCATION VARCHAR(255),
-        RESOURCE_CS_TOKEN VARCHAR(255),
-        PRIMARY KEY(GATEWAY_ID,STORAGE_RESOURCE_ID),
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE USER_RESOURCE_PROFILE (
-  USER_ID varchar(255) NOT NULL,
-  CREATION_TIME datetime DEFAULT NULL,
-  CS_TOKEN varchar(255) DEFAULT NULL,
-  GATEWAY_ID varchar(255) NOT NULL,
-  IDENTITY_SERVER_PWD_CRED_TOKEN varchar(255) DEFAULT NULL,
-  IDENTITY_SERVER_TENANT varchar(255) DEFAULT NULL,
-  UPDATE_TIME datetime DEFAULT NULL,
-  PRIMARY KEY (USER_ID,GATEWAY_ID)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE USER_STORAGE_PREFERENCE (
-  STORAGE_RESOURCE_ID varchar(255) NOT NULL,
-  USER_ID varchar(255) NOT NULL,
-  RESOURCE_CS_TOKEN varchar(255) DEFAULT NULL,
-  FS_ROOT_LOCATION varchar(255) DEFAULT NULL,
-  GATEWAY_ID varchar(255) NOT NULL,
-  LOGIN_USERNAME varchar(255) DEFAULT NULL,
-  PRIMARY KEY (STORAGE_RESOURCE_ID,USER_ID,GATEWAY_ID)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE USER_COMPUTE_RESOURCE_PREFERENCE (
-  RESOURCE_ID varchar(255) NOT NULL,
-  USER_ID varchar(255) NOT NULL,
-  PREFERED_BATCH_QUEUE varchar(255) DEFAULT NULL,
-  RESOURCE_CS_TOKEN varchar(255) DEFAULT NULL,
-  GATEWAY_ID varchar(255) NOT NULL,
-  LOGIN_USERNAME varchar(255) DEFAULT NULL,
-  ALLOCATION_PROJECT_NUMBER varchar(255) DEFAULT NULL,
-  QUALITY_OF_SERVICE varchar(255) DEFAULT NULL,
-  RESERVATION varchar(255) DEFAULT NULL,
-  RESERVATION_END_TIME datetime DEFAULT NULL,
-  RESERVATION_START_TIME datetime DEFAULT NULL,
-  SCRATCH_LOCATION varchar(255) DEFAULT NULL,
-  VALIDATED TINYINT(1) DEFAULT 0,
-  PRIMARY KEY (RESOURCE_ID,USER_ID,GATEWAY_ID)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GROUP_RESOURCE_PROFILE (
-  GATEWAY_ID varchar(255) NOT NULL,
-  GROUP_RESOURCE_PROFILE_ID varchar(255) NOT NULL,
-  GROUP_RESOURCE_PROFILE_NAME varchar(255) DEFAULT NULL,
-  CREATION_TIME BIGINT NOT NULL,
-  UPDATE_TIME BIGINT NOT NULL,
-  DEFAULT_CREDENTIAL_STORE_TOKEN varchar(255) DEFAULT NULL,
-  PRIMARY KEY (GROUP_RESOURCE_PROFILE_ID),
-  UNIQUE (GATEWAY_ID, GROUP_RESOURCE_PROFILE_NAME)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE BATCH_QUEUE_RESOURCE_POLICY (
-  RESOURCE_POLICY_ID varchar(255) NOT NULL,
-  COMPUTE_RESOURCE_ID varchar(255) NOT NULL,
-  GROUP_RESOURCE_PROFILE_ID varchar(255) NOT NULL,
-  QUEUE_NAME varchar(255) NOT NULL,
-  MAX_ALLOWED_NODES INTEGER,
-  MAX_ALLOWED_CORES INTEGER,
-  MAX_ALLOWED_WALLTIME INTEGER,
-  PRIMARY KEY (RESOURCE_POLICY_ID),
-  FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-  FOREIGN KEY (GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_RESOURCE_PROFILE(GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE COMPUTE_RESOURCE_POLICY (
-    RESOURCE_POLICY_ID varchar(255) NOT NULL,
-    COMPUTE_RESOURCE_ID varchar(255) NOT NULL,
-    GROUP_RESOURCE_PROFILE_ID varchar(255) NOT NULL,
-    PRIMARY KEY (RESOURCE_POLICY_ID),
-    FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-    FOREIGN KEY (GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_RESOURCE_PROFILE(GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE COMPUTE_RESOURCE_POLICY_QUEUES (
-    RESOURCE_POLICY_ID varchar(255) NOT NULL,
-    QUEUE_NAME varchar(255) NOT NULL,
-    PRIMARY KEY (RESOURCE_POLICY_ID, QUEUE_NAME),
-    FOREIGN KEY (RESOURCE_POLICY_ID) REFERENCES COMPUTE_RESOURCE_POLICY(RESOURCE_POLICY_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GROUP_COMPUTE_RESOURCE_PREFERENCE
-(
-        RESOURCE_ID VARCHAR(255) NOT NULL,
-        GROUP_RESOURCE_PROFILE_ID varchar(255) NOT NULL,
-        OVERRIDE_BY_AIRAVATA SMALLINT,
-        PREFERED_JOB_SUB_PROTOCOL VARCHAR(255),
-        PREFERED_DATA_MOVE_PROTOCOL VARCHAR(255),
-        PREFERED_BATCH_QUEUE VARCHAR(255),
-        SCRATCH_LOCATION VARCHAR(255),
-        ALLOCATION_PROJECT_NUMBER VARCHAR(255),
-        LOGIN_USERNAME VARCHAR(255),
-        RESOURCE_CS_TOKEN VARCHAR(255),
-        USAGE_REPORTING_GATEWAY_ID VARCHAR(255),
-        QUALITY_OF_SERVICE VARCHAR(255),
-        RESERVATION VARCHAR (255),
-        RESERVATION_START_TIME timestamp,
-        RESERVATION_END_TIME timestamp,
-        SSH_ACCOUNT_PROVISIONER VARCHAR(255),
-        SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO VARCHAR(1000),
-        PRIMARY KEY(RESOURCE_ID,GROUP_RESOURCE_PROFILE_ID),
-        FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
-        FOREIGN KEY (GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_RESOURCE_PROFILE(GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GRP_SSH_ACC_PROV_CONFIG
-(
-        RESOURCE_ID VARCHAR(255) NOT NULL,
-        GROUP_RESOURCE_PROFILE_ID VARCHAR(255) NOT NULL,
-        CONFIG_NAME VARCHAR(255) NOT NULL,
-        CONFIG_VALUE VARCHAR(255),
-        PRIMARY KEY (RESOURCE_ID, CONFIG_NAME, GROUP_RESOURCE_PROFILE_ID),
-        FOREIGN KEY (RESOURCE_ID,GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_COMPUTE_RESOURCE_PREFERENCE (RESOURCE_ID,GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PARSING_TEMPLATE
-(
-        PARSING_TEMPLATE_ID VARCHAR(255) NOT NULL,
-        APP_INTERFACE_ID VARCHAR(255) NOT NULL,
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSING_TEMPLATE_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PARSER
-(
-        PARSER_ID VARCHAR(255) NOT NULL,
-        IMAGE_NAME VARCHAR(255) NOT NULL,
-        OUTPUT_DIR_PATH VARCHAR(255) NOT NULL,
-        INPUT_DIR_PATH VARCHAR(255) NOT NULL,
-        EXECUTION_COMMAND VARCHAR(255) NOT NULL,
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PARSER_OUTPUT
-(
-        PARSER_OUTPUT_ID VARCHAR(255) NOT NULL,
-        PARSER_OUTPUT_NAME VARCHAR(255) NOT NULL,
-        PARSER_OUTPUT_REQUIRED TINYINT(1) NOT NULL,
-        PARSER_ID VARCHAR(255) NOT NULL,
-        OUTPUT_TYPE VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_OUTPUT_ID),
-        FOREIGN KEY (PARSER_ID) REFERENCES PARSER (PARSER_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PARSER_INPUT
-(
-        PARSER_INPUT_ID VARCHAR(255) NOT NULL,
-        PARSER_INPUT_NAME VARCHAR(255) NOT NULL,
-        PARSER_INPUT_REQUIRED TINYINT(1) NOT NULL,
-        PARSER_ID VARCHAR(255) NOT NULL,
-        INPUT_TYPE VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_INPUT_ID),
-        FOREIGN KEY (PARSER_ID) REFERENCES PARSER (PARSER_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PARSING_TEMPLATE_INPUT
-(
-        PARSING_TEMPLATE_INPUT_ID VARCHAR(255) NOT NULL,
-        TARGET_PARSER_INPUT_ID VARCHAR(255) NOT NULL,
-        APPLICATION_OUTPUT_NAME VARCHAR(255),
-        VALUE VARCHAR(255),
-        PARSING_TEMPLATE_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSING_TEMPLATE_INPUT_ID),
-        FOREIGN KEY (TARGET_PARSER_INPUT_ID) REFERENCES PARSER_INPUT (PARSER_INPUT_ID) ON DELETE CASCADE,
-        FOREIGN KEY (PARSING_TEMPLATE_ID) REFERENCES PARSING_TEMPLATE (PARSING_TEMPLATE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PARSER_CONNECTOR
-(
-        PARSER_CONNECTOR_ID VARCHAR(255) NOT NULL,
-        PARENT_PARSER_ID VARCHAR(255) NOT NULL,
-        CHILD_PARSER_ID VARCHAR(255) NOT NULL,
-        PARSING_TEMPLATE_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_CONNECTOR_ID),
-        FOREIGN KEY (PARENT_PARSER_ID) REFERENCES PARSER (PARSER_ID) ON DELETE CASCADE,
-        FOREIGN KEY (CHILD_PARSER_ID) REFERENCES PARSER (PARSER_ID) ON DELETE CASCADE,
-        FOREIGN KEY (PARSING_TEMPLATE_ID) REFERENCES PARSING_TEMPLATE (PARSING_TEMPLATE_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PARSER_CONNECTOR_INPUT
-(
-        PARSER_CONNECTOR_INPUT_ID VARCHAR(255) NOT NULL,
-        PARSER_INPUT_ID VARCHAR(255) NOT NULL,
-        PARSER_OUTPUT_ID VARCHAR(255),
-        VALUE VARCHAR(255),
-        PARSER_CONNECTOR_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PARSER_CONNECTOR_INPUT_ID),
-        FOREIGN KEY (PARSER_INPUT_ID) REFERENCES PARSER_INPUT (PARSER_INPUT_ID) ON DELETE CASCADE,
-        FOREIGN KEY (PARSER_OUTPUT_ID) REFERENCES PARSER_OUTPUT (PARSER_OUTPUT_ID) ON DELETE CASCADE,
-        FOREIGN KEY (PARSER_CONNECTOR_ID) REFERENCES PARSER_CONNECTOR (PARSER_CONNECTOR_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GATEWAY_GROUPS
-(
-  GATEWAY_ID VARCHAR(255) NOT NULL,
-  ADMINS_GROUP_ID VARCHAR(255),
-  READ_ONLY_ADMINS_GROUP_ID VARCHAR(255),
-  DEFAULT_GATEWAY_USERS_GROUP_ID VARCHAR(255),
-  PRIMARY KEY(GATEWAY_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE CLOUD_JOB_SUBMISSION (
-  JOB_SUBMISSION_INTERFACE_ID varchar(255) NOT NULL,
-  EXECUTABLE_TYPE VARCHAR(255) DEFAULT NULL,
-  NODE_ID VARCHAR(255) DEFAULT NULL,
-  PROVIDER_NAME VARCHAR(255) DEFAULT NULL,
-  SECURITY_PROTOCOL VARCHAR(255) DEFAULT NULL,
-  USER_ACCOUNT_NAME VARCHAR(255) DEFAULT NULL,
-  PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE CONFIGURATION
-(
-          CONFIG_KEY VARCHAR(255),
-          CONFIG_VAL VARCHAR(255),
-          PRIMARY KEY(CONFIG_KEY, CONFIG_VAL)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL) VALUES('app_catalog_version', '0.16');
-
diff --git a/modules/ide-integration/src/main/resources/database_scripts/credstore-derby.sql b/modules/ide-integration/src/main/resources/database_scripts/credstore-derby.sql
deleted file mode 100644
index 7ccc001..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/credstore-derby.sql
+++ /dev/null
@@ -1,27 +0,0 @@
-CREATE TABLE COMMUNITY_USER (
-  GATEWAY_ID           VARCHAR(256) NOT NULL,
-  COMMUNITY_USER_NAME  VARCHAR(256) NOT NULL,
-  TOKEN_ID             VARCHAR(256) NOT NULL,
-  COMMUNITY_USER_EMAIL VARCHAR(256) NOT NULL,
-  PRIMARY KEY (GATEWAY_ID, COMMUNITY_USER_NAME, TOKEN_ID)
-);
-
-CREATE TABLE CREDENTIALS (
-  GATEWAY_ID     VARCHAR(256) NOT NULL,
-  TOKEN_ID       VARCHAR(256) NOT NULL,
-  CREDENTIAL     BLOB         NOT NULL,
-  PORTAL_USER_ID VARCHAR(256) NOT NULL,
-  TIME_PERSISTED TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-  DESCRIPTION VARCHAR(500),
-  CREDENTIAL_OWNER_TYPE VARCHAR(10) DEFAULT 'GATEWAY' NOT NULL,
-  PRIMARY KEY (GATEWAY_ID, TOKEN_ID)
-);
-
-CREATE TABLE CONFIGURATION (
-  CONFIG_KEY VARCHAR(255),
-  CONFIG_VAL VARCHAR(255),
-  PRIMARY KEY (CONFIG_KEY, CONFIG_VAL)
-);
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL) VALUES ('credential_store_version', '0.16');
-
diff --git a/modules/ide-integration/src/main/resources/database_scripts/credstore-mysql.sql b/modules/ide-integration/src/main/resources/database_scripts/credstore-mysql.sql
deleted file mode 100644
index a6c9144..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/credstore-mysql.sql
+++ /dev/null
@@ -1,27 +0,0 @@
-CREATE TABLE COMMUNITY_USER (
-  GATEWAY_ID           VARCHAR(100) NOT NULL,
-  COMMUNITY_USER_NAME  VARCHAR(100) NOT NULL,
-  TOKEN_ID             VARCHAR(100) NOT NULL,
-  COMMUNITY_USER_EMAIL VARCHAR(256) NOT NULL,
-  PRIMARY KEY (GATEWAY_ID, COMMUNITY_USER_NAME, TOKEN_ID)
-);
-
-CREATE TABLE CREDENTIALS (
-  GATEWAY_ID     VARCHAR(100) NOT NULL,
-  TOKEN_ID       VARCHAR(100) NOT NULL,
-  CREDENTIAL     BLOB         NOT NULL,
-  PORTAL_USER_ID VARCHAR(256) NOT NULL,
-  TIME_PERSISTED TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-  DESCRIPTION VARCHAR(500),
-  CREDENTIAL_OWNER_TYPE VARCHAR(10) DEFAULT 'GATEWAY' NOT NULL,
-  PRIMARY KEY (GATEWAY_ID, TOKEN_ID)
-);
-
-CREATE TABLE CONFIGURATION (
-  CONFIG_KEY VARCHAR(255),
-  CONFIG_VAL VARCHAR(255),
-  PRIMARY KEY (CONFIG_KEY, CONFIG_VAL)
-);
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL) VALUES ('credential_store_version', '0.16');
-
diff --git a/modules/ide-integration/src/main/resources/database_scripts/dozer_mapping.xml b/modules/ide-integration/src/main/resources/database_scripts/dozer_mapping.xml
deleted file mode 100644
index bf7cb33..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/dozer_mapping.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<mappings xmlns="http://dozer.sourceforge.net"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://dozer.sourceforge.net
-      http://dozer.sourceforge.net/schema/beanmapping.xsd">
-    <mapping>
-        <class-a>org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription</class-a>
-        <class-b>org.apache.airavata.registry.core.entities.appcatalog.StorageInterfaceEntity</class-b>
-        <field custom-converter="org.apache.airavata.registry.core.utils.DozerConverter.StorageDateConverter">
-            <a>creationTime</a>
-            <b>creationTime</b>
-        </field>
-        <field custom-converter="org.apache.airavata.registry.core.utils.DozerConverter.StorageDateConverter">
-            <a>updateTime</a>
-            <b>updateTime</b>
-        </field>
-    </mapping>
-    <mapping>
-        <class-a>org.apache.airavata.registry.core.entities.expcatalog.UserConfigurationDataEntity</class-a>
-        <class-b>org.apache.airavata.model.experiment.UserConfigurationDataModel</class-b>
-        <field>
-            <a>this</a>
-            <b>computationalResourceScheduling</b>
-        </field>
-    </mapping>
-</mappings>
\ No newline at end of file
diff --git a/modules/ide-integration/src/main/resources/database_scripts/expcatalog-derby.sql b/modules/ide-integration/src/main/resources/database_scripts/expcatalog-derby.sql
deleted file mode 100644
index 1cab313..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/expcatalog-derby.sql
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE GATEWAY
-(
-        GATEWAY_ID VARCHAR(255),
-        GATEWAY_NAME VARCHAR(255),
-	      DOMAIN VARCHAR(255),
-	      EMAIL_ADDRESS VARCHAR(255),
-        GATEWAY_ACRONYM varchar(255),
-        GATEWAY_ADMIN_EMAIL varchar(255),
-        GATEWAY_ADMIN_FIRST_NAME varchar(255),
-        GATEWAY_APPROVAL_STATUS varchar(255),
-        GATEWAY_PUBLIC_ABSTRACT varchar(255),
-        GATEWAY_URL varchar(255),
-        GATEWAY_ADMIN_LAST_NAME varchar(255),
-        IDENTITY_SERVER_PASSWORD_TOKEN varchar(255),
-        IDENTITY_SERVER_USERNAME varchar(255),
-        GATEWAY_REVIEW_PROPOSAL_DESCRIPTION varchar(255),
-        DECLINED_REASON varchar(255),
-        OAUTH_CLIENT_SECRET varchar(255),
-        OAUTH_CLIENT_ID varchar(255),
-        REQUEST_CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        REQUESTER_USERNAME VARCHAR(255),
-        PRIMARY KEY (GATEWAY_ID)
-);
-
-CREATE TABLE NOTIFICATION
-(
-        NOTIFICATION_ID VARCHAR(255) NOT NULL,
-        GATEWAY_ID VARCHAR(255),
-        TITLE VARCHAR(255),
-        PRIORITY VARCHAR(255),
-        NOTIFICATION_MESSAGE VARCHAR(4096) NOT NULL,
-        PUBLISHED_DATE TIMESTAMP,
-        EXPIRATION_DATE TIMESTAMP,
-        CREATION_DATE TIMESTAMP,
-        PRIMARY KEY (NOTIFICATION_ID)
-);
-
-CREATE TABLE USERS
-(
-        AIRAVATA_INTERNAL_USER_ID VARCHAR(255) NOT NULL,
-        USER_NAME VARCHAR(255),
-        PASSWORD VARCHAR(255),
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (GATEWAY_ID, USER_NAME),
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE,
-        UNIQUE (AIRAVATA_INTERNAL_USER_ID)
-);
-
-CREATE TABLE GATEWAY_WORKER
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        USER_NAME VARCHAR(255),
-        PRIMARY KEY (GATEWAY_ID, USER_NAME),
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PROJECT
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        USER_NAME VARCHAR(255),
-        PROJECT_NAME VARCHAR(255),
-        PROJECT_ID VARCHAR(255),
-        DESCRIPTION VARCHAR(255),
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        PRIMARY KEY (PROJECT_ID),
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PROJECT_USER
-(
-        PROJECT_ID VARCHAR(255) NOT NULL,
-        USER_NAME VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PROJECT_ID,USER_NAME),
-        FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(PROJECT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE EXPERIMENT (
-        EXPERIMENT_ID varchar(255),
-        PROJECT_ID varchar(255) NOT NULL,
-        GATEWAY_ID varchar(255),
-        EXPERIMENT_TYPE varchar(255),
-        USER_NAME varchar(255),
-        EXPERIMENT_NAME varchar(255),
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        DESCRIPTION varchar(255),
-        EXECUTION_ID varchar(255),
-        GATEWAY_EXECUTION_ID varchar(255),
-        GATEWAY_INSTANCE_ID varchar(255),
-        ENABLE_EMAIL_NOTIFICATION SMALLINT,
-        EMAIL_ADDRESSES CLOB,
-        PRIMARY KEY (EXPERIMENT_ID),
-        FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(PROJECT_ID) ON DELETE CASCADE
-);
-
-
-CREATE TABLE EXPERIMENT_INPUT
-(
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        INPUT_NAME varchar(255),
-        INPUT_VALUE CLOB,
-        DATA_TYPE varchar(255),
-        APPLICATION_ARGUMENT varchar(255),
-        STANDARD_INPUT SMALLINT,
-        USER_FRIENDLY_DESCRIPTION varchar(255),
-        METADATA varchar(4096),
-        INPUT_ORDER INT,
-        IS_REQUIRED SMALLINT,
-        REQUIRED_TO_ADDED_TO_CMD SMALLINT,
-        DATA_STAGED SMALLINT,
-        STORAGE_RESOURCE_ID varchar(255),
-        IS_READ_ONLY SMALLINT,
-        PRIMARY KEY(EXPERIMENT_ID,INPUT_NAME),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE EXPERIMENT_OUTPUT
-(
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        OUTPUT_NAME varchar(255),
-        OUTPUT_VALUE CLOB,
-        DATA_TYPE varchar(255),
-        APPLICATION_ARGUMENT varchar(255),
-        IS_REQUIRED SMALLINT,
-        REQUIRED_TO_ADDED_TO_CMD SMALLINT,
-        DATA_MOVEMENT SMALLINT,
-        LOCATION varchar(255),
-        SEARCH_QUERY varchar(255),
-        OUTPUT_STREAMING SMALLINT,
-        STORAGE_RESOURCE_ID varchar(255),
-        PRIMARY KEY(EXPERIMENT_ID,OUTPUT_NAME),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-
-CREATE TABLE EXPERIMENT_STATUS (
-        STATUS_ID varchar(255),
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        STATE varchar(255),
-        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        REASON CLOB,
-        PRIMARY KEY (STATUS_ID, EXPERIMENT_ID),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-
-CREATE TABLE EXPERIMENT_ERROR (
-        ERROR_ID varchar(255),
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        ACTUAL_ERROR_MESSAGE CLOB,
-        USER_FRIENDLY_MESSAGE CLOB,
-        TRANSIENT_OR_PERSISTENT SMALLINT,
-        ROOT_CAUSE_ERROR_ID_LIST CLOB,
-        PRIMARY KEY (ERROR_ID, EXPERIMENT_ID),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE USER_CONFIGURATION_DATA (
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        AIRAVATA_AUTO_SCHEDULE SMALLINT,
-        OVERRIDE_MANUAL_SCHEDULED_PARAMS SMALLINT,
-        SHARE_EXPERIMENT_PUBLICALLY SMALLINT,
-        THROTTLE_RESOURCES SMALLINT,
-        USER_DN varchar(255),
-        GENERATE_CERT SMALLINT,
-        RESOURCE_HOST_ID varchar(255),
-        TOTAL_CPU_COUNT INT,
-        NODE_COUNT INT,
-        NUMBER_OF_THREADS INT,
-        QUEUE_NAME varchar(255),
-        WALL_TIME_LIMIT INT,
-        TOTAL_PHYSICAL_MEMORY INT,
-        STATIC_WORKING_DIR varchar(255),
-        OVERRIDE_LOGIN_USER_NAME varchar(255),
-        OVERRIDE_SCRATCH_LOCATION varchar(255),
-        OVERRIDE_ALLOCATION_PROJECT_NUMBER varchar(255),
-        STORAGE_RESOURCE_ID varchar(255),
-        EXPERIMENT_DATA_DIR VARCHAR (512),
-        GROUP_RESOURCE_PROFILE_ID VARCHAR(255) DEFAULT NULL,
-        IS_USE_USER_CR_PREF SMALLINT,
-        PRIMARY KEY (EXPERIMENT_ID),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE VIEW LATEST_EXPERIMENT_STATUS AS
-  select ES1.EXPERIMENT_ID AS EXPERIMENT_ID, ES1.STATE AS STATE, ES1.TIME_OF_STATE_CHANGE AS TIME_OF_STATE_CHANGE
-  from EXPERIMENT_STATUS ES1 LEFT JOIN EXPERIMENT_STATUS ES2 ON (ES1.EXPERIMENT_ID = ES2.EXPERIMENT_ID
-    AND ES1.TIME_OF_STATE_CHANGE < ES2.TIME_OF_STATE_CHANGE)  WHERE ES2.TIME_OF_STATE_CHANGE is NULL;
-
-CREATE VIEW EXPERIMENT_SUMMARY AS
-  select E.EXPERIMENT_ID AS EXPERIMENT_ID, E.PROJECT_ID AS PROJECT_ID, E.GATEWAY_ID AS GATEWAY_ID,
-  E.USER_NAME AS USER_NAME, E.EXECUTION_ID AS EXECUTION_ID, E.EXPERIMENT_NAME AS EXPERIMENT_NAME,
-  E.CREATION_TIME AS CREATION_TIME, E.DESCRIPTION AS DESCRIPTION, ES.STATE AS STATE, UD.RESOURCE_HOST_ID
-  AS RESOURCE_HOST_ID, ES.TIME_OF_STATE_CHANGE AS TIME_OF_STATE_CHANGE
-    from ((EXPERIMENT E left join LATEST_EXPERIMENT_STATUS ES on((E.EXPERIMENT_ID = ES.EXPERIMENT_ID)))
-    left join USER_CONFIGURATION_DATA UD on((E.EXPERIMENT_ID = UD.EXPERIMENT_ID))) where true;
-
-CREATE TABLE PROCESS (
-        PROCESS_ID varchar(255),
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        LAST_UPDATE_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        PROCESS_DETAIL CLOB,
-        APPLICATION_INTERFACE_ID varchar(255),
-        TASK_DAG CLOB,
-        APPLICATION_DEPLOYMENT_ID varchar(255),
-        COMPUTE_RESOURCE_ID varchar(255),
-        GATEWAY_EXECUTION_ID varchar(255),
-        ENABLE_EMAIL_NOTIFICATION SMALLINT,
-        EMAIL_ADDRESSES CLOB,
-        STORAGE_RESOURCE_ID varchar(255),
-        USER_DN varchar(255),
-        GENERATE_CERT SMALLINT,
-        EXPERIMENT_DATA_DIR VARCHAR (512),
-        USERNAME VARCHAR (255),
-        GROUP_RESOURCE_PROFILE_ID VARCHAR (255) DEFAULT NULL,
-        USE_USER_CR_PREF SMALLINT,
-        PRIMARY KEY (PROCESS_ID),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PROCESS_INPUT
-(
-        PROCESS_ID varchar(255) NOT NULL,
-        INPUT_NAME varchar(255),
-        INPUT_VALUE CLOB,
-        DATA_TYPE varchar(255),
-        APPLICATION_ARGUMENT varchar(255),
-        STANDARD_INPUT SMALLINT,
-        USER_FRIENDLY_DESCRIPTION varchar(255),
-        METADATA varchar(4096),
-        INPUT_ORDER INT,
-        IS_REQUIRED SMALLINT,
-        REQUIRED_TO_ADDED_TO_CMD SMALLINT,
-        DATA_STAGED SMALLINT,
-        STORAGE_RESOURCE_ID varchar(255),
-        IS_READ_ONLY SMALLINT,
-        PRIMARY KEY(PROCESS_ID,INPUT_NAME),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PROCESS_OUTPUT
-(
-        PROCESS_ID varchar(255) NOT NULL,
-        OUTPUT_NAME varchar(255),
-        OUTPUT_VALUE CLOB,
-        DATA_TYPE varchar(255),
-        APPLICATION_ARGUMENT varchar(255),
-        IS_REQUIRED SMALLINT,
-        REQUIRED_TO_ADDED_TO_CMD SMALLINT,
-        DATA_MOVEMENT SMALLINT,
-        LOCATION varchar(255),
-        SEARCH_QUERY varchar(255),
-        OUTPUT_STREAMING SMALLINT,
-        STORAGE_RESOURCE_ID varchar(255),
-        PRIMARY KEY(PROCESS_ID,OUTPUT_NAME),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-
-CREATE TABLE PROCESS_STATUS (
-        STATUS_ID varchar(255),
-        PROCESS_ID varchar(255) NOT NULL,
-        STATE varchar(255),
-        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        REASON CLOB,
-        PRIMARY KEY (STATUS_ID, PROCESS_ID),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-
-CREATE TABLE PROCESS_ERROR (
-        ERROR_ID varchar(255),
-        PROCESS_ID varchar(255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        ACTUAL_ERROR_MESSAGE CLOB,
-        USER_FRIENDLY_MESSAGE CLOB,
-        TRANSIENT_OR_PERSISTENT SMALLINT,
-        ROOT_CAUSE_ERROR_ID_LIST CLOB,
-        PRIMARY KEY (ERROR_ID, PROCESS_ID),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PROCESS_RESOURCE_SCHEDULE (
-        PROCESS_ID varchar(255) NOT NULL,
-        RESOURCE_HOST_ID varchar(255),
-        TOTAL_CPU_COUNT INT,
-        NODE_COUNT INT,
-        NUMBER_OF_THREADS INT,
-        QUEUE_NAME varchar(255),
-        WALL_TIME_LIMIT INT,
-        TOTAL_PHYSICAL_MEMORY INT,
-        STATIC_WORKING_DIR varchar(255),
-        OVERRIDE_ALLOCATION_PROJECT_NUMBER varchar(255),
-        OVERRIDE_LOGIN_USER_NAME varchar(255),
-        OVERRIDE_SCRATCH_LOCATION varchar(255),
-        PRIMARY KEY (PROCESS_ID),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE TASK (
-        TASK_ID varchar(255),
-        TASK_TYPE varchar(255),
-        PARENT_PROCESS_ID varchar(255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        LAST_UPDATE_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        TASK_DETAIL CLOB,
-        SUB_TASK_MODEL BLOB,
-        PRIMARY KEY (TASK_ID),
-        FOREIGN KEY (PARENT_PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE TASK_STATUS (
-        STATUS_ID varchar(255),
-        TASK_ID varchar(255) NOT NULL,
-        STATE varchar(255),
-        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        REASON CLOB,
-        PRIMARY KEY (STATUS_ID, TASK_ID),
-        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
-);
-
-
-CREATE TABLE TASK_ERROR (
-        ERROR_ID varchar(255),
-        TASK_ID varchar(255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        ACTUAL_ERROR_MESSAGE CLOB,
-        USER_FRIENDLY_MESSAGE CLOB,
-        TRANSIENT_OR_PERSISTENT SMALLINT,
-        ROOT_CAUSE_ERROR_ID_LIST CLOB,
-        PRIMARY KEY (ERROR_ID, TASK_ID),
-        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE JOB (
-        JOB_ID varchar(255),
-        TASK_ID varchar(255) NOT NULL,
-        PROCESS_ID varchar(255),
-        JOB_DESCRIPTION CLOB NOT NULL,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        COMPUTE_RESOURCE_CONSUMED varchar(255),
-        JOB_NAME varchar(255),
-        WORKING_DIR varchar(255),
-        STD_OUT CLOB,
-        STD_ERR CLOB,
-        EXIT_CODE INT,
-        PRIMARY KEY (JOB_ID, TASK_ID),
-        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE JOB_STATUS (
-        STATUS_ID varchar(255),
-        JOB_ID varchar(255) NOT NULL,
-        TASK_ID varchar(255) NOT NULL,
-        STATE varchar(255),
-        TIME_OF_STATE_CHANGE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        REASON CLOB,
-        PRIMARY KEY (STATUS_ID, JOB_ID, TASK_ID),
-        FOREIGN KEY (JOB_ID, TASK_ID) REFERENCES JOB(JOB_ID, TASK_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE QUEUE_STATUS(
-        HOST_NAME VARCHAR(255) NOT NULL,
-        QUEUE_NAME VARCHAR(255) NOT NULL,
-        CREATED_TIME BIGINT NOT NULL,
-        QUEUE_UP SMALLINT,
-        RUNNING_JOBS INT,
-        QUEUED_JOBS INT,
-        PRIMARY KEY (HOST_NAME, QUEUE_NAME, CREATED_TIME)
-);
-
-CREATE TABLE CONFIGURATION
-(
-        CONFIG_KEY VARCHAR(255),
-        CONFIG_VAL VARCHAR(255),
-        EXPIRE_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        CATEGORY_ID VARCHAR (255),
-        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL, CATEGORY_ID)
-);
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL, EXPIRE_DATE, CATEGORY_ID) VALUES('registry.version', '0.16', CURRENT_TIMESTAMP ,'SYSTEM');
diff --git a/modules/ide-integration/src/main/resources/database_scripts/expcatalog-mysql.sql b/modules/ide-integration/src/main/resources/database_scripts/expcatalog-mysql.sql
deleted file mode 100644
index 1b26cf0..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/expcatalog-mysql.sql
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE GATEWAY
-(
-        GATEWAY_ID VARCHAR(255),
-        GATEWAY_NAME VARCHAR(255),
-	      DOMAIN VARCHAR(255),
-	      EMAIL_ADDRESS VARCHAR(255),
-        GATEWAY_ACRONYM varchar(255),
-        GATEWAY_ADMIN_EMAIL varchar(255),
-        GATEWAY_ADMIN_FIRST_NAME varchar(255),
-        GATEWAY_APPROVAL_STATUS varchar(255),
-        GATEWAY_PUBLIC_ABSTRACT varchar(255),
-        GATEWAY_URL varchar(255),
-        GATEWAY_ADMIN_LAST_NAME varchar(255),
-        IDENTITY_SERVER_PASSWORD_TOKEN varchar(255),
-        IDENTITY_SERVER_USERNAME varchar(255),
-        GATEWAY_REVIEW_PROPOSAL_DESCRIPTION varchar(255),
-        DECLINED_REASON varchar(255),
-        OAUTH_CLIENT_SECRET varchar(255),
-        OAUTH_CLIENT_ID varchar(255),
-        REQUEST_CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        REQUESTER_USERNAME VARCHAR(255),
-        PRIMARY KEY (GATEWAY_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE NOTIFICATION
-(
-        NOTIFICATION_ID VARCHAR(255) NOT NULL,
-        GATEWAY_ID VARCHAR(255),
-        TITLE VARCHAR(255),
-        PRIORITY VARCHAR(255),
-        NOTIFICATION_MESSAGE VARCHAR(4096) NOT NULL,
-        PUBLISHED_DATE TIMESTAMP,
-        EXPIRATION_DATE TIMESTAMP,
-        CREATION_DATE TIMESTAMP,
-        PRIMARY KEY (NOTIFICATION_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE USERS
-(
-        AIRAVATA_INTERNAL_USER_ID VARCHAR(255) NOT NULL,
-        USER_NAME VARCHAR(255),
-        PASSWORD VARCHAR(255),
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        PRIMARY KEY (GATEWAY_ID, USER_NAME),
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE,
-        UNIQUE (AIRAVATA_INTERNAL_USER_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE GATEWAY_WORKER
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        USER_NAME VARCHAR(255),
-        PRIMARY KEY (GATEWAY_ID, USER_NAME),
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PROJECT
-(
-        GATEWAY_ID VARCHAR(255) NOT NULL,
-        USER_NAME VARCHAR(255),
-        PROJECT_NAME VARCHAR(255),
-        PROJECT_ID VARCHAR(255),
-        DESCRIPTION VARCHAR(255),
-        CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        PRIMARY KEY (PROJECT_ID),
-        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY(GATEWAY_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PROJECT_USER
-(
-        PROJECT_ID VARCHAR(255) NOT NULL,
-        USER_NAME VARCHAR(255) NOT NULL,
-        PRIMARY KEY (PROJECT_ID,USER_NAME),
-        FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(PROJECT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE EXPERIMENT (
-        EXPERIMENT_ID varchar(255),
-        PROJECT_ID varchar(255) NOT NULL,
-        GATEWAY_ID varchar(255),
-        EXPERIMENT_TYPE varchar(255),
-        USER_NAME varchar(255),
-        EXPERIMENT_NAME varchar(255),
-        CREATION_TIME timestamp DEFAULT NOW(),
-        DESCRIPTION varchar(255),
-        EXECUTION_ID varchar(255),
-        GATEWAY_EXECUTION_ID varchar(255),
-        GATEWAY_INSTANCE_ID varchar(255),
-        ENABLE_EMAIL_NOTIFICATION tinyint(1),
-        EMAIL_ADDRESSES text,
-        PRIMARY KEY (EXPERIMENT_ID),
-        FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(PROJECT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-
-CREATE TABLE EXPERIMENT_INPUT
-(
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        INPUT_NAME varchar(255),
-        INPUT_VALUE text,
-        DATA_TYPE varchar(255),
-        APPLICATION_ARGUMENT varchar(255),
-        STANDARD_INPUT tinyint(1),
-        USER_FRIENDLY_DESCRIPTION varchar(255),
-        METADATA varchar(4096),
-        INPUT_ORDER int(11),
-        IS_REQUIRED tinyint(1),
-        REQUIRED_TO_ADDED_TO_CMD tinyint(1),
-        DATA_STAGED tinyint(1),
-        STORAGE_RESOURCE_ID varchar(255),
-        IS_READ_ONLY tinyint(1),
-        PRIMARY KEY(EXPERIMENT_ID,INPUT_NAME),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE EXPERIMENT_OUTPUT
-(
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        OUTPUT_NAME varchar(255),
-        OUTPUT_VALUE text,
-        DATA_TYPE varchar(255),
-        APPLICATION_ARGUMENT varchar(255),
-        IS_REQUIRED tinyint(1),
-        REQUIRED_TO_ADDED_TO_CMD tinyint(1),
-        DATA_MOVEMENT tinyint(1),
-        LOCATION varchar(255),
-        SEARCH_QUERY varchar(255),
-        OUTPUT_STREAMING SMALLINT,
-        STORAGE_RESOURCE_ID varchar(255),
-        PRIMARY KEY(EXPERIMENT_ID,OUTPUT_NAME),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-
-CREATE TABLE EXPERIMENT_STATUS (
-        STATUS_ID varchar(255),
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        STATE varchar(255),
-        TIME_OF_STATE_CHANGE TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
-        REASON LONGTEXT,
-        PRIMARY KEY (STATUS_ID, EXPERIMENT_ID),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-
-CREATE TABLE EXPERIMENT_ERROR (
-        ERROR_ID varchar(255),
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT NOW(),
-        ACTUAL_ERROR_MESSAGE text,
-        USER_FRIENDLY_MESSAGE text,
-        TRANSIENT_OR_PERSISTENT tinyint(1),
-        ROOT_CAUSE_ERROR_ID_LIST text,
-        PRIMARY KEY (ERROR_ID, EXPERIMENT_ID),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE USER_CONFIGURATION_DATA (
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        AIRAVATA_AUTO_SCHEDULE tinyint(1),
-        OVERRIDE_MANUAL_SCHEDULED_PARAMS tinyint(1),
-        SHARE_EXPERIMENT_PUBLICALLY tinyint(1),
-        THROTTLE_RESOURCES tinyint(1),
-        USER_DN varchar(255),
-        GENERATE_CERT tinyint(1),
-        RESOURCE_HOST_ID varchar(255),
-        TOTAL_CPU_COUNT int(11),
-        NODE_COUNT int(11),
-        NUMBER_OF_THREADS int(11),
-        QUEUE_NAME varchar(255),
-        WALL_TIME_LIMIT int(11),
-        TOTAL_PHYSICAL_MEMORY int(11),
-        STATIC_WORKING_DIR varchar(255),
-        OVERRIDE_LOGIN_USER_NAME varchar(255),
-        OVERRIDE_SCRATCH_LOCATION varchar(255),
-        OVERRIDE_ALLOCATION_PROJECT_NUMBER varchar(255),
-        STORAGE_RESOURCE_ID varchar(255),
-        EXPERIMENT_DATA_DIR VARCHAR (512),
-        GROUP_RESOURCE_PROFILE_ID VARCHAR(255) DEFAULT NULL,
-        IS_USE_USER_CR_PREF TINYINT(1),
-        PRIMARY KEY (EXPERIMENT_ID),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-
-CREATE VIEW LATEST_EXPERIMENT_STATUS AS
-  select ES1.EXPERIMENT_ID AS EXPERIMENT_ID, ES1.STATE AS STATE, ES1.TIME_OF_STATE_CHANGE AS TIME_OF_STATE_CHANGE
-  from EXPERIMENT_STATUS ES1 LEFT JOIN EXPERIMENT_STATUS ES2 ON (ES1.EXPERIMENT_ID = ES2.EXPERIMENT_ID
-    AND ES1.TIME_OF_STATE_CHANGE < ES2.TIME_OF_STATE_CHANGE)  WHERE ES2.TIME_OF_STATE_CHANGE is NULL;
-
-CREATE VIEW EXPERIMENT_SUMMARY AS
-  select E.EXPERIMENT_ID AS EXPERIMENT_ID, E.PROJECT_ID AS PROJECT_ID, E.GATEWAY_ID AS GATEWAY_ID,
-  E.USER_NAME AS USER_NAME, E.EXECUTION_ID AS EXECUTION_ID, E.EXPERIMENT_NAME AS EXPERIMENT_NAME,
-  E.CREATION_TIME AS CREATION_TIME, E.DESCRIPTION AS DESCRIPTION, ES.STATE AS STATE, UD.RESOURCE_HOST_ID
-  AS RESOURCE_HOST_ID, ES.TIME_OF_STATE_CHANGE AS TIME_OF_STATE_CHANGE
-    from ((EXPERIMENT E left join LATEST_EXPERIMENT_STATUS ES on((E.EXPERIMENT_ID = ES.EXPERIMENT_ID)))
-    left join USER_CONFIGURATION_DATA UD on((E.EXPERIMENT_ID = UD.EXPERIMENT_ID))) where 1;
-
-
-CREATE TABLE PROCESS (
-        PROCESS_ID varchar(255),
-        EXPERIMENT_ID varchar(255) NOT NULL,
-        CREATION_TIME  TIMESTAMP DEFAULT NOW(),
-        LAST_UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PROCESS_DETAIL text,
-        APPLICATION_INTERFACE_ID varchar(255),
-        TASK_DAG TEXT,
-        APPLICATION_DEPLOYMENT_ID varchar(255),
-        COMPUTE_RESOURCE_ID varchar(255),
-        GATEWAY_EXECUTION_ID varchar(255),
-        ENABLE_EMAIL_NOTIFICATION BOOLEAN,
-        EMAIL_ADDRESSES TEXT,
-        STORAGE_RESOURCE_ID varchar(255),
-        USER_DN varchar(255),
-        GENERATE_CERT SMALLINT,
-        EXPERIMENT_DATA_DIR VARCHAR (512),
-        USERNAME VARCHAR (255),
-        GROUP_RESOURCE_PROFILE_ID VARCHAR (255) DEFAULT NULL,
-        USE_USER_CR_PREF TINYINT(1),
-        PRIMARY KEY (PROCESS_ID),
-        FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PROCESS_INPUT
-(
-        PROCESS_ID varchar(255) NOT NULL,
-        INPUT_NAME varchar(255),
-        INPUT_VALUE text,
-        DATA_TYPE varchar(255),
-        APPLICATION_ARGUMENT varchar(255),
-        STANDARD_INPUT tinyint(1),
-        USER_FRIENDLY_DESCRIPTION varchar(255),
-        METADATA varchar(4096),
-        INPUT_ORDER int(11),
-        IS_REQUIRED tinyint(1),
-        REQUIRED_TO_ADDED_TO_CMD tinyint(1),
-        DATA_STAGED tinyint(1),
-        STORAGE_RESOURCE_ID varchar(255),
-        IS_READ_ONLY tinyint(1),
-        PRIMARY KEY(PROCESS_ID,INPUT_NAME),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PROCESS_OUTPUT
-(
-        PROCESS_ID varchar(255) NOT NULL,
-        OUTPUT_NAME varchar(255),
-        OUTPUT_VALUE LONGTEXT,
-        DATA_TYPE varchar(255),
-        APPLICATION_ARGUMENT varchar(255),
-        IS_REQUIRED tinyint(1),
-        REQUIRED_TO_ADDED_TO_CMD tinyint(1),
-        DATA_MOVEMENT tinyint(1),
-        LOCATION varchar(255),
-        SEARCH_QUERY varchar(255),
-        OUTPUT_STREAMING SMALLINT,
-        STORAGE_RESOURCE_ID varchar(255),
-        PRIMARY KEY(PROCESS_ID,OUTPUT_NAME),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-
-CREATE TABLE PROCESS_STATUS (
-        STATUS_ID varchar(255),
-        PROCESS_ID varchar(255) NOT NULL,
-        STATE varchar(255),
-        TIME_OF_STATE_CHANGE TIMESTAMP(6) DEFAULT NOW(6) ON UPDATE NOW(6),
-        REASON LONGTEXT,
-        PRIMARY KEY (STATUS_ID, PROCESS_ID),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-
-CREATE TABLE PROCESS_ERROR (
-        ERROR_ID varchar(255),
-        PROCESS_ID varchar(255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT NOW(),
-        ACTUAL_ERROR_MESSAGE text,
-        USER_FRIENDLY_MESSAGE text,
-        TRANSIENT_OR_PERSISTENT tinyint(1),
-        ROOT_CAUSE_ERROR_ID_LIST text,
-        PRIMARY KEY (ERROR_ID, PROCESS_ID),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE PROCESS_RESOURCE_SCHEDULE (
-        PROCESS_ID varchar(255) NOT NULL,
-        RESOURCE_HOST_ID varchar(255),
-        TOTAL_CPU_COUNT int(11),
-        NODE_COUNT int(11),
-        NUMBER_OF_THREADS int(11),
-        QUEUE_NAME varchar(255),
-        WALL_TIME_LIMIT int(11),
-        TOTAL_PHYSICAL_MEMORY int(11),
-        STATIC_WORKING_DIR varchar(255),
-        OVERRIDE_ALLOCATION_PROJECT_NUMBER varchar(255),
-        OVERRIDE_LOGIN_USER_NAME varchar(255),
-        OVERRIDE_SCRATCH_LOCATION varchar(255),
-        PRIMARY KEY (PROCESS_ID),
-        FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE TASK (
-        TASK_ID varchar(255),
-        TASK_TYPE varchar(255),
-        PARENT_PROCESS_ID varchar(255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT NOW(),
-        LAST_UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        TASK_DETAIL text,
-        SUB_TASK_MODEL BLOB,
-        PRIMARY KEY (TASK_ID),
-        FOREIGN KEY (PARENT_PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE TASK_STATUS (
-        STATUS_ID varchar(255),
-        TASK_ID varchar(255) NOT NULL,
-        STATE varchar(255),
-        TIME_OF_STATE_CHANGE TIMESTAMP(6) DEFAULT NOW(6) ON UPDATE NOW(6),
-        REASON LONGTEXT,
-        PRIMARY KEY (STATUS_ID, TASK_ID),
-        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-
-CREATE TABLE TASK_ERROR (
-        ERROR_ID varchar(255),
-        TASK_ID varchar(255) NOT NULL,
-        CREATION_TIME timestamp DEFAULT NOW(),
-        ACTUAL_ERROR_MESSAGE text,
-        USER_FRIENDLY_MESSAGE text,
-        TRANSIENT_OR_PERSISTENT tinyint(1),
-        ROOT_CAUSE_ERROR_ID_LIST text,
-        PRIMARY KEY (ERROR_ID, TASK_ID),
-        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE JOB (
-        JOB_ID varchar(255),
-        TASK_ID varchar(255) NOT NULL,
-        PROCESS_ID varchar(255),
-        JOB_DESCRIPTION LONGTEXT NOT NULL,
-        CREATION_TIME timestamp DEFAULT NOW(),
-        COMPUTE_RESOURCE_CONSUMED varchar(255),
-        JOB_NAME varchar(255),
-        WORKING_DIR varchar(255),
-        STD_OUT LONGTEXT,
-        STD_ERR LONGTEXT,
-        EXIT_CODE INT(11),
-        PRIMARY KEY (JOB_ID, TASK_ID),
-        FOREIGN KEY (TASK_ID) REFERENCES TASK(TASK_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE JOB_STATUS (
-        STATUS_ID varchar(255),
-        JOB_ID varchar(255) NOT NULL,
-        TASK_ID varchar(255) NOT NULL,
-        STATE varchar(255),
-        TIME_OF_STATE_CHANGE TIMESTAMP(6) DEFAULT NOW(6) ON UPDATE NOW(6),
-        REASON LONGTEXT,
-        PRIMARY KEY (STATUS_ID, JOB_ID, TASK_ID),
-        FOREIGN KEY (JOB_ID, TASK_ID) REFERENCES JOB(JOB_ID, TASK_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE QUEUE_STATUS(
-        HOST_NAME VARCHAR(255) NOT NULL,
-        QUEUE_NAME VARCHAR(255) NOT NULL,
-        CREATED_TIME BIGINT(20) NOT NULL,
-        QUEUE_UP     TINYINT(1),
-        RUNNING_JOBS INT(11),
-        QUEUED_JOBS INT(11),
-        PRIMARY KEY (HOST_NAME, QUEUE_NAME, CREATED_TIME)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE CONFIGURATION
-(
-        CONFIG_KEY VARCHAR(255),
-        CONFIG_VAL VARCHAR(255),
-        EXPIRE_DATE TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
-        CATEGORY_ID VARCHAR (255),
-        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL, CATEGORY_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL, EXPIRE_DATE, CATEGORY_ID) VALUES('registry.version', '0.16', NOW() ,'SYSTEM');
diff --git a/modules/ide-integration/src/main/resources/database_scripts/init/01-databases.sql b/modules/ide-integration/src/main/resources/database_scripts/init/01-databases.sql
index ddb47f6..4ac2531 100644
--- a/modules/ide-integration/src/main/resources/database_scripts/init/01-databases.sql
+++ b/modules/ide-integration/src/main/resources/database_scripts/init/01-databases.sql
@@ -178,6 +178,7 @@
   `SEARCH_QUERY` varchar(255) DEFAULT NULL,
   `APP_ARGUMENT` varchar(255) DEFAULT NULL,
   `OUTPUT_STREAMING` smallint(6) DEFAULT NULL,
+  `METADATA` varchar(4096) DEFAULT NULL,
   PRIMARY KEY (`INTERFACE_ID`,`OUTPUT_KEY`),
   CONSTRAINT `application_output_ibfk_1` FOREIGN KEY (`INTERFACE_ID`) REFERENCES `APPLICATION_INTERFACE` (`INTERFACE_ID`) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
@@ -189,7 +190,7 @@
 
 LOCK TABLES `APPLICATION_OUTPUT` WRITE;
 /*!40000 ALTER TABLE `APPLICATION_OUTPUT` DISABLE KEYS */;
-INSERT INTO `APPLICATION_OUTPUT` VALUES ('Echo_661f23c7-eca7-49ba-987b-55f4202b60bb','Echo-Standard-Error','','STDERR',1,0,0,NULL,'','',0),('Echo_661f23c7-eca7-49ba-987b-55f4202b60bb','Echo-Standard-Out','','STDOUT',1,0,0,NULL,'','',0);
+INSERT INTO `APPLICATION_OUTPUT` VALUES ('Echo_661f23c7-eca7-49ba-987b-55f4202b60bb','Echo-Standard-Error','','STDERR',1,0,0,NULL,'','',0, NULL),('Echo_661f23c7-eca7-49ba-987b-55f4202b60bb','Echo-Standard-Out','','STDOUT',1,0,0,NULL,'','',0, NULL);
 /*!40000 ALTER TABLE `APPLICATION_OUTPUT` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1984,6 +1985,7 @@
   `SEARCH_QUERY` varchar(255) DEFAULT NULL,
   `OUTPUT_STREAMING` smallint(6) DEFAULT NULL,
   `STORAGE_RESOURCE_ID` varchar(255) DEFAULT NULL,
+  `METADATA` varchar(4096) DEFAULT NULL,
   PRIMARY KEY (`EXPERIMENT_ID`,`OUTPUT_NAME`),
   CONSTRAINT `experiment_output_ibfk_1` FOREIGN KEY (`EXPERIMENT_ID`) REFERENCES `EXPERIMENT` (`EXPERIMENT_ID`) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
@@ -2311,6 +2313,7 @@
   `SEARCH_QUERY` varchar(255) DEFAULT NULL,
   `OUTPUT_STREAMING` smallint(6) DEFAULT NULL,
   `STORAGE_RESOURCE_ID` varchar(255) DEFAULT NULL,
+  `METADATA` varchar(4096) DEFAULT NULL,
   PRIMARY KEY (`PROCESS_ID`,`OUTPUT_NAME`),
   CONSTRAINT `process_output_ibfk_1` FOREIGN KEY (`PROCESS_ID`) REFERENCES `PROCESS` (`PROCESS_ID`) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
@@ -2628,6 +2631,23 @@
 /*!40000 ALTER TABLE `USER_CONFIGURATION_DATA` ENABLE KEYS */;
 UNLOCK TABLES;
 
+DROP TABLE IF EXISTS `PROCESS_WORKFLOW`;
+CREATE TABLE PROCESS_WORKFLOW
+(
+  `PROCESS_ID` varchar(255) NOT NULL,
+  `WORKFLOW_ID` varchar(255) NOT NULL,
+  `TYPE` varchar(255) DEFAULT NULL,
+  `CREATION_TIME` timestamp DEFAULT NOW(),
+  PRIMARY KEY (`PROCESS_ID`, `WORKFLOW_ID`),
+  FOREIGN KEY (`PROCESS_ID`) REFERENCES PROCESS(`PROCESS_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+
+LOCK TABLES `PROCESS_WORKFLOW` WRITE;
+/*!40000 ALTER TABLE `PROCESS_WORKFLOW` DISABLE KEYS */;
+/*!40000 ALTER TABLE `PROCESS_WORKFLOW` ENABLE KEYS */;
+UNLOCK TABLES;
+
 --
 -- Temporary table structure for view `experiment_summary`
 --
diff --git a/modules/ide-integration/src/main/resources/database_scripts/init/02-sharing-registry-migrations.sql b/modules/ide-integration/src/main/resources/database_scripts/init/02-sharing-registry-migrations.sql
new file mode 100644
index 0000000..9b5733b
--- /dev/null
+++ b/modules/ide-integration/src/main/resources/database_scripts/init/02-sharing-registry-migrations.sql
@@ -0,0 +1,4 @@
+use sharing_catalog;
+
+ALTER TABLE DOMAIN ADD COLUMN IF NOT EXISTS INITIAL_USER_GROUP_ID varchar(255);
+ALTER TABLE DOMAIN ADD CONSTRAINT `DOMAIN_INITIAL_USER_GROUP_ID_FK` FOREIGN KEY IF NOT EXISTS (INITIAL_USER_GROUP_ID, DOMAIN_ID) REFERENCES USER_GROUP(GROUP_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION;
diff --git a/modules/ide-integration/src/main/resources/database_scripts/init/03-appcatalog-migrations.sql b/modules/ide-integration/src/main/resources/database_scripts/init/03-appcatalog-migrations.sql
new file mode 100644
index 0000000..0119ceb
--- /dev/null
+++ b/modules/ide-integration/src/main/resources/database_scripts/init/03-appcatalog-migrations.sql
@@ -0,0 +1,16 @@
+use app_catalog;
+
+ALTER TABLE APPLICATION_INPUT ADD COLUMN IF NOT EXISTS OVERRIDE_FILENAME VARCHAR(255);
+-- AIRAVATA-3126
+CREATE TABLE IF NOT EXISTS COMPUTE_RESOURCE_RESERVATION -- ComputeResourceReservationEntity
+    (RESERVATION_ID VARCHAR(255) NOT NULL, END_TIME TIMESTAMP NOT NULL, RESERVATION_NAME VARCHAR(255) NOT NULL, START_TIME TIMESTAMP NOT NULL, RESOURCE_ID VARCHAR(255) NOT NULL, GROUP_RESOURCE_PROFILE_ID VARCHAR(255) NOT NULL, PRIMARY KEY (RESERVATION_ID)
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+CREATE TABLE IF NOT EXISTS COMPUTE_RESOURCE_RESERVATION_QUEUE (RESERVATION_ID VARCHAR(255), QUEUE_NAME VARCHAR(255) NOT NULL
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+CREATE INDEX IF NOT EXISTS I_CMPTN_Q_RESERVATION_ID ON COMPUTE_RESOURCE_RESERVATION_QUEUE (RESERVATION_ID);
+ALTER TABLE COMPUTE_RESOURCE_RESERVATION ADD CONSTRAINT FK_COMPUTE_RESOURCE_RESERVATION FOREIGN KEY IF NOT EXISTS (RESOURCE_ID, GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_COMPUTE_RESOURCE_PREFERENCE (RESOURCE_ID, GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE;
+
+-- AIRAVATA-3327: Remove deprecated reservation fields
+alter table GROUP_COMPUTE_RESOURCE_PREFERENCE drop column IF EXISTS RESERVATION;
+alter table GROUP_COMPUTE_RESOURCE_PREFERENCE drop column IF EXISTS RESERVATION_START_TIME;
+alter table GROUP_COMPUTE_RESOURCE_PREFERENCE drop column IF EXISTS RESERVATION_END_TIME;
diff --git a/modules/ide-integration/src/main/resources/database_scripts/init/04-expcatalog-migrations.sql b/modules/ide-integration/src/main/resources/database_scripts/init/04-expcatalog-migrations.sql
new file mode 100644
index 0000000..38ba76d
--- /dev/null
+++ b/modules/ide-integration/src/main/resources/database_scripts/init/04-expcatalog-migrations.sql
@@ -0,0 +1,4 @@
+use experiment_catalog;
+
+ALTER TABLE EXPERIMENT_INPUT ADD COLUMN IF NOT EXISTS OVERRIDE_FILENAME VARCHAR(255);
+ALTER TABLE PROCESS_INPUT ADD COLUMN IF NOT EXISTS OVERRIDE_FILENAME VARCHAR(255);
diff --git a/modules/ide-integration/src/main/resources/database_scripts/replicacatalog-derby.sql b/modules/ide-integration/src/main/resources/database_scripts/replicacatalog-derby.sql
deleted file mode 100644
index eb287c7..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/replicacatalog-derby.sql
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE DATA_PRODUCT
-(
-        PRODUCT_URI VARCHAR (255),
-        GATEWAY_ID VARCHAR (255),
-        PRODUCT_NAME VARCHAR (255),
-        PRODUCT_DESCRIPTION VARCHAR (255),
-        OWNER_NAME VARCHAR (255),
-        PARENT_PRODUCT_URI VARCHAR (255),
-        PRODUCT_SIZE INTEGER ,
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        LAST_MODIFIED_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        PRODUCT_TYPE VARCHAR(10),
-        PRIMARY KEY (PRODUCT_URI)
-        -- in Derby can't create self-reference FOREIGN KEY in CREATE TABLE
-        -- statement so this gets added via the following ALTER TABLE statement
-        -- FOREIGN KEY (PARENT_PRODUCT_URI) REFERENCES DATA_PRODUCT (PRODUCT_URI) ON DELETE CASCADE
-);
-
-ALTER TABLE DATA_PRODUCT ADD FOREIGN KEY (PARENT_PRODUCT_URI) REFERENCES DATA_PRODUCT (PRODUCT_URI) ON DELETE CASCADE;
-
-CREATE TABLE DATA_REPLICA_LOCATION
-(
-        REPLICA_ID VARCHAR (255),
-        PRODUCT_URI VARCHAR (255) NOT NULL,
-        REPLICA_NAME VARCHAR (255),
-        REPLICA_DESCRIPTION VARCHAR (255),
-        STORAGE_RESOURCE_ID VARCHAR (255),
-        FILE_PATH VARCHAR (4096),
-        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        LAST_MODIFIED_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        VALID_UNTIL_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
-        REPLICA_LOCATION_CATEGORY VARCHAR(26),
-        REPLICA_PERSISTENT_TYPE VARCHAR(10),
-        PRIMARY KEY (REPLICA_ID),
-        FOREIGN KEY (PRODUCT_URI) REFERENCES DATA_PRODUCT(PRODUCT_URI) ON DELETE CASCADE
-);
-
-CREATE TABLE DATA_PRODUCT_METADATA
-(
-        PRODUCT_URI VARCHAR(255) NOT NULL,
-        METADATA_KEY VARCHAR(255),
-        METADATA_VALUE VARCHAR(255),
-        PRIMARY KEY(PRODUCT_URI, METADATA_KEY),
-        FOREIGN KEY (PRODUCT_URI) REFERENCES DATA_PRODUCT(PRODUCT_URI) ON DELETE CASCADE
-);
-
-CREATE TABLE DATA_REPLICA_METADATA
-(
-        REPLICA_ID VARCHAR(255) NOT NULL,
-        METADATA_KEY VARCHAR(255),
-        METADATA_VALUE VARCHAR(255),
-        PRIMARY KEY(REPLICA_ID, METADATA_KEY),
-        FOREIGN KEY (REPLICA_ID) REFERENCES DATA_REPLICA_LOCATION(REPLICA_ID) ON DELETE CASCADE
-);
-
-
-CREATE TABLE CONFIGURATION
-(
-        CONFIG_KEY VARCHAR(255),
-        CONFIG_VAL VARCHAR(255),
-        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL)
-);
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL) VALUES('data_catalog_version', '0.16');
diff --git a/modules/ide-integration/src/main/resources/database_scripts/replicacatalog-mysql.sql b/modules/ide-integration/src/main/resources/database_scripts/replicacatalog-mysql.sql
deleted file mode 100644
index a123e65..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/replicacatalog-mysql.sql
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE DATA_PRODUCT
-(
-        PRODUCT_URI VARCHAR (255),
-        GATEWAY_ID VARCHAR (255),
-        PRODUCT_NAME VARCHAR (255),
-        PRODUCT_DESCRIPTION VARCHAR (255),
-        OWNER_NAME VARCHAR (255),
-        PARENT_PRODUCT_URI VARCHAR (255),
-        PRODUCT_SIZE INT,
-        CREATION_TIME TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
-        LAST_MODIFIED_TIME TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-        PRODUCT_TYPE VARCHAR(10),
-        PRIMARY KEY (PRODUCT_URI),
-        FOREIGN KEY (PARENT_PRODUCT_URI) REFERENCES DATA_PRODUCT (PRODUCT_URI) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE DATA_REPLICA_LOCATION
-(
-        REPLICA_ID VARCHAR (255),
-        PRODUCT_URI VARCHAR (255) NOT NULL,
-        REPLICA_NAME VARCHAR (255),
-        REPLICA_DESCRIPTION VARCHAR (255),
-        STORAGE_RESOURCE_ID VARCHAR (255),
-        FILE_PATH VARCHAR (255),
-        CREATION_TIME TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
-        LAST_MODIFIED_TIME TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-        VALID_UNTIL_TIME TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
-        REPLICA_LOCATION_CATEGORY VARCHAR(26),
-        REPLICA_PERSISTENT_TYPE VARCHAR(10),
-        PRIMARY KEY (REPLICA_ID),
-        FOREIGN KEY (PRODUCT_URI) REFERENCES DATA_PRODUCT(PRODUCT_URI) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE DATA_PRODUCT_METADATA
-(
-        PRODUCT_URI VARCHAR(255) NOT NULL,
-        METADATA_KEY VARCHAR(255),
-        METADATA_VALUE VARCHAR(255),
-        PRIMARY KEY(PRODUCT_URI, METADATA_KEY),
-        FOREIGN KEY (PRODUCT_URI) REFERENCES DATA_PRODUCT(PRODUCT_URI) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE DATA_REPLICA_METADATA
-(
-        REPLICA_ID VARCHAR(255) NOT NULL,
-        METADATA_KEY VARCHAR(255),
-        METADATA_VALUE VARCHAR(255),
-        PRIMARY KEY(REPLICA_ID, METADATA_KEY),
-        FOREIGN KEY (REPLICA_ID) REFERENCES DATA_REPLICA_LOCATION(REPLICA_ID) ON DELETE CASCADE
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE CONFIGURATION
-(
-        CONFIG_KEY VARCHAR(255),
-        CONFIG_VAL VARCHAR(255),
-        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL) VALUES('data_catalog_version', '0.16');
diff --git a/modules/ide-integration/src/main/resources/database_scripts/sharing-registry-mysql.sql b/modules/ide-integration/src/main/resources/database_scripts/sharing-registry-mysql.sql
deleted file mode 100644
index 145d926..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/sharing-registry-mysql.sql
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
-*/
-
-CREATE TABLE DOMAIN (
-  DOMAIN_ID VARCHAR(255) NOT NULL,
-  NAME VARCHAR(255) NOT NULL,
-  DESCRIPTION VARCHAR(255),
-  CREATED_TIME BIGINT NOT NULL,
-  UPDATED_TIME BIGINT NOT NULL,
-  PRIMARY KEY (DOMAIN_ID)
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-CREATE TABLE SHARING_USER (
-  USER_ID VARCHAR(255) NOT NULL,
-  DOMAIN_ID VARCHAR(255) NOT NULL,
-  USER_NAME VARCHAR(255) NOT NULL,
-  FIRST_NAME VARCHAR (255),
-  LAST_NAME VARCHAR (255),
-  EMAIL VARCHAR (255),
-  ICON BLOB,
-  CREATED_TIME BIGINT NOT NULL,
-  UPDATED_TIME BIGINT NOT NULL,
-  PRIMARY KEY (USER_ID, DOMAIN_ID),
-  FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-CREATE TABLE USER_GROUP (
-  GROUP_ID VARCHAR(255) NOT NULL,
-  DOMAIN_ID VARCHAR(255) NOT NULL,
-  NAME VARCHAR(255) NOT NULL,
-  DESCRIPTION VARCHAR(255),
-  OWNER_ID VARCHAR(255) NOT NULL,
-  GROUP_TYPE VARCHAR(255) NOT NULL,
-  GROUP_CARDINALITY VARCHAR(255) NOT NULL,
-  CREATED_TIME BIGINT NOT NULL,
-  UPDATED_TIME BIGINT NOT NULL,
-  PRIMARY KEY (GROUP_ID, DOMAIN_ID),
-  FOREIGN KEY (OWNER_ID, DOMAIN_ID) REFERENCES SHARING_USER(USER_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-CREATE TABLE GROUP_ADMIN (
-  ADMIN_ID VARCHAR(255) NOT NULL,
-  GROUP_ID VARCHAR(255) NOT NULL,
-  DOMAIN_ID VARCHAR(255) NOT NULL,
-  PRIMARY KEY (ADMIN_ID, GROUP_ID, DOMAIN_ID),
-  FOREIGN KEY (ADMIN_ID, DOMAIN_ID) REFERENCES SHARING_USER(USER_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-CREATE TABLE GROUP_MEMBERSHIP (
-  PARENT_ID VARCHAR(255) NOT NULL,
-  CHILD_ID VARCHAR(255) NOT NULL,
-  DOMAIN_ID VARCHAR(255) NOT NULL,
-  CHILD_TYPE VARCHAR(255) NOT NULL,
-  CREATED_TIME BIGINT NOT NULL,
-  UPDATED_TIME BIGINT NOT NULL,
-  PRIMARY KEY (PARENT_ID, CHILD_ID, DOMAIN_ID),
-  FOREIGN KEY (PARENT_ID, DOMAIN_ID) REFERENCES USER_GROUP(GROUP_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION,
-  FOREIGN KEY (CHILD_ID, DOMAIN_ID) REFERENCES USER_GROUP(GROUP_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-CREATE TABLE ENTITY_TYPE (
-  ENTITY_TYPE_ID VARCHAR(255) NOT NULL,
-  DOMAIN_ID VARCHAR(255) NOT NULL,
-  NAME VARCHAR(255) NOT NULL,
-  DESCRIPTION VARCHAR(255),
-  CREATED_TIME BIGINT NOT NULL,
-  UPDATED_TIME BIGINT NOT NULL,
-  PRIMARY KEY (ENTITY_TYPE_ID, DOMAIN_ID),
-  FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-CREATE TABLE PERMISSION_TYPE (
-  PERMISSION_TYPE_ID VARCHAR(255) NOT NULL,
-  DOMAIN_ID VARCHAR(255) NOT NULL,
-  NAME VARCHAR(255) NOT NULL,
-  DESCRIPTION VARCHAR(255),
-  CREATED_TIME BIGINT NOT NULL,
-  UPDATED_TIME BIGINT NOT NULL,
-  PRIMARY KEY (PERMISSION_TYPE_ID, DOMAIN_ID),
-  FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-CREATE TABLE ENTITY (
-  ENTITY_ID VARCHAR(255) NOT NULL,
-  DOMAIN_ID VARCHAR(255) NOT NULL,
-  ENTITY_TYPE_ID VARCHAR(255) NOT NULL,
-  OWNER_ID VARCHAR(255) NOT NULL,
-  PARENT_ENTITY_ID VARCHAR(255),
-  NAME VARCHAR(255) NOT NULL,
-  DESCRIPTION VARCHAR(255),
-  BINARY_DATA BLOB,
-  FULL_TEXT TEXT,
-  SHARED_COUNT BIGINT DEFAULT 0,
-  ORIGINAL_ENTITY_CREATION_TIME BIGINT NOT NULL,
-  CREATED_TIME BIGINT NOT NULL,
-  UPDATED_TIME BIGINT NOT NULL,
-  PRIMARY KEY (ENTITY_ID, DOMAIN_ID),
-  FOREIGN KEY (ENTITY_TYPE_ID, DOMAIN_ID) REFERENCES ENTITY_TYPE(ENTITY_TYPE_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION,
-  FOREIGN KEY (OWNER_ID, DOMAIN_ID) REFERENCES SHARING_USER(USER_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION,
-  FOREIGN KEY (PARENT_ENTITY_ID, DOMAIN_ID) REFERENCES ENTITY(ENTITY_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-ALTER TABLE ENTITY ADD FULLTEXT FULL_TEXT_INDEX(FULL_TEXT);
-
-CREATE TABLE SHARING (
-  PERMISSION_TYPE_ID VARCHAR(255) NOT NULL,
-  ENTITY_ID VARCHAR(255) NOT NULL,
-  DOMAIN_ID VARCHAR (255) NOT NULL,
-  GROUP_ID VARCHAR(255) NOT NULL,
-  SHARING_TYPE VARCHAR(255) NOT NULL,
-  INHERITED_PARENT_ID VARCHAR(255),
-  CREATED_TIME BIGINT NOT NULL,
-  UPDATED_TIME BIGINT NOT NULL,
-  PRIMARY KEY (PERMISSION_TYPE_ID, ENTITY_ID, GROUP_ID, DOMAIN_ID, INHERITED_PARENT_ID),
-  CONSTRAINT `SHARING_PERMISSION_TYPE_ID_DOMAIN_ID_FK` FOREIGN KEY (PERMISSION_TYPE_ID, DOMAIN_ID) REFERENCES PERMISSION_TYPE(PERMISSION_TYPE_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION,
-  CONSTRAINT `SHARING_ENTITY_ID_DOMAIN_ID_FK` FOREIGN KEY (ENTITY_ID, DOMAIN_ID) REFERENCES ENTITY(ENTITY_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION,
-  CONSTRAINT `SHARING_INHERITED_PARENT_ID_DOMAIN_ID_FK` FOREIGN KEY (INHERITED_PARENT_ID, DOMAIN_ID) REFERENCES ENTITY(ENTITY_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION,
-  CONSTRAINT `SHARING_GROUP_ID_DOMAIN_ID_FK` FOREIGN KEY (GROUP_ID, DOMAIN_ID) REFERENCES USER_GROUP(GROUP_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-CREATE TABLE CONFIGURATION
-(
-  CONFIG_KEY VARCHAR(255) NOT NULL,
-  CONFIG_VALUE VARCHAR(255) NOT NULL,
-  PRIMARY KEY(CONFIG_KEY, CONFIG_VALUE)
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VALUE) VALUES('sharing_reg_version', '0.17');
\ No newline at end of file
diff --git a/modules/ide-integration/src/main/resources/database_scripts/user-profile-catalog-derby.sql b/modules/ide-integration/src/main/resources/database_scripts/user-profile-catalog-derby.sql
deleted file mode 100644
index 9ac9155..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/user-profile-catalog-derby.sql
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE IF NOT EXISTS GATEWAY (
-  AIRAVATA_INTERNAL_GATEWAY_ID varchar(255) NOT NULL,
-  DECLINED_REASON varchar(255) DEFAULT NULL,
-  GATEWAY_DOMAIN varchar(255) DEFAULT NULL,
-  EMAIL_ADDRESS varchar(255) DEFAULT NULL,
-  GATEWAY_ACRONYM varchar(255) DEFAULT NULL,
-  GATEWAY_ADMIN_EMAIL varchar(255) DEFAULT NULL,
-  GATEWAY_ADMIN_FIRST_NAME varchar(255) DEFAULT NULL,
-  GATEWAY_ADMIN_LAST_NAME varchar(255) DEFAULT NULL,
-  GATEWAY_APPROVAL_STATUS varchar(255) DEFAULT NULL,
-  GATEWAY_ID varchar(255) DEFAULT NULL,
-  GATEWAY_NAME varchar(255) DEFAULT NULL,
-  GATEWAY_PUBLIC_ABSTRACT varchar(255) DEFAULT NULL,
-  GATEWAY_URL varchar(255) DEFAULT NULL,
-  IDENTITY_SERVER_PASSWORD_TOKEN varchar(255) DEFAULT NULL,
-  IDENTITY_SERVER_USERNAME varchar(255) DEFAULT NULL,
-  OAUTH_CLIENT_ID varchar(255) DEFAULT NULL,
-  OAUTH_CLIENT_SECRET varchar(255) DEFAULT NULL,
-  REQUEST_CREATION_TIME bigint(20) DEFAULT NULL,
-  REQUESTER_USERNAME varchar(255) DEFAULT NULL,
-  GATEWAY_REVIEW_PROPOSAL_DESCRIPTION varchar(255) DEFAULT NULL,
-  PRIMARY KEY (AIRAVATA_INTERNAL_GATEWAY_ID)
-);
-
-CREATE TABLE USER_PROFILE (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    USER_ID VARCHAR (255) NOT NULL,
-    GATEWAY_ID VARCHAR (255) NOT NULL,
-    USER_MODEL_VERSION VARCHAR (255),
-    FIRST_NAME VARCHAR (255),
-    LAST_NAME VARCHAR (255),
-    MIDDLE_NAME VARCHAR (255),
-    NAME_PREFIX VARCHAR (255),
-    NAME_SUFFIX VARCHAR (255),
-    ORCID_ID VARCHAR (255),
-    COUNTRY VARCHAR (255),
-    HOME_ORGANIZATION VARCHAR (255),
-    ORIGINATION_AFFILIATION VARCHAR (255),
-    CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    LAST_ACCESS_TIME TIMESTAMP,
-    VALID_UNTIL TIMESTAMP,
-    STATE VARCHAR (255),
-    COMMENTS CLOB,
-    GPG_KEY CLOB,
-    TIME_ZONE VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID)
-);
-
-CREATE TABLE USER_PROFILE_EMAIL (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    EMAIL VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, EMAIL),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE USER_PROFILE_PHONE (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    PHONE VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, PHONE ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE USER_PROFILE_NATIONALITY (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    NATIONALITY VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, NATIONALITY ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE USER_PROFILE_LABELED_URI (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    LABELED_URI VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, LABELED_URI ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE NSF_DEMOGRAPHIC (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    GENDER VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE NSF_DEMOGRAPHIC_ETHNICITY (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    ETHNICITY VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, ETHNICITY ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE NSF_DEMOGRAPHIC_RACE (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    RACE VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, RACE ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE NSF_DEMOGRAPHIC_DISABILITY (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    DISABILITY VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, DISABILITY ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE CUSTOMIZED_DASHBOARD (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    ENABLED_EXPERIMENT_ID VARCHAR (255),
-    ENABLED_NAME VARCHAR (255),
-    ENABLED_DESCRIPTION VARCHAR (255),
-    ENABLED_PROJECT VARCHAR (255),
-    ENABLED_OWNER VARCHAR (255),
-    ENABLED_APPLICATION VARCHAR (255),
-    ENABLED_COMPUTE_RESOURCE VARCHAR (255),
-    ENABLED_JOB_NAME VARCHAR (255),
-    ENABLED_JOB_ID VARCHAR (255),
-    ENABLED_JOB_STATUS VARCHAR (255),
-    ENABLED_JOB_CREATION_TIME VARCHAR (255),
-    ENABLED_NOTIFICATIONS_TO VARCHAR (255),
-    ENABLED_WORKING_DIR VARCHAR (255),
-    ENABLED_JOB_DESCRIPTION VARCHAR (255),
-    ENABLED_CREATION_TIME VARCHAR (255),
-    ENABLED_LAST_MODIFIED_TIME VARCHAR (255),
-    ENABLED_WALL_TIME VARCHAR (255),
-    ENABLED_CPU_COUNT VARCHAR (255),
-    ENABLED_NODE_COUNT VARCHAR (255),
-    ENABLED_QUEUE VARCHAR (255),
-    ENABLED_INPUTS VARCHAR (255),
-    ENABLED_OUTPUTS VARCHAR (255),
-    ENABLED_STORAGE_DIR VARCHAR (255),
-    ENABLED_ERRORS VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE CONFIGURATION
-(
-        CONFIG_KEY VARCHAR(255) NOT NULL,
-        CONFIG_VAL VARCHAR(255) NOT NULL,
-        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL)
-);
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL) VALUES('user_profile_catalog_version', '0.17');
diff --git a/modules/ide-integration/src/main/resources/database_scripts/user-profile-catalog-mysql.sql b/modules/ide-integration/src/main/resources/database_scripts/user-profile-catalog-mysql.sql
deleted file mode 100644
index bcc37af..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/user-profile-catalog-mysql.sql
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE IF NOT EXISTS GATEWAY (
-  AIRAVATA_INTERNAL_GATEWAY_ID varchar(255) NOT NULL,
-  DECLINED_REASON varchar(255) DEFAULT NULL,
-  GATEWAY_DOMAIN varchar(255) DEFAULT NULL,
-  EMAIL_ADDRESS varchar(255) DEFAULT NULL,
-  GATEWAY_ACRONYM varchar(255) DEFAULT NULL,
-  GATEWAY_ADMIN_EMAIL varchar(255) DEFAULT NULL,
-  GATEWAY_ADMIN_FIRST_NAME varchar(255) DEFAULT NULL,
-  GATEWAY_ADMIN_LAST_NAME varchar(255) DEFAULT NULL,
-  GATEWAY_APPROVAL_STATUS varchar(255) DEFAULT NULL,
-  GATEWAY_ID varchar(255) DEFAULT NULL,
-  GATEWAY_NAME varchar(255) DEFAULT NULL,
-  GATEWAY_PUBLIC_ABSTRACT varchar(255) DEFAULT NULL,
-  GATEWAY_URL varchar(255) DEFAULT NULL,
-  IDENTITY_SERVER_PASSWORD_TOKEN varchar(255) DEFAULT NULL,
-  IDENTITY_SERVER_USERNAME varchar(255) DEFAULT NULL,
-  OAUTH_CLIENT_ID varchar(255) DEFAULT NULL,
-  OAUTH_CLIENT_SECRET varchar(255) DEFAULT NULL,
-  REQUEST_CREATION_TIME bigint(20) DEFAULT NULL,
-  REQUESTER_USERNAME varchar(255) DEFAULT NULL,
-  GATEWAY_REVIEW_PROPOSAL_DESCRIPTION varchar(255) DEFAULT NULL,
-  PRIMARY KEY (AIRAVATA_INTERNAL_GATEWAY_ID)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS USER_PROFILE (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    USER_ID VARCHAR (255) NOT NULL,
-    GATEWAY_ID VARCHAR (255) NOT NULL,
-    USER_MODEL_VERSION VARCHAR (255),
-    FIRST_NAME VARCHAR (255),
-    LAST_NAME VARCHAR (255),
-    MIDDLE_NAME VARCHAR (255),
-    NAME_PREFIX VARCHAR (255),
-    NAME_SUFFIX VARCHAR (255),
-    ORCID_ID VARCHAR (255),
-    COUNTRY VARCHAR (255),
-    HOME_ORGANIZATION VARCHAR (255),
-    ORIGINATION_AFFILIATION VARCHAR (255),
-    CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    LAST_ACCESS_TIME TIMESTAMP,
-    VALID_UNTIL DATETIME,
-    STATE VARCHAR (255),
-    COMMENTS TEXT,
-    GPG_KEY TEXT,
-    TIME_ZONE VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS USER_PROFILE_EMAIL (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    EMAIL VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, EMAIL),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS USER_PROFILE_PHONE (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    PHONE VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, PHONE ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS USER_PROFILE_NATIONALITY (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    NATIONALITY VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, NATIONALITY ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS USER_PROFILE_LABELED_URI (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    LABELED_URI VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, LABELED_URI ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS NSF_DEMOGRAPHIC (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    GENDER VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS NSF_DEMOGRAPHIC_ETHNICITY (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    ETHNICITY VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, ETHNICITY ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS NSF_DEMOGRAPHIC_RACE (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    RACE VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, RACE ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS NSF_DEMOGRAPHIC_DISABILITY (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    DISABILITY VARCHAR (255) NOT NULL,
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, DISABILITY ),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE IF NOT EXISTS CUSTOMIZED_DASHBOARD (
-    AIRAVATA_INTERNAL_USER_ID VARCHAR (255) NOT NULL,
-    ENABLED_EXPERIMENT_ID VARCHAR (255),
-    ENABLED_NAME VARCHAR (255),
-    ENABLED_DESCRIPTION VARCHAR (255),
-    ENABLED_PROJECT VARCHAR (255),
-    ENABLED_OWNER VARCHAR (255),
-    ENABLED_APPLICATION VARCHAR (255),
-    ENABLED_COMPUTE_RESOURCE VARCHAR (255),
-    ENABLED_JOB_NAME VARCHAR (255),
-    ENABLED_JOB_ID VARCHAR (255),
-    ENABLED_JOB_STATUS VARCHAR (255),
-    ENABLED_JOB_CREATION_TIME VARCHAR (255),
-    ENABLED_NOTIFICATIONS_TO VARCHAR (255),
-    ENABLED_WORKING_DIR VARCHAR (255),
-    ENABLED_JOB_DESCRIPTION VARCHAR (255),
-    ENABLED_CREATION_TIME VARCHAR (255),
-    ENABLED_LAST_MODIFIED_TIME VARCHAR (255),
-    ENABLED_WALL_TIME VARCHAR (255),
-    ENABLED_CPU_COUNT VARCHAR (255),
-    ENABLED_NODE_COUNT VARCHAR (255),
-    ENABLED_QUEUE VARCHAR (255),
-    ENABLED_INPUTS VARCHAR (255),
-    ENABLED_OUTPUTS VARCHAR (255),
-    ENABLED_STORAGE_DIR VARCHAR (255),
-    ENABLED_ERRORS VARCHAR (255),
-    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID),
-    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-CREATE TABLE CONFIGURATION
-(
-        CONFIG_KEY VARCHAR(255) NOT NULL,
-        CONFIG_VAL VARCHAR(255) NOT NULL,
-        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL) VALUES('user_profile_catalog_version', '0.17');
diff --git a/modules/ide-integration/src/main/resources/database_scripts/workflowcatalog-derby.sql b/modules/ide-integration/src/main/resources/database_scripts/workflowcatalog-derby.sql
deleted file mode 100644
index beff4ca..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/workflowcatalog-derby.sql
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE WORKFLOW
-(
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        WORKFLOW_NAME VARCHAR (255) NOT NULL,
-        CREATED_USER VARCHAR (255),
-        GATEWAY_ID VARCHAR (255),
-        GRAPH CLOB,
-        IMAGE BLOB,
-        CREATION_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        UPDATE_TIME timestamp DEFAULT '0000-00-00 00:00:00',
-        PRIMARY KEY (TEMPLATE_ID)
-);
-
-CREATE TABLE WORKFLOW_INPUT
-(
-         TEMPLATE_ID VARCHAR(255) NOT NULL,
-         INPUT_KEY VARCHAR(255),
-         INPUT_VALUE CLOB,
-         DATA_TYPE VARCHAR(255),
-         METADATA VARCHAR(255),
-         APP_ARGUMENT VARCHAR(255),
-         STANDARD_INPUT SMALLINT,
-         USER_FRIENDLY_DESC VARCHAR(255),
-         INPUT_ORDER INTEGER,
-         IS_REQUIRED SMALLINT,
-         REQUIRED_TO_COMMANDLINE SMALLINT,
-         DATA_STAGED SMALLINT,
-         PRIMARY KEY(TEMPLATE_ID,INPUT_KEY),
-         FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE WORKFLOW_OUTPUT
-(
-         TEMPLATE_ID VARCHAR(255) NOT NULL,
-         OUTPUT_KEY VARCHAR(255),
-         OUTPUT_VALUE VARCHAR(255),
-         DATA_TYPE VARCHAR(255),
-         IS_REQUIRED SMALLINT,
-         REQUIRED_TO_COMMANDLINE SMALLINT,
-         DATA_MOVEMENT SMALLINT,
-         DATA_NAME_LOCATION VARCHAR(255),
-         SEARCH_QUERY VARCHAR(255),
-         APP_ARGUMENT VARCHAR(255),
-         OUTPUT_STREAMING SMALLINT,
-         PRIMARY KEY(TEMPLATE_ID,OUTPUT_KEY),
-         FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE COMPONENT_STATUS
-(
-        STATUS_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        STATE VARCHAR(255),
-        REASON VARCHAR(255),
-        UPDATE_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        PRIMARY KEY (STATUS_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE WORKFLOW_STATUS
-(
-        STATUS_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        STATE VARCHAR(255),
-        REASON VARCHAR(255),
-        UPDATE_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        PRIMARY KEY (STATUS_ID, TEMPLATE_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE EDGE
-(
-        EDGE_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        NAME VARCHAR (255),
-        COMPONENT_STATUS_ID VARCHAR(255),
-        DESCRIPTION VARCHAR(500),
-        CREATED_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        PRIMARY KEY (EDGE_ID, TEMPLATE_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PORT
-(
-        PORT_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        NAME VARCHAR (255),
-        COMPONENT_STATUS_ID VARCHAR(255),
-        DESCRIPTION VARCHAR(500),
-        CREATED_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        PRIMARY KEY (PORT_ID, TEMPLATE_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE NODE
-(
-        NODE_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        NAME VARCHAR (255),
-        APPLICATION_ID VARCHAR (255),
-        APPLICATION_NAME VARCHAR (255),
-        COMPONENT_STATUS_ID VARCHAR(255),
-        DESCRIPTION VARCHAR(500),
-        CREATED_TIME timestamp DEFAULT CURRENT_TIMESTAMP,
-        PRIMARY KEY (NODE_ID, TEMPLATE_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
\ No newline at end of file
diff --git a/modules/ide-integration/src/main/resources/database_scripts/workflowcatalog-mysql.sql b/modules/ide-integration/src/main/resources/database_scripts/workflowcatalog-mysql.sql
deleted file mode 100644
index a4d43bb..0000000
--- a/modules/ide-integration/src/main/resources/database_scripts/workflowcatalog-mysql.sql
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-
-CREATE TABLE WORKFLOW
-(
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        WORKFLOW_NAME VARCHAR (255) NOT NULL,
-        CREATED_USER VARCHAR (255),
-        GATEWAY_ID VARCHAR (255),
-        GRAPH LONGTEXT,
-        IMAGE BLOB,
-        CREATION_TIME timestamp DEFAULT NOW(),
-        UPDATE_TIME TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
-        PRIMARY KEY (TEMPLATE_ID)
-);
-
-CREATE TABLE WORKFLOW_INPUT
-(
-         TEMPLATE_ID VARCHAR(255) NOT NULL,
-         INPUT_KEY VARCHAR(255),
-         INPUT_VALUE VARCHAR(255),
-         DATA_TYPE VARCHAR(255),
-         METADATA VARCHAR(255),
-         APP_ARGUMENT VARCHAR(255),
-         STANDARD_INPUT SMALLINT,
-         USER_FRIENDLY_DESC VARCHAR(255),
-         INPUT_ORDER INTEGER,
-         IS_REQUIRED SMALLINT,
-         REQUIRED_TO_COMMANDLINE SMALLINT,
-         DATA_STAGED SMALLINT,
-         PRIMARY KEY(TEMPLATE_ID,INPUT_KEY),
-         FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE WORKFLOW_OUTPUT
-(
-         TEMPLATE_ID VARCHAR(255) NOT NULL,
-         OUTPUT_KEY VARCHAR(255),
-         OUTPUT_VALUE LONGTEXT,
-         DATA_TYPE VARCHAR(255),
-         IS_REQUIRED SMALLINT,
-         REQUIRED_TO_COMMANDLINE SMALLINT,
-         DATA_MOVEMENT SMALLINT,
-         DATA_NAME_LOCATION VARCHAR(255),
-         SEARCH_QUERY VARCHAR(255),
-         APP_ARGUMENT VARCHAR(255),
-         OUTPUT_STREAMING SMALLINT,
-         PRIMARY KEY(TEMPLATE_ID,OUTPUT_KEY),
-         FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE COMPONENT_STATUS
-(
-        STATUS_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        STATE VARCHAR(255),
-        REASON VARCHAR(255),
-        UPDATE_TIME TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
-        PRIMARY KEY (STATUS_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE WORKFLOW_STATUS
-(
-        STATUS_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        STATE VARCHAR(255),
-        REASON VARCHAR(255),
-        UPDATE_TIME TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
-        PRIMARY KEY (STATUS_ID, TEMPLATE_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE EDGE
-(
-        EDGE_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        NAME VARCHAR (255),
-        COMPONENT_STATUS_ID VARCHAR(255),
-        DESCRIPTION VARCHAR(500),
-        CREATED_TIME TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
-        PRIMARY KEY (EDGE_ID, TEMPLATE_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE PORT
-(
-        PORT_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        NAME VARCHAR (255),
-        COMPONENT_STATUS_ID VARCHAR(255),
-        DESCRIPTION VARCHAR(500),
-        CREATED_TIME TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
-        PRIMARY KEY (PORT_ID, TEMPLATE_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
-
-CREATE TABLE NODE
-(
-        NODE_ID VARCHAR (255) NOT NULL,
-        TEMPLATE_ID VARCHAR (255) NOT NULL,
-        NAME VARCHAR (255),
-        APPLICATION_ID VARCHAR (255),
-        APPLICATION_NAME VARCHAR (255),
-        COMPONENT_STATUS_ID VARCHAR(255),
-        DESCRIPTION VARCHAR(500),
-        CREATED_TIME TIMESTAMP DEFAULT NOW() ON UPDATE NOW(),
-        PRIMARY KEY (NODE_ID, TEMPLATE_ID),
-        FOREIGN KEY (TEMPLATE_ID) REFERENCES WORKFLOW(TEMPLATE_ID) ON DELETE CASCADE
-);
\ No newline at end of file
diff --git a/modules/ide-integration/src/main/resources/docker-compose.yml b/modules/ide-integration/src/main/resources/docker-compose.yml
index d2cac0a..3798117 100644
--- a/modules/ide-integration/src/main/resources/docker-compose.yml
+++ b/modules/ide-integration/src/main/resources/docker-compose.yml
@@ -14,7 +14,7 @@
       - ./keycloak/standalone.xml:/opt/jboss/keycloak/standalone/configuration/standalone.xml
     command: ["-b", "0.0.0.0", "-Dkeycloak.migration.action=import", "-Dkeycloak.migration.provider=singleFile", "-Dkeycloak.migration.file=/opt/keycloak/Default-export.json", "-Dkeycloak.migration.strategy=OVERWRITE_EXISTING"]
   db:
-    image: mysql:5.7.21
+    image: mariadb:10.4.13
     environment:
       - MYSQL_ROOT_PASSWORD=123456
       - MYSQL_USER=airavata
@@ -51,4 +51,4 @@
     volumes:
       - /tmp:/tmp
     ports:
-      - "22222:22"
\ No newline at end of file
+      - "22222:22"
diff --git a/modules/ide-integration/src/main/resources/keystores/airavata.jks b/modules/ide-integration/src/main/resources/keystores/airavata.jks
index b732322..f61304f 100644
--- a/modules/ide-integration/src/main/resources/keystores/airavata.jks
+++ b/modules/ide-integration/src/main/resources/keystores/airavata.jks
Binary files differ
diff --git a/modules/ide-integration/src/main/resources/keystores/client_truststore.jks b/modules/ide-integration/src/main/resources/keystores/client_truststore.jks
index a7a604c..566784d 100644
--- a/modules/ide-integration/src/main/resources/keystores/client_truststore.jks
+++ b/modules/ide-integration/src/main/resources/keystores/client_truststore.jks
Binary files differ
diff --git a/modules/ide-integration/src/main/resources/pga/Dockerfile b/modules/ide-integration/src/main/resources/pga/Dockerfile
index 7665443..ce724e9 100644
--- a/modules/ide-integration/src/main/resources/pga/Dockerfile
+++ b/modules/ide-integration/src/main/resources/pga/Dockerfile
@@ -7,4 +7,4 @@
 RUN a2enmod rewrite
 EXPOSE 80
 EXPOSE 443
-CMD [ "/bin/sh", "-c", "composer --working-dir=/var/www/portals/default install && echo 'Starting sever..' && /usr/sbin/apache2ctl -D FOREGROUND"]
\ No newline at end of file
+CMD [ "/bin/sh", "-c", "mkdir -p /var/www/portals/default/app/storage/views/ && mkdir -p /var/www/portals/default/app/storage/sessions/ && composer --working-dir=/var/www/portals/default install && echo 'Starting sever..' && /usr/sbin/apache2ctl -D FOREGROUND"]
\ No newline at end of file
diff --git a/modules/ide-integration/src/main/resources/pga/airavata-php-gateway/app/tests/selenium/pom.xml b/modules/ide-integration/src/main/resources/pga/airavata-php-gateway/app/tests/selenium/pom.xml
index ff5c5d0..5432e3d 100755
--- a/modules/ide-integration/src/main/resources/pga/airavata-php-gateway/app/tests/selenium/pom.xml
+++ b/modules/ide-integration/src/main/resources/pga/airavata-php-gateway/app/tests/selenium/pom.xml
@@ -13,10 +13,11 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
-        <version>2.3.2</version>
+        <version>3.8.0</version>
         <configuration>
-          <source>1.7</source>
-          <target>1.7</target>
+          <!--<source>1.7</source>-->
+          <!--<target>1.7</target>-->
+            <release>11</release>
         </configuration>
       </plugin>
       <plugin>
diff --git a/modules/ide-integration/src/main/resources/pga/docker-compose.yml b/modules/ide-integration/src/main/resources/pga/docker-compose.yml
index c796eae..1acc053 100644
--- a/modules/ide-integration/src/main/resources/pga/docker-compose.yml
+++ b/modules/ide-integration/src/main/resources/pga/docker-compose.yml
@@ -4,7 +4,7 @@
     image: dimuthuupe/pga:1.0
     volumes:
       - ./airavata-php-gateway:/var/www/portals/default
-      - ./exp-data-dir:/var/www/portals/gateway-user-data
+      - /tmp:/tmp
     ports:
       - "8008:80"
     mem_limit: 3G
diff --git a/modules/job-monitor/email-monitor/pom.xml b/modules/job-monitor/email-monitor/pom.xml
index 521de91..3040837 100644
--- a/modules/job-monitor/email-monitor/pom.xml
+++ b/modules/job-monitor/email-monitor/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>job-monitor</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -34,7 +34,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>job-monitor-api</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.yaml</groupId>
diff --git a/modules/job-monitor/email-monitor/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java b/modules/job-monitor/email-monitor/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java
index 64f5b86..ddfd951 100644
--- a/modules/job-monitor/email-monitor/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java
+++ b/modules/job-monitor/email-monitor/src/main/java/org/apache/airavata/monitor/email/EmailBasedMonitor.java
@@ -235,9 +235,11 @@
         List<Message> unreadMessages = new ArrayList<>();
         for (Message message : searchMessages) {
             try {
+                log.info("Parsing the job status message");
                 JobStatusResult jobStatusResult = parse(message);
-                log.info(jobStatusResult.getJobId() + ", " + jobStatusResult.getJobName() + ", " + jobStatusResult.getState().getValue());
+                log.info("Job message parsed. Job Id " + jobStatusResult.getJobId() + ", Job Name " + jobStatusResult.getJobName() + ", Job State " + jobStatusResult.getState().getValue());
                 submitJobStatus(jobStatusResult);
+                log.info("Submitted the job {} status to queue", jobStatusResult.getJobId());
                 processedMessages.add(message);
             } catch (Exception e) {
                 log.error("Error in submitting job status to queue", e);
diff --git a/modules/job-monitor/job-monitor-api/pom.xml b/modules/job-monitor/job-monitor-api/pom.xml
index 827e69c..97b1479 100644
--- a/modules/job-monitor/job-monitor-api/pom.xml
+++ b/modules/job-monitor/job-monitor-api/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>job-monitor</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -33,7 +33,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-commons</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.kafka</groupId>
diff --git a/modules/job-monitor/job-monitor-api/src/main/java/org/apache/airavata/monitor/AbstractMonitor.java b/modules/job-monitor/job-monitor-api/src/main/java/org/apache/airavata/monitor/AbstractMonitor.java
index 92efa00..a2581ad 100644
--- a/modules/job-monitor/job-monitor-api/src/main/java/org/apache/airavata/monitor/AbstractMonitor.java
+++ b/modules/job-monitor/job-monitor-api/src/main/java/org/apache/airavata/monitor/AbstractMonitor.java
@@ -6,7 +6,7 @@
 import org.apache.airavata.model.job.JobModel;
 import org.apache.airavata.monitor.kafka.MessageProducer;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -35,14 +35,16 @@
 
     private void initRegistryClientPool() throws ApplicationSettingsException {
 
-        GenericObjectPool.Config poolConfig = new GenericObjectPool.Config();
-        poolConfig.maxActive = 100;
-        poolConfig.minIdle = 5;
-        poolConfig.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
-        poolConfig.testOnBorrow = true;
-        poolConfig.testWhileIdle = true;
-        poolConfig.numTestsPerEvictionRun = 10;
-        poolConfig.maxWait = 3000;
+        GenericObjectPoolConfig<RegistryService.Client> poolConfig = new GenericObjectPoolConfig<>();
+        poolConfig.setMaxTotal(100);
+        poolConfig.setMinIdle(5);
+        poolConfig.setBlockWhenExhausted(true);
+        poolConfig.setTestOnBorrow(true);
+        poolConfig.setTestWhileIdle(true);
+        // must set timeBetweenEvictionRunsMillis since eviction doesn't run unless that is positive
+        poolConfig.setTimeBetweenEvictionRunsMillis(5L * 60L * 1000L);
+        poolConfig.setNumTestsPerEvictionRun(10);
+        poolConfig.setMaxWaitMillis(3000);
 
         this.registryClientPool = new ThriftClientPool<>(
                 RegistryService.Client::new, poolConfig, ServerSettings.getRegistryServerHost(),
@@ -53,6 +55,7 @@
         RegistryService.Client registryClient = getRegistryClientPool().getResource();
         boolean validated = true;
         try {
+            log.info("Fetching matching jobs for job id {} from registry", jobStatusResult.getJobId());
             List<JobModel> jobs = registryClient.getJobs("jobId", jobStatusResult.getJobId());
 
             if (jobs.size() > 0) {
diff --git a/modules/job-monitor/pom.xml b/modules/job-monitor/pom.xml
index 3302d79..77898d5 100644
--- a/modules/job-monitor/pom.xml
+++ b/modules/job-monitor/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>airavata</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -66,12 +66,12 @@
             <dependency>
                 <groupId>org.apache.airavata</groupId>
                 <artifactId>task-core</artifactId>
-                <version>0.19-SNAPSHOT</version>
+                <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.airavata</groupId>
                 <artifactId>registry-api-stubs</artifactId>
-                <version>0.19-SNAPSHOT</version>
+                <version>${project.version}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>
diff --git a/modules/job-monitor/real-time-monitor/pom.xml b/modules/job-monitor/real-time-monitor/pom.xml
index acc3f44..50729e3 100644
--- a/modules/job-monitor/real-time-monitor/pom.xml
+++ b/modules/job-monitor/real-time-monitor/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>job-monitor</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -33,12 +33,12 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>job-monitor-api</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-commons</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
diff --git a/modules/messaging/client/pom.xml b/modules/messaging/client/pom.xml
index 131bf68..4013fdc 100644
--- a/modules/messaging/client/pom.xml
+++ b/modules/messaging/client/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>messaging</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/messaging/core/pom.xml b/modules/messaging/core/pom.xml
index dfd95ff..c8d7024 100644
--- a/modules/messaging/core/pom.xml
+++ b/modules/messaging/core/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>messaging</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/messaging/pom.xml b/modules/messaging/pom.xml
index 9f35b44..fd7ee0c 100644
--- a/modules/messaging/pom.xml
+++ b/modules/messaging/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/orchestrator/orchestrator-client/pom.xml b/modules/orchestrator/orchestrator-client/pom.xml
index 267745c..85ba396 100644
--- a/modules/orchestrator/orchestrator-client/pom.xml
+++ b/modules/orchestrator/orchestrator-client/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>orchestrator</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/OrchestratorService.java b/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/OrchestratorService.java
index eec03a6..e47749d 100644
--- a/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/OrchestratorService.java
+++ b/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/OrchestratorService.java
@@ -1,19 +1,20 @@
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one or more
-     * contributor license agreements.  See the NOTICE file distributed with
-     * this work for additional information regarding copyright ownership.
-     * The ASF licenses this file to You 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.
-     */
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
 /**
  * Autogenerated by Thrift Compiler (0.10.0)
  *
diff --git a/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/orchestrator_cpiConstants.java b/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/orchestrator_cpiConstants.java
index ff4b26d..b50eff0 100644
--- a/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/orchestrator_cpiConstants.java
+++ b/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/orchestrator_cpiConstants.java
@@ -1,19 +1,20 @@
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one or more
-     * contributor license agreements.  See the NOTICE file distributed with
-     * this work for additional information regarding copyright ownership.
-     * The ASF licenses this file to You 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.
-     */
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
 /**
  * Autogenerated by Thrift Compiler (0.10.0)
  *
diff --git a/modules/orchestrator/orchestrator-core/pom.xml b/modules/orchestrator/orchestrator-core/pom.xml
index 8964fc3..ea4806c 100644
--- a/modules/orchestrator/orchestrator-core/pom.xml
+++ b/modules/orchestrator/orchestrator-core/pom.xml
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>orchestrator</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
index c81736f..08cefbd 100644
--- a/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
+++ b/modules/orchestrator/orchestrator-core/src/main/java/org/apache/airavata/orchestrator/cpi/impl/SimpleOrchestratorImpl.java
@@ -417,6 +417,10 @@
                         break;
                     case URI:
                     case URI_COLLECTION:
+                        if ((processInput.getValue() == null || processInput.getValue().equals("")) && !processInput.isIsRequired()) {
+                            logger.debug("Skipping input data staging task for {} since value is empty and not required", processInput.getName());
+                            break;
+                        }
                         final RegistryService.Client registryClient = getRegistryServiceClient();
                         try {
                             TaskModel inputDataStagingTask = getInputDataStagingTask(registryClient, processModel, processInput, gatewayId);
@@ -466,6 +470,7 @@
                             createOutputDataSatagingTasks(registryClient, processModel, gatewayId, dataStagingTaskIds, processOutput);
                             break;
                         case URI:
+                        case URI_COLLECTION:
                             createOutputDataSatagingTasks(registryClient, processModel, gatewayId, dataStagingTaskIds, processOutput);
                             break;
                         default:
@@ -623,11 +628,14 @@
             DataMovementProtocol dataMovementProtocol =
                     OrchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId);
             String loginUserName = OrchestratorUtils.getLoginUserName(processModel, gatewayId);
+            StringBuilder destinationPath = new StringBuilder(workingDir);
+            Optional.ofNullable(processInput.getOverrideFilename()).ifPresent(destinationPath::append); //If an override filename is provided
+
             destination = new URI(dataMovementProtocol.name(),
                     loginUserName,
                     computeResource.getHostName(),
                     OrchestratorUtils.getDataMovementPort(processModel, gatewayId),
-                    workingDir , null, null);
+                    destinationPath.toString(), null, null);
         } catch (URISyntaxException e) {
             throw new OrchestratorException("Error while constructing destination file URI", e);
         }
diff --git a/modules/orchestrator/orchestrator-service/pom.xml b/modules/orchestrator/orchestrator-service/pom.xml
index 5523e55..87be577 100644
--- a/modules/orchestrator/orchestrator-service/pom.xml
+++ b/modules/orchestrator/orchestrator-service/pom.xml
@@ -27,7 +27,7 @@
     <parent>
         <artifactId>orchestrator</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java
index fd7a670..15800ee 100644
--- a/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java
+++ b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java
@@ -183,7 +183,7 @@
 					//FIXME Resolving replica if available. This is a very crude way of resolving input replicas. A full featured
 					//FIXME replica resolving logic should come here
 					processModel.getProcessInputs().stream().forEach(pi -> {
-						if (pi.getType().equals(DataType.URI) && pi.getValue().startsWith("airavata-dp://")) {
+						if (pi.getType().equals(DataType.URI) && pi.getValue() != null && pi.getValue().startsWith("airavata-dp://")) {
 							try {
 								DataProductModel dataProductModel = registryClient.getDataProduct(pi.getValue());
 								Optional<DataReplicaLocationModel> rpLocation = dataProductModel.getReplicaLocations()
@@ -200,7 +200,7 @@
                             } catch (TException e) {
 								throw new RuntimeException("Error while launching experiment", e);
                             }
-                        } else if (pi.getType().equals(DataType.URI_COLLECTION) && pi.getValue().contains("airavata-dp://")) {
+                        } else if (pi.getType().equals(DataType.URI_COLLECTION) && pi.getValue() != null && pi.getValue().contains("airavata-dp://")) {
 							try {
 								String[] uriList = pi.getValue().split(",");
 								final ArrayList<String> filePathList = new ArrayList<>();
diff --git a/modules/orchestrator/pom.xml b/modules/orchestrator/pom.xml
index b8467cb..4b8807d 100644
--- a/modules/orchestrator/pom.xml
+++ b/modules/orchestrator/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/registry/pom.xml b/modules/registry/pom.xml
index 8329b1d..bc7e841 100644
--- a/modules/registry/pom.xml
+++ b/modules/registry/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/registry/registry-core/README.md b/modules/registry/registry-core/README.md
new file mode 100644
index 0000000..d60fe91
--- /dev/null
+++ b/modules/registry/registry-core/README.md
@@ -0,0 +1,115 @@
+# Schema migration scripts
+
+When you add or update Entity classes, you need to update the SQL schema
+scripts, both the scripts that define the entire schema for brand new databases
+(referred to from here on as the _database script_) and the script to migrate an
+older schema to the new schema (referred to from here on as the _migration
+script_). These instructions show you how to create these scripts.
+
+Before using these steps, be sure to review the **Known Issues** section later
+on. Notably, any removals from the schema will have to be manually managed.
+
+1. First, start by adding or updating the Entity class, for example, by adding a
+   new field.
+
+   Additional notes:
+
+   - To have OpenJPA generate FOREIGN KEY schema statements, you need to
+     annotate the foreign key reference with
+     `@org.apache.openjpa.persistence.jdbc.ForeignKey`.
+   - To have OpenJPA generate INDEX schema statements, you need to annotate the
+     indexed columns with `@org.apache.openjpa.persistence.jdbc.Index`.
+
+2. If you added an Entity class, make sure to add an entry for it in
+   `persistence.xml`. You'll need to also add the same entry to
+   `../../ide-integration/src/main/resources/META-INF/persistence.xml`.
+3. Next, you need to update the Derby database script. To do this, run
+   ```
+   mvn clean process-classes exec:exec@generate-schema-derby
+   ```
+   This will generate a database script for each database in `target/`. For
+   example, for appcatalog, it will generate a file called
+   `target/app_catalog-schema.sql`. Copy the contents of the database script
+   that are relevant to the Entity class changes that you made into the
+   corresponding database script in `src/main/resources/`. For example, if you
+   changed an app catalog Entity then you would copy the `CREATE TABLE`, etc.
+   statements related to that Entity from the `target/app_catalog-schema.sql`
+   script to `src/main/resources/appcatalog-derby.sql`, replace any existing
+   `CREATE TABLE`, etc. statements for the table. Note that the generate
+   database script may have several statements related to your Entity class
+   changes throughout it, for example, the `CREATE TABLE` statements tend to
+   come first and the `FOREIGN KEY` statements come later.
+4. Next, you'll update the MariaDB (or MySQL) database script. To do this, run
+
+   ```
+   mvn clean process-classes docker-compose:up@mysql-up \
+      exec:exec@generate-schema-mysql exec:exec@generate-migrations-mysql \
+      docker-compose:down@mysql-down
+   ```
+
+   This will generate a database and a migration script for each database in
+   `target/`. For example, for appcatalog, it will generate a file called
+   `target/app_catalog-schema.sql` (the database script) and a file called
+   `target/app_catalog-migration.sql` (the migration script). Like the previous
+   step, you'll copy the contents of the database script (the one ending in
+   `-schema.sql`) that are relevant to the Entity class changes you made and add
+   them to the corresponding database script in `src/main/resources/`.
+
+   Some additional notes:
+
+   - Make sure to add `DEFAULT CHARSET=latin1` to all MySQL `CREATE TABLE`
+     statements.
+   - It is recommended that you name all constraints and indexes. This makes it
+     easier to change or drop them in the future. The naming convention is to
+     use a prefix of `FK_` or `UNIQ_` or `IDX_` that indicates the type of
+     constraint, then the table name, then the names of the columns or related
+     entity or some short description of the constraint. For example, if you
+     create a FOREIGN KEY on table CHILD of column PARENT_ID you would name it
+     `FK_CHILD_PARENT_ID`.
+
+5. Next, you'll create a MariaDB migration script. The migration script should
+   have been created in the previous step, but if necessary you can run
+
+   ```
+   mvn clean process-classes docker-compose:up@mysql-up exec:exec@generate-migrations-mysql docker-compose:down@mysql-down
+   ```
+
+   Copy the contents of the migration script that are relevant to the Entity
+   classes changes that you made into the respective migration schema scripts in
+   `../release-migration-scripts/next/DeltaScripts/`. All statements should have
+   `IF NOT EXISTS` (if adding) or `IF EXISTS` (if dropping) added so that they
+   can be reapplied and only change the schema when it hasn't already been
+   updated. For example:
+
+   - `CREATE TABLE IF NOT EXISTS ...`
+   - `DROP TABLE IF EXISTS ...`
+   - `ALTER TABLE <table name> ADD COLUMN IF NOT EXISTS <column definition>`
+   - `ALTER TABLE <table name> DROP COLUMN IF EXISTS <column name>`
+   - `ALTER TABLE <table name> ADD CONSTRAINT <foreign key name> FOREIGN KEY IF NOT EXISTS <foreign key definition>`
+   - `ALTER TABLE <table name> DROP FOREIGN KEY IF EXISTS <foreign key name>`
+   - `ALTER TABLE <table name> ADD KEY IF NOT EXISTS <key definition>`
+   - `ALTER TABLE <table name> DROP KEY IF EXISTS <index name>`
+
+   See also the **additional notes** under the previous step.
+
+6. Next, you'll also copy this MariaDB migration script to the corresponding
+   `0*-migrations.sql` file in ide-integration. Here it should also have
+   `IF NOT EXISTS`/`IF EXISTS` added. Essentially you just need to take the
+   lines you added in `release-migration-scripts` and add them to the
+   corresponding `0*-migrations.sql` script.
+
+## Known Issues
+
+- can automatically create schema migrations that add columns/tables, but not
+  ones that remove them. **Creating schema migrations that drop columns/tables
+  will have to be done manually.**
+- schema generation generates a PRIMARY KEY for VIEWs that are mapped to an
+  Entity, for example ExperimentSummary.
+- when unique constraints are added to an entity, the generated migration
+  scripts do not include an ALTER TABLE statement to add it. However, the
+  database script does include the unique constraint so it can be copied from
+  that into an `ALTER TABLE ADD UNIQUE ...` statement in the migation script.
+- when the definition of a column is chaged, the generated migrations do not
+  include an ALTER STATEMENT to update it. However, the database script does
+  reflect the updated column definition so it can be copied from that into an
+  `ALTER TABLE MODIFY COLUMN col_name ...`.
diff --git a/modules/registry/registry-core/pom.xml b/modules/registry/registry-core/pom.xml
index ece6253..35ef082 100644
--- a/modules/registry/registry-core/pom.xml
+++ b/modules/registry/registry-core/pom.xml
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>registry</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -49,7 +49,7 @@
         <dependency>
             <groupId>net.sf.dozer</groupId>
             <artifactId>dozer</artifactId>
-            <version>5.4.0</version>
+            <version>${dozer.version}</version>
             <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
@@ -98,12 +98,12 @@
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
             <version>${logback.version}</version>
-            <scope>test</scope>
+            <scope>runtime</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-commons</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
@@ -113,14 +113,20 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-registry-cpi</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.ibatis</groupId>
             <artifactId>ibatis-sqlmap</artifactId>
             <version>2.3.0</version>
         </dependency>
-
+        <!-- For MariaDB based schema migrations -->
+        <dependency>
+            <groupId>org.mariadb.jdbc</groupId>
+            <artifactId>mariadb-java-client</artifactId>
+            <version>2.0.2</version>
+            <scope>runtime</scope>
+        </dependency>
     </dependencies>
 
     <build>
@@ -128,51 +134,101 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.1</version>
+                <version>3.8.0</version>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                   <release>11</release>
+                    <!--<compilerArgs>-->
+                        <!--<arg>&#45;&#45;add-opens=java.base/java.lang=ALL-UNNAMED</arg>-->
+                    <!--</compilerArgs>-->
+                    <!--<fork>true</fork>-->
                 </configuration>
             </plugin>
             <plugin>
-                <groupId>org.apache.openjpa</groupId>
-                <artifactId>openjpa-maven-plugin</artifactId>
-                <version>${openjpa.version}</version>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>1.6.0</version>
                 <configuration>
-                    <includes>**/entities/*.class</includes>
-                    <excludes>**/entities/XML*.class</excludes>
-                    <addDefaultConstructor>true</addDefaultConstructor>
-                    <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
+                    <executable>java</executable>
+                    <classpathScope>runtime</classpathScope>
+                    <workingDirectory>${project.build.directory}</workingDirectory>
                 </configuration>
                 <executions>
                     <execution>
-                        <id>enhancer</id>
-                        <phase>process-classes</phase>
+                        <!-- Run with:
+                            mvn process-classes docker-compose:up@mysql-up exec:exec@generate-migrations-mysql docker-compose:down@mysql-down
+                        -->
+                        <id>generate-migrations-mysql</id>
                         <goals>
-                            <goal>enhance</goal>
+                            <goal>exec</goal>
                         </goals>
+                        <configuration>
+                            <arguments>
+                                <argument>-Dairavata.config.dir=${project.basedir}/src/main/resources/migrations-util/mysql</argument>
+                                <argument>-classpath</argument>
+                                <classpath/>
+                                <argument>org.apache.airavata.registry.core.utils.migration.MigrationSchemaGenerator</argument>
+                            </arguments>
+                        </configuration>
                     </execution>
                     <execution>
-                        <!-- execute with `mvn compile openjpa:sql@generate-sql` or `mvn process-classes` -->
-                        <id>generate-sql</id>
-                        <configuration>
-                            <!-- openjpa:sql doesn't work well with multiple persistence-unit's in persistence.xml, so
-                            use this single persistence-unit persistence.xml to list any classes for which SQL schema
-                            generation is desired -->
-                            <persistenceXmlFile>${basedir}/src/main/resources/META-INF/generate-sql-persistence.xml</persistenceXmlFile>
-                            <sqlAction>build</sqlAction>
-                            <connectionDriverName>org.apache.derby.jdbc.ClientDriver</connectionDriverName>
-                        </configuration>
+                        <!-- Run with:
+                            mvn process-classes docker-compose:up@mysql-up exec:exec@generate-schema-mysql docker-compose:down@mysql-down
+                        -->
+                        <id>generate-schema-mysql</id>
                         <goals>
-                            <goal>sql</goal>
+                            <goal>exec</goal>
                         </goals>
+                        <configuration>
+                            <arguments>
+                                <argument>-Dairavata.config.dir=${project.basedir}/src/main/resources/migrations-util/mysql</argument>
+                                <argument>-classpath</argument>
+                                <classpath/>
+                                <argument>org.apache.airavata.registry.core.utils.migration.MigrationSchemaGenerator</argument>
+                                <argument>build</argument>
+                            </arguments>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <!-- Run with:
+                            mvn process-classes exec:exec@generate-migrations-derby
+                        -->
+                        <id>generate-migrations-derby</id>
+                        <goals>
+                            <goal>exec</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>
+                                <argument>-Dairavata.config.dir=${project.basedir}/src/main/resources/migrations-util/derby</argument>
+                                <argument>-classpath</argument>
+                                <classpath/>
+                                <argument>org.apache.airavata.registry.core.utils.migration.MigrationSchemaGenerator</argument>
+                            </arguments>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <!-- Run with:
+                            mvn process-classes exec:exec@generate-schema-derby
+                        -->
+                        <id>generate-schema-derby</id>
+                        <goals>
+                            <goal>exec</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>
+                                <argument>-Dairavata.config.dir=${project.basedir}/src/main/resources/migrations-util/derby</argument>
+                                <argument>-classpath</argument>
+                                <classpath/>
+                                <argument>org.apache.airavata.registry.core.utils.migration.MigrationSchemaGenerator</argument>
+                                <argument>build</argument>
+                            </arguments>
+                        </configuration>
                     </execution>
                 </executions>
             </plugin>
             <plugin>
                 <groupId>org.apache.openjpa</groupId>
                 <artifactId>openjpa-maven-plugin</artifactId>
-                <version>2.2.0</version>
+                <version>${openjpa.version}</version>
                 <configuration>
                     <includes>**/model/*.class</includes>
                     <addDefaultConstructor>true</addDefaultConstructor>
@@ -191,7 +247,7 @@
                     <dependency>
                         <groupId>org.apache.openjpa</groupId>
                         <artifactId>openjpa</artifactId>
-                        <version>2.2.0</version>
+                        <version>${openjpa.version}</version>
                     </dependency>
                 </dependencies>
             </plugin>
@@ -206,7 +262,33 @@
                     <workingDirectory>${project.build.testOutputDirectory}</workingDirectory>
                 </configuration>
             </plugin>
-        </plugins>
+            <plugin>
+                <groupId>com.dkanejs.maven.plugins</groupId>
+                <artifactId>docker-compose-maven-plugin</artifactId>
+                <version>4.0.0</version>
+                <executions>
+                    <execution>
+                        <id>mysql-up</id>
+                        <goals>
+                            <goal>up</goal>
+                        </goals>
+                        <configuration>
+                            <composeFile>${project.basedir}/src/main/resources/migrations-util/mysql/docker-compose.yml</composeFile>
+                            <detachedMode>true</detachedMode>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>mysql-down</id>
+                        <goals>
+                            <goal>down</goal>
+                        </goals>
+                        <configuration>
+                            <composeFile>${project.basedir}/src/main/resources/migrations-util/mysql/docker-compose.yml</composeFile>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            </plugins>
     </build>
 
 </project>
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ApplicationInputEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ApplicationInputEntity.java
index d9db823..6061a9a 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ApplicationInputEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ApplicationInputEntity.java
@@ -79,6 +79,9 @@
 	@Column(name = "IS_READ_ONLY")
 	private boolean isReadOnly;
 
+	@Column(name = "OVERRIDE_FILENAME")
+	private String overrideFilename;
+
 	@ManyToOne(targetEntity = ApplicationInterfaceEntity.class)
 	@JoinColumn(name = "INTERFACE_ID", nullable = false, updatable = false)
 	@ForeignKey(deleteAction = ForeignKeyAction.CASCADE)
@@ -192,6 +195,14 @@
 		this.isReadOnly = isReadOnly;
 	}
 
+	public String getOverrideFilename() {
+		return overrideFilename;
+	}
+
+	public void setOverrideFilename(String overrideFilename) {
+		this.overrideFilename = overrideFilename;
+	}
+
 	public ApplicationInterfaceEntity getApplicationInterface() {
 		return applicationInterface;
 	}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourcePreferenceEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourcePreferenceEntity.java
index 7f28852..40dc3d0 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourcePreferenceEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourcePreferenceEntity.java
@@ -53,7 +53,7 @@
     private String loginUserName;
 
     @Column(name = "OVERRIDE_BY_AIRAVATA")
-    private short overridebyAiravata;
+    private boolean overridebyAiravata;
 
     @Column(name = "PREFERED_BATCH_QUEUE")
     private String preferredBatchQueue;
@@ -208,11 +208,11 @@
         this.loginUserName = loginUserName;
     }
 
-    public short getOverridebyAiravata() {
+    public boolean isOverridebyAiravata() {
         return overridebyAiravata;
     }
 
-    public void setOverridebyAiravata(short overridebyAiravata) {
+    public void setOverridebyAiravata(boolean overridebyAiravata) {
         this.overridebyAiravata = overridebyAiravata;
     }
 
@@ -255,4 +255,4 @@
     public void setSshAccountProvisionerConfigurations(List<SSHAccountProvisionerConfiguration> sshAccountProvisionerConfigurations) {
         this.sshAccountProvisionerConfigurations = sshAccountProvisionerConfigurations;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourceReservationEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourceReservationEntity.java
new file mode 100644
index 0000000..3948098
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourceReservationEntity.java
@@ -0,0 +1,128 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.registry.core.entities.appcatalog;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.CollectionTable;
+import javax.persistence.Column;
+import javax.persistence.ElementCollection;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.apache.openjpa.persistence.jdbc.ForeignKey;
+import org.apache.openjpa.persistence.jdbc.ForeignKeyAction;
+
+/**
+ * The persistent class for the COMPUTE_RESOURCE_RESERVATION database table.
+ */
+@Entity
+@Table(name = "COMPUTE_RESOURCE_RESERVATION")
+public class ComputeResourceReservationEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "RESERVATION_ID")
+    private String reservationId;
+
+    @Column(name = "RESERVATION_NAME", nullable = false)
+    private String reservationName;
+
+    @Column(name = "START_TIME", nullable = false)
+    private Timestamp startTime;
+
+    @Column(name = "END_TIME", nullable = false)
+    private Timestamp endTime;
+
+    @ElementCollection(fetch = FetchType.EAGER)
+    @CollectionTable(name="COMPUTE_RESOURCE_RESERVATION_QUEUE", joinColumns = @JoinColumn(name="RESERVATION_ID"))
+    @Column(name = "QUEUE_NAME", nullable = false)
+    private List<String> queueNames;
+
+    // TODO: FK queue table to BatchQueueEntity?
+
+    @ManyToOne(targetEntity = GroupComputeResourcePrefEntity.class)
+    @JoinColumns({
+            @JoinColumn(name = "RESOURCE_ID", referencedColumnName = "RESOURCE_ID", nullable = false, updatable = false),
+            @JoinColumn(name = "GROUP_RESOURCE_PROFILE_ID", referencedColumnName = "GROUP_RESOURCE_PROFILE_ID", nullable = false, updatable = false)
+    })
+    @ForeignKey(deleteAction = ForeignKeyAction.CASCADE)
+    private GroupComputeResourcePrefEntity groupComputeResourcePref;
+
+    public ComputeResourceReservationEntity() {
+    }
+
+    public String getReservationId() {
+        return reservationId;
+    }
+
+    public void setReservationId(String reservationId) {
+        this.reservationId = reservationId;
+    }
+
+    public String getReservationName() {
+        return reservationName;
+    }
+
+    public void setReservationName(String reservationName) {
+        this.reservationName = reservationName;
+    }
+
+    public Timestamp getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Timestamp startTime) {
+        this.startTime = startTime;
+    }
+
+    public Timestamp getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Timestamp endTime) {
+        this.endTime = endTime;
+    }
+
+    public List<String> getQueueNames() {
+        return queueNames;
+    }
+
+    public void setQueueNames(List<String> queueNames) {
+        this.queueNames = queueNames;
+    }
+
+    public GroupComputeResourcePrefEntity getGroupComputeResourcePref() {
+        return groupComputeResourcePref;
+    }
+
+    public void setGroupComputeResourcePref(GroupComputeResourcePrefEntity groupComputeResourcePref) {
+        this.groupComputeResourcePref = groupComputeResourcePref;
+    }
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GatewayGroupsEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GatewayGroupsEntity.java
index 53d2400..ec7f9f7 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GatewayGroupsEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GatewayGroupsEntity.java
@@ -44,7 +44,7 @@
     @Column(name = "DEFAULT_GATEWAY_USERS_GROUP_ID")
     private String defaultGatewayUsersGroupId;
 
-    protected GatewayGroupsEntity() {
+    public GatewayGroupsEntity() {
 
     }
 
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GroupComputeResourcePrefEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GroupComputeResourcePrefEntity.java
index 8260764..97383e8 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GroupComputeResourcePrefEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GroupComputeResourcePrefEntity.java
@@ -35,6 +35,7 @@
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
 import javax.persistence.Table;
 import java.io.Serializable;
 import java.sql.Timestamp;
@@ -81,15 +82,6 @@
     @Column(name = "QUALITY_OF_SERVICE")
     private String qualityOfService;
 
-    @Column(name = "RESERVATION")
-    private String reservation;
-
-    @Column(name = "RESERVATION_END_TIME")
-    private Timestamp reservationEndTime;
-
-    @Column(name = "RESERVATION_START_TIME")
-    private Timestamp reservationStartTime;
-
     @Column(name = "RESOURCE_CS_TOKEN")
     private String resourceSpecificCredentialStoreToken;
 
@@ -108,7 +100,11 @@
     @OneToMany(targetEntity = GroupSSHAccountProvisionerConfig.class, mappedBy = "groupComputeResourcePref", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
     private List<GroupSSHAccountProvisionerConfig> groupSSHAccountProvisionerConfigs;
 
-    @ManyToOne(targetEntity = GroupResourceProfileEntity.class)
+    @OneToMany(targetEntity = ComputeResourceReservationEntity.class, mappedBy = "groupComputeResourcePref", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
+    @OrderBy("startTime ASC")
+    private List<ComputeResourceReservationEntity> reservations;
+
+    @ManyToOne(targetEntity = GroupResourceProfileEntity.class, cascade = CascadeType.PERSIST)
     @JoinColumn(name = "GROUP_RESOURCE_PROFILE_ID", nullable = false, updatable = false)
     @ForeignKey(deleteAction = ForeignKeyAction.CASCADE)
     private  GroupResourceProfileEntity groupResourceProfile;
@@ -188,30 +184,6 @@
         this.qualityOfService = qualityOfService;
     }
 
-    public String getReservation() {
-        return reservation;
-    }
-
-    public void setReservation(String reservation) {
-        this.reservation = reservation;
-    }
-
-    public Timestamp getReservationEndTime() {
-        return reservationEndTime;
-    }
-
-    public void setReservationEndTime(Timestamp reservationEndTime) {
-        this.reservationEndTime = reservationEndTime;
-    }
-
-    public Timestamp getReservationStartTime() {
-        return reservationStartTime;
-    }
-
-    public void setReservationStartTime(Timestamp reservationStartTime) {
-        this.reservationStartTime = reservationStartTime;
-    }
-
     public String getResourceSpecificCredentialStoreToken() {
         return resourceSpecificCredentialStoreToken;
     }
@@ -260,6 +232,14 @@
         this.groupSSHAccountProvisionerConfigs = groupSSHAccountProvisionerConfigs;
     }
 
+    public List<ComputeResourceReservationEntity> getReservations() {
+        return reservations;
+    }
+
+    public void setReservations(List<ComputeResourceReservationEntity> reservations) {
+        this.reservations = reservations;
+    }
+
     public GroupResourceProfileEntity getGroupResourceProfile() {
         return groupResourceProfile;
     }
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GroupSSHAccountProvisionerConfig.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GroupSSHAccountProvisionerConfig.java
index 1241144..c913d1d 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GroupSSHAccountProvisionerConfig.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/GroupSSHAccountProvisionerConfig.java
@@ -58,7 +58,7 @@
     @Column(name = "CONFIG_VALUE")
     private String configValue;
 
-    @ManyToOne(targetEntity = GroupComputeResourcePrefEntity.class, cascade= CascadeType.MERGE)
+    @ManyToOne(targetEntity = GroupComputeResourcePrefEntity.class)
     @JoinColumns({
             @JoinColumn(name = "RESOURCE_ID", referencedColumnName = "RESOURCE_ID", nullable = false),
             @JoinColumn(name = "GROUP_RESOURCE_PROFILE_ID", referencedColumnName = "GROUP_RESOURCE_PROFILE_ID", nullable = false)
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ResourceJobManagerEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ResourceJobManagerEntity.java
index ee2ca9a..69f1f7b 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ResourceJobManagerEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ResourceJobManagerEntity.java
@@ -20,6 +20,7 @@
 */
 package org.apache.airavata.registry.core.entities.appcatalog;
 
+import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManagerType;
 
 import javax.persistence.*;
@@ -38,8 +39,8 @@
     @Column(name = "RESOURCE_JOB_MANAGER_ID")
     private String resourceJobManagerId;
 
-    @Column(name = "CREATION_TIME")
-    private Timestamp creationTime;
+    @Column(name = "CREATION_TIME", nullable = false, updatable = false)
+    private Timestamp creationTime = AiravataUtils.getCurrentTimestamp();
 
     @Column(name = "JOB_MANAGER_BIN_PATH")
     private String jobManagerBinPath;
@@ -104,4 +105,4 @@
     public void setUpdateTime(Timestamp updateTime) {
         this.updateTime = updateTime;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/SshJobSubmissionEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/SshJobSubmissionEntity.java
index 8070af7..db7beeb 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/SshJobSubmissionEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/SshJobSubmissionEntity.java
@@ -20,6 +20,7 @@
 */
 package org.apache.airavata.registry.core.entities.appcatalog;
 
+import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.model.data.movement.SecurityProtocol;
 
 import javax.persistence.*;
@@ -41,14 +42,14 @@
 	private String jobSubmissionInterfaceId;
 
 	@ManyToOne(cascade= CascadeType.MERGE)
-	@JoinColumn(name = "RESOURCE_JOB_MANAGER_ID")
+	@JoinColumn(name = "RESOURCE_JOB_MANAGER_ID", nullable = false, updatable = false)
 	private ResourceJobManagerEntity resourceJobManager;
 
 	@Column(name="ALTERNATIVE_SSH_HOSTNAME")
 	private String alternativeSshHostname;
 
-	@Column(name="CREATION_TIME")
-	private Timestamp creationTime;
+	@Column(name="CREATION_TIME", nullable = false, updatable = false)
+	private Timestamp creationTime = AiravataUtils.getCurrentTimestamp();
 
 	@Column(name="MONITOR_MODE")
 	private String monitorMode;
@@ -63,9 +64,6 @@
 	@Column(name="UPDATE_TIME")
 	private Timestamp updateTime;
 
-	@Column(name="RESOURCE_JOB_MANAGER_ID")
-	private String resourceJobManagerId;
-
 	public SshJobSubmissionEntity() {
 	}
 
@@ -125,14 +123,6 @@
 		this.updateTime = updateTime;
 	}
 
-	public String getResourceJobManagerId() {
-		return resourceJobManagerId;
-	}
-
-	public void setResourceJobManagerId(String resourceJobManagerId) {
-		this.resourceJobManagerId = resourceJobManagerId;
-	}
-
     public ResourceJobManagerEntity getResourceJobManager() {
         return resourceJobManager;
     }
@@ -140,4 +130,4 @@
     public void setResourceJobManager(ResourceJobManagerEntity resourceJobManager) {
         this.resourceJobManager = resourceJobManager;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentEntity.java
index a71effc..73e9ded 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentEntity.java
@@ -75,7 +75,7 @@
 
     @Lob
     @Column(name = "EMAIL_ADDRESSES")
-    public List<String> emailAddresses;
+    public String emailAddresses;
 
     @OneToOne(targetEntity = UserConfigurationDataEntity.class, cascade = CascadeType.ALL,
             mappedBy = "experiment", fetch = FetchType.EAGER)
@@ -201,11 +201,11 @@
         this.enableEmailNotification = enableEmailNotification;
     }
 
-    public List<String> getEmailAddresses() {
+    public String getEmailAddresses() {
         return emailAddresses;
     }
 
-    public void setEmailAddresses(List<String> emailAddresses) {
+    public void setEmailAddresses(String emailAddresses) {
         this.emailAddresses = emailAddresses;
     }
 
@@ -256,4 +256,4 @@
     public void setProcesses(List<ProcessEntity> processes) {
         this.processes = processes;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputEntity.java
index 33ad224..b934a0d 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentInputEntity.java
@@ -80,6 +80,9 @@
     @Column(name = "IS_READ_ONLY")
     private boolean isReadOnly;
 
+	@Column(name = "OVERRIDE_FILENAME")
+	private String overrideFilename;
+
     @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     private ExperimentEntity experiment;
@@ -204,4 +207,12 @@
     public void setIsReadOnly(boolean isReadOnly) {
         this.isReadOnly = isReadOnly;
     }
-}
\ No newline at end of file
+
+	public String getOverrideFilename() {
+		return overrideFilename;
+	}
+
+	public void setOverrideFilename(String overrideFilename) {
+		this.overrideFilename = overrideFilename;
+	}
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobEntity.java
index 161922f..a8e297b 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobEntity.java
@@ -78,7 +78,7 @@
     private List<JobStatusEntity> jobStatuses;
 
     @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
+    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID", nullable = false, updatable = false)
     private TaskEntity task;
 
     public JobEntity() {
@@ -187,4 +187,4 @@
     public void setTask(TaskEntity task) {
         this.task = task;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusEntity.java
index 53685f7..a91a019 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/JobStatusEntity.java
@@ -59,7 +59,10 @@
     private String reason;
 
     @ManyToOne(targetEntity = JobEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "JOB_ID", referencedColumnName = "JOB_ID")
+    @JoinColumns({ 
+        @JoinColumn(name = "JOB_ID", referencedColumnName = "JOB_ID"),
+        @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
+    })
     private JobEntity job;
 
     public JobStatusEntity() {
@@ -120,4 +123,4 @@
     public void setJob(JobEntity job) {
         this.job = job;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessEntity.java
index b28d3d1..94a2175 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessEntity.java
@@ -73,7 +73,7 @@
 
     @Lob
     @Column(name = "EMAIL_ADDRESSES")
-    private List<String> emailAddresses;
+    private String emailAddresses;
 
     @Column(name = "STORAGE_RESOURCE_ID")
     private String storageResourceId;
@@ -220,11 +220,11 @@
         this.enableEmailNotification = enableEmailNotification;
     }
 
-    public List<String> getEmailAddresses() {
+    public String getEmailAddresses() {
         return emailAddresses;
     }
 
-    public void setEmailAddresses(List<String> emailAddresses) {
+    public void setEmailAddresses(String emailAddresses) {
         this.emailAddresses = emailAddresses;
     }
 
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputEntity.java
index 8c3e7de..ae31c6e 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessInputEntity.java
@@ -80,6 +80,9 @@
     @Column(name = "IS_READ_ONLY")
     private boolean isReadOnly;
 
+	@Column(name = "OVERRIDE_FILENAME")
+	private String overrideFilename;
+
     @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     private ProcessEntity process;
@@ -199,6 +202,14 @@
         isReadOnly = readOnly;
     }
 
+	public String getOverrideFilename() {
+		return overrideFilename;
+	}
+
+	public void setOverrideFilename(String overrideFilename) {
+		this.overrideFilename = overrideFilename;
+	}
+
     public ProcessEntity getProcess() {
         return process;
     }
@@ -206,4 +217,4 @@
     public void setProcess(ProcessEntity process) {
         this.process = process;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/AbstractRepository.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/AbstractRepository.java
index 3c82bef..acbd3fb 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/AbstractRepository.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/AbstractRepository.java
@@ -48,8 +48,16 @@
     }
 
     public T update(T t) {
+        return mergeEntity(mapToEntity(t));
+    }
+
+    protected E mapToEntity(T t) {
         Mapper mapper = ObjectMapperSingleton.getInstance();
-        E entity = mapper.map(t, dbEntityGenericClass);
+        return mapper.map(t, dbEntityGenericClass);
+    }
+
+    protected T mergeEntity(E entity) {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
         E persistedCopy = execute(entityManager -> entityManager.merge(entity));
         return mapper.map(persistedCopy, thriftGenericClass);
     }
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java
index ca2696c..fc86785 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java
@@ -230,7 +230,6 @@
         String resourceJobManagerId = addResourceJobManager(sshJobSubmission.getResourceJobManager());
         Mapper mapper = ObjectMapperSingleton.getInstance();
         SshJobSubmissionEntity sshJobSubmissionEntity = mapper.map(sshJobSubmission, SshJobSubmissionEntity.class);
-        sshJobSubmissionEntity.setResourceJobManagerId(resourceJobManagerId);
         sshJobSubmissionEntity.getResourceJobManager().setResourceJobManagerId(resourceJobManagerId);
         if (sshJobSubmission.getResourceJobManager().getParallelismPrefix() != null) {
             (new ResourceJobManagerRepository()).createParallesimPrefix(sshJobSubmission.getResourceJobManager().getParallelismPrefix(), sshJobSubmissionEntity.getResourceJobManager());
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepository.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepository.java
index 7266b3d..670b40f 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepository.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepository.java
@@ -19,11 +19,14 @@
  */
 package org.apache.airavata.registry.core.repositories.appcatalog;
 
+import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.BatchQueueResourcePolicy;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
 import org.apache.airavata.model.commons.airavata_commonsConstants;
+import org.apache.airavata.registry.core.entities.appcatalog.ComputeResourceReservationEntity;
+import org.apache.airavata.registry.core.entities.appcatalog.GroupComputeResourcePrefEntity;
 import org.apache.airavata.registry.core.entities.appcatalog.GroupComputeResourcePrefPK;
 import org.apache.airavata.registry.core.entities.appcatalog.GroupResourceProfileEntity;
 import org.apache.airavata.registry.core.utils.DBConstants;
@@ -60,6 +63,13 @@
                 if (groupComputeResourcePreference.getGroupSSHAccountProvisionerConfigs() != null) {
                     groupComputeResourcePreference.getGroupSSHAccountProvisionerConfigs().forEach(gssh -> gssh.setGroupResourceProfileId(groupResourceProfileId));
                 }
+                if (groupComputeResourcePreference.getReservations() != null) {
+                    groupComputeResourcePreference.getReservations().forEach(reservation -> {
+                        if (reservation.getReservationId().trim().isEmpty() || reservation.getReservationId().equals(airavata_commonsConstants.DEFAULT_ID)) {
+                            reservation.setReservationId(AiravataUtils.getId(reservation.getReservationName()));
+                        }
+                    });
+                }
             }
         }
         if (groupResourceProfile.getBatchQueueResourcePolicies() != null) {
@@ -84,10 +94,27 @@
 
         updatedGroupResourceProfile.setUpdatedTime(System.currentTimeMillis());
         updateChildren(updatedGroupResourceProfile, updatedGroupResourceProfile.getGroupResourceProfileId());
-        GroupResourceProfile groupResourceProfile = update(updatedGroupResourceProfile);
+        GroupResourceProfileEntity groupResourceProfileEntity = mapToEntity(updatedGroupResourceProfile);
+        updateChildrenEntities(groupResourceProfileEntity);
+        GroupResourceProfile groupResourceProfile = mergeEntity(groupResourceProfileEntity);
         return groupResourceProfile.getGroupResourceProfileId();
     }
 
+    private void updateChildrenEntities(GroupResourceProfileEntity groupResourceProfileEntity) {
+        if (groupResourceProfileEntity.getComputePreferences() != null) {
+            for (GroupComputeResourcePrefEntity groupComputeResourcePrefEntity : groupResourceProfileEntity.getComputePreferences()) {
+                // For some reason next line is needed to get OpenJPA to persist
+                // GroupResourceProfileEntity before GroupComputeResourcePrefEntity
+                groupComputeResourcePrefEntity.setGroupResourceProfile(groupResourceProfileEntity);
+                if (groupComputeResourcePrefEntity.getReservations() != null) {
+                    for (ComputeResourceReservationEntity reservationEntity : groupComputeResourcePrefEntity.getReservations()) {
+                        reservationEntity.setGroupComputeResourcePref(groupComputeResourcePrefEntity);
+                    }
+                }
+            }
+        }
+    }
+
     public GroupResourceProfile getGroupResourceProfile(String groupResourceProfileId) {
         GroupResourceProfile groupResourceProfile = get(groupResourceProfileId);
         return groupResourceProfile;
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserInputRepository.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserInputRepository.java
new file mode 100644
index 0000000..30792d6
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserInputRepository.java
@@ -0,0 +1,25 @@
+package org.apache.airavata.registry.core.repositories.appcatalog;
+
+import org.apache.airavata.model.appcatalog.parser.ParserInput;
+import org.apache.airavata.registry.core.entities.appcatalog.ParserInputEntity;
+import org.apache.airavata.registry.cpi.AppCatalogException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ParserInputRepository extends AppCatAbstractRepository<ParserInput, ParserInputEntity, String> {
+
+    private final static Logger logger = LoggerFactory.getLogger(ParserInputRepository.class);
+
+    public ParserInputRepository() {
+        super(ParserInput.class, ParserInputEntity.class);
+    }
+
+    public ParserInput getParserInput(String inputId) throws AppCatalogException {
+        try {
+            return super.get(inputId);
+        } catch (Exception e) {
+            logger.error("Failed to fetch parser input with id " + inputId, e);
+            throw new AppCatalogException("Failed to fetch parser input with id " + inputId, e);
+        }
+    }
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserOutputRepository.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserOutputRepository.java
new file mode 100644
index 0000000..046de39
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserOutputRepository.java
@@ -0,0 +1,25 @@
+package org.apache.airavata.registry.core.repositories.appcatalog;
+
+import org.apache.airavata.model.appcatalog.parser.ParserOutput;
+import org.apache.airavata.registry.core.entities.appcatalog.ParserOutputEntity;
+import org.apache.airavata.registry.cpi.AppCatalogException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ParserOutputRepository extends AppCatAbstractRepository<ParserOutput, ParserOutputEntity, String> {
+
+    private final static Logger logger = LoggerFactory.getLogger(ParserInputRepository.class);
+
+    public ParserOutputRepository() {
+        super(ParserOutput.class, ParserOutputEntity.class);
+    }
+
+    public ParserOutput getParserOutput(String outputId) throws AppCatalogException {
+        try {
+            return super.get(outputId);
+        } catch (Exception e) {
+            logger.error("Failed to fetch parser output with id " + outputId, e);
+            throw new AppCatalogException("Failed to fetch parser output with id " + outputId, e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
index ca75d62..69c4dc3 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
@@ -293,9 +293,13 @@
         }
 
         if (experimentIds != null) {
-            logger.debug("Filter Experiments by experimentIds");
-            queryParameters.put(DBConstants.Experiment.EXPERIMENT_ID, experimentIds);
-            query += "ES.experimentId IN :" + DBConstants.Experiment.EXPERIMENT_ID + " AND ";
+            if (!experimentIds.isEmpty()) {
+                logger.debug("Filter Experiments by experimentIds");
+                queryParameters.put(DBConstants.Experiment.EXPERIMENT_ID, experimentIds);
+                query += "ES.experimentId IN :" + DBConstants.Experiment.EXPERIMENT_ID + " AND ";
+            } else {
+                return new ArrayList<ExperimentSummaryModel>();
+            }
         }
 
         if (resourceHostName != null) {
@@ -310,7 +314,7 @@
         }
 
         query += "ORDER BY ES.creationTime DESC";
-        List<ExperimentSummaryModel> experimentSummaryModelList = select(query, -1, 0, queryParameters);
+        List<ExperimentSummaryModel> experimentSummaryModelList = select(query, Integer.MAX_VALUE, 0, queryParameters);
         return experimentSummaryModelList;
     }
 
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java
index 6231a6e..6afa340 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java
@@ -74,7 +74,8 @@
     }
 
     public void updateProject(Project project, String projectId) throws RegistryException {
-        saveProjectData(project, projectId);
+        project.setProjectID(projectId);
+        saveProjectData(project, project.getGatewayId());
     }
 
     public Project getProject(String projectId) throws RegistryException {
@@ -199,4 +200,4 @@
         delete(projectId);
     }
 
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/CustomBeanFactory.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/CustomBeanFactory.java
new file mode 100644
index 0000000..153285a
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/CustomBeanFactory.java
@@ -0,0 +1,102 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.registry.core.utils;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.thrift.TBase;
+import org.apache.thrift.TFieldIdEnum;
+import org.apache.thrift.TFieldRequirementType;
+import org.apache.thrift.meta_data.FieldMetaData;
+import org.dozer.BeanFactory;
+import org.dozer.util.MappingUtils;
+import org.dozer.util.ReflectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CustomBeanFactory implements BeanFactory {
+
+    private final static Logger logger = LoggerFactory.getLogger(CustomBeanFactory.class);
+
+    @Override
+    public Object createBean(Object source, Class<?> sourceClass, String targetBeanId) {
+        Object result;
+        Class<?> destClass = MappingUtils.loadClass(targetBeanId);
+        if (logger.isDebugEnabled()) {
+            logger.debug("Creating bean of type " + destClass.getSimpleName());
+        }
+        result = ReflectionUtils.newInstance(destClass);
+        if (result instanceof TBase) {
+
+            callSettersOnThriftFieldsWithDefaults((TBase) result);
+        }
+        return result;
+    }
+
+    /**
+     * Thrift fields with default values aren't serialized and sent over the wire if
+     * their setters were never called. However, Dozer doesn't call the setter on
+     * the field of a target object when the target field's value already matches
+     * the source's field value. This results in the Thrift data model object field
+     * having the default value but it doesn't get serialized with that value (and
+     * for required fields validation fails). The following changes the semantics of
+     * defaulted Thrift fields a bit so that they are always "set" even if the
+     * source object had no such field, but this matches the more general semantics
+     * of what is expected from fields that have default values and it works around
+     * an annoyance with required default fields that would fail validation
+     * otherwise.
+     * 
+     * <p>
+     * See AIRAVATA-3268 and AIRAVATA-3328 for more information.
+     * 
+     * @param <T>
+     * @param <F>
+     * @param instance
+     */
+    private <T extends TBase<T, F>, F extends TFieldIdEnum> void callSettersOnThriftFieldsWithDefaults(
+            TBase<T, F> instance) {
+
+        try {
+            Field metaDataMapField = instance.getClass().getField("metaDataMap");
+            Map<F, FieldMetaData> metaDataMap = (Map<F, FieldMetaData>) metaDataMapField.get(null);
+            for (Entry<F, FieldMetaData> metaDataEntry : metaDataMap.entrySet()) {
+                if (logger.isDebugEnabled()) {
+                    logger.debug("processing field " + metaDataEntry.getValue().fieldName);
+                }
+                Object fieldValue = instance.getFieldValue(metaDataEntry.getKey());
+                if (fieldValue != null) {
+                    if (logger.isDebugEnabled()) {
+                        logger.debug("field " + metaDataEntry.getValue().fieldName + " has a default value ["
+                                + fieldValue + "], calling setter to force the field to be set");
+                    }
+                    instance.setFieldValue(metaDataEntry.getKey(), fieldValue);
+                }
+            }
+        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
+            MappingUtils.throwMappingException(e);
+        }
+    }
+
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/DozerConverter/CsvStringConverter.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/DozerConverter/CsvStringConverter.java
new file mode 100644
index 0000000..fcdda19
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/DozerConverter/CsvStringConverter.java
@@ -0,0 +1,56 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.registry.core.utils.DozerConverter;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.dozer.DozerConverter;
+
+/**
+ * CsvStringConverter
+ */
+public class CsvStringConverter extends DozerConverter<String, List> {
+
+    public CsvStringConverter() {
+        super(String.class, List.class);
+    }
+
+    @Override
+    public List convertTo(String source, List destination) {
+        if (source == null || source.length() == 0) {
+            return null;
+        } else {
+            return Arrays.asList(source.split(","));
+        }
+    }
+
+    @Override
+    public String convertFrom(List source, String destination) {
+        if (source == null || source.isEmpty()) {
+            return null;
+        } else {
+            return String.join(",", source);
+        }
+    }
+
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java
index af62f58..58dd139 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java
@@ -19,18 +19,21 @@
  */
 package org.apache.airavata.registry.core.utils.JPAUtil;
 
-import org.apache.airavata.common.utils.JDBCConfig;
-import org.apache.airavata.common.utils.JPAUtils;
-import org.apache.airavata.registry.core.utils.AppCatalogJDBCConfig;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 
+import org.apache.airavata.common.utils.JDBCConfig;
+import org.apache.airavata.common.utils.JPAUtils;
+import org.apache.airavata.registry.core.utils.AppCatalogJDBCConfig;
+
 public class AppCatalogJPAUtils {
 
-    // TODO: we can rename this back to appcatalog_data once we completely replace the other appcatalog_data persistence context in airavata-registry-core
-    private static final String PERSISTENCE_UNIT_NAME = "appcatalog_data_new";
+    // TODO: we can rename this back to appcatalog_data once we completely replace
+    // the other appcatalog_data persistence context in airavata-registry-core
+    public static final String PERSISTENCE_UNIT_NAME = "appcatalog_data_new";
     private static final JDBCConfig JDBC_CONFIG = new AppCatalogJDBCConfig();
-    private static final EntityManagerFactory factory = JPAUtils.getEntityManagerFactory(PERSISTENCE_UNIT_NAME, JDBC_CONFIG);
+    private static final EntityManagerFactory factory = JPAUtils.getEntityManagerFactory(PERSISTENCE_UNIT_NAME,
+            JDBC_CONFIG);
 
     public static EntityManager getEntityManager() {
         return factory.createEntityManager();
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/ExpCatalogJPAUtils.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/ExpCatalogJPAUtils.java
index 6803bfb..bafc872 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/ExpCatalogJPAUtils.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/ExpCatalogJPAUtils.java
@@ -27,7 +27,7 @@
 import org.apache.airavata.registry.core.utils.ExpCatalogJDBCConfig;
 
 public class ExpCatalogJPAUtils {
-    private static final String PERSISTENCE_UNIT_NAME = "experiment_data_new";
+    public static final String PERSISTENCE_UNIT_NAME = "experiment_data_new";
     private static final JDBCConfig JDBC_CONFIG = new ExpCatalogJDBCConfig();
     private static final EntityManagerFactory factory = JPAUtils.getEntityManagerFactory(PERSISTENCE_UNIT_NAME, JDBC_CONFIG);
 
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/RepCatalogJPAUtils.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/RepCatalogJPAUtils.java
index 4e3b4f0..7b1f9cb 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/RepCatalogJPAUtils.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/RepCatalogJPAUtils.java
@@ -29,7 +29,7 @@
 public class RepCatalogJPAUtils {
 
     // TODO: we can rename this back to replicacatalog_data once we completely replace the other replicacatalog_data persistence context in airavata-registry-core
-    private static final String PERSISTENCE_UNIT_NAME = "replicacatalog_data_new";
+    public static final String PERSISTENCE_UNIT_NAME = "replicacatalog_data_new";
     private static final JDBCConfig JDBC_CONFIG = new ReplicaCatalogJDBCConfig();
     private static final EntityManagerFactory factory = JPAUtils.getEntityManagerFactory(PERSISTENCE_UNIT_NAME, JDBC_CONFIG);
 
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/ObjectMapperSingleton.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/ObjectMapperSingleton.java
index ab5ffe9..16896e3 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/ObjectMapperSingleton.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/ObjectMapperSingleton.java
@@ -82,4 +82,4 @@
             return false;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/migration/MappingToolRunner.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/migration/MappingToolRunner.java
new file mode 100644
index 0000000..97bba99
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/migration/MappingToolRunner.java
@@ -0,0 +1,46 @@
+package org.apache.airavata.registry.core.utils.migration;
+
+import org.apache.airavata.common.utils.JDBCConfig;
+import org.apache.airavata.common.utils.JPAUtils;
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
+import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl;
+import org.apache.openjpa.jdbc.meta.MappingTool;
+import org.apache.openjpa.lib.util.Options;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MappingToolRunner {
+
+    private static Logger logger = LoggerFactory.getLogger(MappingToolRunner.class);
+
+    public static void run(JDBCConfig jdbcConfig, String outputFile, String persistenceUnitName) {
+        run(jdbcConfig, outputFile, persistenceUnitName, MappingTool.ACTION_ADD);
+    }
+
+    // schemaAction is one of MappingTool's supported actions: http://openjpa.apache.org/builds/2.4.3/apache-openjpa/docs/ref_guide_mapping.html#ref_guide_mapping_mappingtool
+    public static void run(JDBCConfig jdbcConfig, String outputFile, String persistenceUnitName, String schemaAction) {
+
+        JDBCConfiguration jdbcConfiguration = new JDBCConfigurationImpl();
+        jdbcConfiguration.fromProperties(JPAUtils.createConnectionProperties(jdbcConfig));
+        jdbcConfiguration.setConnectionDriverName("org.apache.commons.dbcp.BasicDataSource");
+
+        Options options = new Options();
+        options.put("sqlFile", outputFile);
+        // schemaAction "add" brings the schema up to date by adding missing schema elements
+        // schemaAction "build" creates the entire schema as if the database is empty
+        options.put("schemaAction", schemaAction);
+        options.put("foreignKeys", "true");
+        options.put("indexes", "true");
+        options.put("primaryKeys", "true");
+        // Specify persistence-unit name using it's anchor in the persistence.xml file
+        // http://openjpa.apache.org/builds/2.4.3/apache-openjpa/docs/ref_guide_conf_devtools.html
+        options.put("properties", "persistence.xml#" + persistenceUnitName);
+        try {
+            MappingTool.run(jdbcConfiguration, new String[] {}, options, null);
+        } catch (Exception mappingToolEx) {
+            logger.error("Failed to run MappingTool", mappingToolEx);
+            throw new RuntimeException(
+                    "Failed to run MappingTool to generate migration script", mappingToolEx);
+        }
+    }
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/migration/MigrationSchemaGenerator.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/migration/MigrationSchemaGenerator.java
new file mode 100644
index 0000000..be0b524
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/migration/MigrationSchemaGenerator.java
@@ -0,0 +1,100 @@
+package org.apache.airavata.registry.core.utils.migration;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import org.apache.airavata.common.utils.DBInitConfig;
+import org.apache.airavata.common.utils.DBInitializer;
+import org.apache.airavata.common.utils.JDBCConfig;
+import org.apache.airavata.registry.core.utils.AppCatalogDBInitConfig;
+import org.apache.airavata.registry.core.utils.ExpCatalogDBInitConfig;
+import org.apache.airavata.registry.core.utils.ReplicaCatalogDBInitConfig;
+import org.apache.airavata.registry.core.utils.JPAUtil.AppCatalogJPAUtils;
+import org.apache.airavata.registry.core.utils.JPAUtil.ExpCatalogJPAUtils;
+import org.apache.airavata.registry.core.utils.JPAUtil.RepCatalogJPAUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MigrationSchemaGenerator {
+
+    private static final Logger logger = LoggerFactory.getLogger(MigrationSchemaGenerator.class);
+
+    private enum Database {
+        app_catalog(new AppCatalogDBInitConfig().setDbInitScriptPrefix("appcatalog"),
+                AppCatalogJPAUtils.PERSISTENCE_UNIT_NAME),
+        experiment_catalog(new ExpCatalogDBInitConfig().setDbInitScriptPrefix("expcatalog"),
+                ExpCatalogJPAUtils.PERSISTENCE_UNIT_NAME),
+        replica_catalog(new ReplicaCatalogDBInitConfig().setDbInitScriptPrefix("replicacatalog"),
+                RepCatalogJPAUtils.PERSISTENCE_UNIT_NAME);
+
+        private final DBInitConfig dbInitConfig;
+        private final String persistenceUnitName;
+
+        Database(DBInitConfig dbInitConfig, String persistenceUnitName) {
+            this.dbInitConfig = dbInitConfig;
+            this.persistenceUnitName = persistenceUnitName;
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        String schemaAction = args.length > 0 ? args[0] : "add";
+        try {
+            for (Database database : Database.values()) {
+
+                waitForDatabaseServer(database.dbInitConfig.getJDBCConfig(), 30);
+                try {
+                    logger.info("initializing database " + database.name());
+                    DBInitializer.initializeDB(database.dbInitConfig);
+                } catch (Exception e) {
+
+                    logger.error("Failed to initialize database " + database.name(), e);
+                } finally {
+                    String outputFile = "add".equals(schemaAction) ? database.name() + "-migration.sql"
+                            : database.name() + "-schema.sql";
+                    logger.info("creating database script: " + outputFile);
+                    MappingToolRunner.run(database.dbInitConfig.getJDBCConfig(), outputFile,
+                            database.persistenceUnitName, schemaAction);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("Failed to create the databases", e);
+            throw e;
+        }
+    }
+
+    private static void waitForDatabaseServer(JDBCConfig jdbcConfig, int timeoutSeconds) {
+
+        long startTime = System.currentTimeMillis();
+        boolean connected = false;
+        while (!connected) {
+
+            if ((System.currentTimeMillis() - startTime) / 1000 > timeoutSeconds) {
+                throw new RuntimeException(
+                        "Failed to connect to database server after " + timeoutSeconds + " seconds!");
+            }
+            Connection conn = null;
+            try {
+                Class.forName(jdbcConfig.getDriver());
+                conn = DriverManager.getConnection(jdbcConfig.getURL(), jdbcConfig.getUser(), jdbcConfig.getPassword());
+                connected = conn.isValid(10);
+            } catch (Exception e) {
+                logger.debug("Failed to connect to database: " + e.getMessage() + ", waiting 1 second before retrying");
+                try {
+                    Thread.sleep(1000);
+                } catch (InterruptedException e1) {
+                    logger.warn("Thread sleep interrupted, ignoring");
+                }
+            } finally {
+                if (conn != null) {
+                    try {
+                        conn.close();
+                    } catch (SQLException e) {
+                        logger.warn("Failed to close connection, ignoring");
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/modules/registry/registry-core/src/main/resources/META-INF/generate-sql-persistence.xml b/modules/registry/registry-core/src/main/resources/META-INF/generate-sql-persistence.xml
deleted file mode 100644
index 944413d..0000000
--- a/modules/registry/registry-core/src/main/resources/META-INF/generate-sql-persistence.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<!--*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
-* -->
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
-    <!-- openjpa:sql doesn't work well with multiple persistence-unit's in persistence.xml, so
-    use this single persistence-unit persistence.xml to list any classes for which SQL schema
-    generation is desired -->
-    <persistence-unit name="generate-sql">
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.HandlerInputEntity</class>
-        <class>org.apache.airavata.registry.core.entities.airavataworkflowcatalog.HandlerOutputEntity</class>
-    </persistence-unit>
-</persistence>
diff --git a/modules/registry/registry-core/src/main/resources/META-INF/persistence.xml b/modules/registry/registry-core/src/main/resources/META-INF/persistence.xml
index 7ace098..9f6fe1e 100644
--- a/modules/registry/registry-core/src/main/resources/META-INF/persistence.xml
+++ b/modules/registry/registry-core/src/main/resources/META-INF/persistence.xml
@@ -79,6 +79,7 @@
         <class>org.apache.airavata.registry.core.entities.appcatalog.ParsingTemplateInputEntity</class>
         <class>org.apache.airavata.registry.core.entities.appcatalog.ParserConnectorInputEntity</class>
         <class>org.apache.airavata.registry.core.entities.appcatalog.ParserConnectorEntity</class>
+        <class>org.apache.airavata.registry.core.entities.appcatalog.ComputeResourceReservationEntity</class>
         <exclude-unlisted-classes>true</exclude-unlisted-classes>
     </persistence-unit>
     <persistence-unit name="replicacatalog_data_new">
diff --git a/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql b/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
index 4bb49a0..ab1bcab 100644
--- a/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
+++ b/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
@@ -327,6 +327,7 @@
          REQUIRED_TO_COMMANDLINE SMALLINT,
          DATA_STAGED SMALLINT,
          IS_READ_ONLY SMALLINT,
+         OVERRIDE_FILENAME VARCHAR(255),
          PRIMARY KEY(INTERFACE_ID,INPUT_KEY),
          FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
 );
@@ -608,9 +609,6 @@
         RESOURCE_CS_TOKEN VARCHAR(255),
         USAGE_REPORTING_GATEWAY_ID VARCHAR(255),
         QUALITY_OF_SERVICE VARCHAR(255),
-        RESERVATION VARCHAR (255),
-        RESERVATION_START_TIME timestamp,
-        RESERVATION_END_TIME timestamp,
         SSH_ACCOUNT_PROVISIONER VARCHAR(255),
         SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO VARCHAR(1000),
         PRIMARY KEY(RESOURCE_ID,GROUP_RESOURCE_PROFILE_ID),
@@ -618,6 +616,12 @@
         FOREIGN KEY (GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_RESOURCE_PROFILE(GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
 );
 
+CREATE TABLE COMPUTE_RESOURCE_RESERVATION -- ComputeResourceReservationEntity
+    (RESERVATION_ID VARCHAR(255) NOT NULL, END_TIME TIMESTAMP NOT NULL, RESERVATION_NAME VARCHAR(255) NOT NULL, START_TIME TIMESTAMP NOT NULL, RESOURCE_ID VARCHAR(255) NOT NULL, GROUP_RESOURCE_PROFILE_ID VARCHAR(255) NOT NULL, PRIMARY KEY (RESERVATION_ID));
+CREATE TABLE COMPUTE_RESOURCE_RESERVATION_QUEUE (RESERVATION_ID VARCHAR(255), QUEUE_NAME VARCHAR(255) NOT NULL);
+CREATE INDEX I_CMPTN_Q_RESERVATION_ID ON COMPUTE_RESOURCE_RESERVATION_QUEUE (RESERVATION_ID);
+ALTER TABLE COMPUTE_RESOURCE_RESERVATION ADD FOREIGN KEY (RESOURCE_ID, GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_COMPUTE_RESOURCE_PREFERENCE (RESOURCE_ID, GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE;
+
 CREATE TABLE GRP_SSH_ACC_PROV_CONFIG
 (
         RESOURCE_ID VARCHAR(255) NOT NULL,
diff --git a/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql b/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
index b24c433..9ee940b 100644
--- a/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
+++ b/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
@@ -320,6 +320,7 @@
          REQUIRED_TO_COMMANDLINE SMALLINT,
          DATA_STAGED SMALLINT,
          IS_READ_ONLY SMALLINT,
+         OVERRIDE_FILENAME VARCHAR(255),
          PRIMARY KEY(INTERFACE_ID,INPUT_KEY),
          FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
@@ -611,6 +612,14 @@
         FOREIGN KEY (GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_RESOURCE_PROFILE(GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
+CREATE TABLE COMPUTE_RESOURCE_RESERVATION -- ComputeResourceReservationEntity
+    (RESERVATION_ID VARCHAR(255) NOT NULL, END_TIME TIMESTAMP NOT NULL, RESERVATION_NAME VARCHAR(255) NOT NULL, START_TIME TIMESTAMP NOT NULL, RESOURCE_ID VARCHAR(255) NOT NULL, GROUP_RESOURCE_PROFILE_ID VARCHAR(255) NOT NULL, PRIMARY KEY (RESERVATION_ID)
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+CREATE TABLE COMPUTE_RESOURCE_RESERVATION_QUEUE (RESERVATION_ID VARCHAR(255), QUEUE_NAME VARCHAR(255) NOT NULL
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+CREATE INDEX I_CMPTN_Q_RESERVATION_ID ON COMPUTE_RESOURCE_RESERVATION_QUEUE (RESERVATION_ID);
+ALTER TABLE COMPUTE_RESOURCE_RESERVATION ADD CONSTRAINT FK_COMPUTE_RESOURCE_RESERVATION FOREIGN KEY (RESOURCE_ID, GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_COMPUTE_RESOURCE_PREFERENCE (RESOURCE_ID, GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE;
+
 CREATE TABLE GRP_SSH_ACC_PROV_CONFIG
 (
         RESOURCE_ID VARCHAR(255) NOT NULL,
diff --git a/modules/registry/registry-core/src/main/resources/dozer_mapping.xml b/modules/registry/registry-core/src/main/resources/dozer_mapping.xml
index bf7cb33..d9cc624 100644
--- a/modules/registry/registry-core/src/main/resources/dozer_mapping.xml
+++ b/modules/registry/registry-core/src/main/resources/dozer_mapping.xml
@@ -1,8 +1,34 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+
+-->
 <mappings xmlns="http://dozer.sourceforge.net"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://dozer.sourceforge.net
       http://dozer.sourceforge.net/schema/beanmapping.xsd">
+
+    <configuration>
+        <bean-factory>org.apache.airavata.registry.core.utils.CustomBeanFactory</bean-factory>
+    </configuration>
+
     <mapping>
         <class-a>org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription</class-a>
         <class-b>org.apache.airavata.registry.core.entities.appcatalog.StorageInterfaceEntity</class-b>
@@ -23,4 +49,20 @@
             <b>computationalResourceScheduling</b>
         </field>
     </mapping>
-</mappings>
\ No newline at end of file
+    <mapping>
+        <class-a>org.apache.airavata.model.experiment.ExperimentModel</class-a>
+        <class-b>org.apache.airavata.registry.core.entities.expcatalog.ExperimentEntity</class-b>
+        <field custom-converter="org.apache.airavata.registry.core.utils.DozerConverter.CsvStringConverter">
+            <a>emailAddresses</a>
+            <b>emailAddresses</b>
+        </field>
+    </mapping>
+    <mapping>
+        <class-a>org.apache.airavata.model.process.ProcessModel</class-a>
+        <class-b>org.apache.airavata.registry.core.entities.expcatalog.ProcessEntity</class-b>
+        <field custom-converter="org.apache.airavata.registry.core.utils.DozerConverter.CsvStringConverter">
+            <a>emailAddresses</a>
+            <b>emailAddresses</b>
+        </field>
+    </mapping>
+</mappings>
diff --git a/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql b/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql
index 64ab519..85f12f1 100644
--- a/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql
+++ b/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql
@@ -130,6 +130,7 @@
         DATA_STAGED SMALLINT,
         STORAGE_RESOURCE_ID varchar(255),
         IS_READ_ONLY SMALLINT,
+        OVERRIDE_FILENAME VARCHAR(255),
         PRIMARY KEY(EXPERIMENT_ID,INPUT_NAME),
         FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
 );
@@ -257,6 +258,7 @@
         DATA_STAGED SMALLINT,
         STORAGE_RESOURCE_ID varchar(255),
         IS_READ_ONLY SMALLINT,
+        OVERRIDE_FILENAME VARCHAR(255),
         PRIMARY KEY(PROCESS_ID,INPUT_NAME),
         FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
 );
diff --git a/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql b/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql
index 598deeb..b093aa3 100644
--- a/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql
+++ b/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql
@@ -130,6 +130,7 @@
         DATA_STAGED tinyint(1),
         STORAGE_RESOURCE_ID varchar(255),
         IS_READ_ONLY tinyint(1),
+        OVERRIDE_FILENAME VARCHAR(255),
         PRIMARY KEY(EXPERIMENT_ID,INPUT_NAME),
         FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
@@ -259,6 +260,7 @@
         DATA_STAGED tinyint(1),
         STORAGE_RESOURCE_ID varchar(255),
         IS_READ_ONLY tinyint(1),
+        OVERRIDE_FILENAME VARCHAR(255),
         PRIMARY KEY(PROCESS_ID,INPUT_NAME),
         FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
@@ -335,7 +337,7 @@
   CURRENT_RETRY int(11) NOT NULL DEFAULT '0',
   PRIMARY KEY (TASK_ID),
   FOREIGN KEY (PARENT_PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 CREATE TABLE TASK_STATUS (
         STATUS_ID varchar(255),
@@ -416,4 +418,4 @@
   CREATION_TIME timestamp DEFAULT NOW(),
   PRIMARY KEY (PROCESS_ID, WORKFLOW_ID),
   FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
-);
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/modules/registry/registry-core/src/main/resources/migrations-util/derby/airavata-server.properties b/modules/registry/registry-core/src/main/resources/migrations-util/derby/airavata-server.properties
new file mode 100644
index 0000000..006bd2d
--- /dev/null
+++ b/modules/registry/registry-core/src/main/resources/migrations-util/derby/airavata-server.properties
@@ -0,0 +1,72 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+###########################################################################
+#
+#  Properties file for creating database migrations
+#
+###########################################################################
+
+###########################################################################
+#  API Server Registry Configuration
+###########################################################################
+
+#for derby [AiravataJPARegistry]
+registry.jdbc.driver=org.apache.derby.jdbc.ClientDriver
+registry.jdbc.url=jdbc:derby:experiment_catalog;create=true;user=airavata;password=airavata
+registry.jdbc.user=airavata
+registry.jdbc.password=airavata
+validationQuery=SELECT 1 from CONFIGURATION
+
+# Properties for default user mode
+default.registry.user=admin
+default.registry.gateway=php_reference_gateway
+default.registry.oauth.client.id=client_id
+default.registry.oauth.client.secret=client_secret
+
+###########################################################################
+#  Application Catalog DB Configuration
+###########################################################################
+#for derby [AiravataJPARegistry]
+appcatalog.jdbc.driver=org.apache.derby.jdbc.ClientDriver
+appcatalog.jdbc.url=jdbc:derby:app_catalog;create=true;user=airavata;password=airavata
+appcatalog.jdbc.user=airavata
+appcatalog.jdbc.password=airavata
+appcatalog.validationQuery=SELECT 1 from CONFIGURATION
+
+##########################################################################
+#  Replica Catalog DB Configuration
+###########################################################################
+#for derby [AiravataJPARegistry]
+replicacatalog.jdbc.driver=org.apache.derby.jdbc.ClientDriver
+replicacatalog.jdbc.url=jdbc:derby:replica_catalog;create=true;user=airavata;password=airavata
+replicacatalog.jdbc.user=airavata
+replicacatalog.jdbc.password=airavata
+replicacatalog.validationQuery=SELECT 1 from CONFIGURATION
+
+###########################################################################
+#  Workflow Catalog DB Configuration
+###########################################################################
+#for derby [AiravataJPARegistry]
+workflowcatalog.jdbc.driver=org.apache.derby.jdbc.ClientDriver
+workflowcatalog.jdbc.url=jdbc:derby:workflow_catalog;create=true;user=airavata;password=airavata
+workflowcatalog.jdbc.user=airavata
+workflowcatalog.jdbc.password=airavata
+workflowcatalog.validationQuery=SELECT 1 from CONFIGURATION
diff --git a/modules/registry/registry-core/src/main/resources/migrations-util/mysql/airavata-server.properties b/modules/registry/registry-core/src/main/resources/migrations-util/mysql/airavata-server.properties
new file mode 100644
index 0000000..4c84198
--- /dev/null
+++ b/modules/registry/registry-core/src/main/resources/migrations-util/mysql/airavata-server.properties
@@ -0,0 +1,63 @@
+
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+
+###########################################################################
+#
+#  Properties file for creating database migrations
+#
+###########################################################################
+
+###########################################################################
+#  API Server Registry Configuration
+###########################################################################
+
+#for derby [AiravataJPARegistry]
+registry.jdbc.driver=org.mariadb.jdbc.Driver
+registry.jdbc.url=jdbc:mariadb://localhost:13306/experiment_catalog
+registry.jdbc.user=airavata
+registry.jdbc.password=123456
+validationQuery=SELECT 1 from CONFIGURATION
+
+# Properties for default user mode
+default.registry.user=admin
+default.registry.gateway=php_reference_gateway
+default.registry.oauth.client.id=client_id
+default.registry.oauth.client.secret=client_secret
+
+###########################################################################
+#  Application Catalog DB Configuration
+###########################################################################
+#for derby [AiravataJPARegistry]
+appcatalog.jdbc.driver=org.mariadb.jdbc.Driver
+appcatalog.jdbc.url=jdbc:mariadb://localhost:13306/app_catalog
+appcatalog.jdbc.user=airavata
+appcatalog.jdbc.password=123456
+appcatalog.validationQuery=SELECT 1 from CONFIGURATION
+
+##########################################################################
+#  Replica Catalog DB Configuration
+###########################################################################
+#for derby [AiravataJPARegistry]
+replicacatalog.jdbc.driver=org.mariadb.jdbc.Driver
+replicacatalog.jdbc.url=jdbc:mariadb://localhost:13306/replica_catalog
+replicacatalog.jdbc.user=airavata
+replicacatalog.jdbc.password=123456
+replicacatalog.validationQuery=SELECT 1 from CONFIGURATION
diff --git a/modules/registry/registry-core/src/main/resources/migrations-util/mysql/docker-compose.yml b/modules/registry/registry-core/src/main/resources/migrations-util/mysql/docker-compose.yml
new file mode 100644
index 0000000..c1478ed
--- /dev/null
+++ b/modules/registry/registry-core/src/main/resources/migrations-util/mysql/docker-compose.yml
@@ -0,0 +1,15 @@
+version: '3'
+services:
+  db:
+    image: mariadb:10.4.13
+    environment:
+      - MYSQL_ROOT_PASSWORD=123456
+      - MYSQL_USER=airavata
+      - MYSQL_PASSWORD=123456
+    volumes:
+      - ./docker-entrypoint-initdb.d/:/docker-entrypoint-initdb.d
+    ports:
+        - "13306:3306"
+    command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--sql_mode=']
+# Connect to database with:
+# $ docker run --network mysql_default -it --rm mariadb:10 mysql -h mysql_db_1 -u airavata -p123456
diff --git a/modules/registry/registry-core/src/main/resources/migrations-util/mysql/docker-entrypoint-initdb.d/create_databases.sql b/modules/registry/registry-core/src/main/resources/migrations-util/mysql/docker-entrypoint-initdb.d/create_databases.sql
new file mode 100644
index 0000000..9b9a9bd
--- /dev/null
+++ b/modules/registry/registry-core/src/main/resources/migrations-util/mysql/docker-entrypoint-initdb.d/create_databases.sql
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+create database app_catalog;
+grant all privileges on app_catalog.* to 'airavata'@'%' with grant option;
+create database experiment_catalog;
+grant all privileges on experiment_catalog.* to 'airavata'@'%' with grant option;
+create database replica_catalog;
+grant all privileges on replica_catalog.* to 'airavata'@'%' with grant option;
diff --git a/modules/registry/registry-core/src/main/resources/replicacatalog-derby.sql b/modules/registry/registry-core/src/main/resources/replicacatalog-derby.sql
index eb287c7..d215179 100644
--- a/modules/registry/registry-core/src/main/resources/replicacatalog-derby.sql
+++ b/modules/registry/registry-core/src/main/resources/replicacatalog-derby.sql
@@ -46,7 +46,7 @@
         REPLICA_NAME VARCHAR (255),
         REPLICA_DESCRIPTION VARCHAR (255),
         STORAGE_RESOURCE_ID VARCHAR (255),
-        FILE_PATH VARCHAR (4096),
+        FILE_PATH VARCHAR (1024),
         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
         LAST_MODIFIED_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
         VALID_UNTIL_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
diff --git a/modules/registry/registry-core/src/main/resources/replicacatalog-mysql.sql b/modules/registry/registry-core/src/main/resources/replicacatalog-mysql.sql
index a123e65..c389070 100644
--- a/modules/registry/registry-core/src/main/resources/replicacatalog-mysql.sql
+++ b/modules/registry/registry-core/src/main/resources/replicacatalog-mysql.sql
@@ -42,7 +42,7 @@
         REPLICA_NAME VARCHAR (255),
         REPLICA_DESCRIPTION VARCHAR (255),
         STORAGE_RESOURCE_ID VARCHAR (255),
-        FILE_PATH VARCHAR (255),
+        FILE_PATH VARCHAR (1024),
         CREATION_TIME TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
         LAST_MODIFIED_TIME TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
         VALID_UNTIL_TIME TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/GatewayProfileRepositoryTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/GatewayProfileRepositoryTest.java
index bbf70e0..a28cb4e 100644
--- a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/GatewayProfileRepositoryTest.java
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/GatewayProfileRepositoryTest.java
@@ -38,6 +38,7 @@
 import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 public class GatewayProfileRepositoryTest extends TestBase {
@@ -55,7 +56,8 @@
     public void gatewayProfileRepositorytest() throws AppCatalogException, ApplicationSettingsException {
 
         // Verify that the default Gateway Resource Profile exists already
-        List<GatewayResourceProfile> defaultGatewayResourceProfileList = this.gwyResourceProfileRepository.getAllGatewayProfiles();
+        List<GatewayResourceProfile> defaultGatewayResourceProfileList = this.gwyResourceProfileRepository
+                .getAllGatewayProfiles();
         assertEquals(1, defaultGatewayResourceProfileList.size());
         assertEquals(ServerSettings.getDefaultUserGateway(), defaultGatewayResourceProfileList.get(0).getGatewayID());
 
@@ -80,13 +82,13 @@
         preference1.setScratchLocation("/tmp");
         preference1.setAllocationProjectNumber("project1");
 
-        Map<String,String> sshConfig = new HashMap<>();
+        Map<String, String> sshConfig = new HashMap<>();
         sshConfig.put("ANYTEST", "check");
         preference1.setSshAccountProvisionerConfig(sshConfig);
 
         ComputeResourcePreference preference2 = new ComputeResourcePreference();
         preference2.setComputeResourceId(hostId2);
-        preference2.setOverridebyAiravata(true);
+        preference2.setOverridebyAiravata(false);
         preference2.setPreferredJobSubmissionProtocol(JobSubmissionProtocol.LOCAL);
         preference2.setPreferredDataMovementProtocol(DataMovementProtocol.GridFTP);
         preference2.setPreferredBatchQueue("queue2");
@@ -111,7 +113,7 @@
 
         String gwId = gwyResourceProfileRepository.addGatewayResourceProfile(gf);
         GatewayResourceProfile retrievedProfile = null;
-        if (gwyResourceProfileRepository.isExists(gwId)){
+        if (gwyResourceProfileRepository.isExists(gwId)) {
             retrievedProfile = gwyResourceProfileRepository.getGatewayProfile(gwId);
             System.out.println("************ gateway id ************** :" + retrievedProfile.getGatewayID());
             assertTrue("Retrieved gateway id matched", retrievedProfile.getGatewayID().equals("testGateway"));
@@ -124,11 +126,16 @@
         List<GatewayResourceProfile> getGatewayResourceList = gwyResourceProfileRepository.getAllGatewayProfiles();
         assertEquals("should be 3 gateway profiles (1 default and 2 just added)", 3, getGatewayResourceList.size());
 
-        List<ComputeResourcePreference> preferences = gwyResourceProfileRepository.getAllComputeResourcePreferences(gwId);
+        List<ComputeResourcePreference> preferences = gwyResourceProfileRepository
+                .getAllComputeResourcePreferences(gwId);
         System.out.println("compute preferences size : " + preferences.size());
         assertTrue(preferences.size() == 2);
-        if (preferences != null && !preferences.isEmpty()){
-            for (ComputeResourcePreference cm : preferences){
+        if (preferences != null && !preferences.isEmpty()) {
+            ComputeResourcePreference pref1 = preferences.stream().filter(p -> p.getComputeResourceId().equals(hostId1)).findFirst().get();
+            assertTrue(pref1.isOverridebyAiravata());
+            ComputeResourcePreference pref2 = preferences.stream().filter(p -> p.getComputeResourceId().equals(hostId2)).findFirst().get();
+            assertFalse(pref2.isOverridebyAiravata());
+            for (ComputeResourcePreference cm : preferences) {
                 System.out.println("******** host id ********* : " + cm.getComputeResourceId());
                 System.out.println(cm.getPreferredBatchQueue());
                 System.out.println(cm.getPreferredDataMovementProtocol());
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepositoryTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepositoryTest.java
index 6c0be31..f10575f 100644
--- a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepositoryTest.java
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepositoryTest.java
@@ -19,6 +19,7 @@
  */
 package org.apache.airavata.registry.core.repositories.appcatalog;
 
+import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.model.appcatalog.computeresource.BatchQueue;
 import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.*;
@@ -30,7 +31,9 @@
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
@@ -45,6 +48,11 @@
     private GroupResourceProfileRepository groupResourceProfileRepository;
     private String gatewayId = "TEST_GATEWAY";
     private String groupResourceProfileId = null;
+    private String resourceId1 = null;
+    private String resourceId2 = null;
+
+    private final String QUEUE1_NAME = "queue1";
+    private final String QUEUE2_NAME = "queue2";
 
     public GroupResourceProfileRepositoryTest() {
         super(Database.APP_CATALOG);
@@ -52,8 +60,10 @@
         groupResourceProfileRepository = new GroupResourceProfileRepository();
     }
 
-    @Test
-    public void GroupResourceProfileRepositoryTest() throws AppCatalogException {
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
         ComputeResourceDescription description = new ComputeResourceDescription();
 
         description.setHostName("localhost");
@@ -64,14 +74,14 @@
         description.setIpAddresses(ipdaresses);
 
         BatchQueue batchQueue1 = new BatchQueue();
-        batchQueue1.setQueueName("queue1");
+        batchQueue1.setQueueName(QUEUE1_NAME);
         batchQueue1.setQueueDescription("que1Desc1");
         batchQueue1.setMaxRunTime(10);
         batchQueue1.setMaxNodes(4);
         batchQueue1.setMaxJobsInQueue(1);
 
         BatchQueue batchQueue2 = new BatchQueue();
-        batchQueue2.setQueueName("queue2");
+        batchQueue2.setQueueName(QUEUE2_NAME);
         batchQueue2.setQueueDescription("que1Desc2");
         batchQueue2.setMaxRunTime(10);
         batchQueue2.setMaxNodes(4);
@@ -82,7 +92,7 @@
         batchQueueList.add(batchQueue2);
         description.setBatchQueues(batchQueueList);
 
-        String resourceId1 = computeResourceRepository.addComputeResource(description);
+        this.resourceId1 = computeResourceRepository.addComputeResource(description);
 
         ComputeResourceDescription cm2 = new ComputeResourceDescription();
         cm2.setHostName("localhost2");
@@ -107,9 +117,11 @@
         cmbatchQueueList.add(cm_batchQueue2);
         cm2.setBatchQueues(cmbatchQueueList);
 
-        String resourceId2 = computeResourceRepository.addComputeResource(cm2);
+        this.resourceId2 = computeResourceRepository.addComputeResource(cm2);
+    }
 
-        ComputeResourceDescription computeResourceDescription = computeResourceRepository.getComputeResource(resourceId2);
+    @Test
+    public void GroupResourceProfileRepositoryTest() throws AppCatalogException {
 
         GroupResourceProfile groupResourceProfile = new GroupResourceProfile();
         groupResourceProfile.setGatewayId(gatewayId);
@@ -121,9 +133,24 @@
         groupAccountSSHProvisionerConfig.setConfigName("configName");
         groupAccountSSHProvisionerConfig.setConfigValue("configvalue");
 
+        ComputeResourceReservation reservation1 = new ComputeResourceReservation();
+        reservation1.setReservationName("test-reservation1");
+        reservation1.setStartTime(AiravataUtils.getCurrentTimestamp().getTime());
+        reservation1.setEndTime(AiravataUtils.getCurrentTimestamp().getTime() + 100000);
+        reservation1.addToQueueNames(QUEUE1_NAME);
+        reservation1.addToQueueNames(QUEUE2_NAME);
+
+        ComputeResourceReservation reservation2 = new ComputeResourceReservation();
+        reservation2.setReservationName("test-reservation2");
+        reservation2.setStartTime(AiravataUtils.getCurrentTimestamp().getTime() + 200000);
+        reservation2.setEndTime(AiravataUtils.getCurrentTimestamp().getTime() + 300000);
+        reservation2.addToQueueNames(QUEUE1_NAME);
+
         GroupComputeResourcePreference groupComputeResourcePreference1 = new GroupComputeResourcePreference();
         groupComputeResourcePreference1.setComputeResourceId(resourceId1);
         groupComputeResourcePreference1.addToGroupSSHAccountProvisionerConfigs(groupAccountSSHProvisionerConfig);
+        groupComputeResourcePreference1.addToReservations(reservation1);
+        groupComputeResourcePreference1.addToReservations(reservation2);
 
         GroupComputeResourcePreference groupComputeResourcePreference2 = new GroupComputeResourcePreference();
         groupComputeResourcePreference2.setComputeResourceId(resourceId2);
@@ -196,6 +223,12 @@
 
         assertTrue(groupResourceProfileRepository.getGroupComputeResourcePreference(resourceId1,groupResourceProfileId) != null);
         assertTrue(groupResourceProfileRepository.getGroupComputeResourcePreference(resourceId1,groupResourceProfileId).getGroupSSHAccountProvisionerConfigs().size() == 1);
+        // verify reservation1
+        assertEquals(2, groupResourceProfileRepository.getGroupComputeResourcePreference(resourceId1,groupResourceProfileId).getReservations().size());
+        ComputeResourceReservation retrievedReservation1 = groupResourceProfileRepository.getGroupComputeResourcePreference(resourceId1, groupResourceProfileId).getReservations().get(0);
+        assertEquals(reservation1.getReservationName(), retrievedReservation1.getReservationName());
+        assertEquals(reservation1.getStartTime(), retrievedReservation1.getStartTime());
+        assertEquals(reservation1.getEndTime(), retrievedReservation1.getEndTime());
 
         ComputeResourcePolicy getComputeResourcePolicy = groupResourceProfileRepository.getComputeResourcePolicy(computeResourcePolicyId1);
         assertTrue(getComputeResourcePolicy.getAllowedBatchQueues().get(0).equals("queue1"));
@@ -246,8 +279,6 @@
         assertEquals(1, retrievedGroupResourceProfile4.getComputePreferencesSize());
 
         groupResourceProfileRepository.removeGroupResourceProfile(groupResourceProfileId);
-        computeResourceRepository.removeComputeResource(resourceId1);
-        computeResourceRepository.removeComputeResource(resourceId2);
 
     }
 
@@ -269,4 +300,212 @@
         long creationTimeAfterUpdate = groupResourceProfileRepository.getGroupResourceProfile(groupResourceProfileId).getCreationTime();
         Assert.assertEquals("creationTime should be the same after update", creationTime, creationTimeAfterUpdate);
     }
+
+    @Test
+    public void testRemovingReservation() throws AppCatalogException {
+
+        GroupResourceProfile groupResourceProfile = new GroupResourceProfile();
+        groupResourceProfile.setGatewayId(gatewayId);
+        groupResourceProfile.setGroupResourceProfileName("TEST_GROUP_PROFILE_NAME");
+
+        ComputeResourceReservation reservation1 = new ComputeResourceReservation();
+        reservation1.setReservationName("test-reservation1");
+        reservation1.setStartTime(AiravataUtils.getCurrentTimestamp().getTime());
+        reservation1.setEndTime(AiravataUtils.getCurrentTimestamp().getTime() + 100000);
+        reservation1.addToQueueNames(QUEUE1_NAME);
+        reservation1.addToQueueNames(QUEUE2_NAME);
+
+        ComputeResourceReservation reservation2 = new ComputeResourceReservation();
+        reservation2.setReservationName("test-reservation2");
+        reservation2.setStartTime(AiravataUtils.getCurrentTimestamp().getTime() + 200000);
+        reservation2.setEndTime(AiravataUtils.getCurrentTimestamp().getTime() + 300000);
+        reservation2.addToQueueNames(QUEUE1_NAME);
+
+        GroupComputeResourcePreference groupComputeResourcePreference1 = new GroupComputeResourcePreference();
+        groupComputeResourcePreference1.setComputeResourceId(resourceId1);
+        groupComputeResourcePreference1.addToReservations(reservation1);
+        groupComputeResourcePreference1.addToReservations(reservation2);
+
+        groupResourceProfile.addToComputePreferences(groupComputeResourcePreference1);
+
+        String groupResourceProfileId = groupResourceProfileRepository.addGroupResourceProfile(groupResourceProfile);
+
+        // Remove one of the reservations
+        {
+            GroupResourceProfile retrievedGroupResourceProfile = groupResourceProfileRepository
+                    .getGroupResourceProfile(groupResourceProfileId);
+            List<ComputeResourceReservation> retrievedReservations = retrievedGroupResourceProfile
+                    .getComputePreferences().get(0).getReservations();
+            assertEquals(2, retrievedReservations.size());
+            retrievedReservations.remove(1);
+
+            groupResourceProfileRepository.updateGroupResourceProfile(retrievedGroupResourceProfile);
+        }
+
+        {
+            GroupResourceProfile retrievedGroupResourceProfile = groupResourceProfileRepository
+                    .getGroupResourceProfile(groupResourceProfileId);
+            List<ComputeResourceReservation> retrievedReservations = retrievedGroupResourceProfile
+                    .getComputePreferences().get(0).getReservations();
+            assertEquals(1, retrievedReservations.size());
+            assertEquals(reservation1.getReservationName(), retrievedReservations.get(0).getReservationName());
+        }
+
+    }
+
+    @Test
+    public void testUpdatingReservation() throws AppCatalogException {
+
+        GroupResourceProfile groupResourceProfile = new GroupResourceProfile();
+        groupResourceProfile.setGatewayId(gatewayId);
+        groupResourceProfile.setGroupResourceProfileName("TEST_GROUP_PROFILE_NAME");
+
+        ComputeResourceReservation reservation1 = new ComputeResourceReservation();
+        reservation1.setReservationName("test-reservation1");
+        reservation1.setStartTime(AiravataUtils.getCurrentTimestamp().getTime());
+        reservation1.setEndTime(AiravataUtils.getCurrentTimestamp().getTime() + 100000);
+        reservation1.addToQueueNames(QUEUE1_NAME);
+        reservation1.addToQueueNames(QUEUE2_NAME);
+
+        ComputeResourceReservation reservation2 = new ComputeResourceReservation();
+        reservation2.setReservationName("test-reservation2");
+        reservation2.setStartTime(AiravataUtils.getCurrentTimestamp().getTime() + 200000);
+        reservation2.setEndTime(AiravataUtils.getCurrentTimestamp().getTime() + 300000);
+        reservation2.addToQueueNames(QUEUE1_NAME);
+
+        GroupComputeResourcePreference groupComputeResourcePreference1 = new GroupComputeResourcePreference();
+        groupComputeResourcePreference1.setComputeResourceId(resourceId1);
+        groupComputeResourcePreference1.addToReservations(reservation1);
+        groupComputeResourcePreference1.addToReservations(reservation2);
+
+        groupResourceProfile.addToComputePreferences(groupComputeResourcePreference1);
+
+        String groupResourceProfileId = groupResourceProfileRepository.addGroupResourceProfile(groupResourceProfile);
+
+        // Update one of the reservations
+        long newStartTime = AiravataUtils.getCurrentTimestamp().getTime() + 1000*1000;
+        long newEndTime = AiravataUtils.getCurrentTimestamp().getTime() + 2*1000*1000;
+        {
+            GroupResourceProfile retrievedGroupResourceProfile = groupResourceProfileRepository
+                    .getGroupResourceProfile(groupResourceProfileId);
+            List<ComputeResourceReservation> retrievedReservations = retrievedGroupResourceProfile
+                    .getComputePreferences().get(0).getReservations();
+            assertEquals(2, retrievedReservations.size());
+            // push into future, should sort second on next retrieval
+            retrievedReservations.get(0).setStartTime(newStartTime);
+            retrievedReservations.get(0).setEndTime(newEndTime);
+
+            groupResourceProfileRepository.updateGroupResourceProfile(retrievedGroupResourceProfile);
+        }
+
+        {
+            GroupResourceProfile retrievedGroupResourceProfile = groupResourceProfileRepository
+                    .getGroupResourceProfile(groupResourceProfileId);
+            List<ComputeResourceReservation> retrievedReservations = retrievedGroupResourceProfile
+                    .getComputePreferences().get(0).getReservations();
+            assertEquals(2, retrievedReservations.size());
+            // first reservation should now sort second
+            ComputeResourceReservation reservation = retrievedReservations.get(1);
+            assertEquals(reservation1.getReservationName(), reservation.getReservationName());
+            assertEquals(newStartTime, reservation.getStartTime());
+            assertEquals(newEndTime, reservation.getEndTime());
+        }
+
+    }
+
+    @Test
+    public void testAddingQueueToReservation() throws AppCatalogException {
+
+        GroupResourceProfile groupResourceProfile = new GroupResourceProfile();
+        groupResourceProfile.setGatewayId(gatewayId);
+        groupResourceProfile.setGroupResourceProfileName("TEST_GROUP_PROFILE_NAME");
+
+        ComputeResourceReservation reservation1 = new ComputeResourceReservation();
+        reservation1.setReservationName("test-reservation1");
+        reservation1.setStartTime(AiravataUtils.getCurrentTimestamp().getTime());
+        reservation1.setEndTime(AiravataUtils.getCurrentTimestamp().getTime() + 100000);
+        reservation1.addToQueueNames(QUEUE1_NAME);
+
+        GroupComputeResourcePreference groupComputeResourcePreference1 = new GroupComputeResourcePreference();
+        groupComputeResourcePreference1.setComputeResourceId(resourceId1);
+        groupComputeResourcePreference1.addToReservations(reservation1);
+
+        groupResourceProfile.addToComputePreferences(groupComputeResourcePreference1);
+
+        String groupResourceProfileId = groupResourceProfileRepository.addGroupResourceProfile(groupResourceProfile);
+
+        // add queue to the reservation
+        {
+            GroupResourceProfile retrievedGroupResourceProfile = groupResourceProfileRepository
+                    .getGroupResourceProfile(groupResourceProfileId);
+            List<ComputeResourceReservation> retrievedReservations = retrievedGroupResourceProfile
+                    .getComputePreferences().get(0).getReservations();
+            assertEquals(1, retrievedReservations.size());
+            ComputeResourceReservation reservation = retrievedReservations.get(0);
+            assertEquals(1, reservation.getQueueNamesSize());
+            reservation.addToQueueNames(QUEUE2_NAME);
+
+            groupResourceProfileRepository.updateGroupResourceProfile(retrievedGroupResourceProfile);
+        }
+
+        {
+            GroupResourceProfile retrievedGroupResourceProfile = groupResourceProfileRepository
+                    .getGroupResourceProfile(groupResourceProfileId);
+            List<ComputeResourceReservation> retrievedReservations = retrievedGroupResourceProfile
+                    .getComputePreferences().get(0).getReservations();
+            assertEquals(1, retrievedReservations.size());
+            ComputeResourceReservation reservation = retrievedReservations.get(0);
+            assertEquals(new HashSet<>(Arrays.asList(QUEUE1_NAME, QUEUE2_NAME)), new HashSet<>(reservation.getQueueNames()));
+        }
+
+    }
+
+    @Test
+    public void testRemovingQueueFromReservation() throws AppCatalogException {
+
+        GroupResourceProfile groupResourceProfile = new GroupResourceProfile();
+        groupResourceProfile.setGatewayId(gatewayId);
+        groupResourceProfile.setGroupResourceProfileName("TEST_GROUP_PROFILE_NAME");
+
+        ComputeResourceReservation reservation1 = new ComputeResourceReservation();
+        reservation1.setReservationName("test-reservation1");
+        reservation1.setStartTime(AiravataUtils.getCurrentTimestamp().getTime());
+        reservation1.setEndTime(AiravataUtils.getCurrentTimestamp().getTime() + 100000);
+        reservation1.addToQueueNames(QUEUE1_NAME);
+        reservation1.addToQueueNames(QUEUE2_NAME);
+
+        GroupComputeResourcePreference groupComputeResourcePreference1 = new GroupComputeResourcePreference();
+        groupComputeResourcePreference1.setComputeResourceId(resourceId1);
+        groupComputeResourcePreference1.addToReservations(reservation1);
+
+        groupResourceProfile.addToComputePreferences(groupComputeResourcePreference1);
+
+        String groupResourceProfileId = groupResourceProfileRepository.addGroupResourceProfile(groupResourceProfile);
+
+        // add queue to the reservation
+        {
+            GroupResourceProfile retrievedGroupResourceProfile = groupResourceProfileRepository
+                    .getGroupResourceProfile(groupResourceProfileId);
+            List<ComputeResourceReservation> retrievedReservations = retrievedGroupResourceProfile
+                    .getComputePreferences().get(0).getReservations();
+            assertEquals(1, retrievedReservations.size());
+            ComputeResourceReservation reservation = retrievedReservations.get(0);
+            assertEquals(new HashSet<>(Arrays.asList(QUEUE1_NAME, QUEUE2_NAME)), new HashSet<>(reservation.getQueueNames()));
+            reservation.unsetQueueNames();
+            reservation.addToQueueNames(QUEUE1_NAME);
+
+            groupResourceProfileRepository.updateGroupResourceProfile(retrievedGroupResourceProfile);
+        }
+
+        {
+            GroupResourceProfile retrievedGroupResourceProfile = groupResourceProfileRepository
+                    .getGroupResourceProfile(groupResourceProfileId);
+            List<ComputeResourceReservation> retrievedReservations = retrievedGroupResourceProfile
+                    .getComputePreferences().get(0).getReservations();
+            assertEquals(1, retrievedReservations.size());
+            ComputeResourceReservation reservation = retrievedReservations.get(0);
+            assertEquals(new HashSet<>(Arrays.asList(QUEUE1_NAME)), new HashSet<>(reservation.getQueueNames()));
+        }
+
+    }
 }
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepositoryTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepositoryTest.java
index 210ff9d..a5107b1 100644
--- a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepositoryTest.java
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepositoryTest.java
@@ -45,6 +45,10 @@
     ProjectRepository projectRepository;
     ExperimentRepository experimentRepository;
 
+    private String gatewayId;
+
+    private String projectId;
+
     public ExperimentRepositoryTest() {
         super(Database.EXP_CATALOG);
         gatewayRepository = new GatewayRepository();
@@ -52,20 +56,26 @@
         experimentRepository = new ExperimentRepository();
     }
 
-    @Test
-    public void ExperimentRepositoryTest() throws RegistryException {
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
         Gateway gateway = new Gateway();
         gateway.setGatewayId("gateway");
         gateway.setDomain("SEAGRID");
         gateway.setEmailAddress("abc@d.com");
-        String gatewayId = gatewayRepository.addGateway(gateway);
+        gatewayId = gatewayRepository.addGateway(gateway);
 
         Project project = new Project();
         project.setName("projectName");
         project.setOwner("user");
         project.setGatewayId(gatewayId);
 
-        String projectId = projectRepository.addProject(project, gatewayId);
+        projectId = projectRepository.addProject(project, gatewayId);
+    }
+
+    @Test
+    public void ExperimentRepositoryTest() throws RegistryException {
 
         ExperimentModel experimentModel = new ExperimentModel();
         experimentModel.setProjectId(projectId);
@@ -77,8 +87,11 @@
 
         String experimentId = experimentRepository.addExperiment(experimentModel);
         assertTrue(experimentId != null);
+        assertEquals(0, experimentRepository.getExperiment(experimentId).getEmailAddressesSize());
 
         experimentModel.setDescription("description");
+        experimentModel.addToEmailAddresses("notify@example.com");
+        experimentModel.addToEmailAddresses("notify2@example.com");
         experimentRepository.updateExperiment(experimentModel, experimentId);
 
         ExperimentModel retrievedExperimentModel = experimentRepository.getExperiment(experimentId);
@@ -87,6 +100,9 @@
         assertEquals("gateway-instance-id", retrievedExperimentModel.getGatewayInstanceId());
         assertEquals(1, retrievedExperimentModel.getExperimentStatusSize());
         assertEquals(ExperimentState.CREATED, retrievedExperimentModel.getExperimentStatus().get(0).getState());
+        assertEquals(2, retrievedExperimentModel.getEmailAddressesSize());
+        assertEquals("notify@example.com", retrievedExperimentModel.getEmailAddresses().get(0));
+        assertEquals("notify2@example.com", retrievedExperimentModel.getEmailAddresses().get(1));
 
         UserConfigurationDataModel userConfigurationDataModel = new UserConfigurationDataModel();
         userConfigurationDataModel.setAiravataAutoSchedule(true);
@@ -127,27 +143,11 @@
 
         experimentRepository.removeExperiment(experimentId);
         assertFalse(experimentRepository.isExperimentExist(experimentId));
-
-        gatewayRepository.removeGateway(gatewayId);
-        projectRepository.removeProject(projectId);
     }
 
     @Test
     public void testExperimentInputs() throws RegistryException {
 
-        Gateway gateway = new Gateway();
-        gateway.setGatewayId("gateway");
-        gateway.setDomain("SEAGRID");
-        gateway.setEmailAddress("abc@d.com");
-        String gatewayId = gatewayRepository.addGateway(gateway);
-
-        Project project = new Project();
-        project.setName("projectName");
-        project.setOwner("user");
-        project.setGatewayId(gatewayId);
-
-        String projectId = projectRepository.addProject(project, gatewayId);
-
         ExperimentModel experimentModel = new ExperimentModel();
         experimentModel.setProjectId(projectId);
         experimentModel.setGatewayId(gatewayId);
@@ -170,6 +170,7 @@
         input1.setStorageResourceId("storageResourceId");
         input1.setUserFriendlyDescription("First argument");
         input1.setValue("value1");
+        input1.setOverrideFilename("gaussian.com");
         experimentModel.addToExperimentInputs(input1);
 
         String experimentId = experimentRepository.addExperiment(experimentModel);
@@ -191,6 +192,7 @@
         assertEquals("storageResourceId", retrievedInput1.getStorageResourceId());
         assertEquals("First argument", retrievedInput1.getUserFriendlyDescription());
         assertEquals("value1", retrievedInput1.getValue());
+        assertEquals("gaussian.com", retrievedInput1.getOverrideFilename());
 
         // Update values of the input
         retrievedInput1.setIsRequired(false);
@@ -205,6 +207,7 @@
         retrievedInput1.setStorageResourceId("storageResourceId2");
         retrievedInput1.setUserFriendlyDescription("First argument~");
         retrievedInput1.setValue("value1a");
+        retrievedInput1.setOverrideFilename("gaussian.com-updated");
 
         experimentRepository.updateExperiment(retrievedExperimentModel, experimentId);
 
@@ -223,12 +226,38 @@
         assertEquals("storageResourceId2", retrievedInput1.getStorageResourceId());
         assertEquals("First argument~", retrievedInput1.getUserFriendlyDescription());
         assertEquals("value1a", retrievedInput1.getValue());
+        assertEquals("gaussian.com-updated", retrievedInput1.getOverrideFilename());
 
         experimentRepository.removeExperiment(experimentId);
         assertFalse(experimentRepository.isExperimentExist(experimentId));
-
-        gatewayRepository.removeGateway(gatewayId);
-        projectRepository.removeProject(projectId);
     }
 
+    /**
+     * Verify that slashes (forward and backward) are replaced with underscores.
+     */
+    @Test
+    public void testSlashesInExperimentName() throws RegistryException {
+
+        // Forward slashes
+        ExperimentModel experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name/forward-slash//a");
+
+        String experimentId = experimentRepository.addExperiment(experimentModel);
+        assertTrue(experimentId.startsWith("name_forward-slash__a"));
+
+        // Backward slashes
+        experimentModel = new ExperimentModel();
+        experimentModel.setProjectId(projectId);
+        experimentModel.setGatewayId(gatewayId);
+        experimentModel.setExperimentType(ExperimentType.SINGLE_APPLICATION);
+        experimentModel.setUserName("user");
+        experimentModel.setExperimentName("name\\backward-slash\\\\a");
+
+        experimentId = experimentRepository.addExperiment(experimentModel);
+        assertTrue(experimentId.startsWith("name_backward-slash__a"));
+    }
 }
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepositoryTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepositoryTest.java
index f0d7ec3..941102c 100644
--- a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepositoryTest.java
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepositoryTest.java
@@ -99,6 +99,8 @@
 
         processModel.setProcessDetail("detail");
         processModel.setUseUserCRPref(true);
+        processModel.addToEmailAddresses("notify@example.com");
+        processModel.addToEmailAddresses("notify1@example.com");
 
         TaskModel jobSubmissionTask = new TaskModel();
         jobSubmissionTask.setTaskType(TaskTypes.JOB_SUBMISSION);
@@ -121,6 +123,9 @@
         assertEquals("Added process should automatically have 1 status", 1, retrievedProcess.getProcessStatusesSize());
         assertEquals("Added process should automatically have 1 status that is CREATED", ProcessState.CREATED, retrievedProcess.getProcessStatuses().get(0).getState());
         assertEquals(2, retrievedProcess.getTasksSize());
+        assertEquals(2, retrievedProcess.getEmailAddressesSize());
+        assertEquals("notify@example.com", retrievedProcess.getEmailAddresses().get(0));
+        assertEquals("notify1@example.com", retrievedProcess.getEmailAddresses().get(1));
 
         ComputationalResourceSchedulingModel computationalResourceSchedulingModel = new ComputationalResourceSchedulingModel();
         assertEquals(processId, processRepository.addProcessResourceSchedule(computationalResourceSchedulingModel, processId));
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepositoryTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepositoryTest.java
index c79889c..dfa4a58 100644
--- a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepositoryTest.java
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepositoryTest.java
@@ -66,11 +66,18 @@
         String projectId = projectRepository.addProject(project, gatewayId);
         assertTrue(projectId != null);
 
-        project.setDescription("projectDescription");
-        projectRepository.updateProject(project, null);
+        Project updatedProject = project.deepCopy();
+        // Simulate clients that may or may not set projectId but will pass
+        // projectId as an argument to updateProject
+        updatedProject.unsetProjectID();
+        updatedProject.setName("updated projectName");
+        updatedProject.setDescription("projectDescription");
+        projectRepository.updateProject(updatedProject, projectId);
 
         Project retrievedProject = projectRepository.getProject(projectId);
         assertEquals(gatewayId, retrievedProject.getGatewayId());
+        assertEquals("updated projectName", retrievedProject.getName());
+        assertEquals("projectDescription", retrievedProject.getDescription());
 
         assertTrue(projectRepository.getProjectIDs(Constants.FieldConstants.ProjectConstants.OWNER, "user").contains(projectId));
 
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataProductRepositoryTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataProductRepositoryTest.java
index 75b182d..2e191c7 100644
--- a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataProductRepositoryTest.java
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataProductRepositoryTest.java
@@ -132,7 +132,8 @@
         assertEquals(1, retrievedDataProductModel1.getReplicaLocationsSize());
         DataReplicaLocationModel retrievedReplicaLocationModel1 = retrievedDataProductModel1.getReplicaLocations().get(0);
         assertEquals(productUri1, retrievedReplicaLocationModel1.getProductUri());
-        assertFalse(retrievedReplicaLocationModel1.isSetValidUntilTime());
+        // validUntilTime has a default value
+        assertEquals(0, retrievedReplicaLocationModel1.getValidUntilTime());
 
         dataProductRepository.removeDataProduct(productUri1);
         assertFalse(dataProductRepository.isDataProductExists(productUri1));
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataReplicaLocationRepositoryTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataReplicaLocationRepositoryTest.java
index 2784733..0082473 100644
--- a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataReplicaLocationRepositoryTest.java
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataReplicaLocationRepositoryTest.java
@@ -89,7 +89,8 @@
         DataReplicaLocationModel retrievedDataReplicaLocationModel = dataReplicaLocationRepository.getReplicaLocation(replicaId1);
         assertTrue(retrievedDataReplicaLocationModel.getReplicaMetadata().size() == 2);
         assertEquals(retrievedDataReplicaLocationModel.getReplicaPersistentType(), testDataReplicaLocationModel1.getReplicaPersistentType());
-        assertFalse(retrievedDataReplicaLocationModel.isSetValidUntilTime());
+        // validUntilTime has a default value
+        assertEquals(0, retrievedDataReplicaLocationModel.getValidUntilTime());
 
         testDataProductModel.setReplicaLocations(Arrays.asList(testDataReplicaLocationModel1, testDataReplicaLocationModel2));
         dataProductRepository.updateDataProduct(testDataProductModel);
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/utils/CustomBeanFactoryTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/utils/CustomBeanFactoryTest.java
new file mode 100644
index 0000000..27cd5b9
--- /dev/null
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/utils/CustomBeanFactoryTest.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.registry.core.utils;
+
+import org.apache.airavata.model.experiment.UserConfigurationDataModel;
+import org.apache.thrift.TFieldRequirementType;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CustomBeanFactoryTest {
+    
+    @Test
+    public void testRequiredFieldWithDefault() {
+        Assert.assertEquals(TFieldRequirementType.REQUIRED, UserConfigurationDataModel.metaDataMap.get(UserConfigurationDataModel._Fields.AIRAVATA_AUTO_SCHEDULE).requirementType);
+        UserConfigurationDataModel fromConstructor = new UserConfigurationDataModel();
+        Assert.assertFalse(fromConstructor.isSetAiravataAutoSchedule());
+
+        CustomBeanFactory customBeanFactory = new CustomBeanFactory();
+        UserConfigurationDataModel fromFactory = (UserConfigurationDataModel) customBeanFactory
+                .createBean(null, null, UserConfigurationDataModel.class.getName());
+        Assert.assertTrue(fromFactory.isSetAiravataAutoSchedule());
+    }
+
+    @Test
+    public void testOptionalFieldWithDefault() {
+        Assert.assertEquals(TFieldRequirementType.OPTIONAL, UserConfigurationDataModel.metaDataMap.get(UserConfigurationDataModel._Fields.SHARE_EXPERIMENT_PUBLICLY).requirementType);
+        UserConfigurationDataModel fromConstructor = new UserConfigurationDataModel();
+        Assert.assertFalse(fromConstructor.isSetShareExperimentPublicly());
+
+        CustomBeanFactory customBeanFactory = new CustomBeanFactory();
+        UserConfigurationDataModel fromFactory = (UserConfigurationDataModel) customBeanFactory
+                .createBean(null, null, UserConfigurationDataModel.class.getName());
+        Assert.assertTrue(fromFactory.isSetShareExperimentPublicly());
+    }
+}
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/utils/ObjectMapperSingletonTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/utils/ObjectMapperSingletonTest.java
new file mode 100644
index 0000000..9d29b84
--- /dev/null
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/utils/ObjectMapperSingletonTest.java
@@ -0,0 +1,66 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.airavata.registry.core.utils;
+
+import org.apache.airavata.model.experiment.UserConfigurationDataModel;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ObjectMapperSingletonTest {
+
+    public static class TestUserConfigurationDataModel {
+        private boolean airavataAutoSchedule;
+
+        public boolean isAiravataAutoSchedule() {
+            return airavataAutoSchedule;
+        }
+
+        public void setAiravataAutoSchedule(boolean airavataAutoSchedule) {
+            this.airavataAutoSchedule = airavataAutoSchedule;
+        }
+    }
+
+    @Test
+    public void testCopyBooleanFieldsWithDefaultValue() {
+
+        TestUserConfigurationDataModel testUserConfigurationDataModel = new TestUserConfigurationDataModel();
+        testUserConfigurationDataModel.setAiravataAutoSchedule(false);
+
+        // Make sure these fields have default values
+        Assert.assertNotNull("airavataAutoSchedule has default value", new UserConfigurationDataModel().getFieldValue(UserConfigurationDataModel._Fields.AIRAVATA_AUTO_SCHEDULE));
+        Assert.assertNotNull("overrideManualScheduledParams has default value", new UserConfigurationDataModel().getFieldValue(UserConfigurationDataModel._Fields.OVERRIDE_MANUAL_SCHEDULED_PARAMS));
+        Assert.assertNotNull("shareExperimentPublicly has default value", new UserConfigurationDataModel().getFieldValue(UserConfigurationDataModel._Fields.SHARE_EXPERIMENT_PUBLICLY));
+        UserConfigurationDataModel userConfigurationDataModel = ObjectMapperSingleton.getInstance()
+                .map(testUserConfigurationDataModel, UserConfigurationDataModel.class);
+
+        Assert.assertTrue(userConfigurationDataModel.isSetAiravataAutoSchedule());
+        Assert.assertFalse(userConfigurationDataModel.isAiravataAutoSchedule());
+        Assert.assertTrue(
+                "even though overrideManualScheduledParams isn't a field on the source object, since it has a default value it should be set",
+                userConfigurationDataModel.isSetOverrideManualScheduledParams());
+        Assert.assertFalse(userConfigurationDataModel.isOverrideManualScheduledParams());
+        Assert.assertTrue(
+                "even though shareExperimentPublicly isn't a field on the source object, since it has a default value it should be set",
+                userConfigurationDataModel.isSetShareExperimentPublicly());
+        Assert.assertFalse(userConfigurationDataModel.isShareExperimentPublicly());
+    }
+}
diff --git a/modules/registry/registry-cpi/pom.xml b/modules/registry/registry-cpi/pom.xml
index 94d5a1b..575a926 100644
--- a/modules/registry/registry-cpi/pom.xml
+++ b/modules/registry/registry-cpi/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>registry</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/registry/registry-server/pom.xml b/modules/registry/registry-server/pom.xml
index 454db7f..d877cd1 100644
--- a/modules/registry/registry-server/pom.xml
+++ b/modules/registry/registry-server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>registry</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/modules/registry/registry-server/registry-api-service/pom.xml b/modules/registry/registry-server/registry-api-service/pom.xml
index 5884d51..4bc0d61 100644
--- a/modules/registry/registry-server/registry-api-service/pom.xml
+++ b/modules/registry/registry-server/registry-api-service/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>registry-server</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -66,12 +66,12 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-registry-core</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-sharing-registry-stubs</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 </project>
diff --git a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
index 9667f0e..68ee14d 100644
--- a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
+++ b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
@@ -41,6 +41,8 @@
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
 import org.apache.airavata.model.appcatalog.parser.Parser;
+import org.apache.airavata.model.appcatalog.parser.ParserInput;
+import org.apache.airavata.model.appcatalog.parser.ParserOutput;
 import org.apache.airavata.model.appcatalog.parser.ParsingTemplate;
 import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
 import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
@@ -86,16 +88,7 @@
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.airavata.registry.api.registry_apiConstants;
 import org.apache.airavata.registry.core.entities.expcatalog.JobPK;
-import org.apache.airavata.registry.core.repositories.appcatalog.ApplicationDeploymentRepository;
-import org.apache.airavata.registry.core.repositories.appcatalog.ApplicationInterfaceRepository;
-import org.apache.airavata.registry.core.repositories.appcatalog.ComputeResourceRepository;
-import org.apache.airavata.registry.core.repositories.appcatalog.GatewayGroupsRepository;
-import org.apache.airavata.registry.core.repositories.appcatalog.GroupResourceProfileRepository;
-import org.apache.airavata.registry.core.repositories.appcatalog.GwyResourceProfileRepository;
-import org.apache.airavata.registry.core.repositories.appcatalog.ParserRepository;
-import org.apache.airavata.registry.core.repositories.appcatalog.ParsingTemplateRepository;
-import org.apache.airavata.registry.core.repositories.appcatalog.StorageResourceRepository;
-import org.apache.airavata.registry.core.repositories.appcatalog.UserResourceProfileRepository;
+import org.apache.airavata.registry.core.repositories.appcatalog.*;
 import org.apache.airavata.registry.core.repositories.expcatalog.*;
 import org.apache.airavata.registry.core.repositories.replicacatalog.DataProductRepository;
 import org.apache.airavata.registry.core.repositories.replicacatalog.DataReplicaLocationRepository;
@@ -150,6 +143,8 @@
     private WorkflowRepository workflowRepository = new WorkflowRepository();
     private GatewayGroupsRepository gatewayGroupsRepository = new GatewayGroupsRepository();
     private ParserRepository parserRepository = new ParserRepository();
+    private ParserInputRepository parserInputRepository = new ParserInputRepository();
+    private ParserOutputRepository parserOutputRepository = new ParserOutputRepository();
     private ParsingTemplateRepository parsingTemplateRepository = new ParsingTemplateRepository();
     private UserRepository userRepository = new UserRepository();
     private ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
@@ -210,6 +205,7 @@
     @Override
     public Gateway getGateway(String gatewayId) throws RegistryServiceException, TException {
         try {
+            logger.info("Gateway Id "+ gatewayId);
             if (!gatewayRepository.isGatewayExist(gatewayId)){
                 logger.error("Gateway does not exist in the system. Please provide a valid gateway ID...");
                 AiravataSystemException exception = new AiravataSystemException();
@@ -444,10 +440,11 @@
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
         }
-        if (accessibleExpIds == null) {
-            logger.debug("accessibleExpIds is null, defaulting to an empty list");
-            accessibleExpIds = Collections.emptyList();
-        }
+        // FIXME: for now allowing to pass null accessibleExpIds (only admin users should call this method)
+        // if (accessibleExpIds == null) {
+            // logger.debug("accessibleExpIds is null, defaulting to an empty list");
+            // accessibleExpIds = Collections.emptyList();
+        // }
         try {
             Map<String, String> filters = new HashMap<>();
             filters.put(Constants.FieldConstants.ExperimentConstants.GATEWAY_ID, gatewayId);
@@ -778,7 +775,8 @@
                                     String jobID = jobModel.getJobId();
                                     List<JobStatus> status = jobModel.getJobStatuses();
                                     if (status != null && status.size()>0){
-                                        jobStatus.put(jobID, status.get(0));
+                                        JobStatus latestStatus = status.get(status.size() - 1);
+                                        jobStatus.put(jobID, latestStatus);
                                     }
                                 }
                             }
@@ -4938,6 +4936,34 @@
     }
 
     @Override
+    public ParserInput getParserInput(String parserInputId, String gatewayId) throws RegistryServiceException, TException {
+        try {
+            ParserInput parserInput = parserInputRepository.getParserInput(parserInputId);
+            // TODO check the gateway
+
+            return parserInput;
+        } catch (Exception e) {
+            logger.error("Failed to fetch parser input " + parserInputId + " for gateway " + gatewayId, e);
+            throw new RegistryServiceException("Failed to fetch parser input " + parserInputId + " for gateway " +
+                    gatewayId + " More info: " + e.getMessage());
+        }
+    }
+
+    @Override
+    public ParserOutput getParserOutput(String parserOutputId, String gatewayId) throws RegistryServiceException, TException {
+        try {
+            ParserOutput parserOutput = parserOutputRepository.getParserOutput(parserOutputId);
+            // TODO check the gateway
+
+            return parserOutput;
+        } catch (Exception e) {
+            logger.error("Failed to fetch parser output " + parserOutputId + " for gateway " + gatewayId, e);
+            throw new RegistryServiceException("Failed to fetch parser output " + parserOutputId + " for gateway " +
+                    gatewayId + " More info: " + e.getMessage());
+        }
+    }
+
+    @Override
     public ParsingTemplate getParsingTemplate(String templateId, String gatewayId) throws RegistryServiceException, TException {
 
         try {
diff --git a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/messaging/RegistryServiceDBEventHandler.java b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/messaging/RegistryServiceDBEventHandler.java
index 3a2b662..068093d 100644
--- a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/messaging/RegistryServiceDBEventHandler.java
+++ b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/messaging/RegistryServiceDBEventHandler.java
@@ -21,7 +21,6 @@
 
 import org.apache.airavata.common.exception.AiravataException;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.utils.DBEventManagerConstants;
 import org.apache.airavata.common.utils.DBEventService;
 import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.common.utils.ThriftClientPool;
@@ -39,7 +38,7 @@
 import org.apache.airavata.model.workspace.Project;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
-import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -57,14 +56,16 @@
 
     public RegistryServiceDBEventHandler() throws ApplicationSettingsException, RegistryServiceException {
 
-        GenericObjectPool.Config poolConfig = new GenericObjectPool.Config();
-        poolConfig.maxActive = 5;
-        poolConfig.minIdle = 1;
-        poolConfig.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
-        poolConfig.testOnBorrow = true;
-        poolConfig.testWhileIdle = true;
-        poolConfig.numTestsPerEvictionRun = 10;
-        poolConfig.maxWait = 3000;
+        GenericObjectPoolConfig<RegistryService.Client> poolConfig = new GenericObjectPoolConfig<>();
+        poolConfig.setMaxTotal(5);
+        poolConfig.setMinIdle(1);
+        poolConfig.setBlockWhenExhausted(true);
+        poolConfig.setTestOnBorrow(true);
+        poolConfig.setTestWhileIdle(true);
+        // must set timeBetweenEvictionRunsMillis since eviction doesn't run unless that is positive
+        poolConfig.setTimeBetweenEvictionRunsMillis(5L * 60L * 1000L);
+        poolConfig.setNumTestsPerEvictionRun(10);
+        poolConfig.setMaxWaitMillis(3000);
 
         registryClientPool = new ThriftClientPool<>(
                 tProtocol -> new RegistryService.Client(tProtocol), poolConfig, ServerSettings.getRegistryServerHost(),
@@ -133,6 +134,8 @@
                         UserProfile userProfile = new UserProfile();
                         ThriftUtils.createThriftFromBytes(publisherContext.getEntityDataModel(), userProfile);
 
+                        Gateway gateway = registryClient.getGateway(userProfile.getGatewayId());
+                        logger.info("UserProfile event detected #########" + userProfile.getAiravataInternalUserId());
                         // call service-methods based on CRUD type
                         switch (publisherContext.getCrudType()) {
                             case CREATE: {
@@ -141,8 +144,11 @@
                                     registryClient.addUser(userProfile);
                                 }
                                 Project defaultProject = createDefaultProject(registryClient, userProfile);
+
                                 if (defaultProject != null) {
 
+                                    defaultProject.setGatewayId(gateway.getOauthClientId());
+                                    logger.info("publishing gateway to sharing service "+ defaultProject.getGatewayId());
                                     // Publish new PROJECT event (sharing service will listen for it and register this as a shared Entity)
                                     dbEventPublisherUtils.publish(EntityType.PROJECT, CrudType.CREATE, defaultProject);
                                 }
diff --git a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/util/Constants.java b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/util/Constants.java
index 93ddc1d..794af39 100644
--- a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/util/Constants.java
+++ b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/util/Constants.java
@@ -30,8 +30,9 @@
 	public static final String REGISTRY_SERVER_NAME = "regserver.server.name";
     public static final String REGISTRY_SERVER_MIN_THREADS = "regserver.server.min.threads";
 
-    public static final List<String> DB_EVENT_SUBSCRIBERS = new ArrayList<String>(){
-        {add(DBEventService.USER_PROFILE.toString());}
-        {add(DBEventService.TENANT.toString());}
-    };
+    public static final List<String> DB_EVENT_SUBSCRIBERS = new ArrayList<String>(){{
+        add(DBEventService.USER_PROFILE.toString());
+        add(DBEventService.TENANT.toString());
+        add(DBEventService.IAM_ADMIN.toString());
+    }};
 }
diff --git a/modules/registry/registry-server/registry-api-stubs/pom.xml b/modules/registry/registry-server/registry-api-stubs/pom.xml
index 4c8a573..48d3958 100644
--- a/modules/registry/registry-server/registry-api-stubs/pom.xml
+++ b/modules/registry/registry-server/registry-api-stubs/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>registry-server</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/modules/registry/registry-server/registry-api-stubs/src/main/java/org/apache/airavata/registry/api/RegistryService.java b/modules/registry/registry-server/registry-api-stubs/src/main/java/org/apache/airavata/registry/api/RegistryService.java
index caa4753..79486cc 100644
--- a/modules/registry/registry-server/registry-api-stubs/src/main/java/org/apache/airavata/registry/api/RegistryService.java
+++ b/modules/registry/registry-server/registry-api-stubs/src/main/java/org/apache/airavata/registry/api/RegistryService.java
@@ -2596,6 +2596,10 @@
 
     public void removeParser(java.lang.String parserId, java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
 
+    public org.apache.airavata.model.appcatalog.parser.ParserInput getParserInput(java.lang.String parserInputId, java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
+
+    public org.apache.airavata.model.appcatalog.parser.ParserOutput getParserOutput(java.lang.String parserOutputId, java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
+
     public org.apache.airavata.model.appcatalog.parser.ParsingTemplate getParsingTemplate(java.lang.String templateId, java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
 
     public java.util.List<org.apache.airavata.model.appcatalog.parser.ParsingTemplate> getParsingTemplatesForExperiment(java.lang.String experimentId, java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
@@ -2988,6 +2992,10 @@
 
     public void removeParser(java.lang.String parserId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws org.apache.thrift.TException;
 
+    public void getParserInput(java.lang.String parserInputId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserInput> resultHandler) throws org.apache.thrift.TException;
+
+    public void getParserOutput(java.lang.String parserOutputId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserOutput> resultHandler) throws org.apache.thrift.TException;
+
     public void getParsingTemplate(java.lang.String templateId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParsingTemplate> resultHandler) throws org.apache.thrift.TException;
 
     public void getParsingTemplatesForExperiment(java.lang.String experimentId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<java.util.List<org.apache.airavata.model.appcatalog.parser.ParsingTemplate>> resultHandler) throws org.apache.thrift.TException;
@@ -8069,6 +8077,60 @@
       return;
     }
 
+    public org.apache.airavata.model.appcatalog.parser.ParserInput getParserInput(java.lang.String parserInputId, java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
+    {
+      send_getParserInput(parserInputId, gatewayId);
+      return recv_getParserInput();
+    }
+
+    public void send_getParserInput(java.lang.String parserInputId, java.lang.String gatewayId) throws org.apache.thrift.TException
+    {
+      getParserInput_args args = new getParserInput_args();
+      args.setParserInputId(parserInputId);
+      args.setGatewayId(gatewayId);
+      sendBase("getParserInput", args);
+    }
+
+    public org.apache.airavata.model.appcatalog.parser.ParserInput recv_getParserInput() throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
+    {
+      getParserInput_result result = new getParserInput_result();
+      receiveBase(result, "getParserInput");
+      if (result.isSetSuccess()) {
+        return result.success;
+      }
+      if (result.rse != null) {
+        throw result.rse;
+      }
+      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "getParserInput failed: unknown result");
+    }
+
+    public org.apache.airavata.model.appcatalog.parser.ParserOutput getParserOutput(java.lang.String parserOutputId, java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
+    {
+      send_getParserOutput(parserOutputId, gatewayId);
+      return recv_getParserOutput();
+    }
+
+    public void send_getParserOutput(java.lang.String parserOutputId, java.lang.String gatewayId) throws org.apache.thrift.TException
+    {
+      getParserOutput_args args = new getParserOutput_args();
+      args.setParserOutputId(parserOutputId);
+      args.setGatewayId(gatewayId);
+      sendBase("getParserOutput", args);
+    }
+
+    public org.apache.airavata.model.appcatalog.parser.ParserOutput recv_getParserOutput() throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
+    {
+      getParserOutput_result result = new getParserOutput_result();
+      receiveBase(result, "getParserOutput");
+      if (result.isSetSuccess()) {
+        return result.success;
+      }
+      if (result.rse != null) {
+        throw result.rse;
+      }
+      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "getParserOutput failed: unknown result");
+    }
+
     public org.apache.airavata.model.appcatalog.parser.ParsingTemplate getParsingTemplate(java.lang.String templateId, java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
     {
       send_getParsingTemplate(templateId, gatewayId);
@@ -14706,6 +14768,76 @@
       }
     }
 
+    public void getParserInput(java.lang.String parserInputId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserInput> resultHandler) throws org.apache.thrift.TException {
+      checkReady();
+      getParserInput_call method_call = new getParserInput_call(parserInputId, gatewayId, resultHandler, this, ___protocolFactory, ___transport);
+      this.___currentMethod = method_call;
+      ___manager.call(method_call);
+    }
+
+    public static class getParserInput_call extends org.apache.thrift.async.TAsyncMethodCall<org.apache.airavata.model.appcatalog.parser.ParserInput> {
+      private java.lang.String parserInputId;
+      private java.lang.String gatewayId;
+      public getParserInput_call(java.lang.String parserInputId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserInput> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+        super(client, protocolFactory, transport, resultHandler, false);
+        this.parserInputId = parserInputId;
+        this.gatewayId = gatewayId;
+      }
+
+      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
+        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("getParserInput", org.apache.thrift.protocol.TMessageType.CALL, 0));
+        getParserInput_args args = new getParserInput_args();
+        args.setParserInputId(parserInputId);
+        args.setGatewayId(gatewayId);
+        args.write(prot);
+        prot.writeMessageEnd();
+      }
+
+      public org.apache.airavata.model.appcatalog.parser.ParserInput getResult() throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException {
+        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {
+          throw new java.lang.IllegalStateException("Method call not finished!");
+        }
+        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());
+        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);
+        return (new Client(prot)).recv_getParserInput();
+      }
+    }
+
+    public void getParserOutput(java.lang.String parserOutputId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserOutput> resultHandler) throws org.apache.thrift.TException {
+      checkReady();
+      getParserOutput_call method_call = new getParserOutput_call(parserOutputId, gatewayId, resultHandler, this, ___protocolFactory, ___transport);
+      this.___currentMethod = method_call;
+      ___manager.call(method_call);
+    }
+
+    public static class getParserOutput_call extends org.apache.thrift.async.TAsyncMethodCall<org.apache.airavata.model.appcatalog.parser.ParserOutput> {
+      private java.lang.String parserOutputId;
+      private java.lang.String gatewayId;
+      public getParserOutput_call(java.lang.String parserOutputId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserOutput> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+        super(client, protocolFactory, transport, resultHandler, false);
+        this.parserOutputId = parserOutputId;
+        this.gatewayId = gatewayId;
+      }
+
+      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
+        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("getParserOutput", org.apache.thrift.protocol.TMessageType.CALL, 0));
+        getParserOutput_args args = new getParserOutput_args();
+        args.setParserOutputId(parserOutputId);
+        args.setGatewayId(gatewayId);
+        args.write(prot);
+        prot.writeMessageEnd();
+      }
+
+      public org.apache.airavata.model.appcatalog.parser.ParserOutput getResult() throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException {
+        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {
+          throw new java.lang.IllegalStateException("Method call not finished!");
+        }
+        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());
+        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);
+        return (new Client(prot)).recv_getParserOutput();
+      }
+    }
+
     public void getParsingTemplate(java.lang.String templateId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParsingTemplate> resultHandler) throws org.apache.thrift.TException {
       checkReady();
       getParsingTemplate_call method_call = new getParsingTemplate_call(templateId, gatewayId, resultHandler, this, ___protocolFactory, ___transport);
@@ -15077,6 +15209,8 @@
       processMap.put("saveParser", new saveParser());
       processMap.put("listAllParsers", new listAllParsers());
       processMap.put("removeParser", new removeParser());
+      processMap.put("getParserInput", new getParserInput());
+      processMap.put("getParserOutput", new getParserOutput());
       processMap.put("getParsingTemplate", new getParsingTemplate());
       processMap.put("getParsingTemplatesForExperiment", new getParsingTemplatesForExperiment());
       processMap.put("saveParsingTemplate", new saveParsingTemplate());
@@ -19709,6 +19843,54 @@
       }
     }
 
+    public static class getParserInput<I extends Iface> extends org.apache.thrift.ProcessFunction<I, getParserInput_args> {
+      public getParserInput() {
+        super("getParserInput");
+      }
+
+      public getParserInput_args getEmptyArgsInstance() {
+        return new getParserInput_args();
+      }
+
+      protected boolean isOneway() {
+        return false;
+      }
+
+      public getParserInput_result getResult(I iface, getParserInput_args args) throws org.apache.thrift.TException {
+        getParserInput_result result = new getParserInput_result();
+        try {
+          result.success = iface.getParserInput(args.parserInputId, args.gatewayId);
+        } catch (org.apache.airavata.registry.api.exception.RegistryServiceException rse) {
+          result.rse = rse;
+        }
+        return result;
+      }
+    }
+
+    public static class getParserOutput<I extends Iface> extends org.apache.thrift.ProcessFunction<I, getParserOutput_args> {
+      public getParserOutput() {
+        super("getParserOutput");
+      }
+
+      public getParserOutput_args getEmptyArgsInstance() {
+        return new getParserOutput_args();
+      }
+
+      protected boolean isOneway() {
+        return false;
+      }
+
+      public getParserOutput_result getResult(I iface, getParserOutput_args args) throws org.apache.thrift.TException {
+        getParserOutput_result result = new getParserOutput_result();
+        try {
+          result.success = iface.getParserOutput(args.parserOutputId, args.gatewayId);
+        } catch (org.apache.airavata.registry.api.exception.RegistryServiceException rse) {
+          result.rse = rse;
+        }
+        return result;
+      }
+    }
+
     public static class getParsingTemplate<I extends Iface> extends org.apache.thrift.ProcessFunction<I, getParsingTemplate_args> {
       public getParsingTemplate() {
         super("getParsingTemplate");
@@ -20031,6 +20213,8 @@
       processMap.put("saveParser", new saveParser());
       processMap.put("listAllParsers", new listAllParsers());
       processMap.put("removeParser", new removeParser());
+      processMap.put("getParserInput", new getParserInput());
+      processMap.put("getParserOutput", new getParserOutput());
       processMap.put("getParsingTemplate", new getParsingTemplate());
       processMap.put("getParsingTemplatesForExperiment", new getParsingTemplatesForExperiment());
       processMap.put("saveParsingTemplate", new saveParsingTemplate());
@@ -32423,6 +32607,136 @@
       }
     }
 
+    public static class getParserInput<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, getParserInput_args, org.apache.airavata.model.appcatalog.parser.ParserInput> {
+      public getParserInput() {
+        super("getParserInput");
+      }
+
+      public getParserInput_args getEmptyArgsInstance() {
+        return new getParserInput_args();
+      }
+
+      public org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserInput> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {
+        final org.apache.thrift.AsyncProcessFunction fcall = this;
+        return new org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserInput>() { 
+          public void onComplete(org.apache.airavata.model.appcatalog.parser.ParserInput o) {
+            getParserInput_result result = new getParserInput_result();
+            result.success = o;
+            try {
+              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);
+            } catch (org.apache.thrift.transport.TTransportException e) {
+              _LOGGER.error("TTransportException writing to internal frame buffer", e);
+              fb.close();
+            } catch (java.lang.Exception e) {
+              _LOGGER.error("Exception writing to internal frame buffer", e);
+              onError(e);
+            }
+          }
+          public void onError(java.lang.Exception e) {
+            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;
+            org.apache.thrift.TSerializable msg;
+            getParserInput_result result = new getParserInput_result();
+            if (e instanceof org.apache.airavata.registry.api.exception.RegistryServiceException) {
+              result.rse = (org.apache.airavata.registry.api.exception.RegistryServiceException) e;
+              result.setRseIsSet(true);
+              msg = result;
+            } else if (e instanceof org.apache.thrift.transport.TTransportException) {
+              _LOGGER.error("TTransportException inside handler", e);
+              fb.close();
+              return;
+            } else if (e instanceof org.apache.thrift.TApplicationException) {
+              _LOGGER.error("TApplicationException inside handler", e);
+              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;
+              msg = (org.apache.thrift.TApplicationException)e;
+            } else {
+              _LOGGER.error("Exception inside handler", e);
+              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;
+              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());
+            }
+            try {
+              fcall.sendResponse(fb,msg,msgType,seqid);
+            } catch (java.lang.Exception ex) {
+              _LOGGER.error("Exception writing to internal frame buffer", ex);
+              fb.close();
+            }
+          }
+        };
+      }
+
+      protected boolean isOneway() {
+        return false;
+      }
+
+      public void start(I iface, getParserInput_args args, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserInput> resultHandler) throws org.apache.thrift.TException {
+        iface.getParserInput(args.parserInputId, args.gatewayId,resultHandler);
+      }
+    }
+
+    public static class getParserOutput<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, getParserOutput_args, org.apache.airavata.model.appcatalog.parser.ParserOutput> {
+      public getParserOutput() {
+        super("getParserOutput");
+      }
+
+      public getParserOutput_args getEmptyArgsInstance() {
+        return new getParserOutput_args();
+      }
+
+      public org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserOutput> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {
+        final org.apache.thrift.AsyncProcessFunction fcall = this;
+        return new org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserOutput>() { 
+          public void onComplete(org.apache.airavata.model.appcatalog.parser.ParserOutput o) {
+            getParserOutput_result result = new getParserOutput_result();
+            result.success = o;
+            try {
+              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);
+            } catch (org.apache.thrift.transport.TTransportException e) {
+              _LOGGER.error("TTransportException writing to internal frame buffer", e);
+              fb.close();
+            } catch (java.lang.Exception e) {
+              _LOGGER.error("Exception writing to internal frame buffer", e);
+              onError(e);
+            }
+          }
+          public void onError(java.lang.Exception e) {
+            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;
+            org.apache.thrift.TSerializable msg;
+            getParserOutput_result result = new getParserOutput_result();
+            if (e instanceof org.apache.airavata.registry.api.exception.RegistryServiceException) {
+              result.rse = (org.apache.airavata.registry.api.exception.RegistryServiceException) e;
+              result.setRseIsSet(true);
+              msg = result;
+            } else if (e instanceof org.apache.thrift.transport.TTransportException) {
+              _LOGGER.error("TTransportException inside handler", e);
+              fb.close();
+              return;
+            } else if (e instanceof org.apache.thrift.TApplicationException) {
+              _LOGGER.error("TApplicationException inside handler", e);
+              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;
+              msg = (org.apache.thrift.TApplicationException)e;
+            } else {
+              _LOGGER.error("Exception inside handler", e);
+              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;
+              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());
+            }
+            try {
+              fcall.sendResponse(fb,msg,msgType,seqid);
+            } catch (java.lang.Exception ex) {
+              _LOGGER.error("Exception writing to internal frame buffer", ex);
+              fb.close();
+            }
+          }
+        };
+      }
+
+      protected boolean isOneway() {
+        return false;
+      }
+
+      public void start(I iface, getParserOutput_args args, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.appcatalog.parser.ParserOutput> resultHandler) throws org.apache.thrift.TException {
+        iface.getParserOutput(args.parserOutputId, args.gatewayId,resultHandler);
+      }
+    }
+
     public static class getParsingTemplate<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, getParsingTemplate_args, org.apache.airavata.model.appcatalog.parser.ParsingTemplate> {
       public getParsingTemplate() {
         super("getParsingTemplate");
@@ -51999,7 +52313,7 @@
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
       tmpMap.put(_Fields.RESOURCE_HOST_NAME, new org.apache.thrift.meta_data.FieldMetaData("resourceHostName", org.apache.thrift.TFieldRequirementType.DEFAULT, 
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
-      tmpMap.put(_Fields.ACCESSIBLE_EXP_IDS, new org.apache.thrift.meta_data.FieldMetaData("accessibleExpIds", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+      tmpMap.put(_Fields.ACCESSIBLE_EXP_IDS, new org.apache.thrift.meta_data.FieldMetaData("accessibleExpIds", org.apache.thrift.TFieldRequirementType.DEFAULT, 
           new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
               new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
       metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
@@ -52634,9 +52948,6 @@
       }
       // alas, we cannot check 'fromTime' because it's a primitive and you chose the non-beans generator.
       // alas, we cannot check 'toTime' because it's a primitive and you chose the non-beans generator.
-      if (accessibleExpIds == null) {
-        throw new org.apache.thrift.protocol.TProtocolException("Required field 'accessibleExpIds' was not present! Struct: " + toString());
-      }
       // check for sub-struct validity
     }
 
@@ -52821,13 +53132,6 @@
         oprot.writeString(struct.gatewayId);
         oprot.writeI64(struct.fromTime);
         oprot.writeI64(struct.toTime);
-        {
-          oprot.writeI32(struct.accessibleExpIds.size());
-          for (java.lang.String _iter88 : struct.accessibleExpIds)
-          {
-            oprot.writeString(_iter88);
-          }
-        }
         java.util.BitSet optionals = new java.util.BitSet();
         if (struct.isSetUserName()) {
           optionals.set(0);
@@ -52838,7 +53142,10 @@
         if (struct.isSetResourceHostName()) {
           optionals.set(2);
         }
-        oprot.writeBitSet(optionals, 3);
+        if (struct.isSetAccessibleExpIds()) {
+          optionals.set(3);
+        }
+        oprot.writeBitSet(optionals, 4);
         if (struct.isSetUserName()) {
           oprot.writeString(struct.userName);
         }
@@ -52848,6 +53155,15 @@
         if (struct.isSetResourceHostName()) {
           oprot.writeString(struct.resourceHostName);
         }
+        if (struct.isSetAccessibleExpIds()) {
+          {
+            oprot.writeI32(struct.accessibleExpIds.size());
+            for (java.lang.String _iter88 : struct.accessibleExpIds)
+            {
+              oprot.writeString(_iter88);
+            }
+          }
+        }
       }
 
       @Override
@@ -52859,18 +53175,7 @@
         struct.setFromTimeIsSet(true);
         struct.toTime = iprot.readI64();
         struct.setToTimeIsSet(true);
-        {
-          org.apache.thrift.protocol.TList _list89 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-          struct.accessibleExpIds = new java.util.ArrayList<java.lang.String>(_list89.size);
-          java.lang.String _elem90;
-          for (int _i91 = 0; _i91 < _list89.size; ++_i91)
-          {
-            _elem90 = iprot.readString();
-            struct.accessibleExpIds.add(_elem90);
-          }
-        }
-        struct.setAccessibleExpIdsIsSet(true);
-        java.util.BitSet incoming = iprot.readBitSet(3);
+        java.util.BitSet incoming = iprot.readBitSet(4);
         if (incoming.get(0)) {
           struct.userName = iprot.readString();
           struct.setUserNameIsSet(true);
@@ -52883,6 +53188,19 @@
           struct.resourceHostName = iprot.readString();
           struct.setResourceHostNameIsSet(true);
         }
+        if (incoming.get(3)) {
+          {
+            org.apache.thrift.protocol.TList _list89 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+            struct.accessibleExpIds = new java.util.ArrayList<java.lang.String>(_list89.size);
+            java.lang.String _elem90;
+            for (int _i91 = 0; _i91 < _list89.size; ++_i91)
+            {
+              _elem90 = iprot.readString();
+              struct.accessibleExpIds.add(_elem90);
+            }
+          }
+          struct.setAccessibleExpIdsIsSet(true);
+        }
       }
     }
 
@@ -206268,6 +206586,1862 @@
     }
   }
 
+  public static class getParserInput_args implements org.apache.thrift.TBase<getParserInput_args, getParserInput_args._Fields>, java.io.Serializable, Cloneable, Comparable<getParserInput_args>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("getParserInput_args");
+
+    private static final org.apache.thrift.protocol.TField PARSER_INPUT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("parserInputId", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)2);
+
+    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getParserInput_argsStandardSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getParserInput_argsTupleSchemeFactory();
+
+    public java.lang.String parserInputId; // required
+    public java.lang.String gatewayId; // required
+
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+      PARSER_INPUT_ID((short)1, "parserInputId"),
+      GATEWAY_ID((short)2, "gatewayId");
+
+      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
+
+      static {
+        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not found.
+       */
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          case 1: // PARSER_INPUT_ID
+            return PARSER_INPUT_ID;
+          case 2: // GATEWAY_ID
+            return GATEWAY_ID;
+          default:
+            return null;
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, throwing an exception
+       * if it is not found.
+       */
+      public static _Fields findByThriftIdOrThrow(int fieldId) {
+        _Fields fields = findByThriftId(fieldId);
+        if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      public static _Fields findByName(java.lang.String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final java.lang.String _fieldName;
+
+      _Fields(short thriftId, java.lang.String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      public java.lang.String getFieldName() {
+        return _fieldName;
+      }
+    }
+
+    // isset id assignments
+    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      tmpMap.put(_Fields.PARSER_INPUT_ID, new org.apache.thrift.meta_data.FieldMetaData("parserInputId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.GATEWAY_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getParserInput_args.class, metaDataMap);
+    }
+
+    public getParserInput_args() {
+    }
+
+    public getParserInput_args(
+      java.lang.String parserInputId,
+      java.lang.String gatewayId)
+    {
+      this();
+      this.parserInputId = parserInputId;
+      this.gatewayId = gatewayId;
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public getParserInput_args(getParserInput_args other) {
+      if (other.isSetParserInputId()) {
+        this.parserInputId = other.parserInputId;
+      }
+      if (other.isSetGatewayId()) {
+        this.gatewayId = other.gatewayId;
+      }
+    }
+
+    public getParserInput_args deepCopy() {
+      return new getParserInput_args(this);
+    }
+
+    @Override
+    public void clear() {
+      this.parserInputId = null;
+      this.gatewayId = null;
+    }
+
+    public java.lang.String getParserInputId() {
+      return this.parserInputId;
+    }
+
+    public getParserInput_args setParserInputId(java.lang.String parserInputId) {
+      this.parserInputId = parserInputId;
+      return this;
+    }
+
+    public void unsetParserInputId() {
+      this.parserInputId = null;
+    }
+
+    /** Returns true if field parserInputId is set (has been assigned a value) and false otherwise */
+    public boolean isSetParserInputId() {
+      return this.parserInputId != null;
+    }
+
+    public void setParserInputIdIsSet(boolean value) {
+      if (!value) {
+        this.parserInputId = null;
+      }
+    }
+
+    public java.lang.String getGatewayId() {
+      return this.gatewayId;
+    }
+
+    public getParserInput_args setGatewayId(java.lang.String gatewayId) {
+      this.gatewayId = gatewayId;
+      return this;
+    }
+
+    public void unsetGatewayId() {
+      this.gatewayId = null;
+    }
+
+    /** Returns true if field gatewayId is set (has been assigned a value) and false otherwise */
+    public boolean isSetGatewayId() {
+      return this.gatewayId != null;
+    }
+
+    public void setGatewayIdIsSet(boolean value) {
+      if (!value) {
+        this.gatewayId = null;
+      }
+    }
+
+    public void setFieldValue(_Fields field, java.lang.Object value) {
+      switch (field) {
+      case PARSER_INPUT_ID:
+        if (value == null) {
+          unsetParserInputId();
+        } else {
+          setParserInputId((java.lang.String)value);
+        }
+        break;
+
+      case GATEWAY_ID:
+        if (value == null) {
+          unsetGatewayId();
+        } else {
+          setGatewayId((java.lang.String)value);
+        }
+        break;
+
+      }
+    }
+
+    public java.lang.Object getFieldValue(_Fields field) {
+      switch (field) {
+      case PARSER_INPUT_ID:
+        return getParserInputId();
+
+      case GATEWAY_ID:
+        return getGatewayId();
+
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new java.lang.IllegalArgumentException();
+      }
+
+      switch (field) {
+      case PARSER_INPUT_ID:
+        return isSetParserInputId();
+      case GATEWAY_ID:
+        return isSetGatewayId();
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(java.lang.Object that) {
+      if (that == null)
+        return false;
+      if (that instanceof getParserInput_args)
+        return this.equals((getParserInput_args)that);
+      return false;
+    }
+
+    public boolean equals(getParserInput_args that) {
+      if (that == null)
+        return false;
+      if (this == that)
+        return true;
+
+      boolean this_present_parserInputId = true && this.isSetParserInputId();
+      boolean that_present_parserInputId = true && that.isSetParserInputId();
+      if (this_present_parserInputId || that_present_parserInputId) {
+        if (!(this_present_parserInputId && that_present_parserInputId))
+          return false;
+        if (!this.parserInputId.equals(that.parserInputId))
+          return false;
+      }
+
+      boolean this_present_gatewayId = true && this.isSetGatewayId();
+      boolean that_present_gatewayId = true && that.isSetGatewayId();
+      if (this_present_gatewayId || that_present_gatewayId) {
+        if (!(this_present_gatewayId && that_present_gatewayId))
+          return false;
+        if (!this.gatewayId.equals(that.gatewayId))
+          return false;
+      }
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      int hashCode = 1;
+
+      hashCode = hashCode * 8191 + ((isSetParserInputId()) ? 131071 : 524287);
+      if (isSetParserInputId())
+        hashCode = hashCode * 8191 + parserInputId.hashCode();
+
+      hashCode = hashCode * 8191 + ((isSetGatewayId()) ? 131071 : 524287);
+      if (isSetGatewayId())
+        hashCode = hashCode * 8191 + gatewayId.hashCode();
+
+      return hashCode;
+    }
+
+    @Override
+    public int compareTo(getParserInput_args other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      lastComparison = java.lang.Boolean.valueOf(isSetParserInputId()).compareTo(other.isSetParserInputId());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetParserInputId()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.parserInputId, other.parserInputId);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.valueOf(isSetGatewayId()).compareTo(other.isSetGatewayId());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetGatewayId()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayId, other.gatewayId);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+      scheme(iprot).read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+      scheme(oprot).write(oprot, this);
+    }
+
+    @Override
+    public java.lang.String toString() {
+      java.lang.StringBuilder sb = new java.lang.StringBuilder("getParserInput_args(");
+      boolean first = true;
+
+      sb.append("parserInputId:");
+      if (this.parserInputId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.parserInputId);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("gatewayId:");
+      if (this.gatewayId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.gatewayId);
+      }
+      first = false;
+      sb.append(")");
+      return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+      // check for required fields
+      if (parserInputId == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'parserInputId' was not present! Struct: " + toString());
+      }
+      if (gatewayId == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'gatewayId' was not present! Struct: " + toString());
+      }
+      // check for sub-struct validity
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+      try {
+        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {
+      try {
+        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private static class getParserInput_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public getParserInput_argsStandardScheme getScheme() {
+        return new getParserInput_argsStandardScheme();
+      }
+    }
+
+    private static class getParserInput_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<getParserInput_args> {
+
+      public void read(org.apache.thrift.protocol.TProtocol iprot, getParserInput_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField schemeField;
+        iprot.readStructBegin();
+        while (true)
+        {
+          schemeField = iprot.readFieldBegin();
+          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+            break;
+          }
+          switch (schemeField.id) {
+            case 1: // PARSER_INPUT_ID
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.parserInputId = iprot.readString();
+                struct.setParserInputIdIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            case 2: // GATEWAY_ID
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.gatewayId = iprot.readString();
+                struct.setGatewayIdIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            default:
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+          }
+          iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+
+        // check for required fields of primitive type, which can't be checked in the validate method
+        struct.validate();
+      }
+
+      public void write(org.apache.thrift.protocol.TProtocol oprot, getParserInput_args struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (struct.parserInputId != null) {
+          oprot.writeFieldBegin(PARSER_INPUT_ID_FIELD_DESC);
+          oprot.writeString(struct.parserInputId);
+          oprot.writeFieldEnd();
+        }
+        if (struct.gatewayId != null) {
+          oprot.writeFieldBegin(GATEWAY_ID_FIELD_DESC);
+          oprot.writeString(struct.gatewayId);
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class getParserInput_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public getParserInput_argsTupleScheme getScheme() {
+        return new getParserInput_argsTupleScheme();
+      }
+    }
+
+    private static class getParserInput_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<getParserInput_args> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, getParserInput_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+        oprot.writeString(struct.parserInputId);
+        oprot.writeString(struct.gatewayId);
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, getParserInput_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+        struct.parserInputId = iprot.readString();
+        struct.setParserInputIdIsSet(true);
+        struct.gatewayId = iprot.readString();
+        struct.setGatewayIdIsSet(true);
+      }
+    }
+
+    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {
+      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
+    }
+  }
+
+  public static class getParserInput_result implements org.apache.thrift.TBase<getParserInput_result, getParserInput_result._Fields>, java.io.Serializable, Cloneable, Comparable<getParserInput_result>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("getParserInput_result");
+
+    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.STRUCT, (short)0);
+    private static final org.apache.thrift.protocol.TField RSE_FIELD_DESC = new org.apache.thrift.protocol.TField("rse", org.apache.thrift.protocol.TType.STRUCT, (short)1);
+
+    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getParserInput_resultStandardSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getParserInput_resultTupleSchemeFactory();
+
+    public org.apache.airavata.model.appcatalog.parser.ParserInput success; // required
+    public org.apache.airavata.registry.api.exception.RegistryServiceException rse; // required
+
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+      SUCCESS((short)0, "success"),
+      RSE((short)1, "rse");
+
+      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
+
+      static {
+        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not found.
+       */
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          case 0: // SUCCESS
+            return SUCCESS;
+          case 1: // RSE
+            return RSE;
+          default:
+            return null;
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, throwing an exception
+       * if it is not found.
+       */
+      public static _Fields findByThriftIdOrThrow(int fieldId) {
+        _Fields fields = findByThriftId(fieldId);
+        if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      public static _Fields findByName(java.lang.String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final java.lang.String _fieldName;
+
+      _Fields(short thriftId, java.lang.String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      public java.lang.String getFieldName() {
+        return _fieldName;
+      }
+    }
+
+    // isset id assignments
+    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.appcatalog.parser.ParserInput.class)));
+      tmpMap.put(_Fields.RSE, new org.apache.thrift.meta_data.FieldMetaData("rse", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.registry.api.exception.RegistryServiceException.class)));
+      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getParserInput_result.class, metaDataMap);
+    }
+
+    public getParserInput_result() {
+    }
+
+    public getParserInput_result(
+      org.apache.airavata.model.appcatalog.parser.ParserInput success,
+      org.apache.airavata.registry.api.exception.RegistryServiceException rse)
+    {
+      this();
+      this.success = success;
+      this.rse = rse;
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public getParserInput_result(getParserInput_result other) {
+      if (other.isSetSuccess()) {
+        this.success = new org.apache.airavata.model.appcatalog.parser.ParserInput(other.success);
+      }
+      if (other.isSetRse()) {
+        this.rse = new org.apache.airavata.registry.api.exception.RegistryServiceException(other.rse);
+      }
+    }
+
+    public getParserInput_result deepCopy() {
+      return new getParserInput_result(this);
+    }
+
+    @Override
+    public void clear() {
+      this.success = null;
+      this.rse = null;
+    }
+
+    public org.apache.airavata.model.appcatalog.parser.ParserInput getSuccess() {
+      return this.success;
+    }
+
+    public getParserInput_result setSuccess(org.apache.airavata.model.appcatalog.parser.ParserInput success) {
+      this.success = success;
+      return this;
+    }
+
+    public void unsetSuccess() {
+      this.success = null;
+    }
+
+    /** Returns true if field success is set (has been assigned a value) and false otherwise */
+    public boolean isSetSuccess() {
+      return this.success != null;
+    }
+
+    public void setSuccessIsSet(boolean value) {
+      if (!value) {
+        this.success = null;
+      }
+    }
+
+    public org.apache.airavata.registry.api.exception.RegistryServiceException getRse() {
+      return this.rse;
+    }
+
+    public getParserInput_result setRse(org.apache.airavata.registry.api.exception.RegistryServiceException rse) {
+      this.rse = rse;
+      return this;
+    }
+
+    public void unsetRse() {
+      this.rse = null;
+    }
+
+    /** Returns true if field rse is set (has been assigned a value) and false otherwise */
+    public boolean isSetRse() {
+      return this.rse != null;
+    }
+
+    public void setRseIsSet(boolean value) {
+      if (!value) {
+        this.rse = null;
+      }
+    }
+
+    public void setFieldValue(_Fields field, java.lang.Object value) {
+      switch (field) {
+      case SUCCESS:
+        if (value == null) {
+          unsetSuccess();
+        } else {
+          setSuccess((org.apache.airavata.model.appcatalog.parser.ParserInput)value);
+        }
+        break;
+
+      case RSE:
+        if (value == null) {
+          unsetRse();
+        } else {
+          setRse((org.apache.airavata.registry.api.exception.RegistryServiceException)value);
+        }
+        break;
+
+      }
+    }
+
+    public java.lang.Object getFieldValue(_Fields field) {
+      switch (field) {
+      case SUCCESS:
+        return getSuccess();
+
+      case RSE:
+        return getRse();
+
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new java.lang.IllegalArgumentException();
+      }
+
+      switch (field) {
+      case SUCCESS:
+        return isSetSuccess();
+      case RSE:
+        return isSetRse();
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(java.lang.Object that) {
+      if (that == null)
+        return false;
+      if (that instanceof getParserInput_result)
+        return this.equals((getParserInput_result)that);
+      return false;
+    }
+
+    public boolean equals(getParserInput_result that) {
+      if (that == null)
+        return false;
+      if (this == that)
+        return true;
+
+      boolean this_present_success = true && this.isSetSuccess();
+      boolean that_present_success = true && that.isSetSuccess();
+      if (this_present_success || that_present_success) {
+        if (!(this_present_success && that_present_success))
+          return false;
+        if (!this.success.equals(that.success))
+          return false;
+      }
+
+      boolean this_present_rse = true && this.isSetRse();
+      boolean that_present_rse = true && that.isSetRse();
+      if (this_present_rse || that_present_rse) {
+        if (!(this_present_rse && that_present_rse))
+          return false;
+        if (!this.rse.equals(that.rse))
+          return false;
+      }
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      int hashCode = 1;
+
+      hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287);
+      if (isSetSuccess())
+        hashCode = hashCode * 8191 + success.hashCode();
+
+      hashCode = hashCode * 8191 + ((isSetRse()) ? 131071 : 524287);
+      if (isSetRse())
+        hashCode = hashCode * 8191 + rse.hashCode();
+
+      return hashCode;
+    }
+
+    @Override
+    public int compareTo(getParserInput_result other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetSuccess()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.valueOf(isSetRse()).compareTo(other.isSetRse());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetRse()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.rse, other.rse);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+      scheme(iprot).read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+      scheme(oprot).write(oprot, this);
+      }
+
+    @Override
+    public java.lang.String toString() {
+      java.lang.StringBuilder sb = new java.lang.StringBuilder("getParserInput_result(");
+      boolean first = true;
+
+      sb.append("success:");
+      if (this.success == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.success);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("rse:");
+      if (this.rse == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.rse);
+      }
+      first = false;
+      sb.append(")");
+      return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+      // check for required fields
+      // check for sub-struct validity
+      if (success != null) {
+        success.validate();
+      }
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+      try {
+        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {
+      try {
+        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private static class getParserInput_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public getParserInput_resultStandardScheme getScheme() {
+        return new getParserInput_resultStandardScheme();
+      }
+    }
+
+    private static class getParserInput_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<getParserInput_result> {
+
+      public void read(org.apache.thrift.protocol.TProtocol iprot, getParserInput_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField schemeField;
+        iprot.readStructBegin();
+        while (true)
+        {
+          schemeField = iprot.readFieldBegin();
+          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+            break;
+          }
+          switch (schemeField.id) {
+            case 0: // SUCCESS
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
+                struct.success = new org.apache.airavata.model.appcatalog.parser.ParserInput();
+                struct.success.read(iprot);
+                struct.setSuccessIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            case 1: // RSE
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
+                struct.rse = new org.apache.airavata.registry.api.exception.RegistryServiceException();
+                struct.rse.read(iprot);
+                struct.setRseIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            default:
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+          }
+          iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+
+        // check for required fields of primitive type, which can't be checked in the validate method
+        struct.validate();
+      }
+
+      public void write(org.apache.thrift.protocol.TProtocol oprot, getParserInput_result struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (struct.success != null) {
+          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
+          struct.success.write(oprot);
+          oprot.writeFieldEnd();
+        }
+        if (struct.rse != null) {
+          oprot.writeFieldBegin(RSE_FIELD_DESC);
+          struct.rse.write(oprot);
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class getParserInput_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public getParserInput_resultTupleScheme getScheme() {
+        return new getParserInput_resultTupleScheme();
+      }
+    }
+
+    private static class getParserInput_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<getParserInput_result> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, getParserInput_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+        java.util.BitSet optionals = new java.util.BitSet();
+        if (struct.isSetSuccess()) {
+          optionals.set(0);
+        }
+        if (struct.isSetRse()) {
+          optionals.set(1);
+        }
+        oprot.writeBitSet(optionals, 2);
+        if (struct.isSetSuccess()) {
+          struct.success.write(oprot);
+        }
+        if (struct.isSetRse()) {
+          struct.rse.write(oprot);
+        }
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, getParserInput_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+        java.util.BitSet incoming = iprot.readBitSet(2);
+        if (incoming.get(0)) {
+          struct.success = new org.apache.airavata.model.appcatalog.parser.ParserInput();
+          struct.success.read(iprot);
+          struct.setSuccessIsSet(true);
+        }
+        if (incoming.get(1)) {
+          struct.rse = new org.apache.airavata.registry.api.exception.RegistryServiceException();
+          struct.rse.read(iprot);
+          struct.setRseIsSet(true);
+        }
+      }
+    }
+
+    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {
+      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
+    }
+  }
+
+  public static class getParserOutput_args implements org.apache.thrift.TBase<getParserOutput_args, getParserOutput_args._Fields>, java.io.Serializable, Cloneable, Comparable<getParserOutput_args>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("getParserOutput_args");
+
+    private static final org.apache.thrift.protocol.TField PARSER_OUTPUT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("parserOutputId", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)2);
+
+    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getParserOutput_argsStandardSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getParserOutput_argsTupleSchemeFactory();
+
+    public java.lang.String parserOutputId; // required
+    public java.lang.String gatewayId; // required
+
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+      PARSER_OUTPUT_ID((short)1, "parserOutputId"),
+      GATEWAY_ID((short)2, "gatewayId");
+
+      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
+
+      static {
+        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not found.
+       */
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          case 1: // PARSER_OUTPUT_ID
+            return PARSER_OUTPUT_ID;
+          case 2: // GATEWAY_ID
+            return GATEWAY_ID;
+          default:
+            return null;
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, throwing an exception
+       * if it is not found.
+       */
+      public static _Fields findByThriftIdOrThrow(int fieldId) {
+        _Fields fields = findByThriftId(fieldId);
+        if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      public static _Fields findByName(java.lang.String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final java.lang.String _fieldName;
+
+      _Fields(short thriftId, java.lang.String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      public java.lang.String getFieldName() {
+        return _fieldName;
+      }
+    }
+
+    // isset id assignments
+    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      tmpMap.put(_Fields.PARSER_OUTPUT_ID, new org.apache.thrift.meta_data.FieldMetaData("parserOutputId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.GATEWAY_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getParserOutput_args.class, metaDataMap);
+    }
+
+    public getParserOutput_args() {
+    }
+
+    public getParserOutput_args(
+      java.lang.String parserOutputId,
+      java.lang.String gatewayId)
+    {
+      this();
+      this.parserOutputId = parserOutputId;
+      this.gatewayId = gatewayId;
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public getParserOutput_args(getParserOutput_args other) {
+      if (other.isSetParserOutputId()) {
+        this.parserOutputId = other.parserOutputId;
+      }
+      if (other.isSetGatewayId()) {
+        this.gatewayId = other.gatewayId;
+      }
+    }
+
+    public getParserOutput_args deepCopy() {
+      return new getParserOutput_args(this);
+    }
+
+    @Override
+    public void clear() {
+      this.parserOutputId = null;
+      this.gatewayId = null;
+    }
+
+    public java.lang.String getParserOutputId() {
+      return this.parserOutputId;
+    }
+
+    public getParserOutput_args setParserOutputId(java.lang.String parserOutputId) {
+      this.parserOutputId = parserOutputId;
+      return this;
+    }
+
+    public void unsetParserOutputId() {
+      this.parserOutputId = null;
+    }
+
+    /** Returns true if field parserOutputId is set (has been assigned a value) and false otherwise */
+    public boolean isSetParserOutputId() {
+      return this.parserOutputId != null;
+    }
+
+    public void setParserOutputIdIsSet(boolean value) {
+      if (!value) {
+        this.parserOutputId = null;
+      }
+    }
+
+    public java.lang.String getGatewayId() {
+      return this.gatewayId;
+    }
+
+    public getParserOutput_args setGatewayId(java.lang.String gatewayId) {
+      this.gatewayId = gatewayId;
+      return this;
+    }
+
+    public void unsetGatewayId() {
+      this.gatewayId = null;
+    }
+
+    /** Returns true if field gatewayId is set (has been assigned a value) and false otherwise */
+    public boolean isSetGatewayId() {
+      return this.gatewayId != null;
+    }
+
+    public void setGatewayIdIsSet(boolean value) {
+      if (!value) {
+        this.gatewayId = null;
+      }
+    }
+
+    public void setFieldValue(_Fields field, java.lang.Object value) {
+      switch (field) {
+      case PARSER_OUTPUT_ID:
+        if (value == null) {
+          unsetParserOutputId();
+        } else {
+          setParserOutputId((java.lang.String)value);
+        }
+        break;
+
+      case GATEWAY_ID:
+        if (value == null) {
+          unsetGatewayId();
+        } else {
+          setGatewayId((java.lang.String)value);
+        }
+        break;
+
+      }
+    }
+
+    public java.lang.Object getFieldValue(_Fields field) {
+      switch (field) {
+      case PARSER_OUTPUT_ID:
+        return getParserOutputId();
+
+      case GATEWAY_ID:
+        return getGatewayId();
+
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new java.lang.IllegalArgumentException();
+      }
+
+      switch (field) {
+      case PARSER_OUTPUT_ID:
+        return isSetParserOutputId();
+      case GATEWAY_ID:
+        return isSetGatewayId();
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(java.lang.Object that) {
+      if (that == null)
+        return false;
+      if (that instanceof getParserOutput_args)
+        return this.equals((getParserOutput_args)that);
+      return false;
+    }
+
+    public boolean equals(getParserOutput_args that) {
+      if (that == null)
+        return false;
+      if (this == that)
+        return true;
+
+      boolean this_present_parserOutputId = true && this.isSetParserOutputId();
+      boolean that_present_parserOutputId = true && that.isSetParserOutputId();
+      if (this_present_parserOutputId || that_present_parserOutputId) {
+        if (!(this_present_parserOutputId && that_present_parserOutputId))
+          return false;
+        if (!this.parserOutputId.equals(that.parserOutputId))
+          return false;
+      }
+
+      boolean this_present_gatewayId = true && this.isSetGatewayId();
+      boolean that_present_gatewayId = true && that.isSetGatewayId();
+      if (this_present_gatewayId || that_present_gatewayId) {
+        if (!(this_present_gatewayId && that_present_gatewayId))
+          return false;
+        if (!this.gatewayId.equals(that.gatewayId))
+          return false;
+      }
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      int hashCode = 1;
+
+      hashCode = hashCode * 8191 + ((isSetParserOutputId()) ? 131071 : 524287);
+      if (isSetParserOutputId())
+        hashCode = hashCode * 8191 + parserOutputId.hashCode();
+
+      hashCode = hashCode * 8191 + ((isSetGatewayId()) ? 131071 : 524287);
+      if (isSetGatewayId())
+        hashCode = hashCode * 8191 + gatewayId.hashCode();
+
+      return hashCode;
+    }
+
+    @Override
+    public int compareTo(getParserOutput_args other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      lastComparison = java.lang.Boolean.valueOf(isSetParserOutputId()).compareTo(other.isSetParserOutputId());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetParserOutputId()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.parserOutputId, other.parserOutputId);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.valueOf(isSetGatewayId()).compareTo(other.isSetGatewayId());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetGatewayId()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayId, other.gatewayId);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+      scheme(iprot).read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+      scheme(oprot).write(oprot, this);
+    }
+
+    @Override
+    public java.lang.String toString() {
+      java.lang.StringBuilder sb = new java.lang.StringBuilder("getParserOutput_args(");
+      boolean first = true;
+
+      sb.append("parserOutputId:");
+      if (this.parserOutputId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.parserOutputId);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("gatewayId:");
+      if (this.gatewayId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.gatewayId);
+      }
+      first = false;
+      sb.append(")");
+      return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+      // check for required fields
+      if (parserOutputId == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'parserOutputId' was not present! Struct: " + toString());
+      }
+      if (gatewayId == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'gatewayId' was not present! Struct: " + toString());
+      }
+      // check for sub-struct validity
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+      try {
+        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {
+      try {
+        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private static class getParserOutput_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public getParserOutput_argsStandardScheme getScheme() {
+        return new getParserOutput_argsStandardScheme();
+      }
+    }
+
+    private static class getParserOutput_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<getParserOutput_args> {
+
+      public void read(org.apache.thrift.protocol.TProtocol iprot, getParserOutput_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField schemeField;
+        iprot.readStructBegin();
+        while (true)
+        {
+          schemeField = iprot.readFieldBegin();
+          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+            break;
+          }
+          switch (schemeField.id) {
+            case 1: // PARSER_OUTPUT_ID
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.parserOutputId = iprot.readString();
+                struct.setParserOutputIdIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            case 2: // GATEWAY_ID
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.gatewayId = iprot.readString();
+                struct.setGatewayIdIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            default:
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+          }
+          iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+
+        // check for required fields of primitive type, which can't be checked in the validate method
+        struct.validate();
+      }
+
+      public void write(org.apache.thrift.protocol.TProtocol oprot, getParserOutput_args struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (struct.parserOutputId != null) {
+          oprot.writeFieldBegin(PARSER_OUTPUT_ID_FIELD_DESC);
+          oprot.writeString(struct.parserOutputId);
+          oprot.writeFieldEnd();
+        }
+        if (struct.gatewayId != null) {
+          oprot.writeFieldBegin(GATEWAY_ID_FIELD_DESC);
+          oprot.writeString(struct.gatewayId);
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class getParserOutput_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public getParserOutput_argsTupleScheme getScheme() {
+        return new getParserOutput_argsTupleScheme();
+      }
+    }
+
+    private static class getParserOutput_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<getParserOutput_args> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, getParserOutput_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+        oprot.writeString(struct.parserOutputId);
+        oprot.writeString(struct.gatewayId);
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, getParserOutput_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+        struct.parserOutputId = iprot.readString();
+        struct.setParserOutputIdIsSet(true);
+        struct.gatewayId = iprot.readString();
+        struct.setGatewayIdIsSet(true);
+      }
+    }
+
+    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {
+      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
+    }
+  }
+
+  public static class getParserOutput_result implements org.apache.thrift.TBase<getParserOutput_result, getParserOutput_result._Fields>, java.io.Serializable, Cloneable, Comparable<getParserOutput_result>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("getParserOutput_result");
+
+    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.STRUCT, (short)0);
+    private static final org.apache.thrift.protocol.TField RSE_FIELD_DESC = new org.apache.thrift.protocol.TField("rse", org.apache.thrift.protocol.TType.STRUCT, (short)1);
+
+    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getParserOutput_resultStandardSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getParserOutput_resultTupleSchemeFactory();
+
+    public org.apache.airavata.model.appcatalog.parser.ParserOutput success; // required
+    public org.apache.airavata.registry.api.exception.RegistryServiceException rse; // required
+
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+      SUCCESS((short)0, "success"),
+      RSE((short)1, "rse");
+
+      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
+
+      static {
+        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not found.
+       */
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          case 0: // SUCCESS
+            return SUCCESS;
+          case 1: // RSE
+            return RSE;
+          default:
+            return null;
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, throwing an exception
+       * if it is not found.
+       */
+      public static _Fields findByThriftIdOrThrow(int fieldId) {
+        _Fields fields = findByThriftId(fieldId);
+        if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      public static _Fields findByName(java.lang.String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final java.lang.String _fieldName;
+
+      _Fields(short thriftId, java.lang.String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      public java.lang.String getFieldName() {
+        return _fieldName;
+      }
+    }
+
+    // isset id assignments
+    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.appcatalog.parser.ParserOutput.class)));
+      tmpMap.put(_Fields.RSE, new org.apache.thrift.meta_data.FieldMetaData("rse", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.registry.api.exception.RegistryServiceException.class)));
+      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getParserOutput_result.class, metaDataMap);
+    }
+
+    public getParserOutput_result() {
+    }
+
+    public getParserOutput_result(
+      org.apache.airavata.model.appcatalog.parser.ParserOutput success,
+      org.apache.airavata.registry.api.exception.RegistryServiceException rse)
+    {
+      this();
+      this.success = success;
+      this.rse = rse;
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public getParserOutput_result(getParserOutput_result other) {
+      if (other.isSetSuccess()) {
+        this.success = new org.apache.airavata.model.appcatalog.parser.ParserOutput(other.success);
+      }
+      if (other.isSetRse()) {
+        this.rse = new org.apache.airavata.registry.api.exception.RegistryServiceException(other.rse);
+      }
+    }
+
+    public getParserOutput_result deepCopy() {
+      return new getParserOutput_result(this);
+    }
+
+    @Override
+    public void clear() {
+      this.success = null;
+      this.rse = null;
+    }
+
+    public org.apache.airavata.model.appcatalog.parser.ParserOutput getSuccess() {
+      return this.success;
+    }
+
+    public getParserOutput_result setSuccess(org.apache.airavata.model.appcatalog.parser.ParserOutput success) {
+      this.success = success;
+      return this;
+    }
+
+    public void unsetSuccess() {
+      this.success = null;
+    }
+
+    /** Returns true if field success is set (has been assigned a value) and false otherwise */
+    public boolean isSetSuccess() {
+      return this.success != null;
+    }
+
+    public void setSuccessIsSet(boolean value) {
+      if (!value) {
+        this.success = null;
+      }
+    }
+
+    public org.apache.airavata.registry.api.exception.RegistryServiceException getRse() {
+      return this.rse;
+    }
+
+    public getParserOutput_result setRse(org.apache.airavata.registry.api.exception.RegistryServiceException rse) {
+      this.rse = rse;
+      return this;
+    }
+
+    public void unsetRse() {
+      this.rse = null;
+    }
+
+    /** Returns true if field rse is set (has been assigned a value) and false otherwise */
+    public boolean isSetRse() {
+      return this.rse != null;
+    }
+
+    public void setRseIsSet(boolean value) {
+      if (!value) {
+        this.rse = null;
+      }
+    }
+
+    public void setFieldValue(_Fields field, java.lang.Object value) {
+      switch (field) {
+      case SUCCESS:
+        if (value == null) {
+          unsetSuccess();
+        } else {
+          setSuccess((org.apache.airavata.model.appcatalog.parser.ParserOutput)value);
+        }
+        break;
+
+      case RSE:
+        if (value == null) {
+          unsetRse();
+        } else {
+          setRse((org.apache.airavata.registry.api.exception.RegistryServiceException)value);
+        }
+        break;
+
+      }
+    }
+
+    public java.lang.Object getFieldValue(_Fields field) {
+      switch (field) {
+      case SUCCESS:
+        return getSuccess();
+
+      case RSE:
+        return getRse();
+
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new java.lang.IllegalArgumentException();
+      }
+
+      switch (field) {
+      case SUCCESS:
+        return isSetSuccess();
+      case RSE:
+        return isSetRse();
+      }
+      throw new java.lang.IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(java.lang.Object that) {
+      if (that == null)
+        return false;
+      if (that instanceof getParserOutput_result)
+        return this.equals((getParserOutput_result)that);
+      return false;
+    }
+
+    public boolean equals(getParserOutput_result that) {
+      if (that == null)
+        return false;
+      if (this == that)
+        return true;
+
+      boolean this_present_success = true && this.isSetSuccess();
+      boolean that_present_success = true && that.isSetSuccess();
+      if (this_present_success || that_present_success) {
+        if (!(this_present_success && that_present_success))
+          return false;
+        if (!this.success.equals(that.success))
+          return false;
+      }
+
+      boolean this_present_rse = true && this.isSetRse();
+      boolean that_present_rse = true && that.isSetRse();
+      if (this_present_rse || that_present_rse) {
+        if (!(this_present_rse && that_present_rse))
+          return false;
+        if (!this.rse.equals(that.rse))
+          return false;
+      }
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      int hashCode = 1;
+
+      hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287);
+      if (isSetSuccess())
+        hashCode = hashCode * 8191 + success.hashCode();
+
+      hashCode = hashCode * 8191 + ((isSetRse()) ? 131071 : 524287);
+      if (isSetRse())
+        hashCode = hashCode * 8191 + rse.hashCode();
+
+      return hashCode;
+    }
+
+    @Override
+    public int compareTo(getParserOutput_result other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetSuccess()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.valueOf(isSetRse()).compareTo(other.isSetRse());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetRse()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.rse, other.rse);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+      scheme(iprot).read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+      scheme(oprot).write(oprot, this);
+      }
+
+    @Override
+    public java.lang.String toString() {
+      java.lang.StringBuilder sb = new java.lang.StringBuilder("getParserOutput_result(");
+      boolean first = true;
+
+      sb.append("success:");
+      if (this.success == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.success);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("rse:");
+      if (this.rse == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.rse);
+      }
+      first = false;
+      sb.append(")");
+      return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+      // check for required fields
+      // check for sub-struct validity
+      if (success != null) {
+        success.validate();
+      }
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+      try {
+        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {
+      try {
+        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private static class getParserOutput_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public getParserOutput_resultStandardScheme getScheme() {
+        return new getParserOutput_resultStandardScheme();
+      }
+    }
+
+    private static class getParserOutput_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<getParserOutput_result> {
+
+      public void read(org.apache.thrift.protocol.TProtocol iprot, getParserOutput_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField schemeField;
+        iprot.readStructBegin();
+        while (true)
+        {
+          schemeField = iprot.readFieldBegin();
+          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+            break;
+          }
+          switch (schemeField.id) {
+            case 0: // SUCCESS
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
+                struct.success = new org.apache.airavata.model.appcatalog.parser.ParserOutput();
+                struct.success.read(iprot);
+                struct.setSuccessIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            case 1: // RSE
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
+                struct.rse = new org.apache.airavata.registry.api.exception.RegistryServiceException();
+                struct.rse.read(iprot);
+                struct.setRseIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            default:
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+          }
+          iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+
+        // check for required fields of primitive type, which can't be checked in the validate method
+        struct.validate();
+      }
+
+      public void write(org.apache.thrift.protocol.TProtocol oprot, getParserOutput_result struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (struct.success != null) {
+          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
+          struct.success.write(oprot);
+          oprot.writeFieldEnd();
+        }
+        if (struct.rse != null) {
+          oprot.writeFieldBegin(RSE_FIELD_DESC);
+          struct.rse.write(oprot);
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class getParserOutput_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public getParserOutput_resultTupleScheme getScheme() {
+        return new getParserOutput_resultTupleScheme();
+      }
+    }
+
+    private static class getParserOutput_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<getParserOutput_result> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, getParserOutput_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+        java.util.BitSet optionals = new java.util.BitSet();
+        if (struct.isSetSuccess()) {
+          optionals.set(0);
+        }
+        if (struct.isSetRse()) {
+          optionals.set(1);
+        }
+        oprot.writeBitSet(optionals, 2);
+        if (struct.isSetSuccess()) {
+          struct.success.write(oprot);
+        }
+        if (struct.isSetRse()) {
+          struct.rse.write(oprot);
+        }
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, getParserOutput_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+        java.util.BitSet incoming = iprot.readBitSet(2);
+        if (incoming.get(0)) {
+          struct.success = new org.apache.airavata.model.appcatalog.parser.ParserOutput();
+          struct.success.read(iprot);
+          struct.setSuccessIsSet(true);
+        }
+        if (incoming.get(1)) {
+          struct.rse = new org.apache.airavata.registry.api.exception.RegistryServiceException();
+          struct.rse.read(iprot);
+          struct.setRseIsSet(true);
+        }
+      }
+    }
+
+    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {
+      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
+    }
+  }
+
   public static class getParsingTemplate_args implements org.apache.thrift.TBase<getParsingTemplate_args, getParsingTemplate_args._Fields>, java.io.Serializable, Cloneable, Comparable<getParsingTemplate_args>   {
     private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("getParsingTemplate_args");
 
diff --git a/modules/registry/registry-tools/jpa-gen/pom.xml b/modules/registry/registry-tools/jpa-gen/pom.xml
index ef9e7ee..76ebadc 100644
--- a/modules/registry/registry-tools/jpa-gen/pom.xml
+++ b/modules/registry/registry-tools/jpa-gen/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-registry-tools</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/registry/registry-tools/pom.xml b/modules/registry/registry-tools/pom.xml
index 3aea596..0f5b10d 100644
--- a/modules/registry/registry-tools/pom.xml
+++ b/modules/registry/registry-tools/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>registry</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/registry/registry-tools/registry-tool/pom.xml b/modules/registry/registry-tools/registry-tool/pom.xml
index 40b75a0..26ecfbf 100644
--- a/modules/registry/registry-tools/registry-tool/pom.xml
+++ b/modules/registry/registry-tools/registry-tool/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-registry-tools</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/appCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/appCatalog_schema_delta.sql
new file mode 100644
index 0000000..1548106
--- /dev/null
+++ b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/appCatalog_schema_delta.sql
@@ -0,0 +1,512 @@
+--
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you 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.
+--
+
+use app_catalog;
+
+-- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
+-- first, change the db table engine of these tables to InnoDB to allow new tables to FK to them
+ALTER TABLE `JOB_MANAGER_COMMAND` ENGINE = InnoDB;
+ALTER TABLE `HOST_IPADDRESS` ENGINE = InnoDB;
+ALTER TABLE `GSISSH_SUBMISSION` ENGINE = InnoDB;
+ALTER TABLE `HOST_ALIAS` ENGINE = InnoDB;
+ALTER TABLE `JOB_SUBMISSION_INTERFACE` ENGINE = InnoDB;
+ALTER TABLE `LIBRARY_PREPAND_PATH` ENGINE = InnoDB;
+ALTER TABLE `LOCAL_SUBMISSION` ENGINE = InnoDB;
+-- ALTER TABLE `DATA_STORAGE_PREFERENCE` ENGINE = InnoDB;
+ALTER TABLE `COMPUTE_RESOURCE` ENGINE = InnoDB;
+ALTER TABLE `COMPUTE_RESOURCE_FILE_SYSTEM` ENGINE = InnoDB;
+ALTER TABLE `LIBRARY_APEND_PATH` ENGINE = InnoDB;
+ALTER TABLE `GSISSH_EXPORT` ENGINE = InnoDB;
+ALTER TABLE `GLOBUS_GK_ENDPOINT` ENGINE = InnoDB;
+ALTER TABLE `GATEWAY_PROFILE` ENGINE = InnoDB;
+ALTER TABLE `CONFIGURATION` ENGINE = InnoDB;
+ALTER TABLE `DATA_MOVEMENT_INTERFACE` ENGINE = InnoDB;
+ALTER TABLE `GLOBUS_SUBMISSION` ENGINE = InnoDB;
+ALTER TABLE `GRIDFTP_DATA_MOVEMENT` ENGINE = InnoDB;
+ALTER TABLE `GSISSH_POSTJOBCOMMAND` ENGINE = InnoDB;
+ALTER TABLE `POSTJOB_COMMAND` ENGINE = InnoDB;
+ALTER TABLE `GRIDFTP_ENDPOINT` ENGINE = InnoDB;
+ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` ENGINE = InnoDB;
+ALTER TABLE `GSISSH_PREJOBCOMMAND` ENGINE = InnoDB;
+ALTER TABLE `LOCAL_DATA_MOVEMENT` ENGINE = InnoDB;
+ALTER TABLE `APPLICATION_INPUT` ENGINE = InnoDB;
+ALTER TABLE `APP_ENVIRONMENT` ENGINE = InnoDB;
+ALTER TABLE `APP_MODULE_MAPPING` ENGINE = InnoDB;
+ALTER TABLE `APPLICATION_OUTPUT` ENGINE = InnoDB;
+ALTER TABLE `APPLICATION_MODULE` ENGINE = InnoDB;
+ALTER TABLE `UNICORE_DATAMOVEMENT` ENGINE = InnoDB;
+ALTER TABLE `APPLICATION_INTERFACE` ENGINE = InnoDB;
+ALTER TABLE `UNICORE_SUBMISSION` ENGINE = InnoDB;
+-- ALTER TABLE `WORKFLOW_INPUT` ENGINE = InnoDB;
+-- ALTER TABLE `WORKFLOW` ENGINE = InnoDB;
+ALTER TABLE `SSH_JOB_SUBMISSION` ENGINE = InnoDB;
+-- ALTER TABLE `WORKFLOW_OUTPUT` ENGINE = InnoDB;
+ALTER TABLE `APPLICATION_DEPLOYMENT` ENGINE = InnoDB;
+ALTER TABLE `RESOURCE_JOB_MANAGER` ENGINE = InnoDB;
+ALTER TABLE `PREJOB_COMMAND` ENGINE = InnoDB;
+ALTER TABLE `SCP_DATA_MOVEMENT` ENGINE = InnoDB;
+ALTER TABLE `BATCH_QUEUE` ENGINE = InnoDB;
+
+-- new tables
+CREATE TABLE IF NOT EXISTS `PARSING_TEMPLATE` (
+  `PARSING_TEMPLATE_ID` varchar(255) NOT NULL,
+  `APP_INTERFACE_ID` varchar(255) NOT NULL,
+  `GATEWAY_ID` varchar(255) NOT NULL,
+  PRIMARY KEY (`PARSING_TEMPLATE_ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT exists `PARSER` (
+  `PARSER_ID` varchar(255) NOT NULL,
+  `IMAGE_NAME` varchar(255) NOT NULL,
+  `OUTPUT_DIR_PATH` varchar(255) NOT NULL,
+  `INPUT_DIR_PATH` varchar(255) NOT NULL,
+  `EXECUTION_COMMAND` varchar(255) NOT NULL,
+  `GATEWAY_ID` varchar(255) NOT NULL,
+  PRIMARY KEY (`PARSER_ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `GROUP_RESOURCE_PROFILE` (
+  `GROUP_RESOURCE_PROFILE_ID` varchar(255) NOT NULL,
+  `CREATION_TIME` bigint(20) NOT NULL,
+  `GATEWAY_ID` varchar(255) NOT NULL,
+  `GROUP_RESOURCE_PROFILE_NAME` varchar(255) DEFAULT NULL,
+  `UPDATE_TIME` bigint(20) NOT NULL,
+  `DEFAULT_CREDENTIAL_STORE_TOKEN` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`GROUP_RESOURCE_PROFILE_ID`),
+  UNIQUE KEY `GATEWAY_ID` (`GATEWAY_ID`,`GROUP_RESOURCE_PROFILE_NAME`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `GROUP_COMPUTE_RESOURCE_PREFERENCE` (
+  `RESOURCE_ID` varchar(255) NOT NULL,
+  `GROUP_RESOURCE_PROFILE_ID` varchar(255) NOT NULL,
+  `ALLOCATION_PROJECT_NUMBER` varchar(255) DEFAULT NULL,
+  `LOGIN_USERNAME` varchar(255) DEFAULT NULL,
+  `OVERRIDE_BY_AIRAVATA` smallint(6) DEFAULT NULL,
+  `PREFERED_BATCH_QUEUE` varchar(255) DEFAULT NULL,
+  `PREFERED_DATA_MOVE_PROTOCOL` varchar(255) DEFAULT NULL,
+  `PREFERED_JOB_SUB_PROTOCOL` varchar(255) DEFAULT NULL,
+  `QUALITY_OF_SERVICE` varchar(255) DEFAULT NULL,
+  `RESERVATION` varchar(255) DEFAULT NULL,
+  `RESERVATION_END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+  `RESERVATION_START_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  `RESOURCE_CS_TOKEN` varchar(255) DEFAULT NULL,
+  `SCRATCH_LOCATION` varchar(255) DEFAULT NULL,
+  `SSH_ACCOUNT_PROVISIONER` varchar(255) DEFAULT NULL,
+  `SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO` varchar(1000) DEFAULT NULL,
+  `USAGE_REPORTING_GATEWAY_ID` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`RESOURCE_ID`,`GROUP_RESOURCE_PROFILE_ID`),
+  KEY `GROUP_RESOURCE_PROFILE_ID` (`GROUP_RESOURCE_PROFILE_ID`),
+  CONSTRAINT `GROUP_COMPUTE_RESOURCE_PREFERENCE_ibfk_1` FOREIGN KEY (`RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE,
+  CONSTRAINT `GROUP_COMPUTE_RESOURCE_PREFERENCE_ibfk_2` FOREIGN KEY (`GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_RESOURCE_PROFILE` (`GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `GATEWAY_GROUPS` (
+  `GATEWAY_ID` varchar(255) NOT NULL,
+  `ADMINS_GROUP_ID` varchar(255) DEFAULT NULL,
+  `DEFAULT_GATEWAY_USERS_GROUP_ID` varchar(255) DEFAULT NULL,
+  `READ_ONLY_ADMINS_GROUP_ID` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`GATEWAY_ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `BATCH_QUEUE_RESOURCE_POLICY` (
+  `RESOURCE_POLICY_ID` varchar(255) NOT NULL,
+  `COMPUTE_RESOURCE_ID` varchar(255) NOT NULL,
+  `GROUP_RESOURCE_PROFILE_ID` varchar(255) NOT NULL,
+  `MAX_ALLOWED_CORES` int(11) DEFAULT NULL,
+  `MAX_ALLOWED_NODES` int(11) DEFAULT NULL,
+  `MAX_ALLOWED_WALLTIME` int(11) DEFAULT NULL,
+  `QUEUE_NAME` varchar(255) NOT NULL,
+  PRIMARY KEY (`RESOURCE_POLICY_ID`),
+  KEY `COMPUTE_RESOURCE_ID` (`COMPUTE_RESOURCE_ID`),
+  KEY `GROUP_RESOURCE_PROFILE_ID` (`GROUP_RESOURCE_PROFILE_ID`),
+  CONSTRAINT `BATCH_QUEUE_RESOURCE_POLICY_ibfk_1` FOREIGN KEY (`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE,
+  CONSTRAINT `BATCH_QUEUE_RESOURCE_POLICY_ibfk_2` FOREIGN KEY (`GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_RESOURCE_PROFILE` (`GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `PARSER_CONNECTOR` (
+  `PARSER_CONNECTOR_ID` varchar(255) NOT NULL,
+  `PARENT_PARSER_ID` varchar(255) NOT NULL,
+  `CHILD_PARSER_ID` varchar(255) NOT NULL,
+  `PARSING_TEMPLATE_ID` varchar(255) NOT NULL,
+  PRIMARY KEY (`PARSER_CONNECTOR_ID`),
+  KEY `PARENT_PARSER_ID` (`PARENT_PARSER_ID`),
+  KEY `CHILD_PARSER_ID` (`CHILD_PARSER_ID`),
+  KEY `PARSING_TEMPLATE_ID` (`PARSING_TEMPLATE_ID`),
+  CONSTRAINT `PARSER_CONNECTOR_ibfk_1` FOREIGN KEY (`PARENT_PARSER_ID`) REFERENCES `PARSER` (`PARSER_ID`) ON DELETE CASCADE,
+  CONSTRAINT `PARSER_CONNECTOR_ibfk_2` FOREIGN KEY (`CHILD_PARSER_ID`) REFERENCES `PARSER` (`PARSER_ID`) ON DELETE CASCADE,
+  CONSTRAINT `PARSER_CONNECTOR_ibfk_3` FOREIGN KEY (`PARSING_TEMPLATE_ID`) REFERENCES `PARSING_TEMPLATE` (`PARSING_TEMPLATE_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `PARSER_OUTPUT` (
+  `PARSER_OUTPUT_ID` varchar(255) NOT NULL,
+  `PARSER_OUTPUT_NAME` varchar(255) NOT NULL,
+  `PARSER_OUTPUT_REQUIRED` tinyint(1) NOT NULL,
+  `PARSER_ID` varchar(255) NOT NULL,
+  `OUTPUT_TYPE` varchar(255) NOT NULL,
+  PRIMARY KEY (`PARSER_OUTPUT_ID`),
+  KEY `PARSER_ID` (`PARSER_ID`),
+  CONSTRAINT `PARSER_OUTPUT_ibfk_1` FOREIGN KEY (`PARSER_ID`) REFERENCES `PARSER` (`PARSER_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `PARSER_INPUT` (
+  `PARSER_INPUT_ID` varchar(255) NOT NULL,
+  `PARSER_INPUT_NAME` varchar(255) NOT NULL,
+  `PARSER_INPUT_REQUIRED` tinyint(1) NOT NULL,
+  `PARSER_ID` varchar(255) NOT NULL,
+  `INPUT_TYPE` varchar(255) NOT NULL,
+  PRIMARY KEY (`PARSER_INPUT_ID`),
+  KEY `PARSER_ID` (`PARSER_ID`),
+  CONSTRAINT `PARSER_INPUT_ibfk_1` FOREIGN KEY (`PARSER_ID`) REFERENCES `PARSER` (`PARSER_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `PARSING_TEMPLATE_INPUT` (
+  `PARSING_TEMPLATE_INPUT_ID` varchar(255) NOT NULL,
+  `TARGET_PARSER_INPUT_ID` varchar(255) NOT NULL,
+  `APPLICATION_OUTPUT_NAME` varchar(255) DEFAULT NULL,
+  `VALUE` varchar(255) DEFAULT NULL,
+  `PARSING_TEMPLATE_ID` varchar(255) NOT NULL,
+  PRIMARY KEY (`PARSING_TEMPLATE_INPUT_ID`),
+  KEY `PARSING_TEMPLATE_ID` (`PARSING_TEMPLATE_ID`),
+  KEY `TARGET_PARSER_INPUT_ID` (`TARGET_PARSER_INPUT_ID`),
+  CONSTRAINT `PARSING_TEMPLATE_INPUT_ibfk_1` FOREIGN KEY (`TARGET_PARSER_INPUT_ID`) REFERENCES `PARSER_INPUT` (`PARSER_INPUT_ID`) ON DELETE CASCADE,
+  CONSTRAINT `PARSING_TEMPLATE_INPUT_ibfk_2` FOREIGN KEY (`PARSING_TEMPLATE_ID`) REFERENCES `PARSING_TEMPLATE` (`PARSING_TEMPLATE_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `COMPUTE_RESOURCE_POLICY` (
+  `RESOURCE_POLICY_ID` varchar(255) NOT NULL,
+  `COMPUTE_RESOURCE_ID` varchar(255) NOT NULL,
+  `GROUP_RESOURCE_PROFILE_ID` varchar(255) NOT NULL,
+  PRIMARY KEY (`RESOURCE_POLICY_ID`),
+  KEY `COMPUTE_RESOURCE_ID` (`COMPUTE_RESOURCE_ID`),
+  KEY `GROUP_RESOURCE_PROFILE_ID` (`GROUP_RESOURCE_PROFILE_ID`),
+  CONSTRAINT `COMPUTE_RESOURCE_POLICY_ibfk_1` FOREIGN KEY (`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE,
+  CONSTRAINT `COMPUTE_RESOURCE_POLICY_ibfk_2` FOREIGN KEY (`GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_RESOURCE_PROFILE` (`GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `PARSER_CONNECTOR_INPUT` (
+  `PARSER_CONNECTOR_INPUT_ID` varchar(255) NOT NULL,
+  `PARSER_INPUT_ID` varchar(255) NOT NULL,
+  `PARSER_OUTPUT_ID` varchar(255) DEFAULT NULL,
+  `VALUE` varchar(255) DEFAULT NULL,
+  `PARSER_CONNECTOR_ID` varchar(255) NOT NULL,
+  PRIMARY KEY (`PARSER_CONNECTOR_INPUT_ID`),
+  KEY `PARSER_INPUT_ID` (`PARSER_INPUT_ID`),
+  KEY `PARSER_OUTPUT_ID` (`PARSER_OUTPUT_ID`),
+  KEY `PARSER_CONNECTOR_ID` (`PARSER_CONNECTOR_ID`),
+  CONSTRAINT `PARSER_CONNECTOR_INPUT_ibfk_1` FOREIGN KEY (`PARSER_INPUT_ID`) REFERENCES `PARSER_INPUT` (`PARSER_INPUT_ID`) ON DELETE CASCADE,
+  CONSTRAINT `PARSER_CONNECTOR_INPUT_ibfk_2` FOREIGN KEY (`PARSER_OUTPUT_ID`) REFERENCES `PARSER_OUTPUT` (`PARSER_OUTPUT_ID`) ON DELETE CASCADE,
+  CONSTRAINT `PARSER_CONNECTOR_INPUT_ibfk_3` FOREIGN KEY (`PARSER_CONNECTOR_ID`) REFERENCES `PARSER_CONNECTOR` (`PARSER_CONNECTOR_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `GRP_SSH_ACC_PROV_CONFIG` (
+  `CONFIG_NAME` varchar(255) NOT NULL,
+  `GROUP_RESOURCE_PROFILE_ID` varchar(255) NOT NULL,
+  `RESOURCE_ID` varchar(255) NOT NULL,
+  `CONFIG_VALUE` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`CONFIG_NAME`,`GROUP_RESOURCE_PROFILE_ID`,`RESOURCE_ID`),
+  KEY `RESOURCE_ID` (`RESOURCE_ID`,`GROUP_RESOURCE_PROFILE_ID`),
+  CONSTRAINT `GRP_SSH_ACC_PROV_CONFIG_ibfk_1` FOREIGN KEY (`RESOURCE_ID`, `GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_COMPUTE_RESOURCE_PREFERENCE` (`RESOURCE_ID`, `GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `COMPUTE_RESOURCE_POLICY_QUEUES` (
+  `RESOURCE_POLICY_ID` varchar(255) NOT NULL,
+  `QUEUE_NAME` varchar(255) NOT NULL,
+  PRIMARY KEY (`RESOURCE_POLICY_ID`,`QUEUE_NAME`),
+  CONSTRAINT `COMPUTE_RESOURCE_POLICY_QUEUES_ibfk_1` FOREIGN KEY (`RESOURCE_POLICY_ID`) REFERENCES `COMPUTE_RESOURCE_POLICY` (`RESOURCE_POLICY_ID`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+
+-- AIRAVATA-2768
+alter table APPLICATION_INPUT modify METADATA VARCHAR(4096);
+
+-- AIRAVATA-2758
+-- Note: this doesn't really represent a schema change, rather some legacy database instances improperly had created these columns as NOT NULL
+alter table COMPUTE_RESOURCE modify column CREATION_TIME TIMESTAMP DEFAULT NOW() null;
+alter table COMPUTE_RESOURCE modify column CPUS_PER_NODE int default 0 null;
+alter table COMPUTE_RESOURCE modify column DEFAULT_NODE_COUNT int default 0 null;
+alter table COMPUTE_RESOURCE modify column DEFAULT_CPU_COUNT int default 0 null;
+alter table COMPUTE_RESOURCE modify column DEFAULT_WALLTIME int default 0 null;
+alter table COMPUTE_RESOURCE modify column UPDATE_TIME timestamp default '0000-00-00 00:00:00' null;
+
+-- AIRAVATA-2827: OpenJPA 2.4.3 upgrade, convert BIT -> TINYINT(1)
+alter table APPLICATION_OUTPUT modify column OUTPUT_STREAMING tinyint(1);
+alter table APPLICATION_INTERFACE modify column ARCHIVE_WORKING_DIRECTORY tinyint(1);
+alter table APPLICATION_INTERFACE modify column HAS_OPTIONAL_FILE_INPUTS tinyint(1);
+alter table APPLICATION_DEPLOYMENT modify column EDITABLE_BY_USER tinyint(1);
+alter table BATCH_QUEUE modify column IS_DEFAULT_QUEUE tinyint(1);
+alter table COMPUTE_RESOURCE modify column GATEWAY_USAGE_REPORTING tinyint(1);
+alter table USER_COMPUTE_RESOURCE_PREFERENCE modify column VALIDATED tinyint(1) default 0;
+
+-- AIRAVATA-2872: NOT NULL foreign key columsn
+set FOREIGN_KEY_CHECKS=0;
+alter table HOST_ALIAS modify column RESOURCE_ID VARCHAR(255) NOT NULL;
+alter table HOST_IPADDRESS modify column RESOURCE_ID VARCHAR(255) NOT NULL;
+alter table GSISSH_EXPORT modify column SUBMISSION_ID VARCHAR(255) NOT NULL;
+alter table GSISSH_PREJOBCOMMAND modify column SUBMISSION_ID VARCHAR(255) NOT NULL;
+alter table GSISSH_POSTJOBCOMMAND modify column SUBMISSION_ID VARCHAR(255) NOT NULL;
+alter table GLOBUS_GK_ENDPOINT modify column SUBMISSION_ID VARCHAR(255) NOT NULL;
+alter table APPLICATION_DEPLOYMENT modify column APP_MODULE_ID VARCHAR(255) NOT NULL;
+alter table APPLICATION_DEPLOYMENT modify column COMPUTE_HOSTID VARCHAR(255) NOT NULL;
+alter table PREJOB_COMMAND modify column APPDEPLOYMENT_ID VARCHAR(255) NOT NULL;
+alter table POSTJOB_COMMAND modify column APPDEPLOYMENT_ID VARCHAR(255) NOT NULL;
+alter table LIBRARY_PREPAND_PATH modify column DEPLOYMENT_ID VARCHAR(255) NOT NULL;
+alter table LIBRARY_APEND_PATH modify column DEPLOYMENT_ID VARCHAR(255) NOT NULL;
+alter table APP_ENVIRONMENT modify column DEPLOYMENT_ID VARCHAR(255) NOT NULL;
+alter table APP_MODULE_MAPPING modify column INTERFACE_ID VARCHAR(255) NOT NULL;
+alter table APP_MODULE_MAPPING modify column MODULE_ID VARCHAR(255) NOT NULL;
+alter table APPLICATION_INPUT modify column INTERFACE_ID VARCHAR(255) NOT NULL;
+alter table APPLICATION_OUTPUT modify column INTERFACE_ID VARCHAR(255) NOT NULL;
+alter table COMPUTE_RESOURCE_PREFERENCE modify column GATEWAY_ID VARCHAR(255) NOT NULL;
+alter table COMPUTE_RESOURCE_PREFERENCE modify column RESOURCE_ID VARCHAR(255) NOT NULL;
+alter table SSH_ACCOUNT_PROVISIONER_CONFIG modify column GATEWAY_ID VARCHAR(255) NOT NULL;
+alter table SSH_ACCOUNT_PROVISIONER_CONFIG modify column RESOURCE_ID VARCHAR(255) NOT NULL;
+-- alter table DATA_STORAGE_PREFERENCE modify column GATEWAY_ID VARCHAR(255) NOT NULL;
+-- alter table WORKFLOW_INPUT modify column WF_TEMPLATE_ID VARCHAR(255) NOT NULL;
+-- alter table WORKFLOW_OUTPUT modify column WF_TEMPLATE_ID VARCHAR(255) NOT NULL;
+set FOREIGN_KEY_CHECKS=1;
+
+-- AIRAVATA-2872: add missing column
+alter table APP_ENVIRONMENT add column IF NOT EXISTS ENV_ORDER INTEGER;
+
+-- AIRAVATA-2939: add NOT NULL constraints to DB fields that aren't in data model
+alter table APPLICATION_MODULE modify column GATEWAY_ID VARCHAR(255) NOT NULL;
+alter table APPLICATION_MODULE modify column CREATION_TIME TIMESTAMP DEFAULT NOW() NOT NULL;
+alter table APPLICATION_MODULE modify column UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL;
+alter table APPLICATION_DEPLOYMENT modify column CREATION_TIME TIMESTAMP DEFAULT NOW() NOT NULL;
+alter table APPLICATION_DEPLOYMENT modify column UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL;
+alter table APPLICATION_DEPLOYMENT modify column GATEWAY_ID VARCHAR(255) NOT NULL;
+alter table APPLICATION_INTERFACE modify column GATEWAY_ID VARCHAR(255) NOT NULL;
+alter table APPLICATION_INTERFACE modify column CREATION_TIME TIMESTAMP DEFAULT NOW() NOT NULL;
+alter table APPLICATION_INTERFACE modify column UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL;
+
+-- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
+
+-- Some of these column changes involve FK columns so need to temporarily turn off FK checks
+set FOREIGN_KEY_CHECKS=0;
+ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `RESERVATION_END_TIME` `RESERVATION_END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
+ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `PREFERED_JOB_SUB_PROTOCOL` `PREFERED_JOB_SUB_PROTOCOL` varchar(255) DEFAULT NULL;
+ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `PREFERED_DATA_MOVE_PROTOCOL` `PREFERED_DATA_MOVE_PROTOCOL` varchar(255) DEFAULT NULL;
+ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `RESERVATION_START_TIME` `RESERVATION_START_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
+
+ALTER TABLE `STORAGE_INTERFACE` CHANGE `CREATION_TIME` `CREATION_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE `STORAGE_INTERFACE` CHANGE `DATA_MOVEMENT_PROTOCOL` `DATA_MOVEMENT_PROTOCOL` varchar(255) NOT NULL;
+ALTER TABLE `STORAGE_INTERFACE` CHANGE `UPDATE_TIME` `UPDATE_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
+
+ALTER TABLE `LOCAL_SUBMISSION` CHANGE `SECURITY_PROTOCOL` `SECURITY_PROTOCOL` varchar(255) NOT NULL;
+
+ALTER TABLE `PARSER` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(255) NOT NULL;
+ALTER TABLE `PARSER` DROP IF EXISTS `PARSER_INFO_ID`;
+
+ALTER TABLE `PARSING_TEMPLATE` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(255) NOT NULL;
+
+ALTER TABLE `GROUP_RESOURCE_PROFILE` CHANGE `UPDATE_TIME` `UPDATE_TIME` bigint(20) NOT NULL;
+ALTER TABLE `GROUP_RESOURCE_PROFILE` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(255) NOT NULL;
+ALTER TABLE `GROUP_RESOURCE_PROFILE` CHANGE `CREATION_TIME` `CREATION_TIME` bigint(20) NOT NULL;
+
+ALTER TABLE `PARSING_TEMPLATE_INPUT` CHANGE `TARGET_PARSER_INPUT_ID` `TARGET_PARSER_INPUT_ID` varchar(255) NOT NULL;
+
+ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO` `SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO` varchar(1000) DEFAULT NULL;
+
+ALTER TABLE `BATCH_QUEUE` CHANGE `QUEUE_SPECIFIC_MACROS` `QUEUE_SPECIFIC_MACROS` varchar(255) DEFAULT NULL;
+ALTER TABLE `BATCH_QUEUE` CHANGE `DEFAULT_WALLTIME` `DEFAULT_WALLTIME` int(11) DEFAULT NULL;
+
+ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` CHANGE `COMPUTE_RESOURCE_ID` `COMPUTE_RESOURCE_ID` varchar(255) NOT NULL;
+ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` CHANGE `GROUP_RESOURCE_PROFILE_ID` `GROUP_RESOURCE_PROFILE_ID` varchar(255) NOT NULL;
+ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` CHANGE `QUEUE_NAME` `QUEUE_NAME` varchar(255) NOT NULL;
+
+ALTER TABLE `APPLICATION_OUTPUT` CHANGE `OUTPUT_STREAMING` `OUTPUT_STREAMING` smallint(6) DEFAULT NULL;
+
+ALTER TABLE `APPLICATION_INTERFACE` CHANGE `ARCHIVE_WORKING_DIRECTORY` `ARCHIVE_WORKING_DIRECTORY` smallint(6) DEFAULT NULL;
+
+ALTER TABLE `COMPUTE_RESOURCE` CHANGE `CPUS_PER_NODE` `CPUS_PER_NODE` int(11) DEFAULT NULL;
+ALTER TABLE `COMPUTE_RESOURCE` CHANGE `CREATION_TIME` `CREATION_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE `COMPUTE_RESOURCE` CHANGE `DEFAULT_NODE_COUNT` `DEFAULT_NODE_COUNT` int(11) DEFAULT NULL;
+ALTER TABLE `COMPUTE_RESOURCE` CHANGE `UPDATE_TIME` `UPDATE_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
+ALTER TABLE `COMPUTE_RESOURCE` CHANGE `DEFAULT_CPU_COUNT` `DEFAULT_CPU_COUNT` int(11) DEFAULT NULL;
+ALTER TABLE `COMPUTE_RESOURCE` CHANGE `DEFAULT_WALLTIME` `DEFAULT_WALLTIME` int(11) DEFAULT NULL;
+ALTER TABLE `COMPUTE_RESOURCE` CHANGE `GATEWAY_USAGE_MODULE_LOAD_CMD` `GATEWAY_USAGE_MODULE_LOAD_CMD` varchar(500) DEFAULT NULL;
+
+ALTER TABLE `COMPUTE_RESOURCE_POLICY` CHANGE `GROUP_RESOURCE_PROFILE_ID` `GROUP_RESOURCE_PROFILE_ID` varchar(255) NOT NULL;
+ALTER TABLE `COMPUTE_RESOURCE_POLICY` CHANGE `COMPUTE_RESOURCE_ID` `COMPUTE_RESOURCE_ID` varchar(255) NOT NULL;
+
+ALTER TABLE `APPLICATION_INPUT` CHANGE `IS_READ_ONLY` `IS_READ_ONLY` smallint(6) DEFAULT NULL;
+
+ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` CHANGE `RESOURCE_POLICY_ID` `RESOURCE_POLICY_ID` varchar(255) NOT NULL;
+ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` CHANGE `QUEUE_NAME` `QUEUE_NAME` varchar(255) NOT NULL;
+
+ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` CHANGE `SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO` `SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO` varchar(1000) DEFAULT NULL;
+ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` CHANGE `RESERVATION_START_TIME` `RESERVATION_START_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
+ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` CHANGE `RESERVATION_END_TIME` `RESERVATION_END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
+
+ALTER TABLE `APPLICATION_DEPLOYMENT` CHANGE `DEFAULT_WALLTIME` `DEFAULT_WALLTIME` int(11) DEFAULT NULL;
+ALTER TABLE `APPLICATION_DEPLOYMENT` CHANGE `DEFAULT_CPU_COUNT` `DEFAULT_CPU_COUNT` int(11) DEFAULT NULL;
+ALTER TABLE `APPLICATION_DEPLOYMENT` CHANGE `DEFAULT_NODE_COUNT` `DEFAULT_NODE_COUNT` int(11) DEFAULT NULL;
+set FOREIGN_KEY_CHECKS=1;
+
+ALTER TABLE `GATEWAY_PROFILE` DROP IF EXISTS `DATA_STORAGE_HOST`;
+
+-- This table was accidentally created by DB init script, but entity was mapped to STORAGE_PREFERENCE
+DROP TABLE IF EXISTS `DATA_STORAGE_PREFERENCE`;
+
+-- DROP TABLE IF EXISTS `WORKFLOW`, `WORKFLOW_INPUT`, `WORKFLOW_OUTPUT`;
+
+-- keys indexes
+ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` ADD KEY IF NOT EXISTS `COMPUTE_RESOURCE_ID` (`COMPUTE_RESOURCE_ID`);
+ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` ADD KEY IF NOT EXISTS `GROUP_RESOURCE_PROFILE_ID` (`GROUP_RESOURCE_PROFILE_ID`);
+ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` DROP INDEX IF EXISTS `I_BTCHLCY_GROUPRESOURCEPROFILE`;
+ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` ADD PRIMARY KEY IF NOT EXISTS (`RESOURCE_POLICY_ID`,`QUEUE_NAME`);
+ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` DROP INDEX IF EXISTS `I_CMPT_QS_RESOURCE_POLICY_ID`;
+ALTER TABLE `COMPUTE_RESOURCE_POLICY` ADD KEY IF NOT EXISTS `COMPUTE_RESOURCE_ID` (`COMPUTE_RESOURCE_ID`);
+ALTER TABLE `COMPUTE_RESOURCE_POLICY` ADD KEY IF NOT EXISTS `GROUP_RESOURCE_PROFILE_ID` (`GROUP_RESOURCE_PROFILE_ID`);
+ALTER TABLE `COMPUTE_RESOURCE_POLICY` DROP INDEX IF EXISTS `I_CMPTLCY_GROUPRESOURCEPROFILE`;
+ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` ADD KEY IF NOT EXISTS `GROUP_RESOURCE_PROFILE_ID` (`GROUP_RESOURCE_PROFILE_ID`);
+ALTER TABLE `GROUP_RESOURCE_PROFILE` ADD UNIQUE KEY IF NOT EXISTS `GATEWAY_ID` (`GATEWAY_ID`,`GROUP_RESOURCE_PROFILE_NAME`);
+ALTER TABLE `GRP_SSH_ACC_PROV_CONFIG` ADD KEY IF NOT EXISTS `RESOURCE_ID` (`RESOURCE_ID`,`GROUP_RESOURCE_PROFILE_ID`);
+ALTER TABLE `GRP_SSH_ACC_PROV_CONFIG` DROP INDEX IF EXISTS `CONFIG_NAME`;
+ALTER TABLE `PARALLELISM_COMMAND` ADD PRIMARY KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`,`COMMAND_TYPE`);
+ALTER TABLE `PARALLELISM_COMMAND` DROP INDEX IF EXISTS `COMMAND_TYPE`;
+ALTER TABLE `PARSING_TEMPLATE_INPUT` ADD KEY IF NOT EXISTS `TARGET_PARSER_INPUT_ID` (`TARGET_PARSER_INPUT_ID`);
+ALTER TABLE `PARSING_TEMPLATE_INPUT` DROP INDEX IF EXISTS `PARSER_INPUT_ID`;
+ALTER TABLE `POSTJOB_COMMAND` ADD PRIMARY KEY IF NOT EXISTS (`APPDEPLOYMENT_ID`,`COMMAND`);
+ALTER TABLE `POSTJOB_COMMAND` DROP INDEX IF EXISTS `COMMAND`;
+ALTER TABLE `SSH_ACCOUNT_PROVISIONER_CONFIG` ADD PRIMARY KEY IF NOT EXISTS (`GATEWAY_ID`,`RESOURCE_ID`,`CONFIG_NAME`);
+ALTER TABLE `SSH_ACCOUNT_PROVISIONER_CONFIG` DROP INDEX IF EXISTS `CONFIG_NAME`;
+ALTER TABLE `STORAGE_INTERFACE` ADD PRIMARY KEY IF NOT EXISTS (`STORAGE_RESOURCE_ID`,`DATA_MOVEMENT_INTERFACE_ID`);
+ALTER TABLE `STORAGE_INTERFACE` DROP INDEX IF EXISTS `DATA_MOVEMENT_INTERFACE_ID`;
+
+-- Some of these FKs refer to non-existent data. Rather than cleaning up the orphaned data, we'll just turn off FK checks.
+set FOREIGN_KEY_CHECKS=0;
+-- create table delete_ids as select DEPLOYMENT_ID from APP_ENVIRONMENT a where NOT EXISTS (select 1 from APPLICATION_DEPLOYMENT where DEPLOYMENT_ID = ae.DEPLOYMENT_ID);
+-- delete from APP_ENVIRONMENT where DEPLOYMENT_ID in (select DEPLOYMENT_ID from delete_ids);
+ALTER TABLE `APP_ENVIRONMENT` ADD CONSTRAINT `APP_ENVIRONMENT_ibfk_1` FOREIGN KEY IF NOT EXISTS (`DEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
+-- drop table delete_ids;
+
+-- create table delete_ids as select INTERFACE_ID from APP_MODULE_MAPPING a where NOT EXISTS (select 1 from APPLICATION_INTERFACE where INTERFACE_ID = a.INTERFACE_ID);
+-- delete from APP_MODULE_MAPPING where INTERFACE_ID in (select INTERFACE_ID from delete_ids);
+ALTER TABLE `APP_MODULE_MAPPING` ADD CONSTRAINT `APP_MODULE_MAPPING_ibfk_1` FOREIGN KEY IF NOT EXISTS (`INTERFACE_ID`) REFERENCES `APPLICATION_INTERFACE` (`INTERFACE_ID`) ON DELETE CASCADE;
+-- drop table delete_ids;
+
+-- create table delete_ids as select MODULE_ID from APP_MODULE_MAPPING a where NOT EXISTS (select 1 from APPLICATION_MODULE where MODULE_ID = a.MODULE_ID);
+-- delete from APP_MODULE_MAPPING where MODULE_ID in (select MODULE_ID from delete_ids);
+ALTER TABLE `APP_MODULE_MAPPING` ADD CONSTRAINT `APP_MODULE_MAPPING_ibfk_2` FOREIGN KEY IF NOT EXISTS (`MODULE_ID`) REFERENCES `APPLICATION_MODULE` (`MODULE_ID`) ON DELETE CASCADE;
+-- drop table delete_ids;
+
+-- create table delete_ids as select COMPUTE_HOSTID from APPLICATION_DEPLOYMENT a where NOT EXISTS (select 1 from COMPUTE_RESOURCE where RESOURCE_ID = a.COMPUTE_HOSTID);
+-- delete from APPLICATION_DEPLOYMENT where COMPUTE_HOSTID in (select COMPUTE_HOSTID from delete_ids);
+ALTER TABLE `APPLICATION_DEPLOYMENT` ADD CONSTRAINT `APPLICATION_DEPLOYMENT_ibfk_1` FOREIGN KEY IF NOT EXISTS (`COMPUTE_HOSTID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+-- drop table delete_ids;
+
+-- create table delete_ids as select APP_MODULE_ID from APPLICATION_DEPLOYMENT a where NOT EXISTS (select 1 from APPLICATION_MODULE where MODULE_ID = a.APP_MODULE_ID);
+-- delete from APPLICATION_DEPLOYMENT where APP_MODULE_ID in (select APP_MODULE_ID from delete_ids);
+ALTER TABLE `APPLICATION_DEPLOYMENT` ADD CONSTRAINT `APPLICATION_DEPLOYMENT_ibfk_2` FOREIGN KEY IF NOT EXISTS (`APP_MODULE_ID`) REFERENCES `APPLICATION_MODULE` (`MODULE_ID`) ON DELETE CASCADE;
+-- drop table delete_ids;
+
+-- create table delete_ids as select INTERFACE_ID from APPLICATION_INPUT a where NOT EXISTS (select 1 from APPLICATION_INTERFACE where INTERFACE_ID = a.INTERFACE_ID);
+-- delete from APPLICATION_INPUT where INTERFACE_ID in (select INTERFACE_ID from delete_ids);
+ALTER TABLE `APPLICATION_INPUT` ADD CONSTRAINT `APPLICATION_INPUT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`INTERFACE_ID`) REFERENCES `APPLICATION_INTERFACE` (`INTERFACE_ID`) ON DELETE CASCADE;
+-- drop table delete_ids;
+
+-- create table delete_ids as select INTERFACE_ID from APPLICATION_OUTPUT a where NOT EXISTS (select 1 from APPLICATION_INTERFACE where INTERFACE_ID = a.INTERFACE_ID);
+-- delete from APPLICATION_OUTPUT where INTERFACE_ID in (select INTERFACE_ID from delete_ids);
+ALTER TABLE `APPLICATION_OUTPUT` ADD CONSTRAINT `APPLICATION_OUTPUT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`INTERFACE_ID`) REFERENCES `APPLICATION_INTERFACE` (`INTERFACE_ID`) ON DELETE CASCADE;
+-- drop table delete_ids;
+
+ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` ADD CONSTRAINT `BATCH_QUEUE_RESOURCE_POLICY_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` ADD CONSTRAINT `BATCH_QUEUE_RESOURCE_POLICY_ibfk_2` FOREIGN KEY IF NOT EXISTS(`GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_RESOURCE_PROFILE` (`GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE;
+ALTER TABLE `BATCH_QUEUE` ADD CONSTRAINT `BATCH_QUEUE_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `COMPUTE_RESOURCE_FILE_SYSTEM` ADD CONSTRAINT `COMPUTE_RESOURCE_FILE_SYSTEM_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` ADD CONSTRAINT `COMPUTE_RESOURCE_POLICY_QUEUES_ibfk_1` FOREIGN KEY IF NOT EXISTS(`RESOURCE_POLICY_ID`) REFERENCES `COMPUTE_RESOURCE_POLICY` (`RESOURCE_POLICY_ID`) ON DELETE CASCADE;
+ALTER TABLE `COMPUTE_RESOURCE_POLICY` ADD CONSTRAINT `COMPUTE_RESOURCE_POLICY_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `COMPUTE_RESOURCE_POLICY` ADD CONSTRAINT `COMPUTE_RESOURCE_POLICY_ibfk_2` FOREIGN KEY IF NOT EXISTS(`GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_RESOURCE_PROFILE` (`GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE;
+ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` ADD CONSTRAINT `COMPUTE_RESOURCE_PREFERENCE_ibfk_1` FOREIGN KEY IF NOT EXISTS(`RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` ADD CONSTRAINT `COMPUTE_RESOURCE_PREFERENCE_ibfk_2` FOREIGN KEY IF NOT EXISTS(`GATEWAY_ID`) REFERENCES `GATEWAY_PROFILE` (`GATEWAY_ID`) ON DELETE CASCADE;
+ALTER TABLE `DATA_MOVEMENT_INTERFACE` ADD CONSTRAINT `DATA_MOVEMENT_INTERFACE_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `GLOBUS_GK_ENDPOINT` ADD CONSTRAINT `GLOBUS_GK_ENDPOINT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`SUBMISSION_ID`) REFERENCES `GLOBUS_SUBMISSION` (`SUBMISSION_ID`) ON DELETE CASCADE;
+ALTER TABLE `GRIDFTP_ENDPOINT` ADD CONSTRAINT `GRIDFTP_ENDPOINT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`DATA_MOVEMENT_INTERFACE_ID`) REFERENCES `GRIDFTP_DATA_MOVEMENT` (`DATA_MOVEMENT_INTERFACE_ID`) ON DELETE CASCADE;
+ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` ADD CONSTRAINT `GROUP_COMPUTE_RESOURCE_PREFERENCE_ibfk_1` FOREIGN KEY IF NOT EXISTS(`RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` ADD CONSTRAINT `GROUP_COMPUTE_RESOURCE_PREFERENCE_ibfk_2` FOREIGN KEY IF NOT EXISTS(`GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_RESOURCE_PROFILE` (`GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE;
+ALTER TABLE `GRP_SSH_ACC_PROV_CONFIG` ADD CONSTRAINT `GRP_SSH_ACC_PROV_CONFIG_ibfk_1` FOREIGN KEY IF NOT EXISTS(`RESOURCE_ID`, `GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_COMPUTE_RESOURCE_PREFERENCE` (`RESOURCE_ID`, `GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE;
+ALTER TABLE `GSISSH_EXPORT` ADD CONSTRAINT `GSISSH_EXPORT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`SUBMISSION_ID`) REFERENCES `GSISSH_SUBMISSION` (`SUBMISSION_ID`) ON DELETE CASCADE;
+ALTER TABLE `GSISSH_POSTJOBCOMMAND` ADD CONSTRAINT `GSISSH_POSTJOBCOMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS(`SUBMISSION_ID`) REFERENCES `GSISSH_SUBMISSION` (`SUBMISSION_ID`) ON DELETE CASCADE;
+ALTER TABLE `GSISSH_PREJOBCOMMAND` ADD CONSTRAINT `GSISSH_PREJOBCOMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS(`SUBMISSION_ID`) REFERENCES `GSISSH_SUBMISSION` (`SUBMISSION_ID`) ON DELETE CASCADE;
+ALTER TABLE `HOST_ALIAS` ADD CONSTRAINT `HOST_ALIAS_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `HOST_IPADDRESS` ADD CONSTRAINT `HOST_IPADDRESS_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `JOB_MANAGER_COMMAND` ADD CONSTRAINT `JOB_MANAGER_COMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`) REFERENCES `RESOURCE_JOB_MANAGER` (`RESOURCE_JOB_MANAGER_ID`) ON DELETE CASCADE;
+ALTER TABLE `JOB_SUBMISSION_INTERFACE` ADD CONSTRAINT `JOB_SUBMISSION_INTERFACE_ibfk_1` FOREIGN KEY IF NOT EXISTS (`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `LIBRARY_APEND_PATH` ADD CONSTRAINT `LIBRARY_APEND_PATH_ibfk_1` FOREIGN KEY IF NOT EXISTS (`DEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
+ALTER TABLE `LIBRARY_PREPAND_PATH` ADD CONSTRAINT `LIBRARY_PREPAND_PATH_ibfk_1` FOREIGN KEY IF NOT EXISTS (`DEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
+ALTER TABLE `LOCAL_SUBMISSION` ADD CONSTRAINT `LOCAL_SUBMISSION_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`) REFERENCES `RESOURCE_JOB_MANAGER` (`RESOURCE_JOB_MANAGER_ID`);
+ALTER TABLE `MODULE_LOAD_CMD` ADD CONSTRAINT `MODULE_LOAD_CMD_ibfk_1` FOREIGN KEY IF NOT EXISTS (`APP_DEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
+ALTER TABLE `PARALLELISM_COMMAND` ADD CONSTRAINT `PARALLELISM_COMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`) REFERENCES `RESOURCE_JOB_MANAGER` (`RESOURCE_JOB_MANAGER_ID`) ON DELETE CASCADE;
+ALTER TABLE `POSTJOB_COMMAND` ADD CONSTRAINT `POSTJOB_COMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS (`APPDEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
+ALTER TABLE `PREJOB_COMMAND` ADD CONSTRAINT `PREJOB_COMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS (`APPDEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
+ALTER TABLE `SSH_ACCOUNT_PROVISIONER_CONFIG` ADD CONSTRAINT `SSH_ACCOUNT_PROVISIONER_CONFIG_ibfk_1` FOREIGN KEY IF NOT EXISTS (`GATEWAY_ID`, `RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE_PREFERENCE` (`GATEWAY_ID`, `RESOURCE_ID`) ON DELETE CASCADE;
+ALTER TABLE `SSH_JOB_SUBMISSION` ADD CONSTRAINT `SSH_JOB_SUBMISSION_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`) REFERENCES `RESOURCE_JOB_MANAGER` (`RESOURCE_JOB_MANAGER_ID`);
+-- Note: to deal with STORAGE_INTERFACEs that reference non-existent STORAGE_RESOURCEs, use the following to clean up orphans
+-- MariaDB [app_catalog]> create table temp1 as select STORAGE_RESOURCE_ID from STORAGE_INTERFACE si where not exists (select 1 from STORAGE_RESOURCE sr where sr.STORAGE_RESOURCE_ID = si.STORAGE_RESOURCE_ID);
+-- MariaDB [app_catalog]> delete from STORAGE_INTERFACE where STORAGE_RESOURCE_ID in (select STORAGE_RESOURCE_ID from temp1);
+ALTER TABLE `STORAGE_INTERFACE` ADD CONSTRAINT `STORAGE_INTERFACE_ibfk_1` FOREIGN KEY IF NOT EXISTS (`STORAGE_RESOURCE_ID`) REFERENCES `STORAGE_RESOURCE` (`STORAGE_RESOURCE_ID`) ON DELETE CASCADE;
+set FOREIGN_KEY_CHECKS=1;
+
+-- Older tables that no longer exist, or don't exist with those names
+DROP TABLE IF EXISTS `DATA_STORAGE_INTERFACE`;
+DROP TABLE IF EXISTS `GATEWAY_CLIENT_CREDENTIAL`;
+
+-- misnamed column. This migration was only needed in development environment where code with old column name was deployed.
+-- UPDATE PARSER_CONNECTOR_INPUT set PARSER_OUTPUT_ID = PARENT_OUTPUT_ID;
+-- ALTER TABLE `PARSER_CONNECTOR_INPUT` DROP IF EXISTS `PARENT_OUTPUT_ID`;
+-- ALTER TABLE `PARSING_TEMPLATE_INPUT` DROP IF EXISTS `PARSER_INPUT_ID`;
+
+ALTER TABLE `UNICORE_DATAMOVEMENT` DROP IF EXISTS `SECURITY_PROTOCOL`;
+
+-- AIRAVATA-3029: Add METADATA to APPLICATION_OUTPUT
+ALTER TABLE `APPLICATION_OUTPUT` ADD COLUMN IF NOT EXISTS METADATA VARCHAR(4096);
+
+-- AIRAVATA-3268: add overrideFilename to APPLICATION_INPUT
+ALTER TABLE APPLICATION_INPUT ADD COLUMN IF NOT EXISTS OVERRIDE_FILENAME VARCHAR(255);
+update APPLICATION_INPUT set OVERRIDE_FILENAME = INPUT_VALUE where OVERRIDE_FILENAME is null and DATA_TYPE = 'URI' and INPUT_VALUE is not null and INPUT_VALUE != '';
+
+-- AIRAVATA-3126
+CREATE TABLE IF NOT EXISTS COMPUTE_RESOURCE_RESERVATION -- ComputeResourceReservationEntity
+    (RESERVATION_ID VARCHAR(255) NOT NULL, END_TIME TIMESTAMP NOT NULL DEFAULT 0, RESERVATION_NAME VARCHAR(255) NOT NULL, START_TIME TIMESTAMP NOT NULL DEFAULT 0, RESOURCE_ID VARCHAR(255) NOT NULL, GROUP_RESOURCE_PROFILE_ID VARCHAR(255) NOT NULL, PRIMARY KEY (RESERVATION_ID)
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+CREATE TABLE IF NOT EXISTS COMPUTE_RESOURCE_RESERVATION_QUEUE (RESERVATION_ID VARCHAR(255), QUEUE_NAME VARCHAR(255) NOT NULL
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+CREATE INDEX IF NOT EXISTS I_CMPTN_Q_RESERVATION_ID ON COMPUTE_RESOURCE_RESERVATION_QUEUE (RESERVATION_ID);
+ALTER TABLE COMPUTE_RESOURCE_RESERVATION ADD CONSTRAINT FK_COMPUTE_RESOURCE_RESERVATION FOREIGN KEY IF NOT EXISTS (RESOURCE_ID, GROUP_RESOURCE_PROFILE_ID) REFERENCES GROUP_COMPUTE_RESOURCE_PREFERENCE (RESOURCE_ID, GROUP_RESOURCE_PROFILE_ID) ON DELETE CASCADE;
+
+-- AIRAVATA-3276 Replace JSON configuration: "toggle": ["isRequired"] ->
+-- "isRequired": true. Toggling requiredToAddedToCommandLine no longer needed.
+
+-- replace toggle with is isRequired
+update APPLICATION_INPUT
+set METADATA = REGEXP_REPLACE(METADATA, '"toggle": \\[[^}]+\\]', CONCAT('"isRequired": ', IF(IS_REQUIRED=1, 'true', 'false')))
+-- showOptions has "toggle" but not "isRequired"
+where METADATA rlike '"showOptions": {"toggle": \\[[^}]+\\]'
+  and NOT METADATA rlike '"showOptions": {.*"isRequired": (true|false)'
+;
+
+-- remove toggle since isRequired is already there
+update APPLICATION_INPUT
+set METADATA = REGEXP_REPLACE(METADATA, '(, )?"toggle": \\[[^}]+\\](, )?', '')
+-- showOptions has BOTH "toggle" and "isRequired"
+where METADATA rlike '"showOptions": {"toggle": \\[[^}]+\\]'
+  and METADATA rlike '"showOptions": {.*"isRequired": (true|false)'
+;
diff --git a/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/credential_store_schema_delta.sql b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/credential_store_schema_delta.sql
new file mode 100644
index 0000000..87f9792
--- /dev/null
+++ b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/credential_store_schema_delta.sql
@@ -0,0 +1,32 @@
+--
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you 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.
+--
+
+-- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
+use credential_store;
+
+set FOREIGN_KEY_CHECKS=0;
+ALTER TABLE `CREDENTIALS` CHANGE `TIME_PERSISTED` `TIME_PERSISTED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE `CREDENTIALS` CHANGE `DESCRIPTION` `DESCRIPTION` varchar(500) DEFAULT NULL;
+ALTER TABLE `CREDENTIALS` CHANGE `TOKEN_ID` `TOKEN_ID` varchar(100) NOT NULL;
+ALTER TABLE `COMMUNITY_USER` CHANGE `TOKEN_ID` `TOKEN_ID` varchar(100) NOT NULL;
+ALTER TABLE `COMMUNITY_USER` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(100) NOT NULL;
+ALTER TABLE `COMMUNITY_USER` CHANGE `COMMUNITY_USER_NAME` `COMMUNITY_USER_NAME` varchar(100) NOT NULL;
+ALTER TABLE `CREDENTIALS` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(100) NOT NULL;
+set FOREIGN_KEY_CHECKS=1;
diff --git a/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/experimentCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/experimentCatalog_schema_delta.sql
new file mode 100644
index 0000000..487a324
--- /dev/null
+++ b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/experimentCatalog_schema_delta.sql
@@ -0,0 +1,133 @@
+--
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you 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.
+--
+
+use experiment_catalog;
+
+-- AIRAVATA-2768
+alter table EXPERIMENT_INPUT modify METADATA VARCHAR(4096);
+
+-- AIRAVATA-2820
+alter table TASK drop column IF EXISTS TASK_INTERNAL_STORE;
+
+-- AIRAVATA-2827: OpenJPA 2.4.3 upgrade, convert BIT -> TINYINT(1)
+alter table PROCESS modify column USE_USER_CR_PREF tinyint(1);
+alter table QUEUE_STATUS modify column QUEUE_UP tinyint(1);
+alter table USER_CONFIGURATION_DATA modify column IS_USE_USER_CR_PREF tinyint(1);
+
+-- AIRAVATA-2899
+alter table PROCESS_STATUS modify column TIME_OF_STATE_CHANGE TIMESTAMP(6) DEFAULT NOW(6) ON UPDATE NOW(6);
+alter table TASK_STATUS modify column TIME_OF_STATE_CHANGE TIMESTAMP(6) DEFAULT NOW(6) ON UPDATE NOW(6);
+alter table JOB_STATUS modify column TIME_OF_STATE_CHANGE TIMESTAMP(6) DEFAULT NOW(6) ON UPDATE NOW(6);
+
+-- AIRAVATA-2872: NOT NULL foreign key columsn
+set FOREIGN_KEY_CHECKS=0;
+alter table USERS modify column GATEWAY_ID VARCHAR(255) NOT NULL;
+alter table GATEWAY_WORKER modify column GATEWAY_ID VARCHAR(255) NOT NULL;
+alter table PROJECT modify column GATEWAY_ID VARCHAR(255) NOT NULL;
+alter table PROJECT_USER modify column PROJECT_ID VARCHAR(255) NOT NULL;
+alter table PROJECT_USER modify column USER_NAME VARCHAR(255) NOT NULL;
+alter table EXPERIMENT modify column PROJECT_ID VARCHAR(255) NOT NULL;
+alter table EXPERIMENT_INPUT modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
+alter table EXPERIMENT_OUTPUT modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
+alter table EXPERIMENT_STATUS modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
+alter table EXPERIMENT_ERROR modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
+alter table USER_CONFIGURATION_DATA modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
+alter table PROCESS modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
+alter table PROCESS_INPUT modify column PROCESS_ID VARCHAR(255) NOT NULL;
+alter table PROCESS_OUTPUT modify column PROCESS_ID VARCHAR(255) NOT NULL;
+alter table PROCESS_STATUS modify column PROCESS_ID VARCHAR(255) NOT NULL;
+alter table PROCESS_ERROR modify column PROCESS_ID VARCHAR(255) NOT NULL;
+alter table PROCESS_RESOURCE_SCHEDULE modify column PROCESS_ID VARCHAR(255) NOT NULL;
+alter table TASK modify column PARENT_PROCESS_ID VARCHAR(255) NOT NULL;
+alter table TASK_STATUS modify column TASK_ID VARCHAR(255) NOT NULL;
+alter table TASK_ERROR modify column TASK_ID VARCHAR(255) NOT NULL;
+alter table JOB modify column TASK_ID VARCHAR(255) NOT NULL;
+alter table JOB_STATUS modify column TASK_ID VARCHAR(255) NOT NULL;
+alter table JOB_STATUS modify column JOB_ID VARCHAR(255) NOT NULL;
+set FOREIGN_KEY_CHECKS=1;
+
+-- AIRAVATA-2953
+alter table PROCESS_INPUT modify column METADATA VARCHAR(4096);
+
+-- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
+DROP TABLE IF EXISTS `COMMUNITY_USER`;
+DROP TABLE IF EXISTS `CREDENTIALS`;
+
+ALTER TABLE `EXPERIMENT_INPUT` CHANGE `IS_READ_ONLY` `IS_READ_ONLY` tinyint(1) DEFAULT NULL;
+ALTER TABLE `GATEWAY` CHANGE `REQUEST_CREATION_TIME` `REQUEST_CREATION_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE `NOTIFICATION` CHANGE `CREATION_DATE` `CREATION_DATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
+ALTER TABLE `NOTIFICATION` CHANGE `EXPIRATION_DATE` `EXPIRATION_DATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
+ALTER TABLE `NOTIFICATION` CHANGE `PUBLISHED_DATE` `PUBLISHED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
+ALTER TABLE `PROCESS_INPUT` CHANGE `IS_READ_ONLY` `IS_READ_ONLY` tinyint(1) DEFAULT NULL;
+ALTER TABLE `EXPERIMENT` DROP IF EXISTS `ARCHIVE`;
+ALTER TABLE `GATEWAY` DROP IF EXISTS `GATEWAY_DOMAIN`;
+ALTER TABLE `PROCESS` DROP IF EXISTS `ARCHIVE`;
+
+set FOREIGN_KEY_CHECKS=0;
+ALTER TABLE `GATEWAY_WORKER` DROP FOREIGN KEY IF EXISTS `GATEWAY_WORKER_ibfk_2`;
+ALTER TABLE `GATEWAY_WORKER` DROP INDEX IF EXISTS `USER_NAME`;
+ALTER TABLE `PROJECT_USER` DROP FOREIGN KEY IF EXISTS `PROJECT_USER_ibfk_2`;
+ALTER TABLE `PROJECT_USER` DROP INDEX IF EXISTS `USER_NAME`;
+ALTER TABLE `PROJECT` DROP FOREIGN KEY IF EXISTS `PROJECT_ibfk_2`;
+ALTER TABLE `PROJECT` DROP INDEX IF EXISTS `USER_NAME`;
+ALTER TABLE `USERS` ADD CONSTRAINT `USERS_ibfk_1` FOREIGN KEY IF NOT EXISTS (`GATEWAY_ID`) REFERENCES `GATEWAY` (`GATEWAY_ID`) ON DELETE CASCADE;
+ALTER TABLE `USERS` ADD PRIMARY KEY IF NOT EXISTS (`GATEWAY_ID`,`USER_NAME`);
+ALTER TABLE `USERS` DROP INDEX IF EXISTS `USER_NAME`;
+set FOREIGN_KEY_CHECKS=1;
+
+-- AIRAVATA-2978: Add missing columns to PROCESS_RESOURCE_SCHEDULE
+ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS STATIC_WORKING_DIR varchar(255);
+ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS OVERRIDE_ALLOCATION_PROJECT_NUMBER varchar(255);
+ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS OVERRIDE_LOGIN_USER_NAME varchar(255);
+ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS OVERRIDE_SCRATCH_LOCATION varchar(255);
+
+-- AIRAVATA-3029: Add METADATA to EXPERIMENT_OUTPUT and PROCESS_OUTPUT
+ALTER TABLE `EXPERIMENT_OUTPUT` ADD COLUMN IF NOT EXISTS METADATA VARCHAR(4096);
+ALTER TABLE `PROCESS_OUTPUT` ADD COLUMN IF NOT EXISTS METADATA VARCHAR(4096);
+
+ALTER TABLE `PROCESS` ADD COLUMN IF NOT EXISTS `GROUP_RESOURCE_PROFILE_ID` varchar(255) DEFAULT NULL;
+ALTER TABLE `USER_CONFIGURATION_DATA` ADD IF NOT EXISTS `GROUP_RESOURCE_PROFILE_ID` varchar(255) DEFAULT NULL;
+
+-- Copy OAUTH_CLIENT_ID and OAUTH_CLIENT_SECRET from profile_service.GATEWAY
+update GATEWAY g
+inner join profile_service.GATEWAY pg
+on pg.GATEWAY_ID = g.GATEWAY_ID
+set g.OAUTH_CLIENT_ID = pg.OAUTH_CLIENT_ID,
+    g.OAUTH_CLIENT_SECRET = pg.OAUTH_CLIENT_SECRET
+where
+    g.OAUTH_CLIENT_ID is null
+    or g.OAUTH_CLIENT_SECRET is null;
+
+-- AIRAVATA-3303 Slashes in experiment id
+set FOREIGN_KEY_CHECKS=0;
+
+update EXPERIMENT set EXPERIMENT_ID = REPLACE(EXPERIMENT_ID, "/", "_") where EXPERIMENT_ID like '%/%';
+update EXPERIMENT_INPUT set EXPERIMENT_ID = REPLACE(EXPERIMENT_ID, "/", "_") where EXPERIMENT_ID like '%/%';
+update EXPERIMENT_OUTPUT set EXPERIMENT_ID = REPLACE(EXPERIMENT_ID, "/", "_") where EXPERIMENT_ID like '%/%';
+update EXPERIMENT_STATUS set EXPERIMENT_ID = REPLACE(EXPERIMENT_ID, "/", "_") where EXPERIMENT_ID like '%/%';
+update EXPERIMENT_ERROR set EXPERIMENT_ID = REPLACE(EXPERIMENT_ID, "/", "_") where EXPERIMENT_ID like '%/%';
+update USER_CONFIGURATION_DATA set EXPERIMENT_ID = REPLACE(EXPERIMENT_ID, "/", "_") where EXPERIMENT_ID like '%/%';
+update PROCESS set EXPERIMENT_ID = REPLACE(EXPERIMENT_ID, "/", "_") where EXPERIMENT_ID like '%/%';
+
+set FOREIGN_KEY_CHECKS=1;
+
+-- AIRAVATA-3268: add overrideFilename to EXPERIMENT_INPUT, PROCESS_INPUT
+ALTER TABLE EXPERIMENT_INPUT ADD COLUMN IF NOT EXISTS OVERRIDE_FILENAME VARCHAR(255);
+ALTER TABLE PROCESS_INPUT ADD COLUMN IF NOT EXISTS OVERRIDE_FILENAME VARCHAR(255);
diff --git a/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/profile_service_schema_delta.sql b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/profile_service_schema_delta.sql
new file mode 100644
index 0000000..e0ff787
--- /dev/null
+++ b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/profile_service_schema_delta.sql
@@ -0,0 +1,68 @@
+--
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you 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.
+--
+
+use profile_service;
+
+alter database profile_service character set = 'latin1';
+
+-- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
+set FOREIGN_KEY_CHECKS=0;
+ALTER TABLE `NSF_DEMOGRAPHIC_RACE` CHANGE COLUMN IF EXISTS RACES RACE varchar(255) NOT NULL;
+ALTER TABLE `NSF_DEMOGRAPHIC_DISABILITY` CHANGE COLUMN IF EXISTS DISABILITIES DISABILITY varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE_PHONE` CHANGE COLUMN IF EXISTS PHONES PHONE varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE_EMAIL` CHANGE COLUMN IF EXISTS EMAILS EMAIL varchar(255) NOT NULL;
+ALTER TABLE `NSF_DEMOGRAPHIC_ETHNICITY` CHANGE COLUMN IF EXISTS ETHNICITIES ETHNICITY varchar(255) NOT NULL;
+ALTER TABLE `NSF_DEMOGRAPHIC_DISABILITY` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`DISABILITY`);
+ALTER TABLE `NSF_DEMOGRAPHIC_DISABILITY` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
+ALTER TABLE `NSF_DEMOGRAPHIC_ETHNICITY` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`ETHNICITY`);
+ALTER TABLE `NSF_DEMOGRAPHIC_ETHNICITY` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
+ALTER TABLE `NSF_DEMOGRAPHIC_RACE` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`RACE`);
+ALTER TABLE `NSF_DEMOGRAPHIC_RACE` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
+ALTER TABLE `USER_PROFILE_EMAIL` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`EMAIL`);
+ALTER TABLE `USER_PROFILE_EMAIL` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
+ALTER TABLE `USER_PROFILE_LABELED_URI` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`LABELED_URI`);
+ALTER TABLE `USER_PROFILE_LABELED_URI` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
+ALTER TABLE `USER_PROFILE_NATIONALITY` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`NATIONALITY`);
+ALTER TABLE `USER_PROFILE_NATIONALITY` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
+
+-- deduplicate phone records
+CREATE TABLE USER_PROFILE_PHONE_TEMP SELECT DISTINCT AIRAVATA_INTERNAL_USER_ID, PHONE FROM USER_PROFILE_PHONE;
+TRUNCATE USER_PROFILE_PHONE;
+INSERT INTO USER_PROFILE_PHONE SELECT * FROM USER_PROFILE_PHONE_TEMP;
+DROP TABLE USER_PROFILE_PHONE_TEMP;
+
+ALTER TABLE `USER_PROFILE_PHONE` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`PHONE`);
+ALTER TABLE `USER_PROFILE_PHONE` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
+ALTER TABLE `NSF_DEMOGRAPHIC_DISABILITY` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
+ALTER TABLE `NSF_DEMOGRAPHIC_ETHNICITY` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
+ALTER TABLE `NSF_DEMOGRAPHIC_RACE` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
+ALTER TABLE `NSF_DEMOGRAPHIC` CHANGE `GENDER` `GENDER` varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE_EMAIL` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE_LABELED_URI` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE_LABELED_URI` CHANGE `LABELED_URI` `LABELED_URI` varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE_NATIONALITY` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE_NATIONALITY` CHANGE `NATIONALITY` `NATIONALITY` varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE_PHONE` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE_PHONE` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`PHONE`);
+ALTER TABLE `USER_PROFILE` CHANGE `CREATION_TIME` `CREATION_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE `USER_PROFILE` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(255) NOT NULL;
+ALTER TABLE `USER_PROFILE` CHANGE `LAST_ACCESS_TIME` `LAST_ACCESS_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
+ALTER TABLE `USER_PROFILE` CHANGE `USER_ID` `USER_ID` varchar(255) NOT NULL;
+set FOREIGN_KEY_CHECKS=1;
diff --git a/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/replicaCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/replicaCatalog_schema_delta.sql
new file mode 100644
index 0000000..b075d32
--- /dev/null
+++ b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/replicaCatalog_schema_delta.sql
@@ -0,0 +1,46 @@
+--
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you 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.
+--
+
+use replica_catalog;
+
+-- AIRAVATA-2872: NOT NULL foreign key columsn
+set FOREIGN_KEY_CHECKS=0;
+alter table DATA_PRODUCT_METADATA modify column PRODUCT_URI VARCHAR(255) NOT NULL;
+alter table DATA_REPLICA_METADATA modify column REPLICA_ID VARCHAR(255) NOT NULL;
+set FOREIGN_KEY_CHECKS=1;
+
+-- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
+-- somehow these workflow tables got created in the replica_catalog schema
+DROP TABLE IF EXISTS `PORT`;
+DROP TABLE IF EXISTS `WORKFLOW_OUTPUT`;
+DROP TABLE IF EXISTS `WORKFLOW_STATUS`;
+DROP TABLE IF EXISTS `WORKFLOW_INPUT`;
+DROP TABLE IF EXISTS `NODE`;
+DROP TABLE IF EXISTS `COMPONENT_STATUS`;
+DROP TABLE IF EXISTS `EDGE`;
+DROP TABLE IF EXISTS `WORKFLOW`;
+set FOREIGN_KEY_CHECKS=0;
+ALTER TABLE `DATA_PRODUCT` CHANGE `PRODUCT_TYPE` `PRODUCT_TYPE` varchar(10) DEFAULT NULL;
+ALTER TABLE `DATA_REPLICA_LOCATION` CHANGE `REPLICA_LOCATION_CATEGORY` `REPLICA_LOCATION_CATEGORY` varchar(26) DEFAULT NULL;
+ALTER TABLE `DATA_REPLICA_LOCATION` CHANGE `REPLICA_PERSISTENT_TYPE` `REPLICA_PERSISTENT_TYPE` varchar(10) DEFAULT NULL;
+set FOREIGN_KEY_CHECKS=1;
+
+-- AIRAVATA-3280: Widen FILE_PATH to accommodate longer file paths
+ALTER TABLE `DATA_REPLICA_LOCATION` MODIFY COLUMN `FILE_PATH` VARCHAR(1024);
diff --git a/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/sharingCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/sharingCatalog_schema_delta.sql
new file mode 100644
index 0000000..33d093f
--- /dev/null
+++ b/modules/registry/release-migration-scripts/0.18-0.19/DeltaScripts/sharingCatalog_schema_delta.sql
@@ -0,0 +1,48 @@
+--
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you 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.
+--
+
+use sharing_catalog;
+
+-- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
+CREATE TABLE IF NOT EXISTS GROUP_ADMIN (
+  ADMIN_ID VARCHAR(255) NOT NULL,
+  GROUP_ID VARCHAR(255) NOT NULL,
+  DOMAIN_ID VARCHAR(255) NOT NULL,
+  PRIMARY KEY (ADMIN_ID, GROUP_ID, DOMAIN_ID),
+  FOREIGN KEY (ADMIN_ID, DOMAIN_ID) REFERENCES SHARING_USER(USER_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
+)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
+
+ALTER TABLE `GROUP_ADMIN` ADD CONSTRAINT `GROUP_ADMIN_ibfk_1` FOREIGN KEY IF NOT EXISTS (`ADMIN_ID`, `DOMAIN_ID`) REFERENCES `SHARING_USER` (`USER_ID`, `DOMAIN_ID`) ON DELETE CASCADE ON UPDATE NO ACTION;
+ALTER TABLE `GROUP_ADMIN` ADD KEY IF NOT EXISTS `ADMIN_ID` (`ADMIN_ID`,`DOMAIN_ID`);
+
+-- Some SINGLE_USER groups were incorrectly created as MULTI_USER
+update USER_GROUP set GROUP_CARDINALITY = 'SINGLE_USER' where GROUP_CARDINALITY = 'MULTI_USER' and OWNER_ID = GROUP_ID;
+
+-- AIRAVATA-3238: add INITIAL_USER_GROUP_ID to DOMAIN
+ALTER TABLE DOMAIN ADD COLUMN IF NOT EXISTS INITIAL_USER_GROUP_ID varchar(255);
+ALTER TABLE DOMAIN ADD CONSTRAINT `DOMAIN_INITIAL_USER_GROUP_ID_FK` FOREIGN KEY IF NOT EXISTS (INITIAL_USER_GROUP_ID, DOMAIN_ID) REFERENCES USER_GROUP(GROUP_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION;
+
+-- AIRAVATA-3303 Slashes in experiment id
+set FOREIGN_KEY_CHECKS=0;
+
+update SHARING set ENTITY_ID = REPLACE(ENTITY_ID, "/", "_") where ENTITY_ID in (select ENTITY_ID from ENTITY where ENTITY_ID like '%/%' and ENTITY_TYPE_ID like '%:EXPERIMENT');
+update ENTITY set ENTITY_ID = REPLACE(ENTITY_ID, "/", "_") where ENTITY_ID like '%/%' and ENTITY_TYPE_ID like '%:EXPERIMENT';
+
+set FOREIGN_KEY_CHECKS=1;
diff --git a/modules/registry/release-migration-scripts/next/DeltaScripts/appCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/next/DeltaScripts/appCatalog_schema_delta.sql
index 8600fbb..8092f44 100644
--- a/modules/registry/release-migration-scripts/next/DeltaScripts/appCatalog_schema_delta.sql
+++ b/modules/registry/release-migration-scripts/next/DeltaScripts/appCatalog_schema_delta.sql
@@ -20,289 +20,7 @@
 
 use app_catalog;
 
--- AIRAVATA-2768
-alter table APPLICATION_INPUT modify METADATA VARCHAR(4096);
-
--- AIRAVATA-2758
--- Note: this doesn't really represent a schema change, rather some legacy database instances improperly had created these columns as NOT NULL
-alter table COMPUTE_RESOURCE modify column CREATION_TIME TIMESTAMP DEFAULT NOW() null;
-alter table COMPUTE_RESOURCE modify column CPUS_PER_NODE int default 0 null;
-alter table COMPUTE_RESOURCE modify column DEFAULT_NODE_COUNT int default 0 null;
-alter table COMPUTE_RESOURCE modify column DEFAULT_CPU_COUNT int default 0 null;
-alter table COMPUTE_RESOURCE modify column DEFAULT_WALLTIME int default 0 null;
-alter table COMPUTE_RESOURCE modify column UPDATE_TIME timestamp default '0000-00-00 00:00:00' null;
-
--- AIRAVATA-2827: OpenJPA 2.4.3 upgrade, convert BIT -> TINYINT(1)
-alter table APPLICATION_OUTPUT modify column OUTPUT_STREAMING tinyint(1);
-alter table APPLICATION_INTERFACE modify column ARCHIVE_WORKING_DIRECTORY tinyint(1);
-alter table APPLICATION_INTERFACE modify column HAS_OPTIONAL_FILE_INPUTS tinyint(1);
-alter table APPLICATION_DEPLOYMENT modify column EDITABLE_BY_USER tinyint(1);
-alter table BATCH_QUEUE modify column IS_DEFAULT_QUEUE tinyint(1);
-alter table COMPUTE_RESOURCE modify column GATEWAY_USAGE_REPORTING tinyint(1);
-alter table USER_COMPUTE_RESOURCE_PREFERENCE modify column VALIDATED tinyint(1) default 0;
-
--- AIRAVATA-2872: NOT NULL foreign key columsn
-set FOREIGN_KEY_CHECKS=0;
-alter table HOST_ALIAS modify column RESOURCE_ID VARCHAR(255) NOT NULL;
-alter table HOST_IPADDRESS modify column RESOURCE_ID VARCHAR(255) NOT NULL;
-alter table GSISSH_EXPORT modify column SUBMISSION_ID VARCHAR(255) NOT NULL;
-alter table GSISSH_PREJOBCOMMAND modify column SUBMISSION_ID VARCHAR(255) NOT NULL;
-alter table GSISSH_POSTJOBCOMMAND modify column SUBMISSION_ID VARCHAR(255) NOT NULL;
-alter table GLOBUS_GK_ENDPOINT modify column SUBMISSION_ID VARCHAR(255) NOT NULL;
-alter table APPLICATION_DEPLOYMENT modify column APP_MODULE_ID VARCHAR(255) NOT NULL;
-alter table APPLICATION_DEPLOYMENT modify column COMPUTE_HOSTID VARCHAR(255) NOT NULL;
-alter table PREJOB_COMMAND modify column APPDEPLOYMENT_ID VARCHAR(255) NOT NULL;
-alter table POSTJOB_COMMAND modify column APPDEPLOYMENT_ID VARCHAR(255) NOT NULL;
-alter table LIBRARY_PREPAND_PATH modify column DEPLOYMENT_ID VARCHAR(255) NOT NULL;
-alter table LIBRARY_APEND_PATH modify column DEPLOYMENT_ID VARCHAR(255) NOT NULL;
-alter table APP_ENVIRONMENT modify column DEPLOYMENT_ID VARCHAR(255) NOT NULL;
-alter table APP_MODULE_MAPPING modify column INTERFACE_ID VARCHAR(255) NOT NULL;
-alter table APP_MODULE_MAPPING modify column MODULE_ID VARCHAR(255) NOT NULL;
-alter table APPLICATION_INPUT modify column INTERFACE_ID VARCHAR(255) NOT NULL;
-alter table APPLICATION_OUTPUT modify column INTERFACE_ID VARCHAR(255) NOT NULL;
-alter table COMPUTE_RESOURCE_PREFERENCE modify column GATEWAY_ID VARCHAR(255) NOT NULL;
-alter table COMPUTE_RESOURCE_PREFERENCE modify column RESOURCE_ID VARCHAR(255) NOT NULL;
-alter table SSH_ACCOUNT_PROVISIONER_CONFIG modify column GATEWAY_ID VARCHAR(255) NOT NULL;
-alter table SSH_ACCOUNT_PROVISIONER_CONFIG modify column RESOURCE_ID VARCHAR(255) NOT NULL;
--- alter table DATA_STORAGE_PREFERENCE modify column GATEWAY_ID VARCHAR(255) NOT NULL;
--- alter table WORKFLOW_INPUT modify column WF_TEMPLATE_ID VARCHAR(255) NOT NULL;
--- alter table WORKFLOW_OUTPUT modify column WF_TEMPLATE_ID VARCHAR(255) NOT NULL;
-set FOREIGN_KEY_CHECKS=1;
-
--- AIRAVATA-2872: add missing column
-alter table APP_ENVIRONMENT add column IF NOT EXISTS ENV_ORDER INTEGER;
-
--- AIRAVATA-2939: add NOT NULL constraints to DB fields that aren't in data model
-alter table APPLICATION_MODULE modify column GATEWAY_ID VARCHAR(255) NOT NULL;
-alter table APPLICATION_MODULE modify column CREATION_TIME TIMESTAMP DEFAULT NOW() NOT NULL;
-alter table APPLICATION_MODULE modify column UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL;
-alter table APPLICATION_DEPLOYMENT modify column CREATION_TIME TIMESTAMP DEFAULT NOW() NOT NULL;
-alter table APPLICATION_DEPLOYMENT modify column UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL;
-alter table APPLICATION_DEPLOYMENT modify column GATEWAY_ID VARCHAR(255) NOT NULL;
-alter table APPLICATION_INTERFACE modify column GATEWAY_ID VARCHAR(255) NOT NULL;
-alter table APPLICATION_INTERFACE modify column CREATION_TIME TIMESTAMP DEFAULT NOW() NOT NULL;
-alter table APPLICATION_INTERFACE modify column UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL;
-
--- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
-ALTER TABLE `JOB_MANAGER_COMMAND` ENGINE = InnoDB;
-ALTER TABLE `HOST_IPADDRESS` ENGINE = InnoDB;
-ALTER TABLE `GSISSH_SUBMISSION` ENGINE = InnoDB;
-ALTER TABLE `HOST_ALIAS` ENGINE = InnoDB;
-ALTER TABLE `JOB_SUBMISSION_INTERFACE` ENGINE = InnoDB;
-ALTER TABLE `LIBRARY_PREPAND_PATH` ENGINE = InnoDB;
-ALTER TABLE `LOCAL_SUBMISSION` ENGINE = InnoDB;
--- ALTER TABLE `DATA_STORAGE_PREFERENCE` ENGINE = InnoDB;
-ALTER TABLE `COMPUTE_RESOURCE` ENGINE = InnoDB;
-ALTER TABLE `COMPUTE_RESOURCE_FILE_SYSTEM` ENGINE = InnoDB;
-ALTER TABLE `LIBRARY_APEND_PATH` ENGINE = InnoDB;
-ALTER TABLE `GSISSH_EXPORT` ENGINE = InnoDB;
-ALTER TABLE `GLOBUS_GK_ENDPOINT` ENGINE = InnoDB;
-ALTER TABLE `GATEWAY_PROFILE` ENGINE = InnoDB;
-ALTER TABLE `CONFIGURATION` ENGINE = InnoDB;
-ALTER TABLE `DATA_MOVEMENT_INTERFACE` ENGINE = InnoDB;
-ALTER TABLE `GLOBUS_SUBMISSION` ENGINE = InnoDB;
-ALTER TABLE `GRIDFTP_DATA_MOVEMENT` ENGINE = InnoDB;
-ALTER TABLE `GSISSH_POSTJOBCOMMAND` ENGINE = InnoDB;
-ALTER TABLE `POSTJOB_COMMAND` ENGINE = InnoDB;
-ALTER TABLE `GRIDFTP_ENDPOINT` ENGINE = InnoDB;
-ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` ENGINE = InnoDB;
-ALTER TABLE `GSISSH_PREJOBCOMMAND` ENGINE = InnoDB;
-ALTER TABLE `LOCAL_DATA_MOVEMENT` ENGINE = InnoDB;
-ALTER TABLE `APPLICATION_INPUT` ENGINE = InnoDB;
-ALTER TABLE `APP_ENVIRONMENT` ENGINE = InnoDB;
-ALTER TABLE `APP_MODULE_MAPPING` ENGINE = InnoDB;
-ALTER TABLE `APPLICATION_OUTPUT` ENGINE = InnoDB;
-ALTER TABLE `APPLICATION_MODULE` ENGINE = InnoDB;
-ALTER TABLE `UNICORE_DATAMOVEMENT` ENGINE = InnoDB;
-ALTER TABLE `APPLICATION_INTERFACE` ENGINE = InnoDB;
-ALTER TABLE `UNICORE_SUBMISSION` ENGINE = InnoDB;
--- ALTER TABLE `WORKFLOW_INPUT` ENGINE = InnoDB;
--- ALTER TABLE `WORKFLOW` ENGINE = InnoDB;
-ALTER TABLE `SSH_JOB_SUBMISSION` ENGINE = InnoDB;
--- ALTER TABLE `WORKFLOW_OUTPUT` ENGINE = InnoDB;
-ALTER TABLE `APPLICATION_DEPLOYMENT` ENGINE = InnoDB;
-ALTER TABLE `RESOURCE_JOB_MANAGER` ENGINE = InnoDB;
-ALTER TABLE `PREJOB_COMMAND` ENGINE = InnoDB;
-ALTER TABLE `SCP_DATA_MOVEMENT` ENGINE = InnoDB;
-ALTER TABLE `BATCH_QUEUE` ENGINE = InnoDB;
-
--- Some of these column changes involve FK columns so need to temporarily turn off FK checks
-set FOREIGN_KEY_CHECKS=0;
-ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `RESERVATION_END_TIME` `RESERVATION_END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
-ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `PREFERED_JOB_SUB_PROTOCOL` `PREFERED_JOB_SUB_PROTOCOL` varchar(255) DEFAULT NULL;
-ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `PREFERED_DATA_MOVE_PROTOCOL` `PREFERED_DATA_MOVE_PROTOCOL` varchar(255) DEFAULT NULL;
-ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `RESERVATION_START_TIME` `RESERVATION_START_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
-
-ALTER TABLE `STORAGE_INTERFACE` CHANGE `CREATION_TIME` `CREATION_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE `STORAGE_INTERFACE` CHANGE `DATA_MOVEMENT_PROTOCOL` `DATA_MOVEMENT_PROTOCOL` varchar(255) NOT NULL;
-ALTER TABLE `STORAGE_INTERFACE` CHANGE `UPDATE_TIME` `UPDATE_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
-
-ALTER TABLE `LOCAL_SUBMISSION` CHANGE `SECURITY_PROTOCOL` `SECURITY_PROTOCOL` varchar(255) NOT NULL;
-
-ALTER TABLE `PARSER` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(255) NOT NULL;
-ALTER TABLE `PARSER` DROP IF EXISTS `PARSER_INFO_ID`;
-
-ALTER TABLE `PARSING_TEMPLATE` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(255) NOT NULL;
-
-ALTER TABLE `GROUP_RESOURCE_PROFILE` CHANGE `UPDATE_TIME` `UPDATE_TIME` bigint(20) NOT NULL;
-ALTER TABLE `GROUP_RESOURCE_PROFILE` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(255) NOT NULL;
-ALTER TABLE `GROUP_RESOURCE_PROFILE` CHANGE `CREATION_TIME` `CREATION_TIME` bigint(20) NOT NULL;
-
-ALTER TABLE `PARSING_TEMPLATE_INPUT` CHANGE `TARGET_PARSER_INPUT_ID` `TARGET_PARSER_INPUT_ID` varchar(255) NOT NULL;
-
-ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` CHANGE `SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO` `SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO` varchar(1000) DEFAULT NULL;
-
-ALTER TABLE `BATCH_QUEUE` CHANGE `QUEUE_SPECIFIC_MACROS` `QUEUE_SPECIFIC_MACROS` varchar(255) DEFAULT NULL;
-ALTER TABLE `BATCH_QUEUE` CHANGE `DEFAULT_WALLTIME` `DEFAULT_WALLTIME` int(11) DEFAULT NULL;
-
-ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` CHANGE `COMPUTE_RESOURCE_ID` `COMPUTE_RESOURCE_ID` varchar(255) NOT NULL;
-ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` CHANGE `GROUP_RESOURCE_PROFILE_ID` `GROUP_RESOURCE_PROFILE_ID` varchar(255) NOT NULL;
-ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` CHANGE `QUEUE_NAME` `QUEUE_NAME` varchar(255) NOT NULL;
-
-ALTER TABLE `APPLICATION_OUTPUT` CHANGE `OUTPUT_STREAMING` `OUTPUT_STREAMING` smallint(6) DEFAULT NULL;
-
-ALTER TABLE `APPLICATION_INTERFACE` CHANGE `ARCHIVE_WORKING_DIRECTORY` `ARCHIVE_WORKING_DIRECTORY` smallint(6) DEFAULT NULL;
-
-ALTER TABLE `COMPUTE_RESOURCE` CHANGE `CPUS_PER_NODE` `CPUS_PER_NODE` int(11) DEFAULT NULL;
-ALTER TABLE `COMPUTE_RESOURCE` CHANGE `CREATION_TIME` `CREATION_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE `COMPUTE_RESOURCE` CHANGE `DEFAULT_NODE_COUNT` `DEFAULT_NODE_COUNT` int(11) DEFAULT NULL;
-ALTER TABLE `COMPUTE_RESOURCE` CHANGE `UPDATE_TIME` `UPDATE_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
-ALTER TABLE `COMPUTE_RESOURCE` CHANGE `DEFAULT_CPU_COUNT` `DEFAULT_CPU_COUNT` int(11) DEFAULT NULL;
-ALTER TABLE `COMPUTE_RESOURCE` CHANGE `DEFAULT_WALLTIME` `DEFAULT_WALLTIME` int(11) DEFAULT NULL;
-ALTER TABLE `COMPUTE_RESOURCE` CHANGE `GATEWAY_USAGE_MODULE_LOAD_CMD` `GATEWAY_USAGE_MODULE_LOAD_CMD` varchar(500) DEFAULT NULL;
-
-ALTER TABLE `COMPUTE_RESOURCE_POLICY` CHANGE `GROUP_RESOURCE_PROFILE_ID` `GROUP_RESOURCE_PROFILE_ID` varchar(255) NOT NULL;
-ALTER TABLE `COMPUTE_RESOURCE_POLICY` CHANGE `COMPUTE_RESOURCE_ID` `COMPUTE_RESOURCE_ID` varchar(255) NOT NULL;
-
-ALTER TABLE `APPLICATION_INPUT` CHANGE `IS_READ_ONLY` `IS_READ_ONLY` smallint(6) DEFAULT NULL;
-
-ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` CHANGE `RESOURCE_POLICY_ID` `RESOURCE_POLICY_ID` varchar(255) NOT NULL;
-ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` CHANGE `QUEUE_NAME` `QUEUE_NAME` varchar(255) NOT NULL;
-
-ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` CHANGE `SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO` `SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO` varchar(1000) DEFAULT NULL;
-ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` CHANGE `RESERVATION_START_TIME` `RESERVATION_START_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
-ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` CHANGE `RESERVATION_END_TIME` `RESERVATION_END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
-
-ALTER TABLE `APPLICATION_DEPLOYMENT` CHANGE `DEFAULT_WALLTIME` `DEFAULT_WALLTIME` int(11) DEFAULT NULL;
-ALTER TABLE `APPLICATION_DEPLOYMENT` CHANGE `DEFAULT_CPU_COUNT` `DEFAULT_CPU_COUNT` int(11) DEFAULT NULL;
-ALTER TABLE `APPLICATION_DEPLOYMENT` CHANGE `DEFAULT_NODE_COUNT` `DEFAULT_NODE_COUNT` int(11) DEFAULT NULL;
-set FOREIGN_KEY_CHECKS=1;
-
-ALTER TABLE `GATEWAY_PROFILE` DROP IF EXISTS `DATA_STORAGE_HOST`;
-
--- This table was accidentally created by DB init script, but entity was mapped to STORAGE_PREFERENCE
-DROP TABLE IF EXISTS `DATA_STORAGE_PREFERENCE`;
-
--- DROP TABLE IF EXISTS `WORKFLOW`, `WORKFLOW_INPUT`, `WORKFLOW_OUTPUT`;
-
--- keys indexes
-ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` ADD KEY IF NOT EXISTS `COMPUTE_RESOURCE_ID` (`COMPUTE_RESOURCE_ID`);
-ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` ADD KEY IF NOT EXISTS `GROUP_RESOURCE_PROFILE_ID` (`GROUP_RESOURCE_PROFILE_ID`);
-ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` DROP INDEX IF EXISTS `I_BTCHLCY_GROUPRESOURCEPROFILE`;
-ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` ADD PRIMARY KEY IF NOT EXISTS (`RESOURCE_POLICY_ID`,`QUEUE_NAME`);
-ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` DROP INDEX IF EXISTS `I_CMPT_QS_RESOURCE_POLICY_ID`;
-ALTER TABLE `COMPUTE_RESOURCE_POLICY` ADD KEY IF NOT EXISTS `COMPUTE_RESOURCE_ID` (`COMPUTE_RESOURCE_ID`);
-ALTER TABLE `COMPUTE_RESOURCE_POLICY` ADD KEY IF NOT EXISTS `GROUP_RESOURCE_PROFILE_ID` (`GROUP_RESOURCE_PROFILE_ID`);
-ALTER TABLE `COMPUTE_RESOURCE_POLICY` DROP INDEX IF EXISTS `I_CMPTLCY_GROUPRESOURCEPROFILE`;
-ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` ADD KEY IF NOT EXISTS `GROUP_RESOURCE_PROFILE_ID` (`GROUP_RESOURCE_PROFILE_ID`);
-ALTER TABLE `GROUP_RESOURCE_PROFILE` ADD UNIQUE KEY IF NOT EXISTS `GATEWAY_ID` (`GATEWAY_ID`,`GROUP_RESOURCE_PROFILE_NAME`);
-ALTER TABLE `GRP_SSH_ACC_PROV_CONFIG` ADD KEY IF NOT EXISTS `RESOURCE_ID` (`RESOURCE_ID`,`GROUP_RESOURCE_PROFILE_ID`);
-ALTER TABLE `GRP_SSH_ACC_PROV_CONFIG` DROP INDEX IF EXISTS `CONFIG_NAME`;
-ALTER TABLE `PARALLELISM_COMMAND` ADD PRIMARY KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`,`COMMAND_TYPE`);
-ALTER TABLE `PARALLELISM_COMMAND` DROP INDEX IF EXISTS `COMMAND_TYPE`;
-ALTER TABLE `PARSING_TEMPLATE_INPUT` ADD KEY IF NOT EXISTS `TARGET_PARSER_INPUT_ID` (`TARGET_PARSER_INPUT_ID`);
-ALTER TABLE `PARSING_TEMPLATE_INPUT` DROP INDEX IF EXISTS `PARSER_INPUT_ID`;
-ALTER TABLE `POSTJOB_COMMAND` ADD PRIMARY KEY IF NOT EXISTS (`APPDEPLOYMENT_ID`,`COMMAND`);
-ALTER TABLE `POSTJOB_COMMAND` DROP INDEX IF EXISTS `COMMAND`;
-ALTER TABLE `SSH_ACCOUNT_PROVISIONER_CONFIG` ADD PRIMARY KEY IF NOT EXISTS (`GATEWAY_ID`,`RESOURCE_ID`,`CONFIG_NAME`);
-ALTER TABLE `SSH_ACCOUNT_PROVISIONER_CONFIG` DROP INDEX IF EXISTS `CONFIG_NAME`;
-ALTER TABLE `STORAGE_INTERFACE` ADD PRIMARY KEY IF NOT EXISTS (`STORAGE_RESOURCE_ID`,`DATA_MOVEMENT_INTERFACE_ID`);
-ALTER TABLE `STORAGE_INTERFACE` DROP INDEX IF EXISTS `DATA_MOVEMENT_INTERFACE_ID`;
-
--- Some of these FKs refer to non-existent data. Rather than cleaning up the orphaned data, we'll just turn off FK checks.
-set FOREIGN_KEY_CHECKS=0;
--- create table delete_ids as select DEPLOYMENT_ID from APP_ENVIRONMENT a where NOT EXISTS (select 1 from APPLICATION_DEPLOYMENT where DEPLOYMENT_ID = ae.DEPLOYMENT_ID);
--- delete from APP_ENVIRONMENT where DEPLOYMENT_ID in (select DEPLOYMENT_ID from delete_ids);
-ALTER TABLE `APP_ENVIRONMENT` ADD CONSTRAINT `APP_ENVIRONMENT_ibfk_1` FOREIGN KEY IF NOT EXISTS (`DEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
--- drop table delete_ids;
-
--- create table delete_ids as select INTERFACE_ID from APP_MODULE_MAPPING a where NOT EXISTS (select 1 from APPLICATION_INTERFACE where INTERFACE_ID = a.INTERFACE_ID);
--- delete from APP_MODULE_MAPPING where INTERFACE_ID in (select INTERFACE_ID from delete_ids);
-ALTER TABLE `APP_MODULE_MAPPING` ADD CONSTRAINT `APP_MODULE_MAPPING_ibfk_1` FOREIGN KEY IF NOT EXISTS (`INTERFACE_ID`) REFERENCES `APPLICATION_INTERFACE` (`INTERFACE_ID`) ON DELETE CASCADE;
--- drop table delete_ids;
-
--- create table delete_ids as select MODULE_ID from APP_MODULE_MAPPING a where NOT EXISTS (select 1 from APPLICATION_MODULE where MODULE_ID = a.MODULE_ID);
--- delete from APP_MODULE_MAPPING where MODULE_ID in (select MODULE_ID from delete_ids);
-ALTER TABLE `APP_MODULE_MAPPING` ADD CONSTRAINT `APP_MODULE_MAPPING_ibfk_2` FOREIGN KEY IF NOT EXISTS (`MODULE_ID`) REFERENCES `APPLICATION_MODULE` (`MODULE_ID`) ON DELETE CASCADE;
--- drop table delete_ids;
-
--- create table delete_ids as select COMPUTE_HOSTID from APPLICATION_DEPLOYMENT a where NOT EXISTS (select 1 from COMPUTE_RESOURCE where RESOURCE_ID = a.COMPUTE_HOSTID);
--- delete from APPLICATION_DEPLOYMENT where COMPUTE_HOSTID in (select COMPUTE_HOSTID from delete_ids);
-ALTER TABLE `APPLICATION_DEPLOYMENT` ADD CONSTRAINT `APPLICATION_DEPLOYMENT_ibfk_1` FOREIGN KEY IF NOT EXISTS (`COMPUTE_HOSTID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
--- drop table delete_ids;
-
--- create table delete_ids as select APP_MODULE_ID from APPLICATION_DEPLOYMENT a where NOT EXISTS (select 1 from APPLICATION_MODULE where MODULE_ID = a.APP_MODULE_ID);
--- delete from APPLICATION_DEPLOYMENT where APP_MODULE_ID in (select APP_MODULE_ID from delete_ids);
-ALTER TABLE `APPLICATION_DEPLOYMENT` ADD CONSTRAINT `APPLICATION_DEPLOYMENT_ibfk_2` FOREIGN KEY IF NOT EXISTS (`APP_MODULE_ID`) REFERENCES `APPLICATION_MODULE` (`MODULE_ID`) ON DELETE CASCADE;
--- drop table delete_ids;
-
--- create table delete_ids as select INTERFACE_ID from APPLICATION_INPUT a where NOT EXISTS (select 1 from APPLICATION_INTERFACE where INTERFACE_ID = a.INTERFACE_ID);
--- delete from APPLICATION_INPUT where INTERFACE_ID in (select INTERFACE_ID from delete_ids);
-ALTER TABLE `APPLICATION_INPUT` ADD CONSTRAINT `APPLICATION_INPUT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`INTERFACE_ID`) REFERENCES `APPLICATION_INTERFACE` (`INTERFACE_ID`) ON DELETE CASCADE;
--- drop table delete_ids;
-
--- create table delete_ids as select INTERFACE_ID from APPLICATION_OUTPUT a where NOT EXISTS (select 1 from APPLICATION_INTERFACE where INTERFACE_ID = a.INTERFACE_ID);
--- delete from APPLICATION_OUTPUT where INTERFACE_ID in (select INTERFACE_ID from delete_ids);
-ALTER TABLE `APPLICATION_OUTPUT` ADD CONSTRAINT `APPLICATION_OUTPUT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`INTERFACE_ID`) REFERENCES `APPLICATION_INTERFACE` (`INTERFACE_ID`) ON DELETE CASCADE;
--- drop table delete_ids;
-
-ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` ADD CONSTRAINT `BATCH_QUEUE_RESOURCE_POLICY_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `BATCH_QUEUE_RESOURCE_POLICY` ADD CONSTRAINT `BATCH_QUEUE_RESOURCE_POLICY_ibfk_2` FOREIGN KEY IF NOT EXISTS(`GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_RESOURCE_PROFILE` (`GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE;
-ALTER TABLE `BATCH_QUEUE` ADD CONSTRAINT `BATCH_QUEUE_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `COMPUTE_RESOURCE_FILE_SYSTEM` ADD CONSTRAINT `COMPUTE_RESOURCE_FILE_SYSTEM_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `COMPUTE_RESOURCE_POLICY_QUEUES` ADD CONSTRAINT `COMPUTE_RESOURCE_POLICY_QUEUES_ibfk_1` FOREIGN KEY IF NOT EXISTS(`RESOURCE_POLICY_ID`) REFERENCES `COMPUTE_RESOURCE_POLICY` (`RESOURCE_POLICY_ID`) ON DELETE CASCADE;
-ALTER TABLE `COMPUTE_RESOURCE_POLICY` ADD CONSTRAINT `COMPUTE_RESOURCE_POLICY_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `COMPUTE_RESOURCE_POLICY` ADD CONSTRAINT `COMPUTE_RESOURCE_POLICY_ibfk_2` FOREIGN KEY IF NOT EXISTS(`GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_RESOURCE_PROFILE` (`GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE;
-ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` ADD CONSTRAINT `COMPUTE_RESOURCE_PREFERENCE_ibfk_1` FOREIGN KEY IF NOT EXISTS(`RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `COMPUTE_RESOURCE_PREFERENCE` ADD CONSTRAINT `COMPUTE_RESOURCE_PREFERENCE_ibfk_2` FOREIGN KEY IF NOT EXISTS(`GATEWAY_ID`) REFERENCES `GATEWAY_PROFILE` (`GATEWAY_ID`) ON DELETE CASCADE;
-ALTER TABLE `DATA_MOVEMENT_INTERFACE` ADD CONSTRAINT `DATA_MOVEMENT_INTERFACE_ibfk_1` FOREIGN KEY IF NOT EXISTS(`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `GLOBUS_GK_ENDPOINT` ADD CONSTRAINT `GLOBUS_GK_ENDPOINT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`SUBMISSION_ID`) REFERENCES `GLOBUS_SUBMISSION` (`SUBMISSION_ID`) ON DELETE CASCADE;
-ALTER TABLE `GRIDFTP_ENDPOINT` ADD CONSTRAINT `GRIDFTP_ENDPOINT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`DATA_MOVEMENT_INTERFACE_ID`) REFERENCES `GRIDFTP_DATA_MOVEMENT` (`DATA_MOVEMENT_INTERFACE_ID`) ON DELETE CASCADE;
-ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` ADD CONSTRAINT `GROUP_COMPUTE_RESOURCE_PREFERENCE_ibfk_1` FOREIGN KEY IF NOT EXISTS(`RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `GROUP_COMPUTE_RESOURCE_PREFERENCE` ADD CONSTRAINT `GROUP_COMPUTE_RESOURCE_PREFERENCE_ibfk_2` FOREIGN KEY IF NOT EXISTS(`GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_RESOURCE_PROFILE` (`GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE;
-ALTER TABLE `GRP_SSH_ACC_PROV_CONFIG` ADD CONSTRAINT `GRP_SSH_ACC_PROV_CONFIG_ibfk_1` FOREIGN KEY IF NOT EXISTS(`RESOURCE_ID`, `GROUP_RESOURCE_PROFILE_ID`) REFERENCES `GROUP_COMPUTE_RESOURCE_PREFERENCE` (`RESOURCE_ID`, `GROUP_RESOURCE_PROFILE_ID`) ON DELETE CASCADE;
-ALTER TABLE `GSISSH_EXPORT` ADD CONSTRAINT `GSISSH_EXPORT_ibfk_1` FOREIGN KEY IF NOT EXISTS(`SUBMISSION_ID`) REFERENCES `GSISSH_SUBMISSION` (`SUBMISSION_ID`) ON DELETE CASCADE;
-ALTER TABLE `GSISSH_POSTJOBCOMMAND` ADD CONSTRAINT `GSISSH_POSTJOBCOMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS(`SUBMISSION_ID`) REFERENCES `GSISSH_SUBMISSION` (`SUBMISSION_ID`) ON DELETE CASCADE;
-ALTER TABLE `GSISSH_PREJOBCOMMAND` ADD CONSTRAINT `GSISSH_PREJOBCOMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS(`SUBMISSION_ID`) REFERENCES `GSISSH_SUBMISSION` (`SUBMISSION_ID`) ON DELETE CASCADE;
-ALTER TABLE `HOST_ALIAS` ADD CONSTRAINT `HOST_ALIAS_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `HOST_IPADDRESS` ADD CONSTRAINT `HOST_IPADDRESS_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `JOB_MANAGER_COMMAND` ADD CONSTRAINT `JOB_MANAGER_COMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`) REFERENCES `RESOURCE_JOB_MANAGER` (`RESOURCE_JOB_MANAGER_ID`) ON DELETE CASCADE;
-ALTER TABLE `JOB_SUBMISSION_INTERFACE` ADD CONSTRAINT `JOB_SUBMISSION_INTERFACE_ibfk_1` FOREIGN KEY IF NOT EXISTS (`COMPUTE_RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE` (`RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `LIBRARY_APEND_PATH` ADD CONSTRAINT `LIBRARY_APEND_PATH_ibfk_1` FOREIGN KEY IF NOT EXISTS (`DEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
-ALTER TABLE `LIBRARY_PREPAND_PATH` ADD CONSTRAINT `LIBRARY_PREPAND_PATH_ibfk_1` FOREIGN KEY IF NOT EXISTS (`DEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
-ALTER TABLE `LOCAL_SUBMISSION` ADD CONSTRAINT `LOCAL_SUBMISSION_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`) REFERENCES `RESOURCE_JOB_MANAGER` (`RESOURCE_JOB_MANAGER_ID`);
-ALTER TABLE `MODULE_LOAD_CMD` ADD CONSTRAINT `MODULE_LOAD_CMD_ibfk_1` FOREIGN KEY IF NOT EXISTS (`APP_DEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
-ALTER TABLE `PARALLELISM_COMMAND` ADD CONSTRAINT `PARALLELISM_COMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`) REFERENCES `RESOURCE_JOB_MANAGER` (`RESOURCE_JOB_MANAGER_ID`) ON DELETE CASCADE;
-ALTER TABLE `POSTJOB_COMMAND` ADD CONSTRAINT `POSTJOB_COMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS (`APPDEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
-ALTER TABLE `PREJOB_COMMAND` ADD CONSTRAINT `PREJOB_COMMAND_ibfk_1` FOREIGN KEY IF NOT EXISTS (`APPDEPLOYMENT_ID`) REFERENCES `APPLICATION_DEPLOYMENT` (`DEPLOYMENT_ID`) ON DELETE CASCADE;
-ALTER TABLE `SSH_ACCOUNT_PROVISIONER_CONFIG` ADD CONSTRAINT `SSH_ACCOUNT_PROVISIONER_CONFIG_ibfk_1` FOREIGN KEY IF NOT EXISTS (`GATEWAY_ID`, `RESOURCE_ID`) REFERENCES `COMPUTE_RESOURCE_PREFERENCE` (`GATEWAY_ID`, `RESOURCE_ID`) ON DELETE CASCADE;
-ALTER TABLE `SSH_JOB_SUBMISSION` ADD CONSTRAINT `SSH_JOB_SUBMISSION_ibfk_1` FOREIGN KEY IF NOT EXISTS (`RESOURCE_JOB_MANAGER_ID`) REFERENCES `RESOURCE_JOB_MANAGER` (`RESOURCE_JOB_MANAGER_ID`);
--- Note: to deal with STORAGE_INTERFACEs that reference non-existent STORAGE_RESOURCEs, use the following to clean up orphans
--- MariaDB [app_catalog]> create table temp1 as select STORAGE_RESOURCE_ID from STORAGE_INTERFACE si where not exists (select 1 from STORAGE_RESOURCE sr where sr.STORAGE_RESOURCE_ID = si.STORAGE_RESOURCE_ID);
--- MariaDB [app_catalog]> delete from STORAGE_INTERFACE where STORAGE_RESOURCE_ID in (select STORAGE_RESOURCE_ID from temp1);
-ALTER TABLE `STORAGE_INTERFACE` ADD CONSTRAINT `STORAGE_INTERFACE_ibfk_1` FOREIGN KEY IF NOT EXISTS (`STORAGE_RESOURCE_ID`) REFERENCES `STORAGE_RESOURCE` (`STORAGE_RESOURCE_ID`) ON DELETE CASCADE;
-set FOREIGN_KEY_CHECKS=1;
-
--- Older tables that no longer exist, or don't exist with those names
-DROP TABLE IF EXISTS `DATA_STORAGE_INTERFACE`;
-DROP TABLE IF EXISTS `GATEWAY_CLIENT_CREDENTIAL`;
-
--- misnamed column. This migration was only needed in development environment where code with old column name was deployed.
--- UPDATE PARSER_CONNECTOR_INPUT set PARSER_OUTPUT_ID = PARENT_OUTPUT_ID;
--- ALTER TABLE `PARSER_CONNECTOR_INPUT` DROP IF EXISTS `PARENT_OUTPUT_ID`;
--- ALTER TABLE `PARSING_TEMPLATE_INPUT` DROP IF EXISTS `PARSER_INPUT_ID`;
-
-ALTER TABLE `UNICORE_DATAMOVEMENT` DROP IF EXISTS `SECURITY_PROTOCOL`;
-
--- AIRAVATA-3029: Add METADATA to APPLICATION_OUTPUT
-ALTER TABLE `APPLICATION_OUTPUT` ADD COLUMN IF NOT EXISTS METADATA VARCHAR(4096);
+-- AIRAVATA-3327: Remove deprecated reservation fields
+alter table GROUP_COMPUTE_RESOURCE_PREFERENCE drop column IF EXISTS RESERVATION;
+alter table GROUP_COMPUTE_RESOURCE_PREFERENCE drop column IF EXISTS RESERVATION_START_TIME;
+alter table GROUP_COMPUTE_RESOURCE_PREFERENCE drop column IF EXISTS RESERVATION_END_TIME;
diff --git a/modules/registry/release-migration-scripts/next/DeltaScripts/credential_store_schema_delta.sql b/modules/registry/release-migration-scripts/next/DeltaScripts/credential_store_schema_delta.sql
index 87f9792..cd4ce1f 100644
--- a/modules/registry/release-migration-scripts/next/DeltaScripts/credential_store_schema_delta.sql
+++ b/modules/registry/release-migration-scripts/next/DeltaScripts/credential_store_schema_delta.sql
@@ -18,15 +18,4 @@
 -- under the License.
 --
 
--- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
 use credential_store;
-
-set FOREIGN_KEY_CHECKS=0;
-ALTER TABLE `CREDENTIALS` CHANGE `TIME_PERSISTED` `TIME_PERSISTED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE `CREDENTIALS` CHANGE `DESCRIPTION` `DESCRIPTION` varchar(500) DEFAULT NULL;
-ALTER TABLE `CREDENTIALS` CHANGE `TOKEN_ID` `TOKEN_ID` varchar(100) NOT NULL;
-ALTER TABLE `COMMUNITY_USER` CHANGE `TOKEN_ID` `TOKEN_ID` varchar(100) NOT NULL;
-ALTER TABLE `COMMUNITY_USER` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(100) NOT NULL;
-ALTER TABLE `COMMUNITY_USER` CHANGE `COMMUNITY_USER_NAME` `COMMUNITY_USER_NAME` varchar(100) NOT NULL;
-ALTER TABLE `CREDENTIALS` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(100) NOT NULL;
-set FOREIGN_KEY_CHECKS=1;
diff --git a/modules/registry/release-migration-scripts/next/DeltaScripts/experimentCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/next/DeltaScripts/experimentCatalog_schema_delta.sql
index bd4b274..256ecf0 100644
--- a/modules/registry/release-migration-scripts/next/DeltaScripts/experimentCatalog_schema_delta.sql
+++ b/modules/registry/release-migration-scripts/next/DeltaScripts/experimentCatalog_schema_delta.sql
@@ -19,85 +19,3 @@
 --
 
 use experiment_catalog;
-
--- AIRAVATA-2768
-alter table EXPERIMENT_INPUT modify METADATA VARCHAR(4096);
-
--- AIRAVATA-2820
-alter table TASK drop column IF EXISTS TASK_INTERNAL_STORE;
-
--- AIRAVATA-2827: OpenJPA 2.4.3 upgrade, convert BIT -> TINYINT(1)
-alter table PROCESS modify column USE_USER_CR_PREF tinyint(1);
-alter table QUEUE_STATUS modify column QUEUE_UP tinyint(1);
-alter table USER_CONFIGURATION_DATA modify column IS_USE_USER_CR_PREF tinyint(1);
-
--- AIRAVATA-2899
-alter table PROCESS_STATUS modify column TIME_OF_STATE_CHANGE TIMESTAMP(6) DEFAULT NOW(6) ON UPDATE NOW(6);
-alter table TASK_STATUS modify column TIME_OF_STATE_CHANGE TIMESTAMP(6) DEFAULT NOW(6) ON UPDATE NOW(6);
-alter table JOB_STATUS modify column TIME_OF_STATE_CHANGE TIMESTAMP(6) DEFAULT NOW(6) ON UPDATE NOW(6);
-
--- AIRAVATA-2872: NOT NULL foreign key columsn
-set FOREIGN_KEY_CHECKS=0;
-alter table USERS modify column GATEWAY_ID VARCHAR(255) NOT NULL;
-alter table GATEWAY_WORKER modify column GATEWAY_ID VARCHAR(255) NOT NULL;
-alter table PROJECT modify column GATEWAY_ID VARCHAR(255) NOT NULL;
-alter table PROJECT_USER modify column PROJECT_ID VARCHAR(255) NOT NULL;
-alter table PROJECT_USER modify column USER_NAME VARCHAR(255) NOT NULL;
-alter table EXPERIMENT modify column PROJECT_ID VARCHAR(255) NOT NULL;
-alter table EXPERIMENT_INPUT modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
-alter table EXPERIMENT_OUTPUT modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
-alter table EXPERIMENT_STATUS modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
-alter table EXPERIMENT_ERROR modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
-alter table USER_CONFIGURATION_DATA modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
-alter table PROCESS modify column EXPERIMENT_ID VARCHAR(255) NOT NULL;
-alter table PROCESS_INPUT modify column PROCESS_ID VARCHAR(255) NOT NULL;
-alter table PROCESS_OUTPUT modify column PROCESS_ID VARCHAR(255) NOT NULL;
-alter table PROCESS_STATUS modify column PROCESS_ID VARCHAR(255) NOT NULL;
-alter table PROCESS_ERROR modify column PROCESS_ID VARCHAR(255) NOT NULL;
-alter table PROCESS_RESOURCE_SCHEDULE modify column PROCESS_ID VARCHAR(255) NOT NULL;
-alter table TASK modify column PARENT_PROCESS_ID VARCHAR(255) NOT NULL;
-alter table TASK_STATUS modify column TASK_ID VARCHAR(255) NOT NULL;
-alter table TASK_ERROR modify column TASK_ID VARCHAR(255) NOT NULL;
-alter table JOB modify column TASK_ID VARCHAR(255) NOT NULL;
-alter table JOB_STATUS modify column TASK_ID VARCHAR(255) NOT NULL;
-alter table JOB_STATUS modify column JOB_ID VARCHAR(255) NOT NULL;
-set FOREIGN_KEY_CHECKS=1;
-
--- AIRAVATA-2953
-alter table PROCESS_INPUT modify column METADATA VARCHAR(4096);
-
--- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
-DROP TABLE IF EXISTS `COMMUNITY_USER`;
-DROP TABLE IF EXISTS `CREDENTIALS`;
-
-ALTER TABLE `EXPERIMENT_INPUT` CHANGE `IS_READ_ONLY` `IS_READ_ONLY` tinyint(1) DEFAULT NULL;
-ALTER TABLE `GATEWAY` CHANGE `REQUEST_CREATION_TIME` `REQUEST_CREATION_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE `NOTIFICATION` CHANGE `CREATION_DATE` `CREATION_DATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
-ALTER TABLE `NOTIFICATION` CHANGE `EXPIRATION_DATE` `EXPIRATION_DATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
-ALTER TABLE `NOTIFICATION` CHANGE `PUBLISHED_DATE` `PUBLISHED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
-ALTER TABLE `PROCESS_INPUT` CHANGE `IS_READ_ONLY` `IS_READ_ONLY` tinyint(1) DEFAULT NULL;
-ALTER TABLE `EXPERIMENT` DROP IF EXISTS `ARCHIVE`;
-ALTER TABLE `GATEWAY` DROP IF EXISTS `GATEWAY_DOMAIN`;
-ALTER TABLE `PROCESS` DROP IF EXISTS `ARCHIVE`;
-
-set FOREIGN_KEY_CHECKS=0;
-ALTER TABLE `GATEWAY_WORKER` DROP FOREIGN KEY IF EXISTS `GATEWAY_WORKER_ibfk_2`;
-ALTER TABLE `GATEWAY_WORKER` DROP INDEX IF EXISTS `USER_NAME`;
-ALTER TABLE `PROJECT_USER` DROP FOREIGN KEY IF EXISTS `PROJECT_USER_ibfk_2`;
-ALTER TABLE `PROJECT_USER` DROP INDEX IF EXISTS `USER_NAME`;
-ALTER TABLE `PROJECT` DROP FOREIGN KEY IF EXISTS `PROJECT_ibfk_2`;
-ALTER TABLE `PROJECT` DROP INDEX IF EXISTS `USER_NAME`;
-ALTER TABLE `USERS` ADD CONSTRAINT `USERS_ibfk_1` FOREIGN KEY IF NOT EXISTS (`GATEWAY_ID`) REFERENCES `GATEWAY` (`GATEWAY_ID`) ON DELETE CASCADE;
-ALTER TABLE `USERS` ADD PRIMARY KEY IF NOT EXISTS (`GATEWAY_ID`,`USER_NAME`);
-ALTER TABLE `USERS` DROP INDEX IF EXISTS `USER_NAME`;
-set FOREIGN_KEY_CHECKS=1;
-
--- AIRAVATA-2978: Add missing columns to PROCESS_RESOURCE_SCHEDULE
-ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS STATIC_WORKING_DIR varchar(255);
-ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS OVERRIDE_ALLOCATION_PROJECT_NUMBER varchar(255);
-ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS OVERRIDE_LOGIN_USER_NAME varchar(255);
-ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS OVERRIDE_SCRATCH_LOCATION varchar(255);
-
--- AIRAVATA-3029: Add METADATA to EXPERIMENT_OUTPUT and PROCESS_OUTPUT
-ALTER TABLE `EXPERIMENT_OUTPUT` ADD COLUMN IF NOT EXISTS METADATA VARCHAR(4096);
-ALTER TABLE `PROCESS_OUTPUT` ADD COLUMN IF NOT EXISTS METADATA VARCHAR(4096);
diff --git a/modules/registry/release-migration-scripts/next/DeltaScripts/profile_service_schema_delta.sql b/modules/registry/release-migration-scripts/next/DeltaScripts/profile_service_schema_delta.sql
index 16af7b3..cb533cc 100644
--- a/modules/registry/release-migration-scripts/next/DeltaScripts/profile_service_schema_delta.sql
+++ b/modules/registry/release-migration-scripts/next/DeltaScripts/profile_service_schema_delta.sql
@@ -19,43 +19,3 @@
 --
 
 use profile_service;
-
-alter database profile_service character set = 'latin1';
-
--- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
-set FOREIGN_KEY_CHECKS=0;
-ALTER TABLE `NSF_DEMOGRAPHIC_RACE` CHANGE COLUMN IF EXISTS RACES RACE varchar(255) NOT NULL;
-ALTER TABLE `NSF_DEMOGRAPHIC_DISABILITY` CHANGE COLUMN IF EXISTS DISABILITIES DISABILITY varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE_PHONE` CHANGE COLUMN IF EXISTS PHONES PHONE varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE_EMAIL` CHANGE COLUMN IF EXISTS EMAILS EMAIL varchar(255) NOT NULL;
-ALTER TABLE `NSF_DEMOGRAPHIC_ETHNICITY` CHANGE COLUMN IF EXISTS ETHNICITIES ETHNICITY varchar(255) NOT NULL;
-ALTER TABLE `NSF_DEMOGRAPHIC_DISABILITY` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`DISABILITY`);
-ALTER TABLE `NSF_DEMOGRAPHIC_DISABILITY` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
-ALTER TABLE `NSF_DEMOGRAPHIC_ETHNICITY` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`ETHNICITY`);
-ALTER TABLE `NSF_DEMOGRAPHIC_ETHNICITY` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
-ALTER TABLE `NSF_DEMOGRAPHIC_RACE` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`RACE`);
-ALTER TABLE `NSF_DEMOGRAPHIC_RACE` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
-ALTER TABLE `USER_PROFILE_EMAIL` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`EMAIL`);
-ALTER TABLE `USER_PROFILE_EMAIL` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
-ALTER TABLE `USER_PROFILE_LABELED_URI` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`LABELED_URI`);
-ALTER TABLE `USER_PROFILE_LABELED_URI` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
-ALTER TABLE `USER_PROFILE_NATIONALITY` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`NATIONALITY`);
-ALTER TABLE `USER_PROFILE_NATIONALITY` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
-ALTER TABLE `USER_PROFILE_PHONE` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`PHONE`);
-ALTER TABLE `USER_PROFILE_PHONE` DROP INDEX IF EXISTS `AIRAVATA_INTERNAL_USER_ID`;
-ALTER TABLE `NSF_DEMOGRAPHIC_DISABILITY` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
-ALTER TABLE `NSF_DEMOGRAPHIC_ETHNICITY` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
-ALTER TABLE `NSF_DEMOGRAPHIC_RACE` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
-ALTER TABLE `NSF_DEMOGRAPHIC` CHANGE `GENDER` `GENDER` varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE_EMAIL` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE_LABELED_URI` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE_LABELED_URI` CHANGE `LABELED_URI` `LABELED_URI` varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE_NATIONALITY` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE_NATIONALITY` CHANGE `NATIONALITY` `NATIONALITY` varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE_PHONE` CHANGE `AIRAVATA_INTERNAL_USER_ID` `AIRAVATA_INTERNAL_USER_ID` varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE_PHONE` ADD PRIMARY KEY IF NOT EXISTS (`AIRAVATA_INTERNAL_USER_ID`,`PHONE`);
-ALTER TABLE `USER_PROFILE` CHANGE `CREATION_TIME` `CREATION_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE `USER_PROFILE` CHANGE `GATEWAY_ID` `GATEWAY_ID` varchar(255) NOT NULL;
-ALTER TABLE `USER_PROFILE` CHANGE `LAST_ACCESS_TIME` `LAST_ACCESS_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
-ALTER TABLE `USER_PROFILE` CHANGE `USER_ID` `USER_ID` varchar(255) NOT NULL;
-set FOREIGN_KEY_CHECKS=1;
diff --git a/modules/registry/release-migration-scripts/next/DeltaScripts/replicaCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/next/DeltaScripts/replicaCatalog_schema_delta.sql
index d943ffc..942ff54 100644
--- a/modules/registry/release-migration-scripts/next/DeltaScripts/replicaCatalog_schema_delta.sql
+++ b/modules/registry/release-migration-scripts/next/DeltaScripts/replicaCatalog_schema_delta.sql
@@ -19,25 +19,3 @@
 --
 
 use replica_catalog;
-
--- AIRAVATA-2872: NOT NULL foreign key columsn
-set FOREIGN_KEY_CHECKS=0;
-alter table DATA_PRODUCT_METADATA modify column PRODUCT_URI VARCHAR(255) NOT NULL;
-alter table DATA_REPLICA_METADATA modify column REPLICA_ID VARCHAR(255) NOT NULL;
-set FOREIGN_KEY_CHECKS=1;
-
--- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
--- somehow these workflow tables got created in the replica_catalog schema
-DROP TABLE IF EXISTS `PORT`;
-DROP TABLE IF EXISTS `WORKFLOW`;
-DROP TABLE IF EXISTS `WORKFLOW_OUTPUT`;
-DROP TABLE IF EXISTS `WORKFLOW_STATUS`;
-DROP TABLE IF EXISTS `NODE`;
-DROP TABLE IF EXISTS `WORKFLOW_INPUT`;
-DROP TABLE IF EXISTS `COMPONENT_STATUS`;
-DROP TABLE IF EXISTS `EDGE`;
-set FOREIGN_KEY_CHECKS=0;
-ALTER TABLE `DATA_PRODUCT` CHANGE `PRODUCT_TYPE` `PRODUCT_TYPE` varchar(10) DEFAULT NULL;
-ALTER TABLE `DATA_REPLICA_LOCATION` CHANGE `REPLICA_LOCATION_CATEGORY` `REPLICA_LOCATION_CATEGORY` varchar(26) DEFAULT NULL;
-ALTER TABLE `DATA_REPLICA_LOCATION` CHANGE `REPLICA_PERSISTENT_TYPE` `REPLICA_PERSISTENT_TYPE` varchar(10) DEFAULT NULL;
-set FOREIGN_KEY_CHECKS=1;
diff --git a/modules/registry/release-migration-scripts/next/DeltaScripts/sharingCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/next/DeltaScripts/sharingCatalog_schema_delta.sql
index 1dc8aef..6ddb67c 100644
--- a/modules/registry/release-migration-scripts/next/DeltaScripts/sharingCatalog_schema_delta.sql
+++ b/modules/registry/release-migration-scripts/next/DeltaScripts/sharingCatalog_schema_delta.sql
@@ -19,15 +19,3 @@
 --
 
 use sharing_catalog;
-
--- AIRAVATA-2938: bring database schema into sync with registry-refactoring DB init scripts
-CREATE TABLE IF NOT EXISTS GROUP_ADMIN (
-  ADMIN_ID VARCHAR(255) NOT NULL,
-  GROUP_ID VARCHAR(255) NOT NULL,
-  DOMAIN_ID VARCHAR(255) NOT NULL,
-  PRIMARY KEY (ADMIN_ID, GROUP_ID, DOMAIN_ID),
-  FOREIGN KEY (ADMIN_ID, DOMAIN_ID) REFERENCES SHARING_USER(USER_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION
-)ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
-
-ALTER TABLE `GROUP_ADMIN` ADD CONSTRAINT `GROUP_ADMIN_ibfk_1` FOREIGN KEY IF NOT EXISTS (`ADMIN_ID`, `DOMAIN_ID`) REFERENCES `SHARING_USER` (`USER_ID`, `DOMAIN_ID`) ON DELETE CASCADE ON UPDATE NO ACTION;
-ALTER TABLE `GROUP_ADMIN` ADD KEY IF NOT EXISTS `ADMIN_ID` (`ADMIN_ID`,`DOMAIN_ID`);
diff --git a/modules/security/pom.xml b/modules/security/pom.xml
index a6f159c..1ba42cb 100644
--- a/modules/security/pom.xml
+++ b/modules/security/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/modules/security/src/main/java/org/apache/airavata/security/userstore/JDBCUserStore.java b/modules/security/src/main/java/org/apache/airavata/security/userstore/JDBCUserStore.java
index 5f25862..c94ddcd 100644
--- a/modules/security/src/main/java/org/apache/airavata/security/userstore/JDBCUserStore.java
+++ b/modules/security/src/main/java/org/apache/airavata/security/userstore/JDBCUserStore.java
@@ -32,7 +32,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
 import javax.sql.DataSource;
 
@@ -71,7 +70,7 @@
     @Override
     public boolean authenticate(Object credentials) throws UserStoreException {
         log.error("JDBC user store only supports user name, password based authentication.");
-        throw new NotImplementedException();
+        throw new UnsupportedOperationException();
     }
 
     @Override
diff --git a/modules/security/src/main/java/org/apache/airavata/security/userstore/LDAPUserStore.java b/modules/security/src/main/java/org/apache/airavata/security/userstore/LDAPUserStore.java
index 2444b4c..5a790a0 100644
--- a/modules/security/src/main/java/org/apache/airavata/security/userstore/LDAPUserStore.java
+++ b/modules/security/src/main/java/org/apache/airavata/security/userstore/LDAPUserStore.java
@@ -33,7 +33,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
 /**
  * A user store which talks to LDAP server. User credentials and user information are stored in a LDAP server.
@@ -66,7 +65,7 @@
     @Override
     public boolean authenticate(Object credentials) throws UserStoreException {
         log.error("LDAP user store only supports authenticating with user name and password.");
-        throw new NotImplementedException();
+        throw new UnsupportedOperationException();
     }
 
     public void configure(Node specificConfigurationNode) throws UserStoreException {
diff --git a/modules/security/src/main/java/org/apache/airavata/security/userstore/SessionDBUserStore.java b/modules/security/src/main/java/org/apache/airavata/security/userstore/SessionDBUserStore.java
index 21c69fe..b09a0f4 100644
--- a/modules/security/src/main/java/org/apache/airavata/security/userstore/SessionDBUserStore.java
+++ b/modules/security/src/main/java/org/apache/airavata/security/userstore/SessionDBUserStore.java
@@ -26,7 +26,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
 import java.sql.SQLException;
 
@@ -46,7 +45,7 @@
     @Override
     public boolean authenticate(String userName, Object credentials) throws UserStoreException {
         // This user store only supports session tokens.
-        throw new NotImplementedException();
+        throw new UnsupportedOperationException();
     }
 
     @Override
diff --git a/modules/server/pom.xml b/modules/server/pom.xml
index 5c6ee09..fe0a8ea 100644
--- a/modules/server/pom.xml
+++ b/modules/server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
@@ -32,6 +32,19 @@
     <artifactId>airavata-standalone-server</artifactId>
     <name>Airavata Standalone Server</name>
     <description>Module Containing Classes which start the Airavata Standalone Server</description>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <!--<source>9</source>-->
+                    <!--<target>9</target>-->
+                    <release>11</release>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
     <dependencies>
         <dependency>
             <groupId>org.slf4j</groupId>
diff --git a/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java b/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java
index a391291..d2369fb 100644
--- a/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java
+++ b/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java
@@ -47,7 +47,7 @@
     private final static Logger logger = LoggerFactory.getLogger(ServerMain.class);
     private static boolean serversLoaded=false;
 	private static final String stopFileNamePrefix = "server_stop";
-	private static int serverPID=-1;
+	private static long serverPID=-1;
 	private static final String serverStartedFileNamePrefix = "server_start";
 	private static boolean systemShutDown=false;
 	private static String STOP_COMMAND_STR = "stop";
@@ -347,7 +347,7 @@
 	}
 
 	private static String getServerStartedFileName() {
-		return new File(new File(System.getenv("AIRAVATA_HOME"),"bin"),serverStartedFileNamePrefix+"_"+Integer.toString(serverPID)).toString();
+		return new File(new File(System.getenv("AIRAVATA_HOME"),"bin"),serverStartedFileNamePrefix+"_"+Long.toString(serverPID)).toString();
 	}
 
 	public static void stopAllServers() {
@@ -415,23 +415,36 @@
 		ServerMain.systemShutDown = systemShutDown;
 	}
 	
-	private static int getPID(){
-		try {
-			java.lang.management.RuntimeMXBean runtime = java.lang.management.ManagementFactory
-					.getRuntimeMXBean();
-			java.lang.reflect.Field jvm = runtime.getClass()
-					.getDeclaredField("jvm");
-			jvm.setAccessible(true);
-			sun.management.VMManagement mgmt = (sun.management.VMManagement) jvm
-					.get(runtime);
-			java.lang.reflect.Method pid_method = mgmt.getClass()
-					.getDeclaredMethod("getProcessId");
-			pid_method.setAccessible(true);
+//	private static int getPID(){
+//		try {
+//			java.lang.management.RuntimeMXBean runtime = java.lang.management.ManagementFactory
+//					.getRuntimeMXBean();
+//			java.lang.reflect.Field jvm = runtime.getClass()
+//					.getDeclaredField("jvm");
+//			jvm.setAccessible(true);
+//			sun.management.VMManagement mgmt = (sun.management.VMManagement) jvm
+//					.get(runtime);
+//			java.lang.reflect.Method pid_method = mgmt.getClass()
+//					.getDeclaredMethod("getProcessId");
+//			pid_method.setAccessible(true);
+//
+//			int pid = (Integer) pid_method.invoke(mgmt);
+//			return pid;
+//		} catch (Exception e) {
+//			return -1;
+//		}
+//	}
 
-			int pid = (Integer) pid_method.invoke(mgmt);
-			return pid;
+	//getPID from ProcessHandle JDK 9 and onwards
+	private static long getPID () {
+		try {
+			return ProcessHandle.current().pid();
 		} catch (Exception e) {
 			return -1;
 		}
+
 	}
+
+
+
 }
\ No newline at end of file
diff --git a/modules/sharing-registry/pom.xml b/modules/sharing-registry/pom.xml
index 0a3db2f..92b0cfd 100644
--- a/modules/sharing-registry/pom.xml
+++ b/modules/sharing-registry/pom.xml
@@ -26,7 +26,7 @@
         <artifactId>airavata</artifactId>
         <groupId>org.apache.airavata</groupId>
         <relativePath>../../pom.xml</relativePath>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/modules/sharing-registry/sharing-data-migrator/pom.xml b/modules/sharing-registry/sharing-data-migrator/pom.xml
index 18c395c..d5f76eb 100644
--- a/modules/sharing-registry/sharing-data-migrator/pom.xml
+++ b/modules/sharing-registry/sharing-data-migrator/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata-sharing-registry</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
@@ -37,10 +37,11 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.5.1</version>
+                <version>3.8.0</version>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                    <!--<source>1.8</source>-->
+                    <!--<target>1.8</target>-->
+                    <release>11</release>
                 </configuration>
             </plugin>
             <plugin>
@@ -101,12 +102,12 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-commons</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>iam-admin-services-core</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>log4j</groupId>
diff --git a/modules/sharing-registry/sharing-data-migrator/src/main/java/org/apache/airavata/sharing/registry/migrator/airavata/AiravataDataMigrator.java b/modules/sharing-registry/sharing-data-migrator/src/main/java/org/apache/airavata/sharing/registry/migrator/airavata/AiravataDataMigrator.java
index 6eb168c..2dbb130 100644
--- a/modules/sharing-registry/sharing-data-migrator/src/main/java/org/apache/airavata/sharing/registry/migrator/airavata/AiravataDataMigrator.java
+++ b/modules/sharing-registry/sharing-data-migrator/src/main/java/org/apache/airavata/sharing/registry/migrator/airavata/AiravataDataMigrator.java
@@ -38,12 +38,22 @@
 import org.apache.airavata.model.credential.store.SummaryType;
 import org.apache.airavata.model.group.ResourcePermissionType;
 import org.apache.airavata.model.group.ResourceType;
+import org.apache.airavata.model.security.AuthzToken;
+import org.apache.airavata.model.user.Status;
+import org.apache.airavata.model.user.UserProfile;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.registry.api.client.RegistryServiceClientFactory;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
+import org.apache.airavata.security.AiravataSecurityException;
+import org.apache.airavata.service.profile.client.ProfileServiceClientFactory;
 import org.apache.airavata.service.profile.iam.admin.services.core.impl.TenantManagementKeycloakImpl;
+import org.apache.airavata.service.profile.iam.admin.services.cpi.IamAdminServices;
+import org.apache.airavata.service.profile.iam.admin.services.cpi.exception.IamAdminServicesException;
+import org.apache.airavata.service.security.AiravataSecurityManager;
+import org.apache.airavata.service.security.SecurityManagerFactory;
 import org.apache.airavata.sharing.registry.models.*;
 import org.apache.airavata.sharing.registry.server.SharingRegistryServerHandler;
+import org.apache.airavata.sharing.registry.utils.ThriftDataModelConversion;
 import org.apache.thrift.TException;
 
 import java.sql.Connection;
@@ -72,6 +82,7 @@
 
         SharingRegistryServerHandler sharingRegistryServerHandler = new SharingRegistryServerHandler();
         CredentialStoreService.Client credentialStoreServiceClient = getCredentialStoreServiceClient();
+        IamAdminServices.Client iamAdminServiceClient = getIamAdminServiceClient();
 
         String query = "SELECT * FROM GATEWAY" + gatewayWhereClause;
         Statement statement = expCatConnection.createStatement();
@@ -204,17 +215,19 @@
             } else {
                 continue;
             }
-
             if (registryServiceClient.isGatewayGroupsExists(domain.getDomainId())) {
                 GatewayGroups gatewayGroups = registryServiceClient.getGatewayGroups(domain.getDomainId());
                 gatewayGroupsMap.put(domain.getDomainId(), gatewayGroups);
             } else {
-
                 GatewayGroups gatewayGroups = migrateRolesToGatewayGroups(domain, ownerId, sharingRegistryServerHandler, registryServiceClient);
                 gatewayGroupsMap.put(domain.getDomainId(), gatewayGroups);
             }
+            //find all the active users in keycloak that do not exist in sharing registry service and migrate them to the database
+            AuthzToken authzToken_of_management_user = getManagementUsersAccessToken(domain.getDomainId());
+            List<UserProfile> missingUsers = getUsersToMigrate(sharingRegistryServerHandler, iamAdminServiceClient, authzToken_of_management_user, null, domain.getDomainId());
+            migrateKeycloakUsersToGateway(iamAdminServiceClient, authzToken_of_management_user, missingUsers);
+            addUsersToGroups(sharingRegistryServerHandler, missingUsers, gatewayGroupsMap.get(domain.getDomainId()), domain.getDomainId());
         }
-
         //Creating project entries
         query = "SELECT * FROM PROJECT" + gatewayWhereClause;
         statement = expCatConnection.createStatement();
@@ -323,7 +336,7 @@
         // Migrating from GatewayResourceProfile to GroupResourceProfile
         for (String domainID : domainOwnerMap.keySet()) {
             GatewayGroups gatewayGroups = gatewayGroupsMap.get(domainID);
-            if (needsGroupResourceProfileMigration(domainID, registryServiceClient)) {
+            if (needsGroupResourceProfileMigration(domainID, domainOwnerMap.get(domainID), registryServiceClient, sharingRegistryServerHandler)) {
 
                 GroupResourceProfile groupResourceProfile = migrateGatewayResourceProfileToGroupResourceProfile(domainID, registryServiceClient);
 
@@ -352,7 +365,7 @@
                 entity.setEntityTypeId(entity.getDomainId() + ":" + ResourceType.CREDENTIAL_TOKEN.name());
                 entity.setOwnerId(domainOwnerMap.get(domainID));
                 entity.setName(credentialSummary.getToken());
-                entity.setDescription(credentialSummary.getDescription());
+                entity.setDescription(maxLengthString(credentialSummary.getDescription(), 255));
                 if (!sharingRegistryServerHandler.isEntityExists(entity.getDomainId(), entity.getEntityId()))
                     sharingRegistryServerHandler.createEntity(entity);
                 if (gatewayGroupsMap.containsKey(entity.getDomainId())) {
@@ -367,8 +380,7 @@
             for (User sharingUser : sharingUsers) {
 
                 String userId = sharingUser.getUserId();
-                int index = userId.lastIndexOf("@");
-                if (index <= 0) {
+                if (!userId.endsWith("@" + domainID)) {
                     System.out.println("Skipping credentials for user " + userId + " since sharing user id is improperly formed");
                     continue;
                 }
@@ -381,7 +393,8 @@
                     entity.setEntityTypeId(entity.getDomainId() + ":" + ResourceType.CREDENTIAL_TOKEN.name());
                     entity.setOwnerId(userId);
                     entity.setName(credentialSummary.getToken());
-                    entity.setDescription(credentialSummary.getDescription());
+                    // Cap description length at max 255 characters
+                    entity.setDescription(maxLengthString(credentialSummary.getDescription(), 255));
                     if (!sharingRegistryServerHandler.isEntityExists(entity.getDomainId(), entity.getEntityId()))
                         sharingRegistryServerHandler.createEntity(entity);
                     // Don't need to share USER SSH tokens with any group
@@ -398,7 +411,7 @@
                 entity.setEntityTypeId(entity.getDomainId() + ":" + ResourceType.CREDENTIAL_TOKEN.name());
                 entity.setOwnerId(domainOwnerMap.get(domainID));
                 entity.setName(gatewayPasswordEntry.getKey());
-                entity.setDescription(gatewayPasswordEntry.getValue());
+                entity.setDescription(maxLengthString(gatewayPasswordEntry.getValue(), 255));
                 if (!sharingRegistryServerHandler.isEntityExists(entity.getDomainId(), entity.getEntityId()))
                     sharingRegistryServerHandler.createEntity(entity);
                 if (gatewayGroupsMap.containsKey(entity.getDomainId())) {
@@ -432,6 +445,89 @@
                 entity.getDomainId() + ":" + ResourcePermissionType.WRITE, cascadePermission);
     }
 
+    private static List<UserProfile> getUsersToMigrate(SharingRegistryServerHandler sharingRegistryServerHandler, IamAdminServices.Client adminServiceClient, AuthzToken authzToken, String search, String domainId) throws TException {
+
+        List<UserProfile> missingUsers = new ArrayList<>();
+        List<UserProfile> keycloakUsers = adminServiceClient.getUsers(authzToken, 0, -1, search);
+
+        for (UserProfile profile : keycloakUsers) {
+            if (profile.getState().equals(Status.ACTIVE) && !sharingRegistryServerHandler.isUserExists(domainId, profile.getAiravataInternalUserId())) {
+                missingUsers.add(profile);
+            }
+        }
+        return missingUsers;
+    }
+
+    private static boolean migrateKeycloakUsersToGateway(IamAdminServices.Client adminServiceClient,AuthzToken authzToken, List<UserProfile> missingUsers) throws TException{
+
+        boolean allUsersUpdated = true;
+        for(UserProfile profile: missingUsers) {
+                allUsersUpdated &= adminServiceClient.enableUser(authzToken, profile.getUserId());
+            }
+        return allUsersUpdated;
+    }
+    private static void checkUsersInSharingRegistryService(SharingRegistryServerHandler sharingRegistryServerHandler, List<UserProfile> missingUsers, String domainId) throws TException{
+        System.out.println("Waiting for " + missingUsers.size() + " missing users to be propogated to sharing db");
+        int waitCount = 0;
+        // Wait up to 10 seconds for event based replication to complete, then
+        // add missing users to sharing registry
+        while (waitCount < 10) {
+            boolean missingInSharing = false;
+            for (UserProfile users : missingUsers) {
+                if (!sharingRegistryServerHandler.isUserExists(domainId, users.getAiravataInternalUserId())) {
+                    missingInSharing = true;
+                    break;
+                }
+            }
+            if (!missingInSharing) {
+                break;
+            }
+            try {
+                System.out.print(".");
+                // wait for 1 second
+                Thread.sleep(1000);
+                waitCount++;
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        for (UserProfile users : missingUsers) {
+            if (!sharingRegistryServerHandler.isUserExists(domainId, users.getAiravataInternalUserId())) {
+                sharingRegistryServerHandler.createUser(ThriftDataModelConversion.getUser(users));
+            }
+        }
+    }
+    private static boolean addUsersToGroups(SharingRegistryServerHandler sharingRegistryServerHandler, List<UserProfile> missingUsers, GatewayGroups gatewayGroups, String domainId) throws TException, ApplicationSettingsException{
+        //before adding to groups make sure sharing registry has the user otherwise add it
+        checkUsersInSharingRegistryService(sharingRegistryServerHandler, missingUsers, domainId);
+        boolean updatedAllUsers = true;
+        Map<String, List<String>> roleMap = loadRolesForUsers(domainId, missingUsers
+                .stream()
+                .map(user -> user.getAiravataInternalUserId().substring(0, user.getAiravataInternalUserId().lastIndexOf("@")))
+                .collect(Collectors.toList()));
+        if(roleMap.containsKey("gateway-user")){
+            List<String> userIds = roleMap.get("gateway-user").stream()
+                    .map(username -> username + "@" + domainId)
+                    .collect(Collectors.toList());
+            updatedAllUsers &= sharingRegistryServerHandler.addUsersToGroup(domainId, userIds, gatewayGroups.getDefaultGatewayUsersGroupId());
+        }
+        if(roleMap.containsKey("admin")){
+            List<String> userIds = roleMap.get("admin").stream()
+                    .map(username -> username + "@" + domainId)
+                    .collect(Collectors.toList());
+            updatedAllUsers &= sharingRegistryServerHandler.addUsersToGroup(domainId, userIds, gatewayGroups.getAdminsGroupId());
+        }
+        if(roleMap.containsKey("admin-read-only")){
+            List<String> userIds = roleMap.get("admin-read-only").stream()
+                    .map(username -> username + "@" + domainId)
+                    .collect(Collectors.toList());
+            updatedAllUsers &= sharingRegistryServerHandler.addUsersToGroup(domainId, userIds, gatewayGroups.getReadOnlyAdminsGroupId());
+        }
+
+        return updatedAllUsers;
+    }
+
     private static GatewayGroups migrateRolesToGatewayGroups(Domain domain, String ownerId, SharingRegistryServerHandler sharingRegistryServerHandler, RegistryService.Client registryServiceClient) throws TException, ApplicationSettingsException {
         GatewayGroups gatewayGroups = new GatewayGroups();
         gatewayGroups.setGatewayId(domain.getDomainId());
@@ -439,8 +535,8 @@
         // Migrate roles to groups
         List<String> usernames = sharingRegistryServerHandler.getUsers(domain.getDomainId(), 0, -1)
                 .stream()
-                // Filter out bad ids that don't have an "@" in them
-                .filter(user -> user.getUserId().lastIndexOf("@") > 0)
+                // Filter out bad user ids that don't end in "@" + domainId
+                .filter(user -> user.getUserId().endsWith("@" + domain.getDomainId()))
                 .map(user -> user.getUserId().substring(0, user.getUserId().lastIndexOf("@")))
                 .collect(Collectors.toList());
         Map<String, List<String>> roleMap = loadRolesForUsers(domain.getDomainId(), usernames);
@@ -553,10 +649,19 @@
         return userGroup;
     }
 
-    private static boolean needsGroupResourceProfileMigration(String gatewayId, RegistryService.Client registryServiceClient) throws TException {
+    private static boolean needsGroupResourceProfileMigration(String gatewayId, String domainOwnerId, RegistryService.Client registryServiceClient, SharingRegistryServerHandler sharingRegistryServerHandler)
+            throws TException {
         // Return true if GatewayResourceProfile has at least one ComputeResourcePreference and there is no GroupResourceProfile
         List<ComputeResourcePreference> computeResourcePreferences = registryServiceClient.getAllGatewayComputeResourcePreferences(gatewayId);
-        List<GroupResourceProfile> groupResourceProfiles = registryServiceClient.getGroupResourceList(gatewayId, Collections.emptyList());
+        SearchCriteria searchCriteria = new SearchCriteria();
+        searchCriteria.setSearchField(EntitySearchField.ENTITY_TYPE_ID);
+        searchCriteria.setSearchCondition(SearchCondition.EQUAL);
+        searchCriteria.setValue(gatewayId + ":" + ResourceType.GROUP_RESOURCE_PROFILE.name());
+        List<String> accessibleGRPIds = sharingRegistryServerHandler.searchEntities(gatewayId, domainOwnerId, Collections.singletonList(searchCriteria), 0, -1)
+                .stream()
+                .map(p -> p.getEntityId())
+                .collect(Collectors.toList());
+        List<GroupResourceProfile> groupResourceProfiles = registryServiceClient.getGroupResourceList(gatewayId, accessibleGRPIds);
         return !computeResourcePreferences.isEmpty() && groupResourceProfiles.isEmpty();
     }
 
@@ -636,6 +741,15 @@
         return s != null && !"".equals(s.trim());
     }
 
+    private static String maxLengthString(String s, int maxLength) {
+
+        if (s != null) {
+            return s.substring(0, Math.min(maxLength, s.length()));
+        } else {
+            return null;
+        }
+    }
+
     private static CredentialStoreService.Client getCredentialStoreServiceClient() throws TException, ApplicationSettingsException {
         final int serverPort = Integer.parseInt(ServerSettings.getCredentialStoreServerPort());
         final String serverHost = ServerSettings.getCredentialStoreServerHost();
@@ -656,4 +770,24 @@
         }
     }
 
+    private static IamAdminServices.Client getIamAdminServiceClient() throws TException, ApplicationSettingsException {
+        final int serverPort = Integer.parseInt(ServerSettings.getProfileServiceServerPort());
+        final String serverHost = ServerSettings.getProfileServiceServerHost();
+        try {
+            return ProfileServiceClientFactory.createIamAdminServiceClient(serverHost, serverPort);
+        } catch (IamAdminServicesException e) {
+            throw new TException("Unable to create i am admin service client...", e);
+        }
+    }
+
+    private static AuthzToken getManagementUsersAccessToken(String tenantId) throws TException{
+        try {
+            AiravataSecurityManager securityManager = SecurityManagerFactory.getSecurityManager();
+            AuthzToken authzToken = securityManager.getUserManagementServiceAccountAuthzToken(tenantId);
+            return authzToken;
+        } catch (AiravataSecurityException e){
+            throw new TException("Unable to fetch access token for management user for tenant: " + tenantId, e);
+        }
+
+    }
 }
diff --git a/modules/sharing-registry/sharing-data-migrator/src/main/resources/airavata-server.properties.sample b/modules/sharing-registry/sharing-data-migrator/src/main/resources/airavata-server.properties.sample
index cc7371b..730750a 100644
--- a/modules/sharing-registry/sharing-data-migrator/src/main/resources/airavata-server.properties.sample
+++ b/modules/sharing-registry/sharing-data-migrator/src/main/resources/airavata-server.properties.sample
@@ -51,6 +51,7 @@
 trust.store=../../configuration/server/src/main/resources/client_truststore.jks
 trust.store.password=airavata
 iam.server.url=http://localhost/auth
+security.manager.class=org.apache.airavata.service.security.KeyCloakSecurityManager
 
 ###########################################################################
 #  Registry Server Configurations
@@ -64,3 +65,15 @@
 ###########################################################################
 credential.store.server.host=localhost
 credential.store.server.port=8960
+
+###########################################################################
+# Profile Service Configuration
+###########################################################################
+profile.service.server.host=localhost
+profile.service.server.port=8962
+
+###########################################################################
+# Sharing API Server Configuration
+###########################################################################
+sharing.registry.server.host=localhost
+sharing.registry.server.port=7878
diff --git a/modules/sharing-registry/sharing-registry-distribution/pom.xml b/modules/sharing-registry/sharing-registry-distribution/pom.xml
index 7b3f784..1ed482a 100644
--- a/modules/sharing-registry/sharing-registry-distribution/pom.xml
+++ b/modules/sharing-registry/sharing-registry-distribution/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>airavata-sharing-registry</artifactId>
         <groupId>org.apache.airavata</groupId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -47,7 +47,7 @@
         <dependency>
             <groupId>net.sf.dozer</groupId>
             <artifactId>dozer</artifactId>
-            <version>5.4.0</version>
+            <version>${dozer.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.openjpa</groupId>
diff --git a/modules/sharing-registry/sharing-registry-server/pom.xml b/modules/sharing-registry/sharing-registry-server/pom.xml
index 2431b3c..7c2f4a1 100644
--- a/modules/sharing-registry/sharing-registry-server/pom.xml
+++ b/modules/sharing-registry/sharing-registry-server/pom.xml
@@ -25,7 +25,7 @@
         <artifactId>airavata-sharing-registry</artifactId>
         <groupId>org.apache.airavata</groupId>
         <relativePath>../pom.xml</relativePath>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -58,7 +58,7 @@
         <dependency>
             <groupId>net.sf.dozer</groupId>
             <artifactId>dozer</artifactId>
-            <version>5.4.0</version>
+            <version>${dozer.version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>org.slf4j</groupId>
@@ -89,8 +89,21 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-messaging-core</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>${commons.lang.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>custos-java-sdk</artifactId>
+            <version>${org.apache.custos.version}</version>
+        </dependency>
+
+
     </dependencies>
 
     <build>
@@ -98,10 +111,15 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.5.1</version>
+                <version>3.8.0</version>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                    <release>11</release>
+                    <source>9</source>
+                    <target>9</target>
+                    <!--<compilerArgs>-->
+                        <!--<arg>&#45;&#45;add-opens=java.base/java.lang=ALL-UNNAMED</arg>-->
+                    <!--</compilerArgs>-->
+                    <!--<fork>true</fork>-->
                 </configuration>
             </plugin>
             <plugin>
@@ -128,6 +146,13 @@
                         </goals>
                     </execution>
                 </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.openjpa</groupId>
+                        <artifactId>openjpa</artifactId>
+                        <version>${openjpa.version}</version>
+                    </dependency>
+                </dependencies>
             </plugin>
         </plugins>
     </build>
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/entities/DomainEntity.java b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/entities/DomainEntity.java
index ef00e67..0f1b76e 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/entities/DomainEntity.java
+++ b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/entities/DomainEntity.java
@@ -33,6 +33,7 @@
     private String description;
     private Long createdTime;
     private Long updatedTime;
+    private String initialUserGroupId;
 
     @Id
     @Column(name = "DOMAIN_ID")
@@ -84,6 +85,16 @@
         this.updatedTime = updatedTime;
     }
 
+    @Basic
+    @Column(name = "INITIAL_USER_GROUP_ID")
+    public String getInitialUserGroupId() {
+        return initialUserGroupId;
+    }
+
+    public void setInitialUserGroupId(String initialUserGroupId) {
+        this.initialUserGroupId = initialUserGroupId;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -113,4 +124,4 @@
         result = 31 * result + (getUpdatedTime() != null ? getUpdatedTime().hashCode() : 0);
         return result;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/EntityRepository.java b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/EntityRepository.java
index 070bba2..5a6c32d 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/EntityRepository.java
+++ b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/db/repositories/EntityRepository.java
@@ -99,15 +99,15 @@
                 }
             }else if(searchCriteria.getSearchField().equals(EntitySearchField.CREATED_TIME)){
                 if(searchCriteria.getSearchCondition().equals(SearchCondition.GTE)){
-                    query += "E.CREATED_TIME >= " + Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
+                    query += "E.CREATED_TIME >= " + Long.parseLong(searchCriteria.getValue().trim()) + " AND ";
                 }else{
-                    query += "E.CREATED_TIME <= " + Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
+                    query += "E.CREATED_TIME <= " + Long.parseLong(searchCriteria.getValue().trim()) + " AND ";
                 }
             }else if(searchCriteria.getSearchField().equals(EntitySearchField.UPDATED_TIME)){
                 if(searchCriteria.getSearchCondition().equals(SearchCondition.GTE)){
-                    query += "E.UPDATED_TIME >= " + Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
+                    query += "E.UPDATED_TIME >= " + Long.parseLong(searchCriteria.getValue().trim()) + " AND ";
                 }else{
-                    query += "E.UPDATED_TIME <= " + Integer.parseInt(searchCriteria.getValue().trim()) + " AND ";
+                    query += "E.UPDATED_TIME <= " + Long.parseLong(searchCriteria.getValue().trim()) + " AND ";
                 }
             } else if (searchCriteria.getSearchField().equals(EntitySearchField.SHARED_COUNT)) {
                 if (searchCriteria.getSearchCondition().equals(SearchCondition.GTE)) {
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/messaging/SharingServiceDBEventHandler.java b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/messaging/SharingServiceDBEventHandler.java
index f72a570..c00a26d 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/messaging/SharingServiceDBEventHandler.java
+++ b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/messaging/SharingServiceDBEventHandler.java
@@ -1,5 +1,4 @@
 /**
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -7,9 +6,9 @@
  * to you 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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
@@ -21,7 +20,7 @@
 
 import org.apache.airavata.common.exception.AiravataException;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.common.utils.CustosUtils;
 import org.apache.airavata.common.utils.ThriftUtils;
 import org.apache.airavata.messaging.core.MessageContext;
 import org.apache.airavata.messaging.core.MessageHandler;
@@ -29,22 +28,20 @@
 import org.apache.airavata.model.dbevent.DBEventMessageContext;
 import org.apache.airavata.model.error.DuplicateEntryException;
 import org.apache.airavata.model.group.ResourceType;
-import org.apache.airavata.model.user.UserProfile;
 import org.apache.airavata.model.workspace.Gateway;
 import org.apache.airavata.model.workspace.Project;
-import org.apache.airavata.sharing.registry.client.SharingRegistryServiceClientFactory;
-import org.apache.airavata.sharing.registry.models.Domain;
-import org.apache.airavata.sharing.registry.models.Entity;
-import org.apache.airavata.sharing.registry.models.PermissionType;
 import org.apache.airavata.sharing.registry.models.SharingRegistryException;
-import org.apache.airavata.sharing.registry.models.User;
-import org.apache.airavata.sharing.registry.server.SharingRegistryServer;
-import org.apache.airavata.sharing.registry.service.cpi.SharingRegistryService;
-import org.apache.airavata.sharing.registry.utils.ThriftDataModelConversion;
+import org.apache.custos.sharing.management.client.SharingManagementClient;
+import org.apache.custos.sharing.service.Entity;
+import org.apache.custos.sharing.service.EntityType;
+import org.apache.custos.sharing.service.PermissionType;
+import org.apache.custos.sharing.service.Status;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+
 /**
  * Created by Ajinkya on 3/28/17.
  */
@@ -52,11 +49,11 @@
 
     private final static Logger log = LoggerFactory.getLogger(SharingServiceDBEventHandler.class);
 
-    private final SharingRegistryService.Client sharingRegistryClient;
+    private final SharingManagementClient sharingManagementClient;
 
-    SharingServiceDBEventHandler() throws ApplicationSettingsException, SharingRegistryException {
-        log.info("Starting sharing registry client.....");
-        sharingRegistryClient = SharingRegistryServiceClientFactory.createSharingRegistryClient(ServerSettings.getSetting(SharingRegistryServer.SHARING_REG_SERVER_HOST), Integer.parseInt(ServerSettings.getSetting(SharingRegistryServer.SHARING_REG_SERVER_PORT)));
+    SharingServiceDBEventHandler() throws ApplicationSettingsException, SharingRegistryException, IOException {
+        log.info("Connecting to Custos Sharing Service.........");
+        sharingManagementClient = CustosUtils.getCustosClientProvider().getSharingManagementClient();
     }
 
     @Override
@@ -64,7 +61,7 @@
 
         log.info("New DB Event message to sharing service.");
 
-        try{
+        try {
 
             byte[] bytes = ThriftUtils.serializeThriftObject(messageContext.getEvent());
 
@@ -74,68 +71,25 @@
             log.info("DB Event message to sharing service from " + dbEventMessage.getPublisherService());
 
             DBEventMessageContext dBEventMessageContext = dbEventMessage.getMessageContext();
-            try{
-                switch (dBEventMessageContext.getPublisher().getPublisherContext().getEntityType()){
+            try {
+                switch (dBEventMessageContext.getPublisher().getPublisherContext().getEntityType()) {
 
-                    case USER_PROFILE :
-
-                        log.info("User profile specific DB Event communicated by " + dbEventMessage.getPublisherService());
-
-                        UserProfile  userProfile = new UserProfile();
-                        ThriftUtils.createThriftFromBytes(dBEventMessageContext.getPublisher().getPublisherContext().getEntityDataModel(), userProfile);
-                        //AIRAVATA-2506: Sharing Service treats airavataInternalUserId as the userId. AiravataAPIServerHandler
-                        //also treats airavataInternalUserId as the userId when creating entities, entityTypes using the sharing
-                        //service.
-                        userProfile.setUserId(userProfile.getAiravataInternalUserId());
-                        User user = ThriftDataModelConversion.getUser(userProfile);
-
-                        switch (dBEventMessageContext.getPublisher().getPublisherContext().getCrudType()){
-
-                            case CREATE:
-                            case UPDATE:
-
-                                if (!sharingRegistryClient.isUserExists(user.getDomainId(), user.getUserId())) {
-                                    log.info("Creating user. User Id : " + user.getUserId());
-                                    sharingRegistryClient.createUser(user);
-                                    log.debug("User created. User Id : " + user.getUserId());
-                                } else {
-                                    log.info("Updating user. User Id : " + user.getUserId());
-                                    sharingRegistryClient.updatedUser(user);
-                                    log.debug("User updated. User Id : " + user.getUserId());
-                                }
-
-                                break;
-
-                            case READ:
-                                //FIXME: Remove if not required
-                                break;
-
-                            case DELETE:
-                                log.info("Deleting user. User Id : " + user.getUserId());
-
-                                sharingRegistryClient.deleteUser(user.getDomainId(), user.getUserId());
-                                log.debug("User deleted. User Id : " + user.getUserId());
-
-                                break;
-                        }
-                        break;
-
-                    case TENANT :
+                    case TENANT:
 
                         log.info("Tenant specific DB Event communicated by " + dbEventMessage.getPublisherService());
 
                         Gateway gateway = new Gateway();
                         ThriftUtils.createThriftFromBytes(dBEventMessageContext.getPublisher().getPublisherContext().getEntityDataModel(), gateway);
 
-                        switch (dBEventMessageContext.getPublisher().getPublisherContext().getCrudType()){
+                        String custosId = gateway.getOauthClientId();
+
+                        log.info("Custos Id from sharing service "+ custosId);
+
+                        switch (dBEventMessageContext.getPublisher().getPublisherContext().getCrudType()) {
 
                             case CREATE:
                             case UPDATE:
 
-                                // Only create the domain is it doesn't already exist
-                                if (sharingRegistryClient.isDomainExists(gateway.getGatewayId())){
-                                    break;
-                                }
                                 /*
                                 Following set of DB operations should happen in a transaction
                                 As these are thrift calls we cannot enforce this restriction
@@ -144,108 +98,125 @@
                                  log as a warning to handle such scenarios and move ahead.
                                  */
 
-                                log.info("Creating domain. Id : " + gateway.getGatewayId());
+                                if (custosId != null && ! custosId.trim().equals("")) {
+                                    //Creating Entity Types for each domain
+                                    log.info("Creating entity type. Id PROJECT");
+                                    if (!isEntityTypeExists(custosId, "PROJECT")) {
+                                        EntityType projectEntityType = EntityType.newBuilder()
+                                                .setName("PROJECT")
+                                                .setDescription("Project entity type")
+                                                .setId("PROJECT")
+                                                .build();
+                                        sharingManagementClient.createEntityType(custosId, projectEntityType);
+                                    }
 
-                                Domain domain = new Domain();
-                                domain.setDomainId(gateway.getGatewayId());
-                                domain.setName(gateway.getGatewayName());
-                                domain.setDescription("Domain entry for " + domain.getName());
-                                try{
-                                    sharingRegistryClient.createDomain(domain);
-                                    log.debug("Domain created. Id : " + gateway.getGatewayId());
-                                } catch (DuplicateEntryException ex) {
-                                    log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Domain Id : " + gateway.getGatewayId(), ex);
-                                }
 
-                                //Creating Entity Types for each domain
-                                log.info("Creating entity type. Id : " + domain.getDomainId()+":PROJECT");
-                                org.apache.airavata.sharing.registry.models.EntityType entityType = new org.apache.airavata.sharing.registry.models.EntityType();
-                                entityType.setEntityTypeId(domain.getDomainId()+":PROJECT");
-                                entityType.setDomainId(domain.getDomainId());
-                                entityType.setName("PROJECT");
-                                entityType.setDescription("Project entity type");
-                                try {
-                                    sharingRegistryClient.createEntityType(entityType);
-                                    log.debug("Entity type created. Id : " + domain.getDomainId()+":PROJECT");
-                                } catch (DuplicateEntryException ex) {
-                                    log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Entity Id : " + domain.getDomainId()+":PROJECT", ex);
-                                }
+                                    log.info("Creating entity type. Id EXPERIMENT");
+                                    if (!isEntityTypeExists(custosId, "EXPERIMENT")) {
+                                        EntityType experimentEntityType = EntityType.newBuilder()
+                                                .setName("EXPERIMENT")
+                                                .setDescription("Experiment entity type")
+                                                .setId("EXPERIMENT")
+                                                .build();
 
-                                log.info("Creating entity type. Id : " + domain.getDomainId()+":EXPERIMENT");
-                                entityType = new org.apache.airavata.sharing.registry.models.EntityType();
-                                entityType.setEntityTypeId(domain.getDomainId()+":EXPERIMENT");
-                                entityType.setDomainId(domain.getDomainId());
-                                entityType.setName("EXPERIMENT");
-                                entityType.setDescription("Experiment entity type");
-                                try{
-                                    sharingRegistryClient.createEntityType(entityType);
-                                    log.debug("Entity type created. Id : " + domain.getDomainId()+":EXPERIMENT");
-                                } catch (DuplicateEntryException ex) {
-                                    log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Entity Id : " + domain.getDomainId()+":EXPERIMENT", ex);
-                                }
+                                        sharingManagementClient.createEntityType(custosId, experimentEntityType);
+                                    }
 
-                                log.info("Creating entity type. Id : " + domain.getDomainId()+":FILE");
-                                entityType = new org.apache.airavata.sharing.registry.models.EntityType();
-                                entityType.setEntityTypeId(domain.getDomainId()+":FILE");
-                                entityType.setDomainId(domain.getDomainId());
-                                entityType.setName("FILE");
-                                entityType.setDescription("File entity type");
-                                try {
-                                    sharingRegistryClient.createEntityType(entityType);
-                                    log.debug("Entity type created. Id : " + domain.getDomainId() + ":FILE");
-                                } catch (DuplicateEntryException ex) {
-                                    log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Entity Id : " + domain.getDomainId()+":FILE", ex);
-                                }
+                                    log.info("Creating entity type. Id FILE");
+                                    if (!isEntityTypeExists(custosId, "FILE")) {
+                                        EntityType fileEntityType = EntityType.newBuilder()
+                                                .setName("FILE")
+                                                .setDescription("File entity type")
+                                                .setId("FILE")
+                                                .build();
 
-                                log.info("Creating entity type. Id : " + domain.getDomainId()+":"+ResourceType.APPLICATION_DEPLOYMENT);
-                                entityType = new org.apache.airavata.sharing.registry.models.EntityType();
-                                entityType.setEntityTypeId(domain.getDomainId()+":"+ ResourceType.APPLICATION_DEPLOYMENT.name());
-                                entityType.setDomainId(domain.getDomainId());
-                                entityType.setName("APPLICATION-DEPLOYMENT");
-                                entityType.setDescription("Application Deployment entity type");
-                                sharingRegistryClient.createEntityType(entityType);
+                                        sharingManagementClient.createEntityType(custosId, fileEntityType);
 
-                                log.info("Creating entity type. Id : " + domain.getDomainId()+":"+ResourceType.GROUP_RESOURCE_PROFILE);
-                                entityType = new org.apache.airavata.sharing.registry.models.EntityType();
-                                entityType.setEntityTypeId(domain.getDomainId()+":"+ResourceType.GROUP_RESOURCE_PROFILE.name());
-                                entityType.setDomainId(domain.getDomainId());
-                                entityType.setName(ResourceType.GROUP_RESOURCE_PROFILE.name());
-                                entityType.setDescription("Group Resource Profile entity type");
-                                sharingRegistryClient.createEntityType(entityType);
+                                    }
 
-                                log.info("Creating entity type. Id : " + domain.getDomainId()+":"+ResourceType.CREDENTIAL_TOKEN);
-                                entityType = new org.apache.airavata.sharing.registry.models.EntityType();
-                                entityType.setEntityTypeId(domain.getDomainId()+":"+ResourceType.CREDENTIAL_TOKEN.name());
-                                entityType.setDomainId(domain.getDomainId());
-                                entityType.setName(ResourceType.CREDENTIAL_TOKEN.name());
-                                entityType.setDescription("Credential Store Token entity type");
-                                sharingRegistryClient.createEntityType(entityType);
 
-                                //Creating Permission Types for each domain
-                                log.info("Creating Permission Type. Id : " + domain.getDomainId()+":READ");
-                                PermissionType permissionType = new PermissionType();
-                                permissionType.setPermissionTypeId(domain.getDomainId()+":READ");
-                                permissionType.setDomainId(domain.getDomainId());
-                                permissionType.setName("READ");
-                                permissionType.setDescription("Read permission type");
-                                try {
-                                    sharingRegistryClient.createPermissionType(permissionType);
-                                    log.debug("Permission Type created. Id : " + domain.getDomainId() + ":READ");
-                                } catch (DuplicateEntryException ex) {
-                                    log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Permission Id : " + domain.getDomainId()+":READ", ex);
-                                }
+                                    log.info("Creating entity type. Id " + ResourceType.APPLICATION_DEPLOYMENT.name());
+                                    if (!isEntityTypeExists(custosId, ResourceType.APPLICATION_DEPLOYMENT.name())) {
+                                        EntityType applicationEntityType = EntityType.newBuilder()
+                                                .setName(ResourceType.APPLICATION_DEPLOYMENT.name())
+                                                .setDescription("Application Deployment entity type")
+                                                .setId(ResourceType.APPLICATION_DEPLOYMENT.name())
+                                                .build();
 
-                                log.info("Creating Permission Type. Id : " + domain.getDomainId()+":WRITE");
-                                permissionType = new PermissionType();
-                                permissionType.setPermissionTypeId(domain.getDomainId()+":WRITE");
-                                permissionType.setDomainId(domain.getDomainId());
-                                permissionType.setName("WRITE");
-                                permissionType.setDescription("Write permission type");
-                                try {
-                                    sharingRegistryClient.createPermissionType(permissionType);
-                                    log.debug("Permission Type created. Id : " + domain.getDomainId() + ":WRITE");
-                                } catch (DuplicateEntryException ex) {
-                                    log.warn("DuplicateEntryException while consuming TENANT create message, ex: " + ex.getMessage() + ", Permission Id : " + domain.getDomainId() + ":WRITE", ex);
+                                        sharingManagementClient.createEntityType(custosId, applicationEntityType);
+                                    }
+
+                                    log.info("Creating entity type. Id " + ResourceType.GROUP_RESOURCE_PROFILE.name());
+
+                                    if (!isEntityTypeExists(custosId, ResourceType.GROUP_RESOURCE_PROFILE.name())) {
+                                        EntityType applicationEntityType = EntityType.newBuilder()
+                                                .setName(ResourceType.GROUP_RESOURCE_PROFILE.name())
+                                                .setDescription("Group Resource Profile entity type")
+                                                .setId(ResourceType.GROUP_RESOURCE_PROFILE.name())
+                                                .build();
+
+                                        sharingManagementClient.createEntityType(custosId, applicationEntityType);
+                                    }
+
+                                    log.info("Creating entity type. Id " + ResourceType.CREDENTIAL_TOKEN.name());
+                                    if (!isEntityTypeExists(custosId, ResourceType.CREDENTIAL_TOKEN.name())) {
+                                        EntityType applicationEntityType = EntityType.newBuilder()
+                                                .setName(ResourceType.CREDENTIAL_TOKEN.name())
+                                                .setDescription("Credential Store Token entity type")
+                                                .setId(ResourceType.CREDENTIAL_TOKEN.name())
+                                                .build();
+
+                                        sharingManagementClient.createEntityType(custosId, applicationEntityType);
+                                    }
+
+                                    //Creating Permission Types for each domain
+                                    log.info("Creating Permission Type. Id  READ");
+                                    if (!isPermissionTypeExists(custosId, "READ")) {
+                                        PermissionType applicationEntityType = PermissionType.newBuilder()
+                                                .setName("READ")
+                                                .setDescription("Read permission type")
+                                                .setId("READ")
+                                                .build();
+
+                                        sharingManagementClient.createPermissionType(custosId, applicationEntityType);
+                                    }
+
+
+                                    log.info("Creating Permission Type. Id : WRITE");
+
+                                    if (!isPermissionTypeExists(custosId, "WRITE")) {
+                                        PermissionType applicationEntityType = PermissionType.newBuilder()
+                                                .setName("WRITE")
+                                                .setDescription("Write permission type")
+                                                .setId("WRITE")
+                                                .build();
+
+                                        sharingManagementClient.createPermissionType(custosId, applicationEntityType);
+                                    }
+
+                                    log.info("Creating Permission Type. Id : OWNER");
+
+                                    if (!isPermissionTypeExists(custosId, "OWNER")) {
+                                        PermissionType applicationEntityType = PermissionType.newBuilder()
+                                                .setName("OWNER")
+                                                .setDescription("Owner permission type")
+                                                .setId("OWNER")
+                                                .build();
+
+                                        sharingManagementClient.createPermissionType(custosId, applicationEntityType);
+                                    }
+
+                                    log.info("Creating Permission Type. Id : MANAGE_SHARING");
+
+                                    if (!isPermissionTypeExists(custosId, "MANAGE_SHARING")) {
+                                        PermissionType applicationEntityType = PermissionType.newBuilder()
+                                                .setName("MANAGE_SHARING")
+                                                .setDescription("Manage sharing permission type")
+                                                .setId("MANAGE_SHARING")
+                                                .build();
+
+                                        sharingManagementClient.createPermissionType(custosId, applicationEntityType);
+                                    }
                                 }
 
                                 break;
@@ -253,35 +224,40 @@
 
 
                         break;
-                    
-                    case PROJECT :
+
+                    case PROJECT:
                         log.info("Project specific DB Event communicated by " + dbEventMessage.getPublisherService());
 
                         Project project = new Project();
                         ThriftUtils.createThriftFromBytes(dBEventMessageContext.getPublisher().getPublisherContext().getEntityDataModel(), project);
-                        final String domainId = project.getGatewayId();
+                        final String custos = project.getGatewayId();
                         final String entityId = project.getProjectID();
 
-                        switch (dBEventMessageContext.getPublisher().getPublisherContext().getCrudType()){
+                        log.info("Custos Id at Project "+ custos);
+                        log.info("Entity id  at Project "+ entityId);
+
+                        Entity entity = Entity.newBuilder()
+                                .setId(entityId)
+                                .setDescription(project.getDescription())
+                                .setName(project.getName())
+                                .setOwnerId(project.getOwner())
+                                .setType(ResourceType.PROJECT.name())
+                                .build();
+
+                        switch (dBEventMessageContext.getPublisher().getPublisherContext().getCrudType()) {
 
                             case CREATE:
                             case UPDATE:
-
-                                Entity entity = new Entity();
-                                entity.setEntityId(entityId);
-                                entity.setDomainId(domainId);
-                                entity.setEntityTypeId(domainId + ":" + ResourceType.PROJECT.name());
-                                entity.setOwnerId(project.getOwner() + "@" + domainId);
-                                entity.setName(project.getName());
-                                entity.setDescription(project.getDescription());
-
-                                if (!sharingRegistryClient.isEntityExists(domainId, entityId)) {
+                                log.info("Checking existence ########");
+                                Status status = sharingManagementClient.isEntityExists(custos, entity);
+                                log.info("Status ############" + status.getStatus());
+                                if (!status.getStatus()) {
                                     log.info("Creating project entity. Entity Id : " + entityId);
-                                    sharingRegistryClient.createEntity(entity);
+                                    sharingManagementClient.createEntity(custos, entity);
                                     log.info("Project entity created. Entity Id : " + entityId);
                                 } else {
                                     log.info("Updating project entity. Entity Id : " + entityId);
-                                    sharingRegistryClient.updateEntity(entity);
+                                    sharingManagementClient.updateEntity(custos, entity);
                                     log.info("Project entity updated. Entity Id : " + entityId);
                                 }
 
@@ -293,14 +269,15 @@
 
                             case DELETE:
                                 log.info("Deleting project entity. Entity Id : " + entityId);
-                                sharingRegistryClient.deleteEntity(domainId, entityId);
+                                sharingManagementClient.deleteEntity(custos, entity);
                                 log.info("Project entity deleted. Entity Id : " + entityId);
 
                                 break;
                         }
                         break;
 
-                    default: log.error("Handler not defined for " + dBEventMessageContext.getPublisher().getPublisherContext().getEntityType());
+                    default:
+                        log.error("Handler not defined for " + dBEventMessageContext.getPublisher().getPublisherContext().getEntityType());
                 }
             } catch (DuplicateEntryException ex) {
                 // log this exception and proceed (do nothing)
@@ -317,6 +294,29 @@
             log.error("Error fetching application settings.", e);
         } catch (AiravataException e) {
             log.error("Error sending ack. Message Delivery Tag : " + messageContext.getDeliveryTag(), e);
+        } catch (IOException e) {
+            log.error("Error sending ack. Message Delivery Tag : " + messageContext.getDeliveryTag(), e);
+        }
+    }
+
+
+    private boolean isEntityTypeExists(String custosId, String entityType) {
+        EntityType type = EntityType.newBuilder().setId(entityType).build();
+        EntityType request = sharingManagementClient.getEntityType(custosId, type);
+        if (request != null && request.getId() != null && request.getId().trim().equals(entityType)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private boolean isPermissionTypeExists(String custosId, String entityType) {
+        PermissionType type = PermissionType.newBuilder().setId(entityType).build();
+        PermissionType request = sharingManagementClient.getPermissionType(custosId, type);
+        if (request != null && request.getId() != null && request.getId().trim().equals(entityType)) {
+            return true;
+        } else {
+            return false;
         }
     }
 }
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/messaging/SharingServiceDBEventMessagingFactory.java b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/messaging/SharingServiceDBEventMessagingFactory.java
index 31efc4d..836ab65 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/messaging/SharingServiceDBEventMessagingFactory.java
+++ b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/messaging/SharingServiceDBEventMessagingFactory.java
@@ -35,6 +35,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -67,7 +68,7 @@
         return dbEventPublisher;
     }
 
-    public static Subscriber getDBEventSubscriber() throws AiravataException, SharingRegistryException {
+    public static Subscriber getDBEventSubscriber() throws AiravataException, SharingRegistryException, IOException {
         if(null == sharingServiceDBEventSubscriber){
             synchronized (SharingServiceDBEventMessagingFactory.class){
                 if(null == sharingServiceDBEventSubscriber){
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/ServerMain.java b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/ServerMain.java
index 7eaee34..eaf48bd 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/ServerMain.java
+++ b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/ServerMain.java
@@ -30,7 +30,7 @@
 public class ServerMain {
     private final static Logger logger = LoggerFactory.getLogger(ServerMain.class);
 
-    private static int serverPID = -1;
+    private static long serverPID = -1;
     private static final String stopFileNamePrefix = "server_stop";
     private static final String serverStartedFileNamePrefix = "server_start";
 
@@ -66,27 +66,37 @@
             SHARING_REGISTRY_HOME = "/tmp";
         else
             SHARING_REGISTRY_HOME = SHARING_REGISTRY_HOME + "/bin";
-        return new File(SHARING_REGISTRY_HOME, serverStartedFileNamePrefix + "_" + Integer.toString(serverPID)).toString();
+        return new File(SHARING_REGISTRY_HOME, serverStartedFileNamePrefix + "_" + Long.toString(serverPID)).toString();
     }
 
-    private static int getPID() {
-        try {
-            java.lang.management.RuntimeMXBean runtime = java.lang.management.ManagementFactory
-                    .getRuntimeMXBean();
-            java.lang.reflect.Field jvm = runtime.getClass()
-                    .getDeclaredField("jvm");
-            jvm.setAccessible(true);
-            sun.management.VMManagement mgmt = (sun.management.VMManagement) jvm
-                    .get(runtime);
-            java.lang.reflect.Method pid_method = mgmt.getClass()
-                    .getDeclaredMethod("getProcessId");
-            pid_method.setAccessible(true);
+//    private static int getPID() {
+//        try {
+//            java.lang.management.RuntimeMXBean runtime = java.lang.management.ManagementFactory
+//                    .getRuntimeMXBean();
+//            java.lang.reflect.Field jvm = runtime.getClass()
+//                    .getDeclaredField("jvm");
+//            jvm.setAccessible(true);
+//            sun.management.VMManagement mgmt = (sun.management.VMManagement) jvm
+//                    .get(runtime);
+//            java.lang.reflect.Method pid_method = mgmt.getClass()
+//                    .getDeclaredMethod("getProcessId");
+//            pid_method.setAccessible(true);
+//
+//            int pid = (Integer) pid_method.invoke(mgmt);
+//            return pid;
+//        } catch (Exception e) {
+//            return -1;
+//        }
+//    }
 
-            int pid = (Integer) pid_method.invoke(mgmt);
-            return pid;
+    //getPID from ProcessHandle JDK 9 and onwards
+    private static long getPID () {
+        try {
+            return ProcessHandle.current().pid();
         } catch (Exception e) {
             return -1;
         }
+
     }
 
     private static void deleteOldStopRequests() {
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServer.java b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServer.java
index e24196b..ab8e70e 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServer.java
+++ b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServer.java
@@ -36,6 +36,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 
@@ -122,7 +123,7 @@
 
                             logger.info("Start sharing service DB Event subscriber");
                             SharingServiceDBEventMessagingFactory.getDBEventSubscriber();
-                        } catch (AiravataException | SharingRegistryException e) {
+                        } catch (AiravataException | SharingRegistryException | IOException e) {
                             logger.error("Error starting sharing service. Error setting up DB event services.");
                             server.stop();
                         }
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServerHandler.java b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServerHandler.java
index f4b08ae..82fc938 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServerHandler.java
+++ b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServerHandler.java
@@ -70,6 +70,8 @@
             domain.setUpdatedTime(System.currentTimeMillis());
             (new DomainRepository()).create(domain);
 
+
+
             //create the global permission for the domain
             PermissionType permissionType = new PermissionType();
             permissionType.setPermissionTypeId(domain.getDomainId() + ":" + OWNER_PERMISSION_NAME);
@@ -175,6 +177,12 @@
             userGroup.setGroupCardinality(GroupCardinality.SINGLE_USER);
             (new UserGroupRepository()).create(userGroup);
 
+            Domain domain = new DomainRepository().get(user.getDomainId());
+            if (domain.getInitialUserGroupId() != null) {
+                addUsersToGroup(user.getDomainId(), Collections.singletonList(user.getUserId()),
+                        domain.getInitialUserGroupId());
+            }
+
             return user.getUserId();
         }catch (Throwable ex) {
             logger.error(ex.getMessage(), ex);
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/utils/Constants.java b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/utils/Constants.java
index d7b4892..10bce03 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/utils/Constants.java
+++ b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/utils/Constants.java
@@ -36,5 +36,6 @@
         add(DBEventService.USER_PROFILE.toString());
         add(DBEventService.TENANT.toString());
         add(DBEventService.REGISTRY.toString());
+        add(DBEventService.IAM_ADMIN.toString());
     }};
 }
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/utils/ThriftDataModelConversion.java b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/utils/ThriftDataModelConversion.java
index 7806f26..5093ec9 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/utils/ThriftDataModelConversion.java
+++ b/modules/sharing-registry/sharing-registry-server/src/main/java/org/apache/airavata/sharing/registry/utils/ThriftDataModelConversion.java
@@ -36,10 +36,11 @@
      */
     public static User getUser(UserProfile userProfile){
         User user = new User();
-        user.setUserId(userProfile.getUserId());
+        user.setUserId(userProfile.getAiravataInternalUserId());
         user.setDomainId(userProfile.getGatewayId());
-        // TODO: should set username to getUserId, but see SharingServiceDBEventHandler which overrides userId (see AIRAVATA-2788)
-        user.setUserName(userProfile.getFirstName() + " " + userProfile.getLastName());
+        user.setUserName(userProfile.getUserId());
+        user.setFirstName(userProfile.getFirstName());
+        user.setLastName(userProfile.getLastName());
         user.setEmail(userProfile.getEmails().get(0));
         return user;
     }
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql
index a7038e2..6fe96a1 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql
+++ b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql
@@ -25,6 +25,7 @@
   DESCRIPTION VARCHAR(255),
   CREATED_TIME BIGINT NOT NULL,
   UPDATED_TIME BIGINT NOT NULL,
+  INITIAL_USER_GROUP_ID VARCHAR(255),
   PRIMARY KEY (DOMAIN_ID)
 );
 
@@ -145,3 +146,5 @@
 );
 
 INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VALUE) VALUES('sharing_reg_version', '0.17');
+
+ALTER TABLE DOMAIN ADD FOREIGN KEY (INITIAL_USER_GROUP_ID, DOMAIN_ID) REFERENCES USER_GROUP(GROUP_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION;
diff --git a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql
index 145d926..87b55d9 100644
--- a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql
+++ b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql
@@ -25,6 +25,7 @@
   DESCRIPTION VARCHAR(255),
   CREATED_TIME BIGINT NOT NULL,
   UPDATED_TIME BIGINT NOT NULL,
+  INITIAL_USER_GROUP_ID VARCHAR(255),
   PRIMARY KEY (DOMAIN_ID)
 )ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
 
@@ -143,4 +144,6 @@
   PRIMARY KEY(CONFIG_KEY, CONFIG_VALUE)
 )ENGINE=InnoDB DEFAULT CHARACTER SET=latin1;
 
-INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VALUE) VALUES('sharing_reg_version', '0.17');
\ No newline at end of file
+INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VALUE) VALUES('sharing_reg_version', '0.17');
+
+ALTER TABLE DOMAIN ADD CONSTRAINT `DOMAIN_INITIAL_USER_GROUP_ID_FK` FOREIGN KEY (INITIAL_USER_GROUP_ID, DOMAIN_ID) REFERENCES USER_GROUP(GROUP_ID, DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION;
diff --git a/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServerHandlerTest.java b/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServerHandlerTest.java
index 8cdde80..827a29f 100644
--- a/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServerHandlerTest.java
+++ b/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServerHandlerTest.java
@@ -382,5 +382,40 @@
         Assert.assertTrue("user3 and user7 in shared users", entityId2SharedUsers.contains(user3) && entityId2SharedUsers.contains(user7));
         Assert.assertEquals(1, sharingRegistryServerHandler.getListOfDirectlySharedGroups(domainId, entityId3, permissionTypeId1).size());
         Assert.assertEquals(groupId2, sharingRegistryServerHandler.getListOfDirectlySharedGroups(domainId, entityId3, permissionTypeId1).get(0).getGroupId());
+
+        // Test that new users are added to initialUserGroupId
+        UserGroup initialUserGroup = new UserGroup();
+        String initialUserGroupName = "initial user group";
+        String initialUserGroupId = domainId + ":" + initialUserGroupName;
+        initialUserGroup.setGroupId(initialUserGroupId);
+        initialUserGroup.setDomainId(domainId);
+        initialUserGroup.setName(initialUserGroupName);
+        initialUserGroup.setDescription("initial user group desc");
+        initialUserGroup.setOwnerId(userId1);
+        initialUserGroup.setGroupType(GroupType.USER_LEVEL_GROUP);
+        initialUserGroup.setGroupCardinality(GroupCardinality.MULTI_USER);
+        initialUserGroup.setCreatedTime(System.currentTimeMillis());
+        initialUserGroup.setUpdatedTime(System.currentTimeMillis());
+
+        Assert.assertNotNull(sharingRegistryServerHandler.createGroup(initialUserGroup));
+
+        domain.setInitialUserGroupId(initialUserGroupId);
+        Assert.assertTrue(sharingRegistryServerHandler.updateDomain(domain));
+        Assert.assertEquals(initialUserGroupId, sharingRegistryServerHandler.getDomain(domain.getDomainId()).getInitialUserGroupId());
+
+        User user8 = new User();
+        String userName8 = "test-user-8." + System.currentTimeMillis();
+        String userId8 = domainId + ":" + userName8;
+        user8.setUserId(userId8);
+        user8.setUserName(userName8);
+        user8.setDomainId(domainId);
+        user8.setCreatedTime(System.currentTimeMillis());
+        user8.setUpdatedTime(System.currentTimeMillis());
+
+        Assert.assertNotNull(sharingRegistryServerHandler.createUser(user8));
+        List<UserGroup> user8Groups = sharingRegistryServerHandler.getAllMemberGroupsForUser(domain.getDomainId(), userId8);
+        Assert.assertFalse(user8Groups.isEmpty());
+        Assert.assertEquals(1, user8Groups.size());
+        Assert.assertEquals(initialUserGroupId, user8Groups.get(0).getGroupId());
     }
 }
diff --git a/modules/sharing-registry/sharing-registry-stubs/pom.xml b/modules/sharing-registry/sharing-registry-stubs/pom.xml
index 71689f0..6fffcab 100644
--- a/modules/sharing-registry/sharing-registry-stubs/pom.xml
+++ b/modules/sharing-registry/sharing-registry-stubs/pom.xml
@@ -25,7 +25,7 @@
         <artifactId>airavata-sharing-registry</artifactId>
         <groupId>org.apache.airavata</groupId>
         <relativePath>../pom.xml</relativePath>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -48,7 +48,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-data-models</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
@@ -57,10 +57,10 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.5.1</version>
+                <version>3.8.0</version>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                   <release>11</release>
+
                 </configuration>
             </plugin>
             <plugin>
diff --git a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/Domain.java b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/Domain.java
index 1b0fdd9..3800279 100644
--- a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/Domain.java
+++ b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/Domain.java
@@ -33,6 +33,7 @@
  * <li>description : A short description for the domain</li>
  * <li>createdTime : Will be set by the system</li>
  * <li>updatedTime : Will be set by the system</li>
+ * <li>initialUserGroupId : New users will automatically be added to this group</li>
  * 
  */
 @javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
@@ -44,6 +45,7 @@
   private static final org.apache.thrift.protocol.TField DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("description", org.apache.thrift.protocol.TType.STRING, (short)3);
   private static final org.apache.thrift.protocol.TField CREATED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("createdTime", org.apache.thrift.protocol.TType.I64, (short)4);
   private static final org.apache.thrift.protocol.TField UPDATED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("updatedTime", org.apache.thrift.protocol.TType.I64, (short)5);
+  private static final org.apache.thrift.protocol.TField INITIAL_USER_GROUP_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("initialUserGroupId", org.apache.thrift.protocol.TType.STRING, (short)6);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new DomainStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new DomainTupleSchemeFactory();
@@ -53,6 +55,7 @@
   private java.lang.String description; // optional
   private long createdTime; // optional
   private long updatedTime; // optional
+  private java.lang.String initialUserGroupId; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -60,7 +63,8 @@
     NAME((short)2, "name"),
     DESCRIPTION((short)3, "description"),
     CREATED_TIME((short)4, "createdTime"),
-    UPDATED_TIME((short)5, "updatedTime");
+    UPDATED_TIME((short)5, "updatedTime"),
+    INITIAL_USER_GROUP_ID((short)6, "initialUserGroupId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -85,6 +89,8 @@
           return CREATED_TIME;
         case 5: // UPDATED_TIME
           return UPDATED_TIME;
+        case 6: // INITIAL_USER_GROUP_ID
+          return INITIAL_USER_GROUP_ID;
         default:
           return null;
       }
@@ -128,7 +134,7 @@
   private static final int __CREATEDTIME_ISSET_ID = 0;
   private static final int __UPDATEDTIME_ISSET_ID = 1;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.DOMAIN_ID,_Fields.NAME,_Fields.DESCRIPTION,_Fields.CREATED_TIME,_Fields.UPDATED_TIME};
+  private static final _Fields optionals[] = {_Fields.DOMAIN_ID,_Fields.NAME,_Fields.DESCRIPTION,_Fields.CREATED_TIME,_Fields.UPDATED_TIME,_Fields.INITIAL_USER_GROUP_ID};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -142,6 +148,8 @@
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.UPDATED_TIME, new org.apache.thrift.meta_data.FieldMetaData("updatedTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+    tmpMap.put(_Fields.INITIAL_USER_GROUP_ID, new org.apache.thrift.meta_data.FieldMetaData("initialUserGroupId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(Domain.class, metaDataMap);
   }
@@ -167,6 +175,9 @@
     }
     this.createdTime = other.createdTime;
     this.updatedTime = other.updatedTime;
+    if (other.isSetInitialUserGroupId()) {
+      this.initialUserGroupId = other.initialUserGroupId;
+    }
   }
 
   public Domain deepCopy() {
@@ -183,6 +194,7 @@
     this.createdTime = 0;
     setUpdatedTimeIsSet(false);
     this.updatedTime = 0;
+    this.initialUserGroupId = null;
   }
 
   public java.lang.String getDomainId() {
@@ -298,6 +310,29 @@
     __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __UPDATEDTIME_ISSET_ID, value);
   }
 
+  public java.lang.String getInitialUserGroupId() {
+    return this.initialUserGroupId;
+  }
+
+  public void setInitialUserGroupId(java.lang.String initialUserGroupId) {
+    this.initialUserGroupId = initialUserGroupId;
+  }
+
+  public void unsetInitialUserGroupId() {
+    this.initialUserGroupId = null;
+  }
+
+  /** Returns true if field initialUserGroupId is set (has been assigned a value) and false otherwise */
+  public boolean isSetInitialUserGroupId() {
+    return this.initialUserGroupId != null;
+  }
+
+  public void setInitialUserGroupIdIsSet(boolean value) {
+    if (!value) {
+      this.initialUserGroupId = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case DOMAIN_ID:
@@ -340,6 +375,14 @@
       }
       break;
 
+    case INITIAL_USER_GROUP_ID:
+      if (value == null) {
+        unsetInitialUserGroupId();
+      } else {
+        setInitialUserGroupId((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
@@ -360,6 +403,9 @@
     case UPDATED_TIME:
       return getUpdatedTime();
 
+    case INITIAL_USER_GROUP_ID:
+      return getInitialUserGroupId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -381,6 +427,8 @@
       return isSetCreatedTime();
     case UPDATED_TIME:
       return isSetUpdatedTime();
+    case INITIAL_USER_GROUP_ID:
+      return isSetInitialUserGroupId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -445,6 +493,15 @@
         return false;
     }
 
+    boolean this_present_initialUserGroupId = true && this.isSetInitialUserGroupId();
+    boolean that_present_initialUserGroupId = true && that.isSetInitialUserGroupId();
+    if (this_present_initialUserGroupId || that_present_initialUserGroupId) {
+      if (!(this_present_initialUserGroupId && that_present_initialUserGroupId))
+        return false;
+      if (!this.initialUserGroupId.equals(that.initialUserGroupId))
+        return false;
+    }
+
     return true;
   }
 
@@ -472,6 +529,10 @@
     if (isSetUpdatedTime())
       hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(updatedTime);
 
+    hashCode = hashCode * 8191 + ((isSetInitialUserGroupId()) ? 131071 : 524287);
+    if (isSetInitialUserGroupId())
+      hashCode = hashCode * 8191 + initialUserGroupId.hashCode();
+
     return hashCode;
   }
 
@@ -533,6 +594,16 @@
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetInitialUserGroupId()).compareTo(other.isSetInitialUserGroupId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetInitialUserGroupId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.initialUserGroupId, other.initialUserGroupId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -594,6 +665,16 @@
       sb.append(this.updatedTime);
       first = false;
     }
+    if (isSetInitialUserGroupId()) {
+      if (!first) sb.append(", ");
+      sb.append("initialUserGroupId:");
+      if (this.initialUserGroupId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.initialUserGroupId);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -679,6 +760,14 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 6: // INITIAL_USER_GROUP_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.initialUserGroupId = iprot.readString();
+              struct.setInitialUserGroupIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -723,6 +812,13 @@
         oprot.writeI64(struct.updatedTime);
         oprot.writeFieldEnd();
       }
+      if (struct.initialUserGroupId != null) {
+        if (struct.isSetInitialUserGroupId()) {
+          oprot.writeFieldBegin(INITIAL_USER_GROUP_ID_FIELD_DESC);
+          oprot.writeString(struct.initialUserGroupId);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -756,7 +852,10 @@
       if (struct.isSetUpdatedTime()) {
         optionals.set(4);
       }
-      oprot.writeBitSet(optionals, 5);
+      if (struct.isSetInitialUserGroupId()) {
+        optionals.set(5);
+      }
+      oprot.writeBitSet(optionals, 6);
       if (struct.isSetDomainId()) {
         oprot.writeString(struct.domainId);
       }
@@ -772,12 +871,15 @@
       if (struct.isSetUpdatedTime()) {
         oprot.writeI64(struct.updatedTime);
       }
+      if (struct.isSetInitialUserGroupId()) {
+        oprot.writeString(struct.initialUserGroupId);
+      }
     }
 
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, Domain struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
-      java.util.BitSet incoming = iprot.readBitSet(5);
+      java.util.BitSet incoming = iprot.readBitSet(6);
       if (incoming.get(0)) {
         struct.domainId = iprot.readString();
         struct.setDomainIdIsSet(true);
@@ -798,6 +900,10 @@
         struct.updatedTime = iprot.readI64();
         struct.setUpdatedTimeIsSet(true);
       }
+      if (incoming.get(5)) {
+        struct.initialUserGroupId = iprot.readString();
+        struct.setInitialUserGroupIdIsSet(true);
+      }
     }
   }
 
diff --git a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/SharingRegistryService.java b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/SharingRegistryService.java
index ff90b4d..fdf5473 100644
--- a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/SharingRegistryService.java
+++ b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/SharingRegistryService.java
@@ -1,19 +1,20 @@
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one or more
-     * contributor license agreements.  See the NOTICE file distributed with
-     * this work for additional information regarding copyright ownership.
-     * The ASF licenses this file to You 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.
-     */
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
 /**
  * Autogenerated by Thrift Compiler (0.10.0)
  *
diff --git a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/sharing_cpiConstants.java b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/sharing_cpiConstants.java
index 204520d..b3a7ae7 100644
--- a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/sharing_cpiConstants.java
+++ b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/sharing_cpiConstants.java
@@ -1,19 +1,20 @@
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one or more
-     * contributor license agreements.  See the NOTICE file distributed with
-     * this work for additional information regarding copyright ownership.
-     * The ASF licenses this file to You 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.
-     */
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
 /**
  * Autogenerated by Thrift Compiler (0.10.0)
  *
diff --git a/modules/sharing-registry/sharing-service-docs/api-docs/sharing_cpi.html b/modules/sharing-registry/sharing-service-docs/api-docs/sharing_cpi.html
index 4cbd468..29da22d 100644
--- a/modules/sharing-registry/sharing-service-docs/api-docs/sharing_cpi.html
+++ b/modules/sharing-registry/sharing-service-docs/api-docs/sharing_cpi.html
@@ -82,308 +82,308 @@
 <div class="definition"><h4 id="Fn_SharingRegistryService_createDomain">Function: SharingRegistryService.createDomain</h4>
 <pre><code>string</code> createDomain(<code><a href="sharing_models.html#Struct_Domain">sharing_models.Domain</a></code> domain)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>, <code><a href="sharing_models.html#Struct_DuplicateEntryException">sharing_models.DuplicateEntryException</a></code>
-</pre><p>API method to create a new domain</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updateDomain">Function: SharingRegistryService.updateDomain</h4>
+</pre><pre><p>API method to create a new domain</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updateDomain">Function: SharingRegistryService.updateDomain</h4>
 <pre><code>bool</code> updateDomain(<code><a href="sharing_models.html#Struct_Domain">sharing_models.Domain</a></code> domain)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to update a domain</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isDomainExists">Function: SharingRegistryService.isDomainExists</h4>
+</pre><pre><p>API method to update a domain</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isDomainExists">Function: SharingRegistryService.isDomainExists</h4>
 <pre><code>bool</code> isDomainExists(<code>string</code> domainId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to check Domain Exists</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteDomain">Function: SharingRegistryService.deleteDomain</h4>
+</pre><pre><p>API method to check Domain Exists</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteDomain">Function: SharingRegistryService.deleteDomain</h4>
 <pre><code>bool</code> deleteDomain(<code>string</code> domainId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to delete domain</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getDomain">Function: SharingRegistryService.getDomain</h4>
+</pre><pre><p>API method to delete domain</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getDomain">Function: SharingRegistryService.getDomain</h4>
 <pre><code><a href="sharing_models.html#Struct_Domain">sharing_models.Domain</a></code> getDomain(<code>string</code> domainId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to retrieve a domain</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getDomains">Function: SharingRegistryService.getDomains</h4>
+</pre><pre><p>API method to retrieve a domain</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getDomains">Function: SharingRegistryService.getDomains</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_Domain">sharing_models.Domain</a></code>&gt;</code> getDomains(<code>i32</code> offset,
                                        <code>i32</code> limit)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get all domain.</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_createUser">Function: SharingRegistryService.createUser</h4>
+</pre><pre><p>API method to get all domain.</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_createUser">Function: SharingRegistryService.createUser</h4>
 <pre><code>string</code> createUser(<code><a href="sharing_models.html#Struct_User">sharing_models.User</a></code> user)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>, <code><a href="sharing_models.html#Struct_DuplicateEntryException">sharing_models.DuplicateEntryException</a></code>
-</pre><p>API method to register a user in the system</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updatedUser">Function: SharingRegistryService.updatedUser</h4>
+</pre><pre><p>API method to register a user in the system</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updatedUser">Function: SharingRegistryService.updatedUser</h4>
 <pre><code>bool</code> updatedUser(<code><a href="sharing_models.html#Struct_User">sharing_models.User</a></code> user)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to update existing user</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isUserExists">Function: SharingRegistryService.isUserExists</h4>
+</pre><pre><p>API method to update existing user</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isUserExists">Function: SharingRegistryService.isUserExists</h4>
 <pre><code>bool</code> isUserExists(<code>string</code> domainId,
                   <code>string</code> userId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to check User Exists</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteUser">Function: SharingRegistryService.deleteUser</h4>
+</pre><pre><p>API method to check User Exists</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteUser">Function: SharingRegistryService.deleteUser</h4>
 <pre><code>bool</code> deleteUser(<code>string</code> domainId,
                 <code>string</code> userId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to delete user</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getUser">Function: SharingRegistryService.getUser</h4>
+</pre><pre><p>API method to delete user</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getUser">Function: SharingRegistryService.getUser</h4>
 <pre><code><a href="sharing_models.html#Struct_User">sharing_models.User</a></code> getUser(<code>string</code> domainId,
                             <code>string</code> userId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get a user</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getUsers">Function: SharingRegistryService.getUsers</h4>
+</pre><pre><p>API method to get a user</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getUsers">Function: SharingRegistryService.getUsers</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_User">sharing_models.User</a></code>&gt;</code> getUsers(<code>string</code> domainId,
                                    <code>i32</code> offset,
                                    <code>i32</code> limit)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get a list of users in a specific domain.</p>
+</pre><pre><p>API method to get a list of users in a specific domain.</p>
 <li>domainId : Domain id</li>
 <li>offset : Starting result number</li>
 <li>limit : Number of max results to be sent</li>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_createGroup">Function: SharingRegistryService.createGroup</h4>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_createGroup">Function: SharingRegistryService.createGroup</h4>
 <pre><code>string</code> createGroup(<code><a href="sharing_models.html#Struct_UserGroup">sharing_models.UserGroup</a></code> group)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to create a new group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updateGroup">Function: SharingRegistryService.updateGroup</h4>
+</pre><pre><p>API method to create a new group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updateGroup">Function: SharingRegistryService.updateGroup</h4>
 <pre><code>bool</code> updateGroup(<code><a href="sharing_models.html#Struct_UserGroup">sharing_models.UserGroup</a></code> group)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to update a group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isGroupExists">Function: SharingRegistryService.isGroupExists</h4>
+</pre><pre><p>API method to update a group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isGroupExists">Function: SharingRegistryService.isGroupExists</h4>
 <pre><code>bool</code> isGroupExists(<code>string</code> domainId,
                    <code>string</code> groupId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to check Group Exists</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteGroup">Function: SharingRegistryService.deleteGroup</h4>
+</pre><pre><p>API method to check Group Exists</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteGroup">Function: SharingRegistryService.deleteGroup</h4>
 <pre><code>bool</code> deleteGroup(<code>string</code> domainId,
                  <code>string</code> groupId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to delete a group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getGroup">Function: SharingRegistryService.getGroup</h4>
+</pre><pre><p>API method to delete a group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getGroup">Function: SharingRegistryService.getGroup</h4>
 <pre><code><a href="sharing_models.html#Struct_UserGroup">sharing_models.UserGroup</a></code> getGroup(<code>string</code> domainId,
                                   <code>string</code> groupId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get a group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getGroups">Function: SharingRegistryService.getGroups</h4>
+</pre><pre><p>API method to get a group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getGroups">Function: SharingRegistryService.getGroups</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_UserGroup">sharing_models.UserGroup</a></code>&gt;</code> getGroups(<code>string</code> domainId,
                                          <code>i32</code> offset,
                                          <code>i32</code> limit)
-</pre><p>API method to get groups in a domainId.</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_addUsersToGroup">Function: SharingRegistryService.addUsersToGroup</h4>
+</pre><pre><p>API method to get groups in a domainId.</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_addUsersToGroup">Function: SharingRegistryService.addUsersToGroup</h4>
 <pre><code>bool</code> addUsersToGroup(<code>string</code> domainId,
                      <code>list&lt;<code>string</code>&gt;</code> userIds,
                      <code>string</code> groupId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to add list of users to a group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_removeUsersFromGroup">Function: SharingRegistryService.removeUsersFromGroup</h4>
+</pre><pre><p>API method to add list of users to a group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_removeUsersFromGroup">Function: SharingRegistryService.removeUsersFromGroup</h4>
 <pre><code>bool</code> removeUsersFromGroup(<code>string</code> domainId,
                           <code>list&lt;<code>string</code>&gt;</code> userIds,
                           <code>string</code> groupId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to remove users from a group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_transferGroupOwnership">Function: SharingRegistryService.transferGroupOwnership</h4>
+</pre><pre><p>API method to remove users from a group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_transferGroupOwnership">Function: SharingRegistryService.transferGroupOwnership</h4>
 <pre><code>bool</code> transferGroupOwnership(<code>string</code> domainId,
                             <code>string</code> groupId,
                             <code>string</code> newOwnerId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to transfer group ownership</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_addGroupAdmins">Function: SharingRegistryService.addGroupAdmins</h4>
+</pre><pre><p>API method to transfer group ownership</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_addGroupAdmins">Function: SharingRegistryService.addGroupAdmins</h4>
 <pre><code>bool</code> addGroupAdmins(<code>string</code> domainId,
                     <code>string</code> groupId,
                     <code>list&lt;<code>string</code>&gt;</code> adminIds)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to add Admin for a group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_removeGroupAdmins">Function: SharingRegistryService.removeGroupAdmins</h4>
+</pre><pre><p>API method to add Admin for a group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_removeGroupAdmins">Function: SharingRegistryService.removeGroupAdmins</h4>
 <pre><code>bool</code> removeGroupAdmins(<code>string</code> domainId,
                        <code>string</code> groupId,
                        <code>list&lt;<code>string</code>&gt;</code> adminIds)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to remove Admin for a group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_hasAdminAccess">Function: SharingRegistryService.hasAdminAccess</h4>
+</pre><pre><p>API method to remove Admin for a group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_hasAdminAccess">Function: SharingRegistryService.hasAdminAccess</h4>
 <pre><code>bool</code> hasAdminAccess(<code>string</code> domainId,
                     <code>string</code> groupId,
                     <code>string</code> adminId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to check whether the user has Admin access for the group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_hasOwnerAccess">Function: SharingRegistryService.hasOwnerAccess</h4>
+</pre><pre><p>API method to check whether the user has Admin access for the group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_hasOwnerAccess">Function: SharingRegistryService.hasOwnerAccess</h4>
 <pre><code>bool</code> hasOwnerAccess(<code>string</code> domainId,
                     <code>string</code> groupId,
                     <code>string</code> ownerId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to check whether the user has Admin access for the group</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getGroupMembersOfTypeUser">Function: SharingRegistryService.getGroupMembersOfTypeUser</h4>
+</pre><pre><p>API method to check whether the user has Admin access for the group</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getGroupMembersOfTypeUser">Function: SharingRegistryService.getGroupMembersOfTypeUser</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_User">sharing_models.User</a></code>&gt;</code> getGroupMembersOfTypeUser(<code>string</code> domainId,
                                                     <code>string</code> groupId,
                                                     <code>i32</code> offset,
                                                     <code>i32</code> limit)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get list of child users in a group. Only the direct members will be returned.</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getGroupMembersOfTypeGroup">Function: SharingRegistryService.getGroupMembersOfTypeGroup</h4>
+</pre><pre><p>API method to get list of child users in a group. Only the direct members will be returned.</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getGroupMembersOfTypeGroup">Function: SharingRegistryService.getGroupMembersOfTypeGroup</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_UserGroup">sharing_models.UserGroup</a></code>&gt;</code> getGroupMembersOfTypeGroup(<code>string</code> domainId,
                                                           <code>string</code> groupId,
                                                           <code>i32</code> offset,
                                                           <code>i32</code> limit)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get list of child groups in a group. Only the direct members will be returned.</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_addChildGroupsToParentGroup">Function: SharingRegistryService.addChildGroupsToParentGroup</h4>
+</pre><pre><p>API method to get list of child groups in a group. Only the direct members will be returned.</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_addChildGroupsToParentGroup">Function: SharingRegistryService.addChildGroupsToParentGroup</h4>
 <pre><code>bool</code> addChildGroupsToParentGroup(<code>string</code> domainId,
                                  <code>list&lt;<code>string</code>&gt;</code> childIds,
                                  <code>string</code> groupId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to add a child group to a parent group.</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_removeChildGroupFromParentGroup">Function: SharingRegistryService.removeChildGroupFromParentGroup</h4>
+</pre><pre><p>API method to add a child group to a parent group.</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_removeChildGroupFromParentGroup">Function: SharingRegistryService.removeChildGroupFromParentGroup</h4>
 <pre><code>bool</code> removeChildGroupFromParentGroup(<code>string</code> domainId,
                                      <code>string</code> childId,
                                      <code>string</code> groupId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to remove a child group from parent group.</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getAllMemberGroupsForUser">Function: SharingRegistryService.getAllMemberGroupsForUser</h4>
+</pre><pre><p>API method to remove a child group from parent group.</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getAllMemberGroupsForUser">Function: SharingRegistryService.getAllMemberGroupsForUser</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_UserGroup">sharing_models.UserGroup</a></code>&gt;</code> getAllMemberGroupsForUser(<code>string</code> domainId,
                                                          <code>string</code> userId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
 </pre></div><div class="definition"><h4 id="Fn_SharingRegistryService_createEntityType">Function: SharingRegistryService.createEntityType</h4>
 <pre><code>string</code> createEntityType(<code><a href="sharing_models.html#Struct_EntityType">sharing_models.EntityType</a></code> entityType)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>, <code><a href="sharing_models.html#Struct_DuplicateEntryException">sharing_models.DuplicateEntryException</a></code>
-</pre><p>API method to create a new entity type</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updateEntityType">Function: SharingRegistryService.updateEntityType</h4>
+</pre><pre><p>API method to create a new entity type</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updateEntityType">Function: SharingRegistryService.updateEntityType</h4>
 <pre><code>bool</code> updateEntityType(<code><a href="sharing_models.html#Struct_EntityType">sharing_models.EntityType</a></code> entityType)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to update entity type</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isEntityTypeExists">Function: SharingRegistryService.isEntityTypeExists</h4>
+</pre><pre><p>API method to update entity type</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isEntityTypeExists">Function: SharingRegistryService.isEntityTypeExists</h4>
 <pre><code>bool</code> isEntityTypeExists(<code>string</code> domainId,
                         <code>string</code> entityTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to check EntityType Exists</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteEntityType">Function: SharingRegistryService.deleteEntityType</h4>
+</pre><pre><p>API method to check EntityType Exists</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteEntityType">Function: SharingRegistryService.deleteEntityType</h4>
 <pre><code>bool</code> deleteEntityType(<code>string</code> domainId,
                       <code>string</code> entityTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to delete entity type</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getEntityType">Function: SharingRegistryService.getEntityType</h4>
+</pre><pre><p>API method to delete entity type</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getEntityType">Function: SharingRegistryService.getEntityType</h4>
 <pre><code><a href="sharing_models.html#Struct_EntityType">sharing_models.EntityType</a></code> getEntityType(<code>string</code> domainId,
                                         <code>string</code> entityTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get an entity type</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getEntityTypes">Function: SharingRegistryService.getEntityTypes</h4>
+</pre><pre><p>API method to get an entity type</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getEntityTypes">Function: SharingRegistryService.getEntityTypes</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_EntityType">sharing_models.EntityType</a></code>&gt;</code> getEntityTypes(<code>string</code> domainId,
                                                <code>i32</code> offset,
                                                <code>i32</code> limit)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get entity types in a domainId.</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_createEntity">Function: SharingRegistryService.createEntity</h4>
+</pre><pre><p>API method to get entity types in a domainId.</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_createEntity">Function: SharingRegistryService.createEntity</h4>
 <pre><code>string</code> createEntity(<code><a href="sharing_models.html#Struct_Entity">sharing_models.Entity</a></code> entity)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to register new entity</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updateEntity">Function: SharingRegistryService.updateEntity</h4>
+</pre><pre><p>API method to register new entity</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updateEntity">Function: SharingRegistryService.updateEntity</h4>
 <pre><code>bool</code> updateEntity(<code><a href="sharing_models.html#Struct_Entity">sharing_models.Entity</a></code> entity)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to update entity</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isEntityExists">Function: SharingRegistryService.isEntityExists</h4>
+</pre><pre><p>API method to update entity</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isEntityExists">Function: SharingRegistryService.isEntityExists</h4>
 <pre><code>bool</code> isEntityExists(<code>string</code> domainId,
                     <code>string</code> entityId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to check Entity Exists</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteEntity">Function: SharingRegistryService.deleteEntity</h4>
+</pre><pre><p>API method to check Entity Exists</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deleteEntity">Function: SharingRegistryService.deleteEntity</h4>
 <pre><code>bool</code> deleteEntity(<code>string</code> domainId,
                   <code>string</code> entityId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to delete entity</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getEntity">Function: SharingRegistryService.getEntity</h4>
+</pre><pre><p>API method to delete entity</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getEntity">Function: SharingRegistryService.getEntity</h4>
 <pre><code><a href="sharing_models.html#Struct_Entity">sharing_models.Entity</a></code> getEntity(<code>string</code> domainId,
                                 <code>string</code> entityId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get entity</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_searchEntities">Function: SharingRegistryService.searchEntities</h4>
+</pre><pre><p>API method to get entity</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_searchEntities">Function: SharingRegistryService.searchEntities</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_Entity">sharing_models.Entity</a></code>&gt;</code> searchEntities(<code>string</code> domainId,
                                            <code>string</code> userId,
                                            <code>list&lt;<code><a href="sharing_models.html#Struct_SearchCriteria">sharing_models.SearchCriteria</a></code>&gt;</code> filters,
                                            <code>i32</code> offset,
                                            <code>i32</code> limit)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to search entities</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getListOfSharedUsers">Function: SharingRegistryService.getListOfSharedUsers</h4>
+</pre><pre><p>API method to search entities</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getListOfSharedUsers">Function: SharingRegistryService.getListOfSharedUsers</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_User">sharing_models.User</a></code>&gt;</code> getListOfSharedUsers(<code>string</code> domainId,
                                                <code>string</code> entityId,
                                                <code>string</code> permissionTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get a list of shared users given the entity id</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getListOfDirectlySharedUsers">Function: SharingRegistryService.getListOfDirectlySharedUsers</h4>
+</pre><pre><p>API method to get a list of shared users given the entity id</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getListOfDirectlySharedUsers">Function: SharingRegistryService.getListOfDirectlySharedUsers</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_User">sharing_models.User</a></code>&gt;</code> getListOfDirectlySharedUsers(<code>string</code> domainId,
                                                        <code>string</code> entityId,
                                                        <code>string</code> permissionTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get a list of shared users given the entity id where the sharing type is directly applied</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getListOfSharedGroups">Function: SharingRegistryService.getListOfSharedGroups</h4>
+</pre><pre><p>API method to get a list of shared users given the entity id where the sharing type is directly applied</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getListOfSharedGroups">Function: SharingRegistryService.getListOfSharedGroups</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_UserGroup">sharing_models.UserGroup</a></code>&gt;</code> getListOfSharedGroups(<code>string</code> domainId,
                                                      <code>string</code> entityId,
                                                      <code>string</code> permissionTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get a list of shared groups given the entity id</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getListOfDirectlySharedGroups">Function: SharingRegistryService.getListOfDirectlySharedGroups</h4>
+</pre><pre><p>API method to get a list of shared groups given the entity id</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getListOfDirectlySharedGroups">Function: SharingRegistryService.getListOfDirectlySharedGroups</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_UserGroup">sharing_models.UserGroup</a></code>&gt;</code> getListOfDirectlySharedGroups(<code>string</code> domainId,
                                                              <code>string</code> entityId,
                                                              <code>string</code> permissionTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get a list of directly shared groups given the entity id where the sharing type is directly applied</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_createPermissionType">Function: SharingRegistryService.createPermissionType</h4>
+</pre><pre><p>API method to get a list of directly shared groups given the entity id where the sharing type is directly applied</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_createPermissionType">Function: SharingRegistryService.createPermissionType</h4>
 <pre><code>string</code> createPermissionType(<code><a href="sharing_models.html#Struct_PermissionType">sharing_models.PermissionType</a></code> permissionType)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>, <code><a href="sharing_models.html#Struct_DuplicateEntryException">sharing_models.DuplicateEntryException</a></code>
-</pre><p>API method to create permission type</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updatePermissionType">Function: SharingRegistryService.updatePermissionType</h4>
+</pre><pre><p>API method to create permission type</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_updatePermissionType">Function: SharingRegistryService.updatePermissionType</h4>
 <pre><code>bool</code> updatePermissionType(<code><a href="sharing_models.html#Struct_PermissionType">sharing_models.PermissionType</a></code> permissionType)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to update permission type</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isPermissionExists">Function: SharingRegistryService.isPermissionExists</h4>
+</pre><pre><p>API method to update permission type</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_isPermissionExists">Function: SharingRegistryService.isPermissionExists</h4>
 <pre><code>bool</code> isPermissionExists(<code>string</code> dimainId,
                         <code>string</code> permissionId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to check Permission Exists</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deletePermissionType">Function: SharingRegistryService.deletePermissionType</h4>
+</pre><pre><p>API method to check Permission Exists</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_deletePermissionType">Function: SharingRegistryService.deletePermissionType</h4>
 <pre><code>bool</code> deletePermissionType(<code>string</code> domainId,
                           <code>string</code> permissionTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to delete permission type</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getPermissionType">Function: SharingRegistryService.getPermissionType</h4>
+</pre><pre><p>API method to delete permission type</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getPermissionType">Function: SharingRegistryService.getPermissionType</h4>
 <pre><code><a href="sharing_models.html#Struct_PermissionType">sharing_models.PermissionType</a></code> getPermissionType(<code>string</code> domainId,
                                                 <code>string</code> permissionTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get permission type</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getPermissionTypes">Function: SharingRegistryService.getPermissionTypes</h4>
+</pre><pre><p>API method to get permission type</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_getPermissionTypes">Function: SharingRegistryService.getPermissionTypes</h4>
 <pre><code>list&lt;<code><a href="sharing_models.html#Struct_PermissionType">sharing_models.PermissionType</a></code>&gt;</code> getPermissionTypes(<code>string</code> domainId,
                                                        <code>i32</code> offset,
                                                        <code>i32</code> limit)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to get list of permission types in a given domainId.</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_shareEntityWithUsers">Function: SharingRegistryService.shareEntityWithUsers</h4>
+</pre><pre><p>API method to get list of permission types in a given domainId.</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_shareEntityWithUsers">Function: SharingRegistryService.shareEntityWithUsers</h4>
 <pre><code>bool</code> shareEntityWithUsers(<code>string</code> domainId,
                           <code>string</code> entityId,
                           <code>list&lt;<code>string</code>&gt;</code> userList,
                           <code>string</code> permissionTypeId,
                           <code>bool</code> cascadePermission)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to share an entity with users</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_revokeEntitySharingFromUsers">Function: SharingRegistryService.revokeEntitySharingFromUsers</h4>
+</pre><pre><p>API method to share an entity with users</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_revokeEntitySharingFromUsers">Function: SharingRegistryService.revokeEntitySharingFromUsers</h4>
 <pre><code>bool</code> revokeEntitySharingFromUsers(<code>string</code> domainId,
                                   <code>string</code> entityId,
                                   <code>list&lt;<code>string</code>&gt;</code> userList,
                                   <code>string</code> permissionTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to revoke sharing from a list of users</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_shareEntityWithGroups">Function: SharingRegistryService.shareEntityWithGroups</h4>
+</pre><pre><p>API method to revoke sharing from a list of users</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_shareEntityWithGroups">Function: SharingRegistryService.shareEntityWithGroups</h4>
 <pre><code>bool</code> shareEntityWithGroups(<code>string</code> domainId,
                            <code>string</code> entityId,
                            <code>list&lt;<code>string</code>&gt;</code> groupList,
                            <code>string</code> permissionTypeId,
                            <code>bool</code> cascadePermission)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to share an entity with list of groups</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_revokeEntitySharingFromGroups">Function: SharingRegistryService.revokeEntitySharingFromGroups</h4>
+</pre><pre><p>API method to share an entity with list of groups</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_revokeEntitySharingFromGroups">Function: SharingRegistryService.revokeEntitySharingFromGroups</h4>
 <pre><code>bool</code> revokeEntitySharingFromGroups(<code>string</code> domainId,
                                    <code>string</code> entityId,
                                    <code>list&lt;<code>string</code>&gt;</code> groupList,
                                    <code>string</code> permissionTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to revoke sharing from list of users</p>
-<br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_userHasAccess">Function: SharingRegistryService.userHasAccess</h4>
+</pre><pre><p>API method to revoke sharing from list of users</p>
+</pre><br/></div><div class="definition"><h4 id="Fn_SharingRegistryService_userHasAccess">Function: SharingRegistryService.userHasAccess</h4>
 <pre><code>bool</code> userHasAccess(<code>string</code> domainId,
                    <code>string</code> userId,
                    <code>string</code> entityId,
                    <code>string</code> permissionTypeId)
     throws <code><a href="sharing_models.html#Struct_SharingRegistryException">sharing_models.SharingRegistryException</a></code>
-</pre><p>API method to check whether a user has access to a specific entity</p>
-<br/></div></div></body></html>
+</pre><pre><p>API method to check whether a user has access to a specific entity</p>
+</pre><br/></div></div></body></html>
diff --git a/modules/sharing-registry/sharing-service-docs/api-docs/sharing_models.html b/modules/sharing-registry/sharing-service-docs/api-docs/sharing_models.html
index 3707f44..f44eb9f 100644
--- a/modules/sharing-registry/sharing-service-docs/api-docs/sharing_models.html
+++ b/modules/sharing-registry/sharing-service-docs/api-docs/sharing_models.html
@@ -36,35 +36,35 @@
 <table class="table-bordered table-striped table-condensed"><thead><th>Constant</th><th>Type</th><th>Value</th></thead>
 <tr id="Const_DO_NOT_SET_AT_CLIENTS_ID"><td><code>DO_NOT_SET_AT_CLIENTS_ID</code></td><td><code>string</code></td><td><code>"DO_NOT_SET_AT_CLIENTS_ID"</code></td></tr></table><hr/><h2 id="Enumerations">Enumerations</h2>
 <div class="definition"><h3 id="Enum_GroupCardinality">Enumeration: GroupCardinality</h3>
-<p>This is an system internal enum used to define single user groups and multi users groups. Every user is also
+<pre><p>This is an system internal enum used to define single user groups and multi users groups. Every user is also
 considered as a group in it's own right for implementation ease</p>
 
-<br/><br/><table class="table-bordered table-striped table-condensed">
+</pre><br/><br/><table class="table-bordered table-striped table-condensed">
 <tr><td><code>SINGLE_USER</code></td><td><code>0</code></td><td>
 </td></tr>
 <tr><td><code>MULTI_USER</code></td><td><code>1</code></td><td>
 </td></tr>
 </table></div>
 <div class="definition"><h3 id="Enum_GroupType">Enumeration: GroupType</h3>
-<p>Group types can be either user level or domain level groups.</p>
+<pre><p>Group types can be either user level or domain level groups.</p>
 
-<br/><br/><table class="table-bordered table-striped table-condensed">
+</pre><br/><br/><table class="table-bordered table-striped table-condensed">
 <tr><td><code>DOMAIN_LEVEL_GROUP</code></td><td><code>0</code></td><td>
 </td></tr>
 <tr><td><code>USER_LEVEL_GROUP</code></td><td><code>1</code></td><td>
 </td></tr>
 </table></div>
 <div class="definition"><h3 id="Enum_GroupChildType">Enumeration: GroupChildType</h3>
-<p>System internal data type to match group child types</p>
+<pre><p>System internal data type to match group child types</p>
 
-<br/><br/><table class="table-bordered table-striped table-condensed">
+</pre><br/><br/><table class="table-bordered table-striped table-condensed">
 <tr><td><code>USER</code></td><td><code>0</code></td><td>
 </td></tr>
 <tr><td><code>GROUP</code></td><td><code>1</code></td><td>
 </td></tr>
 </table></div>
 <div class="definition"><h3 id="Enum_EntitySearchField">Enumeration: EntitySearchField</h3>
-<p>This list of fields that can be used to search entities</p>
+<pre><p>This list of fields that can be used to search entities</p>
 <li>NAME : Name of the entity</li>
 <li>DESCRIPTION : Description of the entity</li>
 <li>FULL_TEXT : Full text field of the entity</li>
@@ -74,7 +74,7 @@
 <li>UPDATED_TIME : Updated time of the entity</li>
 <li>SHARED_COUNT : Number of directly shared users and groups</li>
 
-<br/><br/><table class="table-bordered table-striped table-condensed">
+</pre><br/><br/><table class="table-bordered table-striped table-condensed">
 <tr><td><code>NAME</code></td><td><code>0</code></td><td>
 </td></tr>
 <tr><td><code>DESCRIPTION</code></td><td><code>1</code></td><td>
@@ -97,14 +97,14 @@
 </td></tr>
 </table></div>
 <div class="definition"><h3 id="Enum_SearchCondition">Enumeration: SearchCondition</h3>
-<p>Different search operators that can be used with the entity search fields</p>
+<pre><p>Different search operators that can be used with the entity search fields</p>
 <li>EQUAL : Simply matches for equality. Applicable for name, and parent entity id</li>
 <li>LIKE : Check for the condition %$FIELD% condition. Applicable for name, and description</li>
 <li>FULL_TEXT : Does a full text search. Only applicable for the FULL_TEXT field.</li>
 <li>GTE : Greater than or equal. Only applicable for created time, updated time and shared count.</li>
 <li>LTE : Less than or equal. Only applicable for created time, updated time and shared count.</li>
 
-<br/><br/><table class="table-bordered table-striped table-condensed">
+</pre><br/><br/><table class="table-bordered table-striped table-condensed">
 <tr><td><code>EQUAL</code></td><td><code>0</code></td><td>
 </td></tr>
 <tr><td><code>LIKE</code></td><td><code>1</code></td><td>
@@ -119,9 +119,9 @@
 </td></tr>
 </table></div>
 <div class="definition"><h3 id="Enum_SharingType">Enumeration: SharingType</h3>
-<p>This is an internal enum type for managing sharings</p>
+<pre><p>This is an internal enum type for managing sharings</p>
 
-<br/><br/><table class="table-bordered table-striped table-condensed">
+</pre><br/><br/><table class="table-bordered table-striped table-condensed">
 <tr><td><code>DIRECT_NON_CASCADING</code></td><td><code>0</code></td><td>
 </td></tr>
 <tr><td><code>DIRECT_CASCADING</code></td><td><code>1</code></td><td>
@@ -137,7 +137,8 @@
 <tr><td>3</td><td>description</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>4</td><td>createdTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>5</td><td>updatedTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><p>Domain is the entity that enables multi-tenency in this componenet. Every tenant will be
+<tr><td>6</td><td>initialUserGroupId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
+</table><br/><pre><p>Domain is the entity that enables multi-tenency in this componenet. Every tenant will be
 operating separately it's own silo which is identified by the domain id. In the current implementation domain id
 will be same as the domain name</p>
 <li>domainId : Will be generated by the server based on the domain name</li>
@@ -145,8 +146,9 @@
 <li>description : A short description for the domain</li>
 <li>createdTime : Will be set by the system</li>
 <li>updatedTime : Will be set by the system</li>
+<li>initialUserGroupId : New users will automatically be added to this group</li>
 
-<br/></div><div class="definition"><h3 id="Struct_User">Struct: User</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_User">Struct: User</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>userId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>domainId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
@@ -157,7 +159,7 @@
 <tr><td>7</td><td>icon</td><td><code>binary</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>8</td><td>createdTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>9</td><td>updatedTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><p>User is the model used to register a user in the system. Minimal user information will be required to provide
+</table><br/><pre><p>User is the model used to register a user in the system. Minimal user information will be required to provide
 regarding the user.</p>
 <li><b>userId</b> : User id provided by the client</li>
 <li><b>domainId</b> : Domain id for that user</li>
@@ -169,7 +171,7 @@
 <li>createdTime : If client provides this value then the system will use it if not the current time will be set</li>
 <li>updatedTime : If client provides this value then the system will use it if not the current time will be set</li>
 
-<br/></div><div class="definition"><h3 id="Struct_GroupAdmin">Struct: GroupAdmin</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_GroupAdmin">Struct: GroupAdmin</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>groupId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>domainId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
@@ -186,7 +188,7 @@
 <tr><td>8</td><td>createdTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>9</td><td>updatedTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>10</td><td>groupAdmins</td><td><code>list&lt;<code><a href="#Struct_GroupAdmin">GroupAdmin</a></code>&gt;</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><p>User group is a collection of users.</p>
+</table><br/><pre><p>User group is a collection of users.</p>
  <li><b>groupId</b> : Group id provided by the client</li>
  <li><b>domainId</b> : Domain id for this user group</li>
  <li><b>name</b> : Name for the user group. should be one word</li>
@@ -198,7 +200,7 @@
  <li>updatedTime : Will be set by the system</li>
  <li>groupAdmins : Admins for the group</li>
  
-<br/></div><div class="definition"><h3 id="Struct_GroupMembership">Struct: GroupMembership</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_GroupMembership">Struct: GroupMembership</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>parentId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>childId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
@@ -206,9 +208,9 @@
 <tr><td>4</td><td>childType</td><td><code><a href="#Enum_GroupChildType">GroupChildType</a></code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>5</td><td>createdTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>6</td><td>updatedTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><p>System internal data type to map group memberships</p>
+</table><br/><pre><p>System internal data type to map group memberships</p>
 
-<br/></div><div class="definition"><h3 id="Struct_EntityType">Struct: EntityType</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_EntityType">Struct: EntityType</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>entityTypeId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>domainId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
@@ -216,7 +218,7 @@
 <tr><td>4</td><td>description</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>5</td><td>createdTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>6</td><td>updatedTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><p>client defined entity types</p>
+</table><br/><pre><p>client defined entity types</p>
 <li><b>entityTypeId</b> : Entity type id provided by the client</li>
 <li><b>domainId</b> : Domain id of the domain.</li>
 <li><b>name</b> : Name for the entity type. Should be a single word.</li>
@@ -224,17 +226,17 @@
 <li>createdTime : Will be set by the system</li>
 <li>updatedTime : Will be set by the system</li>
 
-<br/></div><div class="definition"><h3 id="Struct_SearchCriteria">Struct: SearchCriteria</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_SearchCriteria">Struct: SearchCriteria</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>searchField</td><td><code><a href="#Enum_EntitySearchField">EntitySearchField</a></code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>value</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>3</td><td>searchCondition</td><td><code><a href="#Enum_SearchCondition">SearchCondition</a></code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><p>Container object for search criteria</p>
+</table><br/><pre><p>Container object for search criteria</p>
 <li><b>searchField</b> : Entity search field</li>
 <li><b>value</b> : Search value</li>
 <li><b>searchCondition</b> : EQUAL, LIKE etc..</li>
 
-<br/></div><div class="definition"><h3 id="Struct_Entity">Struct: Entity</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_Entity">Struct: Entity</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>entityId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>domainId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
@@ -249,7 +251,7 @@
 <tr><td>11</td><td>originalEntityCreationTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>12</td><td>createdTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>13</td><td>updatedTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><p>Entity object which is used to register an entity in the system.</p>
+</table><br/><pre><p>Entity object which is used to register an entity in the system.</p>
 <li><b>entityId</b> : Entity id provided by the client</li>
 <li><b>domainId</b> : Domain id</li>
 <li><b>entityTypeId</b> : Entity type id</li>
@@ -264,7 +266,7 @@
 <li>createdTime : Will be set by the system</li>
 <li>updatedTime : Will be set by the system</li>
 
-<br/></div><div class="definition"><h3 id="Struct_PermissionType">Struct: PermissionType</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_PermissionType">Struct: PermissionType</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>permissionTypeId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>domainId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
@@ -272,7 +274,7 @@
 <tr><td>4</td><td>description</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>5</td><td>createdTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>6</td><td>updatedTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><p>Object for creating client defined permission type</p>
+</table><br/><pre><p>Object for creating client defined permission type</p>
 <li><b>permissionTypeId</b> : Permission type id provided by the client</li>
 <li><b>domainId</b> : Domain id</li>
 <li><b>name</b> : Single word name for the permission</li>
@@ -280,7 +282,7 @@
 <li>createdTime : Will be set by the system</li>
 <li>updatedTime : Will be set by the system</li>
 
-<br/></div><div class="definition"><h3 id="Struct_Sharing">Struct: Sharing</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_Sharing">Struct: Sharing</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>permissionTypeId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>2</td><td>entityId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
@@ -290,19 +292,19 @@
 <tr><td>6</td><td>inheritedParentId</td><td><code>string</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>7</td><td>createdTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
 <tr><td>8</td><td>updatedTime</td><td><code>i64</code></td><td></td><td>optional</td><td></td></tr>
-</table><br/><p>This is an internal enum type for managing sharings</p>
+</table><br/><pre><p>This is an internal enum type for managing sharings</p>
 
-<br/></div><div class="definition"><h3 id="Struct_SharingRegistryException">Exception: SharingRegistryException</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_SharingRegistryException">Exception: SharingRegistryException</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>message</td><td><code>string</code></td><td></td><td>required</td><td></td></tr>
-</table><br/><p>Exception model used in the sharing registry service</p>
+</table><br/><pre><p>Exception model used in the sharing registry service</p>
 
-<br/></div><div class="definition"><h3 id="Struct_DuplicateEntryException">Exception: DuplicateEntryException</h3>
+</pre><br/></div><div class="definition"><h3 id="Struct_DuplicateEntryException">Exception: DuplicateEntryException</h3>
 <table class="table-bordered table-striped table-condensed"><thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></thead>
 <tr><td>1</td><td>message</td><td><code>string</code></td><td></td><td>required</td><td></td></tr>
-</table><br/>This exception is thrown when you try to save a duplicate entity that already exists
+</table><br/><pre>This exception is thrown when you try to save a duplicate entity that already exists
   in the database.
 
   message: contains the associated error message
 
-<br/></div></div></body></html>
+</pre><br/></div></div></body></html>
diff --git a/pom.xml b/pom.xml
index c5b2f10..c2d6b5a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,7 +38,7 @@
     <artifactId>airavata</artifactId>
     <packaging>pom</packaging>
     <name>Airavata</name>
-    <version>0.19-SNAPSHOT</version>
+    <version>0.20-SNAPSHOT</version>
 
     <url>http://airavata.apache.org/</url>
     <inceptionYear>2011</inceptionYear>
@@ -77,12 +77,10 @@
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <axis2.version>1.5.1</axis2.version>
         <derby.version>10.13.1.1</derby.version>
         <org.slf4j.version>1.7.25</org.slf4j.version>
         <log4j.version>1.2.17</log4j.version>
-        <axiom.version>1.2.8</axiom.version>
-        <surefire.version>2.18.1</surefire.version>
+        <surefire.version>3.0.0-M4</surefire.version>
         <junit.version>4.12</junit.version>
         <curator.version>2.8.0</curator.version>
         <!--remove xmlbeans version -->
@@ -92,15 +90,12 @@
         <xpp5.version>1.2.8</xpp5.version>
         <xsul.version>2.10.7</xsul.version>
         <xsul5.version>1.2.7</xsul5.version>
-        <gpel.version>1.0.9</gpel.version>
         <atomixmiser.version>0.9.4</atomixmiser.version>
-        <jython.version>2.5.3</jython.version>
         <jersey.version>1.13</jersey.version>
         <cargo.version>1.3.1</cargo.version>
         <oa4mp.version>1.1.3</oa4mp.version>
         <antrun.version>1.8</antrun.version>
         <bouncy.castle.version>1.56</bouncy.castle.version>
-        <jglobus.version>2.1.0</jglobus.version>
         <ebay.cors.filter>1.0.0</ebay.cors.filter>
         <thrift.version>0.10.0</thrift.version>
         <mysql.connector.version>5.1.34</mysql.connector.version>
@@ -118,7 +113,14 @@
         <commons.io.version>2.4</commons.io.version>
         <google.guava.version>20.0</google.guava.version>
         <jacoco.version>0.8.1</jacoco.version>
-        <openjpa.version>2.4.3</openjpa.version>
+        <openjpa.version>3.1.0</openjpa.version>
+        <dozer.version>5.4.0</dozer.version>
+        <javax.annotation.version>1.3.2</javax.annotation.version>
+        <jaxb.version>2.4.0-b180830.0359</jaxb.version>
+        <jmockit.version>1.44</jmockit.version>
+        <commons.lang.version>2.6</commons.lang.version>
+        <org.apache.commons.pool2.version>2.7.0</org.apache.commons.pool2.version>
+        <org.apache.custos.version>1.0-SNAPSHOT</org.apache.custos.version>
     </properties>
 
     <developers>
@@ -534,6 +536,27 @@
                 <artifactId>guava</artifactId>
                 <version>${google.guava.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-pool2</artifactId>
+                <version>${org.apache.commons.pool2.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-pool2</artifactId>
+                <version>${org.apache.commons.pool2.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.custos</groupId>
+                <artifactId>custos-java-sdk</artifactId>
+                <version>${org.apache.custos.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jmockit</groupId>
+                <artifactId>jmockit</artifactId>
+                <version>${jmockit.version}</version>
+                <scope>test</scope>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
@@ -557,26 +580,6 @@
                 <enabled>false</enabled>
             </snapshots>
         </repository>
-        <repository>
-            <id>wso2</id>
-            <name>Repository</name>
-            <url>https://dist.wso2.org/maven2</url>
-        </repository>
-        <repository>
-            <id>oauth</id>
-            <name>OAuth Repository</name>
-            <url>https://oauth.googlecode.com/svn/code/maven</url>
-        </repository>
-        <repository>
-            <id>wso2-nexus</id>
-            <name>WSO2 internal Repository</name>
-            <url>https://maven.wso2.org/nexus/content/groups/wso2-public/</url>
-            <releases>
-                <enabled>true</enabled>
-                <updatePolicy>daily</updatePolicy>
-                <checksumPolicy>ignore</checksumPolicy>
-            </releases>
-        </repository>
     </repositories>
 
     <profiles>
@@ -667,9 +670,22 @@
                         <artifactId>maven-compiler-plugin</artifactId>
                         <version>3.6.1</version>
                         <configuration>
-                            <source>1.8</source>
-                            <target>1.8</target>
+                            <source>11</source>
+                            <target>11</target>
+                        <!--</configuration>-->
+                        <!--&lt;!&ndash;<version>3.8.0</version>&ndash;&gt;-->
+                        <!--<configuration>-->
+
+                            <!--<compilerArgs>-->
+                                <!--<arg>&#45;&#45;add-exports=java.base/sun.security=ALL-UNNAMED</arg>-->
+                            <!--</compilerArgs>-->
+                            <!--<release>11</release>-->
+                            <fork>true</fork>
                         </configuration>
+
+                        <!-- without forking compilation happens in the
+                            same process, so no arguments are applied -->
+
                     </plugin>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
@@ -683,6 +699,11 @@
                                 tests -->
                             <!-- Integration tests are run using the fail-safe plugin in the module
                                 pom -->
+                            <useSystemClassLoader>false</useSystemClassLoader>
+                            <argLine>-Xmx1024m -XX:MaxPermSize=256m -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar</argLine>
+
+                            <reuseForks>false</reuseForks>
+
                             <excludes>
                                 <exclude>**/IT.java</exclude>
                                 <exclude>**/*TestWithMyProxyAuth.java</exclude>
@@ -784,10 +805,13 @@
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-compiler-plugin</artifactId>
-                        <version>3.1</version>
+                        <version>3.8.0</version>
                         <configuration>
-                            <source>1.8</source>
-                            <target>1.8</target>
+                            <release>11</release>
+                            <!--<compilerArgs>-->
+                                <!--<arg>&#45;&#45;add-opens=java.base/java.lang=ALL-UNNAMED</arg>-->
+                            <!--</compilerArgs>-->
+                            <!--<fork>true</fork>-->
                         </configuration>
                     </plugin>
                     <plugin>
diff --git a/thrift-interface-descriptions/component-cpis/credential-store-cpi.thrift b/thrift-interface-descriptions/component-cpis/credential-store-cpi.thrift
index 1aae91f..0264184 100644
--- a/thrift-interface-descriptions/component-cpis/credential-store-cpi.thrift
+++ b/thrift-interface-descriptions/component-cpis/credential-store-cpi.thrift
@@ -28,6 +28,7 @@
 include "../base-api/base_api.thrift"
 
 namespace java org.apache.airavata.credential.store.cpi
+namespace py airavata.api.credential.store
 
 const string CS_CPI_VERSION = "0.18.0"
 
diff --git a/thrift-interface-descriptions/component-cpis/credential_store_errors.thrift b/thrift-interface-descriptions/component-cpis/credential_store_errors.thrift
index 148d7f2..da79a91 100644
--- a/thrift-interface-descriptions/component-cpis/credential_store_errors.thrift
+++ b/thrift-interface-descriptions/component-cpis/credential_store_errors.thrift
@@ -26,6 +26,7 @@
 
 namespace java org.apache.airavata.credential.store.exception
 namespace php Airavata.Credential.Store.Error
+namespace py airavata.api.credential.store.error
 
 exception CredentialStoreException {
   1: required string message
diff --git a/thrift-interface-descriptions/component-cpis/registry-api.thrift b/thrift-interface-descriptions/component-cpis/registry-api.thrift
index e461bdf..c6da494 100644
--- a/thrift-interface-descriptions/component-cpis/registry-api.thrift
+++ b/thrift-interface-descriptions/component-cpis/registry-api.thrift
@@ -372,7 +372,7 @@
                                     4: string userName,
                                     5: string applicationName,
                                     6: string resourceHostName,
-                                    7: required list<string> accessibleExpIds)
+                                    7: list<string> accessibleExpIds)
                         throws (1: registry_api_errors.RegistryServiceException rse)
 
 
@@ -2662,6 +2662,10 @@
             throws (1: registry_api_errors.RegistryServiceException rse);
     void removeParser(1: required string parserId, 2: required string gatewayId)
             throws (1: registry_api_errors.RegistryServiceException rse);
+    parser_model.ParserInput getParserInput(1: required string parserInputId, 2: required string gatewayId)
+                throws (1: registry_api_errors.RegistryServiceException rse);
+    parser_model.ParserOutput getParserOutput(1: required string parserOutputId, 2: required string gatewayId)
+                    throws (1: registry_api_errors.RegistryServiceException rse);
 
     parser_model.ParsingTemplate getParsingTemplate(1: required string templateId, 2: required string gatewayId)
             throws (1: registry_api_errors.RegistryServiceException rse);
diff --git a/thrift-interface-descriptions/data-models/app-catalog-models/application_io_models.thrift b/thrift-interface-descriptions/data-models/app-catalog-models/application_io_models.thrift
index f8537c7..3556e4b 100644
--- a/thrift-interface-descriptions/data-models/app-catalog-models/application_io_models.thrift
+++ b/thrift-interface-descriptions/data-models/app-catalog-models/application_io_models.thrift
@@ -64,6 +64,8 @@
  * metaData:
  *   Any metadat. This is typically ignore by Airavata and is used by gateways for application configuration.
  *
+ * overrideFilename:
+ *   Rename input file to given value when staging to compute resource.
 */
 struct InputDataObjectType {
     1: required string name,
@@ -78,7 +80,8 @@
     10: optional bool requiredToAddedToCommandLine,
     11: optional bool dataStaged,
     12: optional string storageResourceId,
-    13: optional bool isReadOnly
+    13: optional bool isReadOnly,
+    14: optional string overrideFilename
 }
 
 /**
diff --git a/thrift-interface-descriptions/data-models/experiment-catalog-models/workspace_model.thrift b/thrift-interface-descriptions/data-models/experiment-catalog-models/workspace_model.thrift
index fc1cb88..770452b 100644
--- a/thrift-interface-descriptions/data-models/experiment-catalog-models/workspace_model.thrift
+++ b/thrift-interface-descriptions/data-models/experiment-catalog-models/workspace_model.thrift
@@ -91,7 +91,9 @@
     17: optional string oauthClientId,
     18: optional string oauthClientSecret,
     19: optional i64 requestCreationTime,
-    20: optional string requesterUsername
+    20: optional string requesterUsername,
+    21:  optional list<string> redirectURLs,
+    22: optional  string scope
 }
 
 enum NotificationPriority {
diff --git a/thrift-interface-descriptions/data-models/resource-catalog-models/group_resource_profile_model.thrift b/thrift-interface-descriptions/data-models/resource-catalog-models/group_resource_profile_model.thrift
index 0f4b950..063f7c6 100644
--- a/thrift-interface-descriptions/data-models/resource-catalog-models/group_resource_profile_model.thrift
+++ b/thrift-interface-descriptions/data-models/resource-catalog-models/group_resource_profile_model.thrift
@@ -34,6 +34,14 @@
     4: optional string configValue
 }
 
+struct ComputeResourceReservation {
+    1: required string reservationId = airavata_commons.DEFAULT_ID,
+    2: required string reservationName,
+    3: required list<string> queueNames,
+    4: required i64 startTime,
+    5: required i64 endTime,
+}
+
 struct GroupComputeResourcePreference {
     1: required string computeResourceId,
     2: required string groupResourceProfileId = airavata_commons.DEFAULT_ID,
@@ -47,12 +55,10 @@
     10: optional string resourceSpecificCredentialStoreToken,
     11: optional string usageReportingGatewayId,
     12: optional string qualityOfService,
-    13: optional string reservation,
-    14: optional i64 reservationStartTime,
-    15: optional i64 reservationEndTime,
     16: optional string sshAccountProvisioner,
     17: optional list<GroupAccountSSHProvisionerConfig> groupSSHAccountProvisionerConfigs,
-    18: optional string sshAccountProvisionerAdditionalInfo
+    18: optional string sshAccountProvisionerAdditionalInfo,
+    19: optional list<ComputeResourceReservation> reservations,
 }
 
 struct ComputeResourcePolicy {
@@ -104,4 +110,4 @@
     7: optional i64 creationTime,
     8: optional i64 updatedTime,
     9: optional string defaultCredentialStoreToken
-}
\ No newline at end of file
+}
diff --git a/thrift-interface-descriptions/data-models/sharing-models/sharing_models.thrift b/thrift-interface-descriptions/data-models/sharing-models/sharing_models.thrift
index 002145c..e1c29a2 100644
--- a/thrift-interface-descriptions/data-models/sharing-models/sharing_models.thrift
+++ b/thrift-interface-descriptions/data-models/sharing-models/sharing_models.thrift
@@ -33,13 +33,15 @@
 * <li>description : A short description for the domain</li>
 * <li>createdTime : Will be set by the system</li>
 * <li>updatedTime : Will be set by the system</li>
+* <li>initialUserGroupId : New users will automatically be added to this group</li>
 **/
 struct Domain {
     1: optional string domainId = DO_NOT_SET_AT_CLIENTS_ID,
     2: optional string name,
     3: optional string description,
     4: optional i64 createdTime,
-    5: optional i64 updatedTime
+    5: optional i64 updatedTime,
+    6: optional string initialUserGroupId
 }
 
 /**
@@ -300,4 +302,4 @@
 **/
 exception DuplicateEntryException {
     1: required string message
-}
\ No newline at end of file
+}
diff --git a/thrift-interface-descriptions/generate-thrift-stubs.sh b/thrift-interface-descriptions/generate-thrift-stubs.sh
index 0d65086..2912153 100755
--- a/thrift-interface-descriptions/generate-thrift-stubs.sh
+++ b/thrift-interface-descriptions/generate-thrift-stubs.sh
@@ -80,8 +80,10 @@
     # Thrift files
     AIRAVATA_API_THRIFT_FILE="${BASEDIR}/thrift-interface-descriptions/airavata-apis/airavata_api.thrift"
     SHARING_API_THRIFT_FILE="${BASEDIR}/thrift-interface-descriptions/component-cpis/sharing_cpi.thrift"
+    CREDENTIAL_API_THRIFT_FILE="${BASEDIR}/thrift-interface-descriptions/component-cpis/credential-store-cpi.thrift"
     DATAMODEL_THRIFT_FILE="${BASEDIR}/thrift-interface-descriptions/data-models/airavata_data_models.thrift"
     SHARING_DATAMODEL_THRIFT_FILE="${BASEDIR}/thrift-interface-descriptions/data-models/sharing-models/sharing_models.thrift"
+    CREDENTIAL_DATAMODEL_THRIFT_FILE="${BASEDIR}/thrift-interface-descriptions/data-models/credential-store-models/credential_store_data_models.thrift"
     APP_CATALOG_THRIFT_FILE="${BASEDIR}/thrift-interface-descriptions/data-models/app-catalog-models/app_catalog_models.thrift"
     RESOURCE_CATALOG_THRIFT_FILE="${BASEDIR}/thrift-interface-descriptions/data-models/resource-catalog-models/resource_catalog_models.thrift"
     WORKFLOW_THRIFT_FILE="${BASEDIR}/thrift-interface-descriptions/data-models/workflow-models/workflow_data_model.thrift"
@@ -92,7 +94,7 @@
     JAVA_API_SDK_DIR='../airavata-api/airavata-api-stubs/src/main/java'
     PHP_SDK_DIR='../airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib'
     CPP_SDK_DIR='../airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/'
-    PYTHON_SDK_DIR='../airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/'
+    PYTHON_SDK_DIR='../airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/'
 
     BASE_API_SRC_DIR='../airavata-api/airavata-base-api/src/main/java'
 
@@ -298,7 +300,7 @@
 generate_python_stubs() {
 
     #Python generation directory
-    PYTHON_GEN_DIR=${BASE_TARGET_DIR}/gen-py
+    PYTHON_GEN_DIR=${BASE_TARGET_DIR}/gen-py/airavata
 
     # As a precaution  remove and previously generated files if exists
     rm -rf ${PYTHON_GEN_DIR}
@@ -307,6 +309,8 @@
     #   The airavata_api.thrift includes rest of data models.
     $THRIFT_EXEC ${THRIFT_ARGS} --gen py ${AIRAVATA_API_THRIFT_FILE}  || fail unable to generate Python thrift classes
 
+    $THRIFT_EXEC ${THRIFT_ARGS} --gen py ${CREDENTIAL_API_THRIFT_FILE}  || fail unable to generate Python thrift classes
+
     $THRIFT_EXEC ${THRIFT_ARGS} --gen py ${SHARING_API_THRIFT_FILE}  || fail unable to generate Python thrift classes
 
     $THRIFT_EXEC ${THRIFT_ARGS} --gen py ${PROFILE_SERVICE_THRIFT_FILE} || fail unable to generate Python thrift classes
diff --git a/tools/custos-data-migrator/pom.xml b/tools/custos-data-migrator/pom.xml
new file mode 100644
index 0000000..56ca3cd
--- /dev/null
+++ b/tools/custos-data-migrator/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>airavata-tools-parent</artifactId>
+        <groupId>org.apache.airavata</groupId>
+        <version>0.20-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>custos-data-migrator</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/tools/custos-data-migrator/src/main/java/org/apache/airavata/custos/data/migrators/UserProfileMigrator.java b/tools/custos-data-migrator/src/main/java/org/apache/airavata/custos/data/migrators/UserProfileMigrator.java
new file mode 100644
index 0000000..59221fd
--- /dev/null
+++ b/tools/custos-data-migrator/src/main/java/org/apache/airavata/custos/data/migrators/UserProfileMigrator.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.custos.data.migrators;
+
+public class UserProfileMigrator {
+}
diff --git a/tools/load-client/pom.xml b/tools/load-client/pom.xml
index 7dc9e86..64d4f1b 100644
--- a/tools/load-client/pom.xml
+++ b/tools/load-client/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata-tools-parent</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -17,7 +17,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>airavata-api-stubs</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.jboss.resteasy</groupId>
@@ -32,7 +32,7 @@
         <dependency>
             <groupId>org.apache.airavata</groupId>
             <artifactId>sshj-agent</artifactId>
-            <version>0.19-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.yaml</groupId>
@@ -44,6 +44,11 @@
             <artifactId>commons-cli</artifactId>
             <version>1.2</version>
         </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-authz-client</artifactId>
+            <version>2.5.4.Final</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/tools/load-client/src/main/java/org/apache/airavata/tools/load/Authenticator.java b/tools/load-client/src/main/java/org/apache/airavata/tools/load/Authenticator.java
new file mode 100644
index 0000000..6442fc5
--- /dev/null
+++ b/tools/load-client/src/main/java/org/apache/airavata/tools/load/Authenticator.java
@@ -0,0 +1,46 @@
+package org.apache.airavata.tools.load;
+
+import org.apache.airavata.model.security.AuthzToken;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.keycloak.authorization.client.AuthzClient;
+import org.keycloak.authorization.client.Configuration;
+import org.keycloak.representations.AccessTokenResponse;
+
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Authenticator {
+
+    public static AuthzToken getAuthzToken(String userName, String password, String gateway, String keycloakUrl,
+                                           String keycloakClientId, String keycloakClientSecret)
+            throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
+
+        Map<String, Object> clientCredentials = new HashMap<>();
+        clientCredentials.put("secret", keycloakClientSecret);
+        SSLContextBuilder builder = new SSLContextBuilder();
+        builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
+        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build());
+        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
+
+        Configuration configuration = new Configuration(keycloakUrl,
+                gateway, keycloakClientId, clientCredentials, httpclient);
+        AuthzClient keycloakClient = AuthzClient.create(configuration);
+        AccessTokenResponse accessToken = keycloakClient.obtainAccessToken(userName, password);
+
+
+        AuthzToken authzToken = new AuthzToken();
+        Map<String, String> claims = new HashMap<>();
+        claims.put("gatewayID", gateway);
+        claims.put("userName", userName);
+        authzToken.setAccessToken(accessToken.getToken());
+        authzToken.setClaimsMap(claims);
+        return authzToken;
+    }
+}
diff --git a/tools/load-client/src/main/java/org/apache/airavata/tools/load/Configuration.java b/tools/load-client/src/main/java/org/apache/airavata/tools/load/Configuration.java
index c8484ea..7526cd7 100644
--- a/tools/load-client/src/main/java/org/apache/airavata/tools/load/Configuration.java
+++ b/tools/load-client/src/main/java/org/apache/airavata/tools/load/Configuration.java
@@ -1,5 +1,7 @@
 package org.apache.airavata.tools.load;
 
+import org.apache.airavata.model.security.AuthzToken;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -12,6 +14,9 @@
     private String applicationInterfaceId;
     private String computeResourceId;
     private String storageResourceId;
+    private String keycloakUrl;
+    private String keycloakClientId;
+    private String keycloakClientSecret;
 
     private String experimentBaseName;
 
@@ -25,6 +30,20 @@
     private int iterationsPerUser;
     private int randomMSDelayWithinSubmissions;
 
+
+    private AuthzToken authzToken;
+
+    public AuthzToken getAuthzToken() throws Exception {
+
+        if (authzToken == null) {
+            System.out.print("Enter password for user " + getUserId() + " in gateway " + getGatewayId() + " : ");
+            String pw = new String(System.console().readPassword());
+            authzToken = Authenticator.getAuthzToken(getUserId(), pw, getGatewayId(),
+                    getKeycloakUrl(), getKeycloakClientId(), getKeycloakClientSecret());
+        }
+        return authzToken;
+    }
+
     private List<Input> inputs = new ArrayList<>();
 
     public String getUserId() {
@@ -183,4 +202,28 @@
             this.value = value;
         }
     }
+
+    public String getKeycloakUrl() {
+        return keycloakUrl;
+    }
+
+    public void setKeycloakUrl(String keycloakUrl) {
+        this.keycloakUrl = keycloakUrl;
+    }
+
+    public String getKeycloakClientId() {
+        return keycloakClientId;
+    }
+
+    public void setKeycloakClientId(String keycloakClientId) {
+        this.keycloakClientId = keycloakClientId;
+    }
+
+    public String getKeycloakClientSecret() {
+        return keycloakClientSecret;
+    }
+
+    public void setKeycloakClientSecret(String keycloakClientSecret) {
+        this.keycloakClientSecret = keycloakClientSecret;
+    }
 }
diff --git a/tools/load-client/src/main/java/org/apache/airavata/tools/load/LoadClient.java b/tools/load-client/src/main/java/org/apache/airavata/tools/load/LoadClient.java
index 64b22c6..8436887 100644
--- a/tools/load-client/src/main/java/org/apache/airavata/tools/load/LoadClient.java
+++ b/tools/load-client/src/main/java/org/apache/airavata/tools/load/LoadClient.java
@@ -7,6 +7,7 @@
 import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
 import org.apache.airavata.model.security.AuthzToken;
 import org.apache.commons.cli.*;
+import org.keycloak.authorization.client.AuthzClient;
 import org.yaml.snakeyaml.Yaml;
 
 import java.io.FileInputStream;
@@ -43,6 +44,11 @@
             }
         }
 
+        // Making sure that all authzkeys are loaded
+        for (Configuration cfg : configurations.getConfigurations()) {
+            cfg.getAuthzToken();
+        }
+
         securityManager.loadCertificate(configurations.getApiHost(), configurations.getApiPort());
         createStorageResourceManagers(configurations);
     }
@@ -50,18 +56,12 @@
     public void start() throws Exception {
         for (Configuration configuration : configurations.getConfigurations()) {
 
-            AuthzToken mockAuthzToken = new AuthzToken("");
-            Map<String, String> claimsMap = new HashMap<>();
-            claimsMap.put(Constants.USER_NAME, configuration.getUserId());
-            claimsMap.put(Constants.GATEWAY_ID, configuration.getGatewayId());
-            mockAuthzToken.setClaimsMap(claimsMap);
-
             UnitLoad unitLoad = new UnitLoad(configurations.getApiHost(), configurations.getApiPort(),
                     securityManager.getTrustStorePath(), securityManager.getTrustStorePassword(),
-                    storageResourceManagerStore.get(configuration.getStorageResourceId()), mockAuthzToken);
+                    storageResourceManagerStore.get(configuration.getStorageResourceId()), configuration.getAuthzToken());
 
             StatusMonitor statusMonitor = new StatusMonitor(configurations.getApiHost(), configurations.getApiPort(),
-                    securityManager.getTrustStorePath(), securityManager.getTrustStorePassword(), mockAuthzToken);
+                    securityManager.getTrustStorePath(), securityManager.getTrustStorePassword(), configuration.getAuthzToken());
 
             CompletionService<List<String>> completion = unitLoad.execute(configuration);
 
@@ -82,6 +82,7 @@
 
     private void createStorageResourceManagers(Configurations configurations) throws Exception {
 
+
         Airavata.Client airavataClient = AiravataClientFactory.createAiravataSecureClient(configurations.getApiHost(), configurations.getApiPort(),
                 securityManager.getTrustStorePath(), securityManager.getTrustStorePassword(), 100000);
 
@@ -89,10 +90,17 @@
             String storageResourceId = configuration.getStorageResourceId();
 
             if (!storageResourceManagerStore.containsKey(storageResourceId)) {
-                StorageResourceDescription storageResource = airavataClient.getStorageResource(new AuthzToken(""), storageResourceId);
-                StoragePreference gatewayStoragePreference = airavataClient.getGatewayStoragePreference(new AuthzToken(""), configuration.getGatewayId(), storageResourceId);
-                StorageResourceManager storageResourceManager = new StorageResourceManager(gatewayStoragePreference, storageResource, privateKeyFile, publicKeyFile, passPhrase);
+                StorageResourceDescription storageResource = airavataClient
+                        .getStorageResource(configuration.getAuthzToken(), storageResourceId);
+
+                StoragePreference gatewayStoragePreference = airavataClient
+                        .getGatewayStoragePreference(configuration.getAuthzToken(),
+                                configuration.getGatewayId(), storageResourceId);
+
+                StorageResourceManager storageResourceManager = new StorageResourceManager(gatewayStoragePreference,
+                        storageResource, privateKeyFile, publicKeyFile, passPhrase);
                 storageResourceManager.init();
+
                 storageResourceManagerStore.put(storageResourceId, storageResourceManager);
             }
         }
diff --git a/tools/load-client/src/main/resources/conf/load-config.yml b/tools/load-client/src/main/resources/conf/load-config.yml
index 2d872e9..6b40394 100644
--- a/tools/load-client/src/main/resources/conf/load-config.yml
+++ b/tools/load-client/src/main/resources/conf/load-config.yml
@@ -1,24 +1,27 @@
-apiHost: 149.165.170.103
+apiHost: apidev.scigap.org
 apiPort: 9930
 configurations:
   - experimentBaseName: "TestEcho"
     userId: "dimuthu"
     gatewayId: "seagrid"
-    projectId: "Dimuthu-Perc18_7651cf55-187c-4dd1-96ed-6c611ef095aa"
+    projectId: "DefaultProject_7ac38275-0ca1-433a-ab6a-630c8c1df2ef"
     applicationInterfaceId: "Echo_3f480d1f-ea86-4018-94bb-015423d66a1c"
-    computeResourceId: "js-156-93.jetstream-cloud.org_dcdf7bfc-fdfa-4b83-ad8b-5f23e32b54ae"
-    storageResourceId: "testing.seagrid.org_8a52ed94-b990-42d2-8714-f3d0abde1022"
+    computeResourceId: "bigred2.uits.iu.edu_ac140dca-3c88-46d8-b9ed-875d96ea6908"
+    storageResourceId: "pgadev.scigap.org_7ddf28fd-d503-4ff8-bbc5-3279a7c3b99e"
+    keycloakUrl: "https://iamdev.scigap.org/auth"
+    keycloakClientId: "pga"
+    keycloakClientSecret: "secret"
 
     inputs:
       - name: "Input-to-Echo"
         value: "Test"
 
-    queue: "cloud"
+    queue: "cpu"
     wallTime: 60
     cpuCount: 2
     nodeCount: 1
     physicalMemory: 512
 
-    concurrentUsers: 10
-    iterationsPerUser: 20
+    concurrentUsers: 1
+    iterationsPerUser: 2
     randomMSDelayWithinSubmissions: 100
diff --git a/tools/pom.xml b/tools/pom.xml
index 8e37083..b9b92de 100644
--- a/tools/pom.xml
+++ b/tools/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.airavata</groupId>
         <artifactId>airavata</artifactId>
-        <version>0.19-SNAPSHOT</version>
+        <version>0.20-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -46,4 +46,7 @@
             </modules>
         </profile>
     </profiles>
+    <modules>
+        <module>custos-data-migrator</module>
+    </modules>
 </project>