Merge remote-tracking branch 'origin/AIRAVATA-3326-improved-database-migration-script-creation' into develop
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..162bad5 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>
 
@@ -146,7 +146,7 @@
         <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 6fcdae7..724e27c 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
@@ -313,6 +313,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();
@@ -426,6 +427,7 @@
      * 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();
@@ -1141,6 +1143,7 @@
      *
      */
     @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();
@@ -4933,6 +4936,7 @@
     }
 
     @Override
+    @SecurityCheck
     public List<QueueStatusModel> getLatestQueueStatuses(AuthzToken authzToken) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
@@ -5915,6 +5919,7 @@
     }
 
     @Override
+    @SecurityCheck
     public Parser getParser(AuthzToken authzToken, String parserId, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
@@ -5932,6 +5937,7 @@
     }
 
     @Override
+    @SecurityCheck
     public String saveParser(AuthzToken authzToken, Parser parser) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
@@ -5949,6 +5955,7 @@
     }
 
     @Override
+    @SecurityCheck
     public List<Parser> listAllParsers(AuthzToken authzToken, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
@@ -5966,6 +5973,7 @@
     }
 
     @Override
+    @SecurityCheck
     public boolean removeParser(AuthzToken authzToken, String parserId, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
@@ -5983,6 +5991,7 @@
     }
 
     @Override
+    @SecurityCheck
     public ParsingTemplate getParsingTemplate(AuthzToken authzToken, String templateId, String gatewayId)
             throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
@@ -6001,6 +6010,7 @@
     }
 
     @Override
+    @SecurityCheck
     public List<ParsingTemplate> getParsingTemplatesForExperiment(AuthzToken authzToken, String experimentId, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
@@ -6018,6 +6028,7 @@
     }
 
     @Override
+    @SecurityCheck
     public String saveParsingTemplate(AuthzToken authzToken, ParsingTemplate parsingTemplate) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
@@ -6035,6 +6046,7 @@
     }
 
     @Override
+    @SecurityCheck
     public boolean removeParsingTemplate(AuthzToken authzToken, String templateId, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
@@ -6052,6 +6064,7 @@
     }
 
     @Override
+    @SecurityCheck
     public List<ParsingTemplate> listAllParsingTemplates(AuthzToken authzToken, String gatewayId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, AuthorizationException, TException {
         RegistryService.Client regClient = registryClientPool.getResource();
         try {
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-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/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/ttypes.py
similarity index 95%
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/airavata/model/appcatalog/groupresourceprofile/ttypes.py
index d5b8e18..61df7f6 100644
--- 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/airavata/model/appcatalog/groupresourceprofile/ttypes.py
@@ -259,9 +259,6 @@
      - resourceSpecificCredentialStoreToken
      - usageReportingGatewayId
      - qualityOfService
-     - reservation
-     - reservationStartTime
-     - reservationEndTime
      - sshAccountProvisioner
      - groupSSHAccountProvisionerConfigs
      - sshAccountProvisionerAdditionalInfo
@@ -282,16 +279,16 @@
         (10, TType.STRING, 'resourceSpecificCredentialStoreToken', 'UTF8', None, ),  # 10
         (11, TType.STRING, 'usageReportingGatewayId', 'UTF8', None, ),  # 11
         (12, TType.STRING, 'qualityOfService', 'UTF8', None, ),  # 12
-        (13, TType.STRING, 'reservation', 'UTF8', None, ),  # 13
-        (14, TType.I64, 'reservationStartTime', None, None, ),  # 14
-        (15, TType.I64, 'reservationEndTime', None, None, ),  # 15
+        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, reservation=None, reservationStartTime=None, reservationEndTime=None, sshAccountProvisioner=None, groupSSHAccountProvisionerConfigs=None, sshAccountProvisionerAdditionalInfo=None, reservations=None,):
+    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
@@ -304,9 +301,6 @@
         self.resourceSpecificCredentialStoreToken = resourceSpecificCredentialStoreToken
         self.usageReportingGatewayId = usageReportingGatewayId
         self.qualityOfService = qualityOfService
-        self.reservation = reservation
-        self.reservationStartTime = reservationStartTime
-        self.reservationEndTime = reservationEndTime
         self.sshAccountProvisioner = sshAccountProvisioner
         self.groupSSHAccountProvisionerConfigs = groupSSHAccountProvisionerConfigs
         self.sshAccountProvisionerAdditionalInfo = sshAccountProvisionerAdditionalInfo
@@ -381,21 +375,6 @@
                     self.qualityOfService = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                 else:
                     iprot.skip(ftype)
-            elif fid == 13:
-                if ftype == TType.STRING:
-                    self.reservation = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 14:
-                if ftype == TType.I64:
-                    self.reservationStartTime = iprot.readI64()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 15:
-                if ftype == TType.I64:
-                    self.reservationEndTime = iprot.readI64()
-                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()
@@ -486,18 +465,6 @@
             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.reservation is not None:
-            oprot.writeFieldBegin('reservation', TType.STRING, 13)
-            oprot.writeString(self.reservation.encode('utf-8') if sys.version_info[0] == 2 else self.reservation)
-            oprot.writeFieldEnd()
-        if self.reservationStartTime is not None:
-            oprot.writeFieldBegin('reservationStartTime', TType.I64, 14)
-            oprot.writeI64(self.reservationStartTime)
-            oprot.writeFieldEnd()
-        if self.reservationEndTime is not None:
-            oprot.writeFieldBegin('reservationEndTime', TType.I64, 15)
-            oprot.writeI64(self.reservationEndTime)
-            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)
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/src/main/resources/lib/airavata/model/application/io/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/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/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/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 100%
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/airavata/model/group/ttypes.py
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 100%
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/airavata/model/sharing/ttypes.py
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 83%
copy from airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/appcatalog/groupresourceprofile/ttypes.py
copy to airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/appcatalog/groupresourceprofile/ttypes.py
index d5b8e18..e2841da 100644
--- 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
@@ -118,132 +118,6 @@
         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:
@@ -265,7 +139,6 @@
      - sshAccountProvisioner
      - groupSSHAccountProvisionerConfigs
      - sshAccountProvisionerAdditionalInfo
-     - reservations
     """
 
     thrift_spec = (
@@ -288,10 +161,9 @@
         (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, reservation=None, reservationStartTime=None, reservationEndTime=None, sshAccountProvisioner=None, groupSSHAccountProvisionerConfigs=None, sshAccountProvisionerAdditionalInfo=None, reservations=None,):
+    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, reservation=None, reservationStartTime=None, reservationEndTime=None, sshAccountProvisioner=None, groupSSHAccountProvisionerConfigs=None, sshAccountProvisionerAdditionalInfo=None,):
         self.computeResourceId = computeResourceId
         self.groupResourceProfileId = groupResourceProfileId
         self.overridebyAiravata = overridebyAiravata
@@ -310,7 +182,6 @@
         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:
@@ -404,11 +275,11 @@
             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)
+                    (_etype3, _size0) = iprot.readListBegin()
+                    for _i4 in range(_size0):
+                        _elem5 = GroupAccountSSHProvisionerConfig()
+                        _elem5.read(iprot)
+                        self.groupSSHAccountProvisionerConfigs.append(_elem5)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -417,17 +288,6 @@
                     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()
@@ -505,21 +365,14 @@
         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)
+            for iter6 in self.groupSSHAccountProvisionerConfigs:
+                iter6.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()
 
@@ -594,10 +447,10 @@
             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)
+                    (_etype10, _size7) = iprot.readListBegin()
+                    for _i11 in range(_size7):
+                        _elem12 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.allowedBatchQueues.append(_elem12)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -626,8 +479,8 @@
         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)
+            for iter13 in self.allowedBatchQueues:
+                oprot.writeString(iter13.encode('utf-8') if sys.version_info[0] == 2 else iter13)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
@@ -877,33 +730,33 @@
             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)
+                    (_etype17, _size14) = iprot.readListBegin()
+                    for _i18 in range(_size14):
+                        _elem19 = GroupComputeResourcePreference()
+                        _elem19.read(iprot)
+                        self.computePreferences.append(_elem19)
                     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)
+                    (_etype23, _size20) = iprot.readListBegin()
+                    for _i24 in range(_size20):
+                        _elem25 = ComputeResourcePolicy()
+                        _elem25.read(iprot)
+                        self.computeResourcePolicies.append(_elem25)
                     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)
+                    (_etype29, _size26) = iprot.readListBegin()
+                    for _i30 in range(_size26):
+                        _elem31 = BatchQueueResourcePolicy()
+                        _elem31.read(iprot)
+                        self.batchQueueResourcePolicies.append(_elem31)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -947,22 +800,22 @@
         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)
+            for iter32 in self.computePreferences:
+                iter32.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)
+            for iter33 in self.computeResourcePolicies:
+                iter33.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)
+            for iter34 in self.batchQueueResourcePolicies:
+                iter34.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.creationTime is not None:
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/build/lib/airavata/model/application/io/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/io/ttypes.py
new file mode 100644
index 0000000..8c9017a
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/build/lib/airavata/model/application/io/ttypes.py
@@ -0,0 +1,498 @@
+#
+# 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.
+
+
+    Attributes:
+     - name
+     - value
+     - type
+     - applicationArgument
+     - standardInput
+     - userFriendlyDescription
+     - metaData
+     - inputOrder
+     - isRequired
+     - requiredToAddedToCommandLine
+     - dataStaged
+     - storageResourceId
+     - isReadOnly
+    """
+
+    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
+    )
+
+    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,):
+        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
+
+    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)
+            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()
+        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/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 100%
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/build/lib/airavata/model/group/ttypes.py
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 100%
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/build/lib/airavata/model/sharing/ttypes.py
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..36c7e62
--- /dev/null
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/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/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..b66e69d
--- /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..cc9d4e2
--- /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..5c32fb9
--- /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 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/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/ComputeResourceReservation.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/groupresourceprofile/ComputeResourceReservation.java
index 5909f9c..df76be4 100644
--- 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
@@ -686,13 +686,13 @@
           case 3: // QUEUE_NAMES
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list16 = iprot.readListBegin();
-                struct.queueNames = new java.util.ArrayList<java.lang.String>(_list16.size);
-                java.lang.String _elem17;
-                for (int _i18 = 0; _i18 < _list16.size; ++_i18)
+                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)
                 {
-                  _elem17 = iprot.readString();
-                  struct.queueNames.add(_elem17);
+                  _elem1 = iprot.readString();
+                  struct.queueNames.add(_elem1);
                 }
                 iprot.readListEnd();
               }
@@ -744,9 +744,9 @@
         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 _iter19 : struct.queueNames)
+          for (java.lang.String _iter3 : struct.queueNames)
           {
-            oprot.writeString(_iter19);
+            oprot.writeString(_iter3);
           }
           oprot.writeListEnd();
         }
@@ -779,9 +779,9 @@
       oprot.writeString(struct.reservationName);
       {
         oprot.writeI32(struct.queueNames.size());
-        for (java.lang.String _iter20 : struct.queueNames)
+        for (java.lang.String _iter4 : struct.queueNames)
         {
-          oprot.writeString(_iter20);
+          oprot.writeString(_iter4);
         }
       }
       oprot.writeI64(struct.startTime);
@@ -796,13 +796,13 @@
       struct.reservationName = iprot.readString();
       struct.setReservationNameIsSet(true);
       {
-        org.apache.thrift.protocol.TList _list21 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-        struct.queueNames = new java.util.ArrayList<java.lang.String>(_list21.size);
-        java.lang.String _elem22;
-        for (int _i23 = 0; _i23 < _list21.size; ++_i23)
+        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)
         {
-          _elem22 = iprot.readString();
-          struct.queueNames.add(_elem22);
+          _elem6 = iprot.readString();
+          struct.queueNames.add(_elem6);
         }
       }
       struct.setQueueNamesIsSet(true);
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 f43c58b..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,9 +40,6 @@
   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);
@@ -63,9 +60,6 @@
   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
@@ -93,9 +87,6 @@
     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"),
@@ -138,12 +129,6 @@
           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
@@ -193,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,_Fields.RESERVATIONS};
+  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);
@@ -224,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, 
@@ -239,7 +216,7 @@
         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.FieldValueMetaData(org.apache.thrift.protocol.TType.STRUCT            , "ComputeResourceReservation"))));
+            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);
   }
@@ -302,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;
     }
@@ -323,7 +295,7 @@
     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(other_element);
+        __this__reservations.add(new ComputeResourceReservation(other_element));
       }
       this.reservations = __this__reservations;
     }
@@ -349,11 +321,6 @@
     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;
@@ -651,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;
   }
@@ -938,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();
@@ -1035,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();
 
@@ -1091,12 +958,6 @@
       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:
@@ -1232,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) {
@@ -1348,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();
@@ -1507,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;
@@ -1706,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:");
@@ -1921,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();
@@ -1956,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();
               }
@@ -1983,14 +1729,14 @@
           case 19: // RESERVATIONS
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list3 = iprot.readListBegin();
-                struct.reservations = new java.util.ArrayList<ComputeResourceReservation>(_list3.size);
-                ComputeResourceReservation _elem4;
-                for (int _i5 = 0; _i5 < _list3.size; ++_i5)
+                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)
                 {
-                  _elem4 = new ComputeResourceReservation();
-                  _elem4.read(iprot);
-                  struct.reservations.add(_elem4);
+                  _elem12 = new ComputeResourceReservation();
+                  _elem12.read(iprot);
+                  struct.reservations.add(_elem12);
                 }
                 iprot.readListEnd();
               }
@@ -2088,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);
@@ -2117,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 _iter6 : struct.groupSSHAccountProvisionerConfigs)
+            for (GroupAccountSSHProvisionerConfig _iter14 : struct.groupSSHAccountProvisionerConfigs)
             {
-              _iter6.write(oprot);
+              _iter14.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -2138,9 +1867,9 @@
           oprot.writeFieldBegin(RESERVATIONS_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.reservations.size()));
-            for (ComputeResourceReservation _iter7 : struct.reservations)
+            for (ComputeResourceReservation _iter15 : struct.reservations)
             {
-              _iter7.write(oprot);
+              _iter15.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -2195,28 +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);
-      }
-      if (struct.isSetReservations()) {
-        optionals.set(15);
-      }
-      oprot.writeBitSet(optionals, 16);
+      oprot.writeBitSet(optionals, 13);
       if (struct.isSetLoginUserName()) {
         oprot.writeString(struct.loginUserName);
       }
@@ -2244,24 +1964,15 @@
       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 _iter8 : struct.groupSSHAccountProvisionerConfigs)
+          for (GroupAccountSSHProvisionerConfig _iter16 : struct.groupSSHAccountProvisionerConfigs)
           {
-            _iter8.write(oprot);
+            _iter16.write(oprot);
           }
         }
       }
@@ -2271,9 +1982,9 @@
       if (struct.isSetReservations()) {
         {
           oprot.writeI32(struct.reservations.size());
-          for (ComputeResourceReservation _iter9 : struct.reservations)
+          for (ComputeResourceReservation _iter17 : struct.reservations)
           {
-            _iter9.write(oprot);
+            _iter17.write(oprot);
           }
         }
       }
@@ -2288,7 +1999,7 @@
       struct.setGroupResourceProfileIdIsSet(true);
       struct.overridebyAiravata = iprot.readBool();
       struct.setOverridebyAiravataIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(16);
+      java.util.BitSet incoming = iprot.readBitSet(13);
       if (incoming.get(0)) {
         struct.loginUserName = iprot.readString();
         struct.setLoginUserNameIsSet(true);
@@ -2326,49 +2037,37 @@
         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 _list10 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.groupSSHAccountProvisionerConfigs = new java.util.ArrayList<GroupAccountSSHProvisionerConfig>(_list10.size);
-          GroupAccountSSHProvisionerConfig _elem11;
-          for (int _i12 = 0; _i12 < _list10.size; ++_i12)
+          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)
           {
-            _elem11 = new GroupAccountSSHProvisionerConfig();
-            _elem11.read(iprot);
-            struct.groupSSHAccountProvisionerConfigs.add(_elem11);
+            _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(15)) {
+      if (incoming.get(12)) {
         {
-          org.apache.thrift.protocol.TList _list13 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.reservations = new java.util.ArrayList<ComputeResourceReservation>(_list13.size);
-          ComputeResourceReservation _elem14;
-          for (int _i15 = 0; _i15 < _list13.size; ++_i15)
+          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)
           {
-            _elem14 = new ComputeResourceReservation();
-            _elem14.read(iprot);
-            struct.reservations.add(_elem14);
+            _elem22 = new ComputeResourceReservation();
+            _elem22.read(iprot);
+            struct.reservations.add(_elem22);
           }
         }
         struct.setReservationsIsSet(true);
diff --git a/airavata-api/airavata-model-utils/pom.xml b/airavata-api/airavata-model-utils/pom.xml
index 51bace8..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>
 
@@ -49,7 +49,12 @@
             <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/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/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..30bbd53 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>
 
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 dd1ec54..0f53e2d 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>
 
@@ -94,7 +94,7 @@
         <dependency>
             <groupId>org.jmockit</groupId>
             <artifactId>jmockit</artifactId>
-            <version>1.39</version>
+            <version>${jmockit.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -103,5 +103,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/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/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/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 6cde1aa..be0741e 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
@@ -30,7 +30,7 @@
 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-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
 
@@ -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
@@ -176,3 +179,5 @@
 
 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 2a544e5..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,7 +23,7 @@
 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
+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')]"
@@ -31,4 +31,4 @@
 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")'
+# 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/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 43f2687..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"
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
index 8122833..4d1a25a 100644
--- a/dev-tools/ansible/inventories/scigap/develop/host_vars/mines/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/develop/host_vars/mines/vars.yml
@@ -35,7 +35,7 @@
 auth_options:
   password:
     name: "Mines"
-  external:
+#  external:
 #    - name: "Existing Institute Login"
 #      idp_alias: "cilogon"
 
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 a56dee3..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"
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 049da8a..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"
 
@@ -52,6 +58,8 @@
   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"
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 177d850..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"
diff --git a/dev-tools/ansible/inventories/scigap/develop/hosts b/dev-tools/ansible/inventories/scigap/develop/hosts
index 4a0b8e5..9184ea6 100644
--- a/dev-tools/ansible/inventories/scigap/develop/hosts
+++ b/dev-tools/ansible/inventories/scigap/develop/hosts
@@ -34,6 +34,10 @@
 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/production/group_vars/all/vars.yml b/dev-tools/ansible/inventories/scigap/production/group_vars/all/vars.yml
index 01661e1..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
@@ -133,6 +133,7 @@
 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
@@ -177,4 +178,6 @@
 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"
\ No newline at end of file
+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/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/dreg/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/vars.yml
index 5e43373..56a0f48 100644
--- a/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/dreg/vars.yml
@@ -28,6 +28,9 @@
 # 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
 
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
index 3a3e376..40e2091 100644
--- 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
@@ -20,6 +20,10 @@
 
 ---
 
+# 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
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
index f318823..62f6f51 100644
--- a/dev-tools/ansible/inventories/scigap/production/host_vars/mines/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/mines/vars.yml
@@ -45,4 +45,5 @@
 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/physicell/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/physicell/vars.yml
index b71354d..f83b413 100644
--- a/dev-tools/ansible/inventories/scigap/production/host_vars/physicell/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/physicell/vars.yml
@@ -21,11 +21,11 @@
 ---
 
 
-vhost_servername: "physicell.scigap.org"
+vhost_servername: "gateway.physicell.org"
 vhost_ssl: True
-ssl_certificate_file: "/etc/letsencrypt/live/physicell.scigap.org/cert.pem"
-ssl_certificate_chain_file: "/etc/letsencrypt/live/physicell.scigap.org/fullchain.pem"
-ssl_certificate_key_file: "/etc/letsencrypt/live/physicell.scigap.org/privkey.pem"
+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"
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
index c6880cf..820ff18 100644
--- a/dev-tools/ansible/inventories/scigap/production/host_vars/smaltr/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/smaltr/vars.yml
@@ -44,7 +44,7 @@
 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')]"
+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/hosts b/dev-tools/ansible/inventories/scigap/production/hosts
index 706cd9c..40c05a2 100644
--- a/dev-tools/ansible/inventories/scigap/production/hosts
+++ b/dev-tools/ansible/inventories/scigap/production/hosts
@@ -62,6 +62,7 @@
 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
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 6f64cfc..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 }}"
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 00f3396..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
@@ -140,6 +140,7 @@
 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
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/roles/common/defaults/main.yml b/dev-tools/ansible/roles/common/defaults/main.yml
index afc80f5..e5635e1 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.2"
+apache_maven_url: "https://www-eu.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-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/django/defaults/main.yml b/dev-tools/ansible/roles/django/defaults/main.yml
index 9a72ec5..58f002a 100644
--- a/dev-tools/ansible/roles/django/defaults/main.yml
+++ b/dev-tools/ansible/roles/django/defaults/main.yml
@@ -54,7 +54,7 @@
 # By default it has no value meaning system default CA certs will be used for validation.
 django_keycloak_ca_certfile_path:
 
-django_wsgi_processes: 2
+django_wsgi_processes: 1
 
 django_debug: false
 django_error_emails: "{{ admin_emails }}"
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 489ab2b..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
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 b23da56..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
@@ -100,3 +100,10 @@
 ###########################################################################
 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/httpd/defaults/main.yml b/dev-tools/ansible/roles/httpd/defaults/main.yml
index 6c09be4..1317100 100644
--- a/dev-tools/ansible/roles/httpd/defaults/main.yml
+++ b/dev-tools/ansible/roles/httpd/defaults/main.yml
@@ -51,4 +51,11 @@
 
 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/main.yml b/dev-tools/ansible/roles/httpd/tasks/main.yml
index cb61714..2f7be68 100644
--- a/dev-tools/ansible/roles/httpd/tasks/main.yml
+++ b/dev-tools/ansible/roles/httpd/tasks/main.yml
@@ -1,7 +1,7 @@
 
 # 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"
 
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/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/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-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/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/SSHJAgentAdaptor.java b/modules/airavata-helix/agent-impl/sshj-agent/src/main/java/org/apache/airavata/helix/adaptor/SSHJAgentAdaptor.java
index 5eae723..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
@@ -461,26 +461,26 @@
 
     @Override
     public List<String> getFileNameFromExtension(String fileName, String parentPath) throws AgentException {
-        SFTPClientWrapper sftpClient = null;
-        try  {
-            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) {
-            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
-                }
-            });
+        }*/
+        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
diff --git a/modules/airavata-helix/helix-spectator/pom.xml b/modules/airavata-helix/helix-spectator/pom.xml
index aef6002..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,22 +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>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.slf4j</groupId>
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 e57fa1e..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
@@ -647,11 +647,6 @@
             reservation = userComputeResourcePreference.getReservation();
             start = userComputeResourcePreference.getReservationStartTime();
             end = userComputeResourcePreference.getReservationEndTime();
-        } else {
-            // TODO: remove this once we've migrated to groupComputeResourcePreference.getReservations()
-            reservation = groupComputeResourcePreference.getReservation();
-            start = groupComputeResourcePreference.getReservationStartTime();
-            end = groupComputeResourcePreference.getReservationEndTime();
         }
         if (reservation != null && start > 0 && start < end) {
             long now = Calendar.getInstance().getTimeInMillis();
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 2448b29..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
@@ -106,7 +106,7 @@
 
                     String destParent = destFilePath.substring(0, destFilePath.lastIndexOf("/"));
                     final String storageArchiveDir = "ARCHIVE";
-                    String unArchiveTarCommand = "mkdir " + storageArchiveDir + " && tar -xvf " + archiveFileName + " -C "
+                    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);
 
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 af43cef..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
@@ -137,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) ?
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 30c22fb..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 {
@@ -189,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/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 220714b..488277f 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>
 
@@ -109,7 +109,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>
@@ -136,7 +136,7 @@
         <dependency>
             <groupId>org.jmockit</groupId>
             <artifactId>jmockit</artifactId>
-            <version>1.39</version>
+            <version>${jmockit.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -169,6 +169,11 @@
             <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>
     </dependencies>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
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
index 34751cc..1f24db8 100644
--- 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
@@ -16,9 +16,7 @@
 import mockit.Expectations;
 import mockit.Mocked;
 import mockit.Verifications;
-import mockit.integration.junit4.JMockit;
 
-@RunWith(JMockit.class)
 public class ThriftClientPoolTest {
 
     @Mocked
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/credential-store/credential-store-service/pom.xml b/modules/credential-store/credential-store-service/pom.xml
index 9e015ba..74ed465 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>
 
@@ -154,6 +154,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..b6ad6e5 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
@@ -40,7 +40,7 @@
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import sun.security.provider.X509Factory;
+//import sun.security.provider.X509Factory;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -122,7 +122,7 @@
             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[] certificates = new X509Certificate[1];
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/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 245723a..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>
 
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 cb81d2e..4eead3a 100644
--- a/modules/ide-integration/README.md
+++ b/modules/ide-integration/README.md
@@ -176,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/airavata-server.properties b/modules/ide-integration/src/main/resources/airavata-server.properties
index 2ff2e9f..c0d3e56 100644
--- a/modules/ide-integration/src/main/resources/airavata-server.properties
+++ b/modules/ide-integration/src/main/resources/airavata-server.properties
@@ -275,11 +275,18 @@
 email.expiration.minutes=60
 email.based.monitoring.period=10000
 
-email.based.monitor.address=CHANGEME
-email.based.monitor.password=CHANGEME
+email.based.monitor.address=airavatatest123@gmail.com
+email.based.monitor.password=airavatatest12345678
 
 ###########################################################################
 # ThriftClientPool Configuration
 ###########################################################################
 thrift.client.pool.abandoned.removal.enabled=true
-thrift.client.pool.abandoned.removal.logged=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/init/03-appcatalog-migrations.sql b/modules/ide-integration/src/main/resources/database_scripts/init/03-appcatalog-migrations.sql
index a509fb2..0119ceb 100644
--- 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
@@ -9,3 +9,8 @@
 )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/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/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/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-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-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/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/pom.xml b/modules/registry/registry-core/pom.xml
index 3099b25..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>
@@ -103,7 +103,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.airavata</groupId>
@@ -113,7 +113,7 @@
         <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>
@@ -134,10 +134,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>
@@ -225,7 +228,7 @@
             <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>
@@ -244,7 +247,7 @@
                     <dependency>
                         <groupId>org.apache.openjpa</groupId>
                         <artifactId>openjpa</artifactId>
-                        <version>2.2.0</version>
+                        <version>${openjpa.version}</version>
                     </dependency>
                 </dependencies>
             </plugin>
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/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 22e0673..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
@@ -82,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;
 
@@ -193,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;
     }
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/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/resources/appcatalog-derby.sql b/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
index afe5fed..ab1bcab 100644
--- a/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
+++ b/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
@@ -609,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),
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 5d3e9b6..d9cc624 100644
--- a/modules/registry/registry-core/src/main/resources/dozer_mapping.xml
+++ b/modules/registry/registry-core/src/main/resources/dozer_mapping.xml
@@ -24,6 +24,11 @@
           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>
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/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-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-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
index d88340a..1548106 100644
--- 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
@@ -482,3 +482,31 @@
 -- 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/next/DeltaScripts/appCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/next/DeltaScripts/appCatalog_schema_delta.sql
index 6dacaa4..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,29 +20,7 @@
 
 use app_catalog;
 
--- 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)'
-;
--- 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-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/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-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..5066870 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,15 @@
         <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>
+
+
     </dependencies>
 
     <build>
@@ -98,10 +105,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 +140,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/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-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/pom.xml b/pom.xml
index 9f28735..79c2ac7 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,12 @@
         <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>
     </properties>
 
@@ -540,6 +540,12 @@
                 <artifactId>commons-pool2</artifactId>
                 <version>${org.apache.commons.pool2.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.jmockit</groupId>
+                <artifactId>jmockit</artifactId>
+                <version>${jmockit.version}</version>
+                <scope>test</scope>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
@@ -563,26 +569,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>
@@ -673,9 +659,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>
@@ -689,6 +688,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>
@@ -790,10 +794,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/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 868db38..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
@@ -55,9 +55,6 @@
     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,
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/load-client/pom.xml b/tools/load-client/pom.xml
index 9edad34..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>
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
index 4477297..6442fc5 100644
--- 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
@@ -34,6 +34,7 @@
         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);
diff --git a/tools/pom.xml b/tools/pom.xml
index 8e37083..cd86cef 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>