You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ya...@apache.org on 2026/04/01 19:04:45 UTC

(airavata) 12/49: refactor: migrate airavata-api from Thrift model types to proto types

This is an automated email from the ASF dual-hosted git repository.

yasith pushed a commit to branch feat/grpc-armeria-migration
in repository https://gitbox.apache.org/repos/asf/airavata.git

commit d0c37c289eeba628f53901a0f953c74bad54ab24
Author: yasithdev <ya...@icloud.com>
AuthorDate: Tue Mar 31 08:15:45 2026 -0400

    refactor: migrate airavata-api from Thrift model types to proto types
    
    Replaced Thrift-generated model types with proto equivalents across
    execution/, compute/, storage/, credential/, sharing/, common/,
    and security/ packages. Converted mutable Thrift POJOs to immutable
    proto builder patterns. Deleted unused Thrift client utilities.
---
 .../common/config/ApplicationSettings.java         |  14 -
 .../airavata/common/security/UserContext.java      |   2 +-
 .../common/util/AiravataClientFactory.java         |  81 ---
 .../airavata/common/util/ThriftClientPool.java     | 258 ---------
 .../airavata/compute/mapper/ComputeMapper.java     |  60 +-
 .../compute/model/ApplicationDeploymentEntity.java |   2 +-
 .../compute/model/ApplicationInputEntity.java      |   2 +-
 .../compute/model/ApplicationOutputEntity.java     |   2 +-
 .../compute/model/CloudJobSubmissionEntity.java    |   4 +-
 .../model/ComputeResourceFileSystemEntity.java     |   2 +-
 .../compute/model/ComputeResourceFileSystemPK.java |   2 +-
 .../model/ComputeResourcePreferenceEntity.java     |   4 +-
 .../compute/model/GlobusSubmissionEntity.java      |   2 +-
 .../model/GroupComputeResourcePrefEntity.java      |   4 +-
 .../compute/model/JobManagerCommandEntity.java     |   2 +-
 .../compute/model/JobManagerCommandPK.java         |   2 +-
 .../model/JobSubmissionInterfaceEntity.java        |   2 +-
 .../compute/model/LocalSubmissionEntity.java       |   2 +-
 .../compute/model/ParallelismCommandEntity.java    |   2 +-
 .../compute/model/ParallelismCommandPK.java        |   2 +-
 .../compute/model/ResourceJobManagerEntity.java    |   2 +-
 .../compute/model/SshJobSubmissionEntity.java      |   2 +-
 .../compute/model/UnicoreSubmissionEntity.java     |   2 +-
 .../ApplicationDeploymentRepository.java           |  15 +-
 .../repository/ApplicationInputRepository.java     |   2 +-
 .../repository/ApplicationInterfaceRepository.java |  24 +-
 .../repository/ApplicationModuleRepository.java    |   2 +-
 .../repository/ApplicationOutputRepository.java    |   2 +-
 .../repository/BatchQueuePolicyRepository.java     |   2 +-
 .../compute/repository/BatchQueueRepository.java   |   2 +-
 .../ComputeResourcePolicyRepository.java           |   2 +-
 .../repository/ComputeResourcePrefRepository.java  |   2 +-
 .../repository/ComputeResourceRepository.java      | 119 ++--
 .../repository/GatewayGroupsRepository.java        |   2 +-
 .../repository/GroupResourceProfileRepository.java | 148 +++--
 .../repository/GrpComputePrefRepository.java       |  56 +-
 .../repository/GwyResourceProfileRepository.java   |   6 +-
 .../JobSubmissionInterfaceRepository.java          |   2 +-
 .../compute/repository/ParserInputRepository.java  |   2 +-
 .../compute/repository/ParserOutputRepository.java |   2 +-
 .../compute/repository/ParserRepository.java       |   2 +-
 .../repository/ParsingTemplateRepository.java      |   2 +-
 .../repository/ResourceJobManagerRepository.java   |  28 +-
 .../UserComputeResourcePreferenceRepository.java   |   2 +-
 .../repository/UserResourceProfileRepository.java  |   6 +-
 .../compute/service/ApplicationCatalogService.java |  30 +-
 .../service/GatewayResourceProfileService.java     |  38 +-
 .../service/GroupResourceProfileService.java       |  18 +-
 .../airavata/compute/service/ParserService.java    |   4 +-
 .../airavata/compute/service/ResourceService.java  |  45 +-
 .../service/UserResourceProfileService.java        |   8 +-
 .../task/AiravataCustomCommandOutputParser.java    |   2 +-
 .../compute/task/DefaultJobSubmissionTask.java     | 106 ++--
 .../compute/task/ForkJobConfiguration.java         |   6 +-
 .../compute/task/ForkJobSubmissionTask.java        |  48 +-
 .../airavata/compute/task/ForkOutputParser.java    |   2 +-
 .../airavata/compute/task/GroovyMapBuilder.java    |  63 +--
 .../compute/task/HTCondorJobConfiguration.java     |  22 +-
 .../compute/task/HTCondorOutputParser.java         |  12 +-
 .../apache/airavata/compute/task/JobFactory.java   |  14 +-
 .../airavata/compute/task/JobSubmissionTask.java   |  30 +-
 .../org/apache/airavata/compute/task/JobUtil.java  |   2 +-
 .../airavata/compute/task/LSFJobConfiguration.java |   6 +-
 .../airavata/compute/task/LSFOutputParser.java     |  10 +-
 .../compute/task/LocalJobSubmissionTask.java       |  15 +-
 .../apache/airavata/compute/task/OutputParser.java |   2 +-
 .../airavata/compute/task/PBSJobConfiguration.java |   6 +-
 .../airavata/compute/task/PBSOutputParser.java     |   8 +-
 .../compute/task/SlurmJobConfiguration.java        |  24 +-
 .../airavata/compute/task/SlurmOutputParser.java   |  10 +-
 .../airavata/compute/task/UGEJobConfiguration.java |   6 +-
 .../airavata/compute/task/UGEOutputParser.java     |  10 +-
 .../compute/task/aws/AWSCompletingTask.java        |   2 +-
 .../compute/task/aws/AWSJobSubmissionTask.java     |  78 +--
 .../compute/task/aws/AWSProcessContextManager.java |  25 +-
 .../airavata/compute/task/aws/AWSTaskUtil.java     |   4 +-
 .../compute/task/aws/CreateEC2InstanceTask.java    |  17 +-
 .../apache/airavata/compute/util/AgentAdaptor.java |   4 +-
 .../airavata/compute/util/AppDeploymentUtil.java   |  24 +-
 .../airavata/compute/util/AppInterfaceUtil.java    |  50 +-
 .../util/GroupComputeResourcePreferenceUtil.java   |  18 +-
 .../airavata/compute/util/SSHJAgentAdaptor.java    |  42 +-
 .../airavata/compute/util/SshAgentAdaptor.java     |   8 +-
 .../airavata/credential/task/EnvSetupTask.java     |   2 +-
 .../execution/handler/RegistryServerHandler.java   | 622 +++++++++++----------
 .../handler/RegistryServiceDBEventHandler.java     |  35 +-
 .../RegistryServiceDBEventMessagingFactory.java    |  10 +-
 .../airavata/execution/mapper/ExecutionMapper.java | 118 ++--
 .../airavata/execution/model/ExperimentEntity.java |   4 +-
 .../execution/model/ExperimentInputEntity.java     |   2 +-
 .../execution/model/ExperimentOutputEntity.java    |   2 +-
 .../execution/model/ExperimentStatusEntity.java    |   2 +-
 .../airavata/execution/model/GatewayEntity.java    |   2 +-
 .../airavata/execution/model/JobStatusEntity.java  |   2 +-
 .../execution/model/NotificationEntity.java        |   2 +-
 .../execution/model/ProcessInputEntity.java        |   2 +-
 .../execution/model/ProcessOutputEntity.java       |   2 +-
 .../execution/model/ProcessStatusEntity.java       |   2 +-
 .../airavata/execution/model/TaskEntity.java       |   2 +-
 .../airavata/execution/model/TaskStatusEntity.java |   2 +-
 .../workflow/AiravataWorkflowStatusEntity.java     |   2 +-
 .../model/workflow/ApplicationStatusEntity.java    |   2 +-
 .../execution/model/workflow/EdgeEntity.java       |   2 +-
 .../model/workflow/HandlerInputEntity.java         |   2 +-
 .../model/workflow/HandlerOutputEntity.java        |   2 +-
 .../execution/model/workflow/NodeEntity.java       |   2 +-
 .../execution/model/workflow/PortEntity.java       |   2 +-
 .../model/workflow/WorkflowConnectionEntity.java   |   2 +-
 .../model/workflow/WorkflowHandlerEntity.java      |   2 +-
 .../monitor/AiravataCustomMailParser.java          |   2 +-
 .../execution/monitor/ClusterStatusMonitorJob.java |  32 +-
 .../execution/monitor/ComputeResourceMonitor.java  |   8 +-
 .../execution/monitor/EmailBasedMonitor.java       |   4 +-
 .../execution/monitor/HTCondorEmailParser.java     |   4 +-
 .../execution/monitor/JobStateValidator.java       |   2 +-
 .../execution/monitor/JobStatusResult.java         |   2 +-
 .../monitor/JobStatusResultDeserializer.java       |   2 +-
 .../airavata/execution/monitor/LSFEmailParser.java |   2 +-
 .../airavata/execution/monitor/MonitoringJob.java  |  39 +-
 .../airavata/execution/monitor/PBSEmailParser.java |   2 +-
 .../execution/monitor/RealtimeJobStatusParser.java |   4 +-
 .../execution/monitor/RealtimeMonitor.java         |   2 +-
 .../airavata/execution/monitor/ResourceConfig.java |   2 +-
 .../execution/monitor/SLURMEmailParser.java        |   2 +-
 .../airavata/execution/monitor/UGEEmailParser.java |   2 +-
 .../orchestrator/AbstractOrchestrator.java         |   4 +-
 .../execution/orchestrator/AdaptorSupport.java     |   4 +-
 .../execution/orchestrator/AdaptorSupportImpl.java |   4 +-
 .../execution/orchestrator/AgentStore.java         |   4 +-
 .../execution/orchestrator/AiravataTask.java       | 168 +++---
 .../orchestrator/BatchQueueValidator.java          | 174 +++---
 .../orchestrator/DefaultHostScheduler.java         |   2 +-
 .../orchestrator/ExperimentStatusValidator.java    |  35 +-
 .../orchestrator/GFACPassiveJobSubmitter.java      |  19 +-
 .../GroupResourceProfileValidator.java             | 113 ++--
 .../execution/orchestrator/HostScheduler.java      |   2 +-
 .../orchestrator/JobMetadataValidator.java         |   6 +-
 .../execution/orchestrator/Orchestrator.java       |  11 +-
 .../orchestrator/OrchestratorClientFactory.java    |   2 +-
 .../orchestrator/OrchestratorClientSample.java     |  48 +-
 .../orchestrator/OrchestratorServerUtils.java      |  23 +-
 .../execution/orchestrator/OrchestratorUtils.java  |  60 +-
 .../orchestrator/ParserWorkflowManager.java        |  22 +-
 .../orchestrator/PostWorkflowManager.java          |  58 +-
 .../execution/orchestrator/PreWorkflowManager.java |  41 +-
 .../orchestrator/SimpleOrchestratorImpl.java       | 440 ++++++++-------
 .../execution/orchestrator/TaskContext.java        | 146 ++---
 .../execution/orchestrator/TaskFactory.java        |   2 +-
 .../execution/orchestrator/WorkflowManager.java    |  25 +-
 .../repository/ExperimentErrorRepository.java      |   6 +-
 .../repository/ExperimentInputRepository.java      |   6 +-
 .../repository/ExperimentOutputRepository.java     |   6 +-
 .../execution/repository/ExperimentRepository.java |  46 +-
 .../repository/ExperimentStatusRepository.java     |   8 +-
 .../repository/ExperimentSummaryRepository.java    |   6 +-
 .../execution/repository/GatewayRepository.java    |   2 +-
 .../GatewayUsageReportingCommandRepository.java    |   2 +-
 .../execution/repository/JobRepository.java        |  14 +-
 .../execution/repository/JobStatusRepository.java  |   8 +-
 .../repository/NotificationRepository.java         |   2 +-
 .../repository/ProcessErrorRepository.java         |   4 +-
 .../repository/ProcessInputRepository.java         |   6 +-
 .../repository/ProcessOutputRepository.java        |   6 +-
 .../execution/repository/ProcessRepository.java    |  47 +-
 .../repository/ProcessStatusRepository.java        |  10 +-
 .../repository/ProcessWorkflowRepository.java      |   4 +-
 .../execution/repository/ProjectRepository.java    |   6 +-
 .../repository/QueueStatusRepository.java          |   2 +-
 .../execution/repository/TaskErrorRepository.java  |   4 +-
 .../execution/repository/TaskRepository.java       |  18 +-
 .../execution/repository/TaskStatusRepository.java |   8 +-
 .../execution/repository/UserRepository.java       |   2 +-
 .../execution/repository/WorkflowRepository.java   |   8 +-
 .../scheduler/ComputeResourceSelectionPolicy.java  |   2 +-
 .../ComputeResourceSelectionPolicyImpl.java        |   2 +-
 .../execution/scheduler/DataAnalyzerImpl.java      |   7 +-
 .../DefaultComputeResourceSelectionPolicy.java     |  14 +-
 .../scheduler/ExponentialBackOffReScheduler.java   |  72 +--
 .../scheduler/MultipleComputeResourcePolicy.java   |  12 +-
 .../execution/scheduler/ProcessScannerImpl.java    |   4 +-
 .../execution/scheduler/ProcessSchedulerImpl.java  |  70 +--
 .../airavata/execution/scheduler/ReScheduler.java  |   4 +-
 .../apache/airavata/execution/scheduler/Utils.java |  40 +-
 .../execution/service/ExperimentService.java       |  78 +--
 .../airavata/execution/service/GatewayService.java |   4 +-
 .../execution/service/NotificationService.java     |   2 +-
 .../airavata/execution/service/ProjectService.java |   4 +-
 .../execution/task/CancelCompletingTask.java       |   2 +-
 .../airavata/execution/task/CompletingTask.java    |   4 +-
 .../airavata/execution/task/DataParsingTask.java   |  59 +-
 .../execution/task/JobVerificationTask.java        |   6 +-
 .../execution/task/RemoteJobCancellationTask.java  |  10 +-
 .../execution/util/AppCatalogDBInitConfig.java     |   2 +-
 .../execution/util/ExpCatalogDBInitConfig.java     |   6 +-
 .../execution/util/ExperimentModelUtil.java        | 106 ++--
 .../airavata/execution/util/ProjectModelUtil.java  |  14 +-
 .../airavata/execution/util/QueryConstants.java    |   2 +-
 .../execution/util/cpi/ApplicationDeployment.java  |   2 +-
 .../execution/util/cpi/ApplicationInterface.java   |   8 +-
 .../execution/util/cpi/ComputeResource.java        |   6 +-
 .../execution/util/cpi/DataProductInterface.java   |   2 +-
 .../util/cpi/DataReplicaLocationInterface.java     |   2 +-
 .../execution/util/cpi/GwyResourceProfile.java     |   6 +-
 .../execution/util/cpi/StorageResource.java        |   2 +-
 .../execution/util/cpi/UsrResourceProfile.java     |   6 +-
 .../execution/util/cpi/WorkflowCatalog.java        |   2 +-
 .../client/ProfileServiceClientFactory.java        | 100 ----
 .../sharing/service/ResourceSharingService.java    |   6 +-
 .../airavata/sharing/service/SharingHelper.java    |   4 +-
 .../airavata/storage/mapper/StorageMapper.java     |  12 +-
 .../storage/model/DataMovementInterfaceEntity.java |   2 +-
 .../airavata/storage/model/DataProductEntity.java  |   2 +-
 .../storage/model/DataReplicaLocationEntity.java   |   4 +-
 .../storage/model/GridftpDataMovementEntity.java   |   2 +-
 .../storage/model/ScpDataMovementEntity.java       |   2 +-
 .../storage/model/StorageInterfaceEntity.java      |   2 +-
 .../storage/model/UnicoreDatamovementEntity.java   |   2 +-
 .../storage/repository/DataMovementRepository.java |   2 +-
 .../storage/repository/DataProductRepository.java  |   4 +-
 .../repository/DataReplicaLocationRepository.java  |   4 +-
 .../storage/repository/StoragePrefRepository.java  |   2 +-
 .../repository/StorageResourceRepository.java      |   7 +-
 .../UserStoragePreferenceRepository.java           |   2 +-
 .../storage/service/DataProductService.java        |   4 +-
 .../apache/airavata/storage/task/ArchiveTask.java  |   4 +-
 .../airavata/storage/task/DataStagingTask.java     |   6 +-
 .../storage/task/InputDataStagingTask.java         |   8 +-
 .../storage/task/OutputDataStagingTask.java        |  14 +-
 .../airavata/storage/util/SSHJStorageAdaptor.java  |  12 +-
 .../storage/util/StorageResourceAdaptorImpl.java   |   4 +-
 230 files changed, 2410 insertions(+), 2655 deletions(-)

diff --git a/airavata-api/src/main/java/org/apache/airavata/common/config/ApplicationSettings.java b/airavata-api/src/main/java/org/apache/airavata/common/config/ApplicationSettings.java
index 2cf9d7d20c..8b23af23c3 100644
--- a/airavata-api/src/main/java/org/apache/airavata/common/config/ApplicationSettings.java
+++ b/airavata-api/src/main/java/org/apache/airavata/common/config/ApplicationSettings.java
@@ -50,12 +50,6 @@ public class ApplicationSettings {
 
     private static final String SHUTDOWN_STATEGY_STRING = "shutdown.strategy";
 
-    // ThriftClientPool Constants
-    private static final String THRIFT_CLIENT_POOL_ABANDONED_REMOVAL_ENABLED =
-            "thrift.client.pool.abandoned.removal.enabled";
-    private static final String THRIFT_CLIENT_POOL_ABANDONED_REMOVAL_LOGGED =
-            "thrift.client.pool.abandoned.removal.logged";
-
     protected static ApplicationSettings INSTANCE;
 
     public static enum ShutdownStrategy {
@@ -303,14 +297,6 @@ public class ApplicationSettings {
         return getSetting(ServerSettings.IAM_SERVER_URL);
     }
 
-    public static boolean isThriftClientPoolAbandonedRemovalEnabled() {
-        return Boolean.parseBoolean(getSetting(THRIFT_CLIENT_POOL_ABANDONED_REMOVAL_ENABLED, "false"));
-    }
-
-    public static boolean isThriftClientPoolAbandonedRemovalLogged() {
-        return Boolean.parseBoolean(getSetting(THRIFT_CLIENT_POOL_ABANDONED_REMOVAL_LOGGED, "false"));
-    }
-
     public static void mergeSettingsCommandLineArgs(String[] args) {
         getInstance().mergeSettingsCommandLineArgsImpl(args);
     }
diff --git a/airavata-api/src/main/java/org/apache/airavata/common/security/UserContext.java b/airavata-api/src/main/java/org/apache/airavata/common/security/UserContext.java
index 73694d56c2..225a91b2a4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/common/security/UserContext.java
+++ b/airavata-api/src/main/java/org/apache/airavata/common/security/UserContext.java
@@ -21,7 +21,7 @@ package org.apache.airavata.common.security;
 
 import java.util.Map;
 import org.apache.airavata.common.config.Constants;
-import org.apache.airavata.model.security.AuthzToken;
+import org.apache.airavata.model.security.proto.AuthzToken;
 import org.apache.airavata.security.profile.commons.user.entities.UserProfileEntity;
 
 public class UserContext {
diff --git a/airavata-api/src/main/java/org/apache/airavata/common/util/AiravataClientFactory.java b/airavata-api/src/main/java/org/apache/airavata/common/util/AiravataClientFactory.java
deleted file mode 100644
index 3e45463333..0000000000
--- a/airavata-api/src/main/java/org/apache/airavata/common/util/AiravataClientFactory.java
+++ /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.
-*/
-package org.apache.airavata.common.util;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.airavata.api.Airavata;
-import org.apache.airavata.common.config.Constants;
-import org.apache.airavata.common.config.ServerSettings;
-import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.model.error.AiravataClientException;
-import org.apache.airavata.model.security.AuthzToken;
-import org.apache.thrift.TException;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.transport.TSSLTransportFactory;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransport;
-import org.apache.thrift.transport.TTransportException;
-
-public class AiravataClientFactory {
-
-    public static Airavata.Client createAiravataClient(String serverHost, int serverPort, boolean secure)
-            throws AiravataClientException {
-        try {
-            TTransport transport;
-            if (!secure) {
-                transport = new TSocket(serverHost, serverPort);
-                transport.open();
-            } else {
-                // TLS enabled client
-                var params = new TSSLTransportFactory.TSSLTransportParameters();
-                params.setKeyStore(ServerSettings.getKeyStorePath(), ServerSettings.getKeyStorePassword());
-                transport = TSSLTransportFactory.getClientSocket(serverHost, serverPort, 10000, params);
-            }
-
-            var protocol = new TBinaryProtocol(transport);
-            //            TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "APIServer");
-            return new Airavata.Client(protocol);
-        } catch (TTransportException | ApplicationSettingsException e) {
-            AiravataClientException exception = new AiravataClientException();
-            exception.setParameter("Unable to connect to the server at " + serverHost + ":" + serverPort);
-            throw exception;
-        }
-    }
-
-    public static void main(String[] a) throws TException, ApplicationSettingsException {
-        AuthzToken token = new AuthzToken();
-        token.setAccessToken(
-                "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJBUGFKRUpERFc4ZEdzMExnc3ozYUdydERsZ2U0eWlQblFibUNsYnpJX2NVIn0.eyJqdGkiOiI1NmMwZDZmYy0yMGVhLTQ1Y2UtODUwNC1kMTY0MTZkYTdkYzEiLCJleHAiOjE2NDc0NTQyNjcsIm5iZiI6MCwiaWF0IjoxNjQ3NDUyNDY3LCJpc3MiOiJodHRwczovL2lhbWRldi5zY2lnYXAub3JnL2F1dGgvcmVhbG1zL3NlYWdyaWQiLCJhdWQiOiJwZ2EiLCJzdWIiOiI3ZGZkYjI4MS1lNWIzLTQ4MjQtOTcxZC00YzQ2ZmNkMzIwYTEiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJwZ2EiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiI1NWVkODI5OS0xN2FiLTQ [...]
-        Map<String, String> claimsMap = new HashMap<>();
-        claimsMap.put(Constants.GATEWAY_ID, "seagrid");
-        claimsMap.put(Constants.USER_NAME, "2021test1");
-        token.setClaimsMap(claimsMap);
-        Airavata.Client apiClient = createAiravataClient("apidev.scigap.org", 8930, ServerSettings.isTLSEnabled());
-
-        List<String> outputNames = new ArrayList<>();
-        outputNames.add("Gaussian-Application-Output");
-        outputNames.add("Gaussian-Standar-Out");
-        apiClient.fetchIntermediateOutputs(
-                token, "Clone_of_Gaussian16_on_Mar_16,_2022_1:42_PM_1ad9e887-6ec4-4b1a-9ffb-e028ccb3c86c", outputNames);
-    }
-}
diff --git a/airavata-api/src/main/java/org/apache/airavata/common/util/ThriftClientPool.java b/airavata-api/src/main/java/org/apache/airavata/common/util/ThriftClientPool.java
deleted file mode 100644
index b9a082a6d4..0000000000
--- a/airavata-api/src/main/java/org/apache/airavata/common/util/ThriftClientPool.java
+++ /dev/null
@@ -1,258 +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.
-*/
-package org.apache.airavata.common.util;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import org.apache.airavata.base.api.BaseAPI;
-import org.apache.airavata.common.config.ApplicationSettings;
-import org.apache.commons.pool2.BasePooledObjectFactory;
-import org.apache.commons.pool2.PooledObject;
-import org.apache.commons.pool2.impl.AbandonedConfig;
-import org.apache.commons.pool2.impl.DefaultPooledObject;
-import org.apache.commons.pool2.impl.GenericObjectPool;
-import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TMultiplexedProtocol;
-import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransport;
-import org.apache.thrift.transport.TTransportException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ThriftClientPool<T extends BaseAPI.Client> implements AutoCloseable {
-
-    private static final Logger logger = LoggerFactory.getLogger(ThriftClientPool.class);
-
-    private final GenericObjectPool<T> internalPool;
-
-    /**
-     * StringWriter that flushes to SLF4J logger.
-     */
-    private static class ErrorLoggingStringWriter extends StringWriter {
-
-        @Override
-        public void flush() {
-            logger.error(this.toString());
-            // Reset buffer
-            this.getBuffer().setLength(0);
-        }
-    }
-
-    public ThriftClientPool(
-            ClientFactory<T> clientFactory, GenericObjectPoolConfig<T> poolConfig, String host, int port) {
-        this(clientFactory, new BinaryOverSocketProtocolFactory(host, port), poolConfig);
-    }
-
-    public ThriftClientPool(
-            ClientFactory<T> clientFactory,
-            GenericObjectPoolConfig<T> poolConfig,
-            String host,
-            int port,
-            String serviceName) {
-        this(clientFactory, new BinaryOverSocketProtocolFactory(host, port, serviceName), poolConfig);
-    }
-
-    public ThriftClientPool(
-            ClientFactory<T> clientFactory, ProtocolFactory protocolFactory, GenericObjectPoolConfig<T> poolConfig) {
-
-        AbandonedConfig abandonedConfig = null;
-        if (ApplicationSettings.isThriftClientPoolAbandonedRemovalEnabled()) {
-            abandonedConfig = new AbandonedConfig();
-            abandonedConfig.setRemoveAbandonedOnBorrow(true);
-            abandonedConfig.setRemoveAbandonedOnMaintenance(true);
-            if (ApplicationSettings.isThriftClientPoolAbandonedRemovalLogged()) {
-                abandonedConfig.setLogAbandoned(true);
-                abandonedConfig.setLogWriter(new PrintWriter(new ErrorLoggingStringWriter()));
-            } else {
-                abandonedConfig.setLogAbandoned(false);
-            }
-        }
-        this.internalPool = new GenericObjectPool<T>(
-                new ThriftClientFactory(clientFactory, protocolFactory), poolConfig, abandonedConfig);
-    }
-
-    public ThriftClientPool(
-            ClientFactory<T> clientFactory,
-            ProtocolFactory protocolFactory,
-            GenericObjectPoolConfig<T> poolConfig,
-            AbandonedConfig abandonedConfig) {
-
-        if (abandonedConfig != null
-                && abandonedConfig.getRemoveAbandonedOnMaintenance()
-                && poolConfig.getTimeBetweenEvictionRunsMillis() <= 0) {
-            logger.warn(
-                    "Abandoned removal is enabled but"
-                            + " removeAbandonedOnMaintenance won't run since"
-                            + " timeBetweenEvictionRunsMillis is not positive, current value: {}",
-                    poolConfig.getTimeBetweenEvictionRunsMillis());
-        }
-        this.internalPool = new GenericObjectPool<T>(
-                new ThriftClientFactory(clientFactory, protocolFactory), poolConfig, abandonedConfig);
-    }
-
-    class ThriftClientFactory extends BasePooledObjectFactory<T> {
-
-        private ClientFactory<T> clientFactory;
-        private ProtocolFactory protocolFactory;
-
-        public ThriftClientFactory(ClientFactory<T> clientFactory, ProtocolFactory protocolFactory) {
-            this.clientFactory = clientFactory;
-            this.protocolFactory = protocolFactory;
-        }
-
-        @Override
-        public T create() throws Exception {
-            try {
-                TProtocol protocol = protocolFactory.make();
-                return clientFactory.make(protocol);
-            } catch (Exception e) {
-                logger.warn(e.getMessage(), e);
-                throw new ThriftClientException("Can not make a new object for pool", e);
-            }
-        }
-
-        @Override
-        public void destroyObject(PooledObject<T> pooledObject) throws Exception {
-            T obj = pooledObject.getObject();
-            if (obj.getOutputProtocol().getTransport().isOpen()) {
-                obj.getOutputProtocol().getTransport().close();
-            }
-            if (obj.getInputProtocol().getTransport().isOpen()) {
-                obj.getInputProtocol().getTransport().close();
-            }
-        }
-
-        @Override
-        public PooledObject<T> wrap(T obj) {
-            return new DefaultPooledObject<T>(obj);
-        }
-    }
-
-    public static interface ClientFactory<T> {
-
-        T make(TProtocol tProtocol);
-    }
-
-    public static interface ProtocolFactory {
-
-        TProtocol make();
-    }
-
-    public static class BinaryOverSocketProtocolFactory implements ProtocolFactory {
-
-        private String host;
-        private int port;
-        private String serviceName;
-
-        public BinaryOverSocketProtocolFactory(String host, int port) {
-            this(host, port, null);
-        }
-
-        public BinaryOverSocketProtocolFactory(String host, int port, String serviceName) {
-            this.host = host;
-            this.port = port;
-            this.serviceName = serviceName;
-        }
-
-        public TProtocol make() {
-            TTransport transport;
-            try {
-                transport = new TSocket(host, port);
-                transport.open();
-            } catch (TTransportException e) {
-                logger.warn(e.getMessage(), e);
-                throw new ThriftClientException("Can not make protocol", e);
-            }
-            TProtocol protocol = new TBinaryProtocol(transport);
-            if (serviceName != null) {
-                return new TMultiplexedProtocol(protocol, serviceName);
-            }
-            return protocol;
-        }
-    }
-
-    public static class ThriftClientException extends RuntimeException {
-
-        // Fucking Eclipse
-        private static final long serialVersionUID = -2275296727467192665L;
-
-        public ThriftClientException(String message, Exception e) {
-            super(message, e);
-        }
-    }
-
-    public T getResource() {
-        try {
-            for (int i = 0; i < 10; i++) {
-                // This tries to fetch a client from the pool and validate it before returning.
-                final T client = internalPool.borrowObject();
-                try {
-                    String apiVersion = client.getAPIVersion();
-                    logger.debug("Validated client and fetched api version " + apiVersion);
-                    return client;
-                } catch (Exception e) {
-                    logger.warn("Failed to validate the client. Retrying " + i, e);
-                    returnBrokenResource(client);
-                }
-            }
-            throw new Exception("Failed to fetch a client form the pool after validation");
-        } catch (Exception e) {
-            throw new ThriftClientException("Could not get a resource from the pool", e);
-        }
-    }
-
-    public void returnResourceObject(T resource) {
-        try {
-            internalPool.returnObject(resource);
-        } catch (Exception e) {
-            throw new ThriftClientException("Could not return the resource to the pool", e);
-        }
-    }
-
-    public void returnBrokenResource(T resource) {
-        returnBrokenResourceObject(resource);
-    }
-
-    public void returnResource(T resource) {
-        returnResourceObject(resource);
-    }
-
-    protected void returnBrokenResourceObject(T resource) {
-        try {
-            internalPool.invalidateObject(resource);
-        } catch (Exception e) {
-            throw new ThriftClientException("Could not return the resource to the pool", e);
-        }
-    }
-
-    public void destroy() {
-        close();
-    }
-
-    public void close() {
-        try {
-            internalPool.close();
-        } catch (Exception e) {
-            throw new ThriftClientException("Could not destroy the pool", e);
-        }
-    }
-}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/mapper/ComputeMapper.java b/airavata-api/src/main/java/org/apache/airavata/compute/mapper/ComputeMapper.java
index 3953b137ac..f6d48a5fe7 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/mapper/ComputeMapper.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/mapper/ComputeMapper.java
@@ -21,36 +21,36 @@ package org.apache.airavata.compute.mapper;
 
 import java.sql.Timestamp;
 import org.apache.airavata.compute.model.*;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationModule;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.BatchQueue;
-import org.apache.airavata.model.appcatalog.computeresource.CloudJobSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
-import org.apache.airavata.model.appcatalog.computeresource.LOCALSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManager;
-import org.apache.airavata.model.appcatalog.computeresource.SSHJobSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.UnicoreJobSubmission;
-import org.apache.airavata.model.appcatalog.gatewaygroups.GatewayGroups;
-import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.BatchQueueResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.appcatalog.parser.Parser;
-import org.apache.airavata.model.appcatalog.parser.ParserInput;
-import org.apache.airavata.model.appcatalog.parser.ParserOutput;
-import org.apache.airavata.model.appcatalog.parser.ParsingTemplate;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserResourceProfile;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.data.movement.GridFTPDataMovement;
-import org.apache.airavata.model.data.movement.LOCALDataMovement;
-import org.apache.airavata.model.data.movement.SCPDataMovement;
-import org.apache.airavata.model.data.movement.UnicoreDataMovement;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationDeploymentDescription;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationModule;
+import org.apache.airavata.model.appcatalog.appinterface.proto.ApplicationInterfaceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.BatchQueue;
+import org.apache.airavata.model.appcatalog.computeresource.proto.CloudJobSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionInterface;
+import org.apache.airavata.model.appcatalog.computeresource.proto.LOCALSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ResourceJobManager;
+import org.apache.airavata.model.appcatalog.computeresource.proto.SSHJobSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.UnicoreJobSubmission;
+import org.apache.airavata.model.appcatalog.gatewaygroups.proto.GatewayGroups;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.ComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.GatewayResourceProfile;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.BatchQueueResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupResourceProfile;
+import org.apache.airavata.model.appcatalog.parser.proto.Parser;
+import org.apache.airavata.model.appcatalog.parser.proto.ParserInput;
+import org.apache.airavata.model.appcatalog.parser.proto.ParserOutput;
+import org.apache.airavata.model.appcatalog.parser.proto.ParsingTemplate;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserResourceProfile;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.data.movement.proto.GridFTPDataMovement;
+import org.apache.airavata.model.data.movement.proto.LOCALDataMovement;
+import org.apache.airavata.model.data.movement.proto.SCPDataMovement;
+import org.apache.airavata.model.data.movement.proto.UnicoreDataMovement;
 import org.apache.airavata.storage.model.GridftpDataMovementEntity;
 import org.apache.airavata.storage.model.LocalDataMovementEntity;
 import org.apache.airavata.storage.model.ScpDataMovementEntity;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationDeploymentEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationDeploymentEntity.java
index 89435c0abe..f97a0bd74e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationDeploymentEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationDeploymentEntity.java
@@ -23,7 +23,7 @@ import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
 import java.util.List;
-import org.apache.airavata.model.parallelism.ApplicationParallelismType;
+import org.apache.airavata.model.parallelism.proto.ApplicationParallelismType;
 
 /**
  * The persistent class for the application_deployment database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationInputEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationInputEntity.java
index 9846723608..a0a36682d4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationInputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationInputEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.proto.DataType;
 
 /**
  * The persistent class for the application_input database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationOutputEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationOutputEntity.java
index 242ed900dd..0610706c50 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationOutputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationOutputEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.proto.DataType;
 
 /**
  * The persistent class for the application_output database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/CloudJobSubmissionEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/CloudJobSubmissionEntity.java
index 3e0d1d6bc4..43790c113e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/CloudJobSubmissionEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/CloudJobSubmissionEntity.java
@@ -21,8 +21,8 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.appcatalog.computeresource.ProviderName;
-import org.apache.airavata.model.data.movement.SecurityProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ProviderName;
+import org.apache.airavata.model.data.movement.proto.SecurityProtocol;
 
 /**
  * The persistent class for the cloud_job_submission database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceFileSystemEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceFileSystemEntity.java
index f0ea4028e7..575ca4e0fe 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceFileSystemEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceFileSystemEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.appcatalog.computeresource.FileSystems;
+import org.apache.airavata.model.appcatalog.computeresource.proto.FileSystems;
 
 /**
  * The persistent class for the compute_resource_file_system database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceFileSystemPK.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceFileSystemPK.java
index c46d9b1160..4ceaa0d394 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceFileSystemPK.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceFileSystemPK.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.compute.model;
 
 import java.io.Serializable;
-import org.apache.airavata.model.appcatalog.computeresource.FileSystems;
+import org.apache.airavata.model.appcatalog.computeresource.proto.FileSystems;
 
 /**
  * The primary key class for the compute_resource_file_system database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourcePreferenceEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourcePreferenceEntity.java
index 07e1589ed4..55d4b58a91 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourcePreferenceEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourcePreferenceEntity.java
@@ -23,8 +23,8 @@ import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
 import java.util.List;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.data.movement.DataMovementProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.data.movement.proto.DataMovementProtocol;
 
 /**
  * The persistent class for the compute_resource_preference database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/GlobusSubmissionEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/GlobusSubmissionEntity.java
index d69ab63f7f..2c352f7941 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/GlobusSubmissionEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/GlobusSubmissionEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.data.movement.SecurityProtocol;
+import org.apache.airavata.model.data.movement.proto.SecurityProtocol;
 
 /**
  * The persistent class for the globus_submission database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/GroupComputeResourcePrefEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/GroupComputeResourcePrefEntity.java
index 9164de5671..94cbe8cd31 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/GroupComputeResourcePrefEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/GroupComputeResourcePrefEntity.java
@@ -34,8 +34,8 @@ import jakarta.persistence.JoinColumn;
 import jakarta.persistence.ManyToOne;
 import jakarta.persistence.Table;
 import java.io.Serializable;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.data.movement.DataMovementProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.data.movement.proto.DataMovementProtocol;
 import org.hibernate.annotations.OnDelete;
 import org.hibernate.annotations.OnDeleteAction;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/JobManagerCommandEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/JobManagerCommandEntity.java
index 2e3c7da5f4..a0a24df5bd 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/JobManagerCommandEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/JobManagerCommandEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
 
 /**
  * The persistent class for the job_manager_command database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/JobManagerCommandPK.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/JobManagerCommandPK.java
index d66996dbd5..2e2c7350fc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/JobManagerCommandPK.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/JobManagerCommandPK.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.compute.model;
 
 import java.io.Serializable;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
 
 /**
  * The primary key class for the job_manager_command database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/JobSubmissionInterfaceEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/JobSubmissionInterfaceEntity.java
index f98b03dca4..c93fd47bb9 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/JobSubmissionInterfaceEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/JobSubmissionInterfaceEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.compute.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
 
 /**
  * The persistent class for the job_submission_interface database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/LocalSubmissionEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/LocalSubmissionEntity.java
index 9a8ecad805..91b7f0f5e4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/LocalSubmissionEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/LocalSubmissionEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.compute.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.data.movement.SecurityProtocol;
+import org.apache.airavata.model.data.movement.proto.SecurityProtocol;
 
 /**
  * The persistent class for the local_submission database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParallelismCommandEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParallelismCommandEntity.java
index 056c51a0c9..19a4d5fd10 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParallelismCommandEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParallelismCommandEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.parallelism.ApplicationParallelismType;
+import org.apache.airavata.model.parallelism.proto.ApplicationParallelismType;
 
 /**
  * The persistent class for the parallelism_command database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParallelismCommandPK.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParallelismCommandPK.java
index 408f06d64b..f5c4a6f846 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParallelismCommandPK.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParallelismCommandPK.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.compute.model;
 
 import java.io.Serializable;
-import org.apache.airavata.model.parallelism.ApplicationParallelismType;
+import org.apache.airavata.model.parallelism.proto.ApplicationParallelismType;
 
 /**
  * The primary key class for the parallelism_command database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ResourceJobManagerEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ResourceJobManagerEntity.java
index ef5a085b95..9a89d0d944 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ResourceJobManagerEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ResourceJobManagerEntity.java
@@ -25,7 +25,7 @@ import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.airavata.common.util.AiravataUtils;
-import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManagerType;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ResourceJobManagerType;
 
 /**
  * The persistent class for the resource_job_manager database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/SshJobSubmissionEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/SshJobSubmissionEntity.java
index c89b305fb5..babf80aab6 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/SshJobSubmissionEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/SshJobSubmissionEntity.java
@@ -23,7 +23,7 @@ import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
 import org.apache.airavata.common.util.AiravataUtils;
-import org.apache.airavata.model.data.movement.SecurityProtocol;
+import org.apache.airavata.model.data.movement.proto.SecurityProtocol;
 
 /**
  * The persistent class for the ssh_job_submission database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/UnicoreSubmissionEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/UnicoreSubmissionEntity.java
index c518c1a3cb..00986c4672 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/UnicoreSubmissionEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/UnicoreSubmissionEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.data.movement.SecurityProtocol;
+import org.apache.airavata.model.data.movement.proto.SecurityProtocol;
 
 /**
  * The persistent class for the unicore_submission database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationDeploymentRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationDeploymentRepository.java
index 90cca5f43e..d30d1950c6 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationDeploymentRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationDeploymentRepository.java
@@ -28,9 +28,9 @@ import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.ApplicationDeployment;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.commons.airavata_commonsConstants;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationDeploymentDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -66,13 +66,16 @@ public class ApplicationDeploymentRepository
             throws AppCatalogException {
 
         if (applicationDeploymentDescription.getAppDeploymentId().trim().isEmpty()
-                || applicationDeploymentDescription.getAppDeploymentId().equals(airavata_commonsConstants.DEFAULT_ID)) {
+                || applicationDeploymentDescription.getAppDeploymentId().equals("DO_NOT_SET_AT_CLIENTS")) {
             logger.debug(
                     "If Application Deployment ID is empty or DEFAULT, set it as the compute host name plus the App Module ID");
             ComputeResourceDescription computeResourceDescription = new ComputeResourceRepository()
                     .getComputeResource(applicationDeploymentDescription.getComputeHostId());
-            applicationDeploymentDescription.setAppDeploymentId(
-                    computeResourceDescription.getHostName() + "_" + applicationDeploymentDescription.getAppModuleId());
+            applicationDeploymentDescription = applicationDeploymentDescription.toBuilder()
+                    .setAppDeploymentId(
+                            computeResourceDescription.getHostName() + "_"
+                                    + applicationDeploymentDescription.getAppModuleId())
+                    .build();
         }
 
         String applicationDeploymentId = applicationDeploymentDescription.getAppDeploymentId();
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationInputRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationInputRepository.java
index faa3b2d8ef..8c222d6dbe 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationInputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationInputRepository.java
@@ -23,7 +23,7 @@ import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.ApplicationInputEntity;
 import org.apache.airavata.compute.model.ApplicationInputPK;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.application.io.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
 
 public class ApplicationInputRepository
         extends AbstractRepository<InputDataObjectType, ApplicationInputEntity, ApplicationInputPK> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationInterfaceRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationInterfaceRepository.java
index ae9e39777f..5a18e2988d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationInterfaceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationInterfaceRepository.java
@@ -31,11 +31,11 @@ import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.ApplicationInterface;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationModule;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.commons.airavata_commonsConstants;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationModule;
+import org.apache.airavata.model.appcatalog.appinterface.proto.ApplicationInterfaceDescription;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -73,11 +73,13 @@ public class ApplicationInterfaceRepository
         if (applicationInterfaceDescription.getApplicationInterfaceId().trim().equals("")
                 || applicationInterfaceDescription
                         .getApplicationInterfaceId()
-                        .equals(airavata_commonsConstants.DEFAULT_ID)) {
+                        .equals("DO_NOT_SET_AT_CLIENTS")) {
             logger.debug(
                     "If Application Interface ID is empty or DEFAULT, set it as the Application Interface Name plus random UUID");
-            applicationInterfaceDescription.setApplicationInterfaceId(
-                    AiravataUtils.getId(applicationInterfaceDescription.getApplicationName()));
+            applicationInterfaceDescription = applicationInterfaceDescription.toBuilder()
+                    .setApplicationInterfaceId(
+                            AiravataUtils.getId(applicationInterfaceDescription.getApplicationName()))
+                    .build();
         }
 
         String applicationInterfaceId = applicationInterfaceDescription.getApplicationInterfaceId();
@@ -122,10 +124,12 @@ public class ApplicationInterfaceRepository
             throws AppCatalogException {
 
         if (applicationModule.getAppModuleId().trim().equals("")
-                || applicationModule.getAppModuleId().equals(airavata_commonsConstants.DEFAULT_ID)) {
+                || applicationModule.getAppModuleId().equals("DO_NOT_SET_AT_CLIENTS")) {
             logger.debug(
                     "If Application Module ID is empty or DEFAULT, set it as the Application Module Name plus random UUID");
-            applicationModule.setAppModuleId(AiravataUtils.getId(applicationModule.getAppModuleName()));
+            applicationModule = applicationModule.toBuilder()
+                    .setAppModuleId(AiravataUtils.getId(applicationModule.getAppModuleName()))
+                    .build();
         }
 
         String applicationModuleId = applicationModule.getAppModuleId();
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationModuleRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationModuleRepository.java
index 3c027a8898..02ff949fdf 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationModuleRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationModuleRepository.java
@@ -22,7 +22,7 @@ package org.apache.airavata.compute.repository;
 import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.ApplicationModuleEntity;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationModule;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationModule;
 
 public class ApplicationModuleRepository
         extends AbstractRepository<ApplicationModule, ApplicationModuleEntity, String> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationOutputRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationOutputRepository.java
index 160e9d6295..f51feddf8e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationOutputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ApplicationOutputRepository.java
@@ -23,7 +23,7 @@ import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.ApplicationOutputEntity;
 import org.apache.airavata.compute.model.ApplicationOutputPK;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
 
 public class ApplicationOutputRepository
         extends AbstractRepository<OutputDataObjectType, ApplicationOutputEntity, ApplicationOutputPK> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/BatchQueuePolicyRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/BatchQueuePolicyRepository.java
index dfd80d726f..f133dd8e55 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/BatchQueuePolicyRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/BatchQueuePolicyRepository.java
@@ -22,7 +22,7 @@ package org.apache.airavata.compute.repository;
 import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.BatchQueueResourcePolicyEntity;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.BatchQueueResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.BatchQueueResourcePolicy;
 
 /**
  * Created by skariyat on 2/10/18.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/BatchQueueRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/BatchQueueRepository.java
index 655bf45f4f..fe09228815 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/BatchQueueRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/BatchQueueRepository.java
@@ -23,7 +23,7 @@ import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.BatchQueueEntity;
 import org.apache.airavata.compute.model.BatchQueuePK;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.appcatalog.computeresource.BatchQueue;
+import org.apache.airavata.model.appcatalog.computeresource.proto.BatchQueue;
 
 public class BatchQueueRepository extends AbstractRepository<BatchQueue, BatchQueueEntity, BatchQueuePK> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourcePolicyRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourcePolicyRepository.java
index ee6fbfe32d..f2e10e9928 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourcePolicyRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourcePolicyRepository.java
@@ -22,7 +22,7 @@ package org.apache.airavata.compute.repository;
 import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.ComputeResourcePolicyEntity;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourcePolicy;
 
 /**
  * Created by skariyat on 2/10/18.
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourcePrefRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourcePrefRepository.java
index f0b203dde7..a1cd1a5948 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourcePrefRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourcePrefRepository.java
@@ -26,7 +26,7 @@ import org.apache.airavata.compute.model.ComputeResourcePreferenceEntity;
 import org.apache.airavata.compute.model.ComputeResourcePreferencePK;
 import org.apache.airavata.compute.model.SSHAccountProvisionerConfiguration;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.ComputeResourcePreference;
 
 public class ComputeResourcePrefRepository
         extends AbstractRepository<
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourceRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourceRepository.java
index 83538e10c1..51f42a38a5 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ComputeResourceRepository.java
@@ -39,24 +39,24 @@ import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.ComputeResource;
-import org.apache.airavata.model.appcatalog.computeresource.CloudJobSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.FileSystems;
-import org.apache.airavata.model.appcatalog.computeresource.GlobusJobSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
-import org.apache.airavata.model.appcatalog.computeresource.LOCALSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManager;
-import org.apache.airavata.model.appcatalog.computeresource.SSHJobSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.UnicoreJobSubmission;
-import org.apache.airavata.model.commons.airavata_commonsConstants;
-import org.apache.airavata.model.data.movement.DMType;
-import org.apache.airavata.model.data.movement.DataMovementInterface;
-import org.apache.airavata.model.data.movement.GridFTPDataMovement;
-import org.apache.airavata.model.data.movement.LOCALDataMovement;
-import org.apache.airavata.model.data.movement.SCPDataMovement;
-import org.apache.airavata.model.data.movement.UnicoreDataMovement;
-import org.apache.airavata.model.parallelism.ApplicationParallelismType;
+import org.apache.airavata.model.appcatalog.computeresource.proto.CloudJobSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.FileSystems;
+import org.apache.airavata.model.appcatalog.computeresource.proto.GlobusJobSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionInterface;
+import org.apache.airavata.model.appcatalog.computeresource.proto.LOCALSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ResourceJobManager;
+import org.apache.airavata.model.appcatalog.computeresource.proto.SSHJobSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.UnicoreJobSubmission;
+
+import org.apache.airavata.model.data.movement.proto.DMType;
+import org.apache.airavata.model.data.movement.proto.DataMovementInterface;
+import org.apache.airavata.model.data.movement.proto.GridFTPDataMovement;
+import org.apache.airavata.model.data.movement.proto.LOCALDataMovement;
+import org.apache.airavata.model.data.movement.proto.SCPDataMovement;
+import org.apache.airavata.model.data.movement.proto.UnicoreDataMovement;
+import org.apache.airavata.model.parallelism.proto.ApplicationParallelismType;
 import org.apache.airavata.storage.model.GridftpDataMovementEntity;
 import org.apache.airavata.storage.model.GridftpEndpointEntity;
 import org.apache.airavata.storage.model.LocalDataMovementEntity;
@@ -89,8 +89,10 @@ public class ComputeResourceRepository
     @Override
     public String addComputeResource(ComputeResourceDescription description) throws AppCatalogException {
         if (description.getComputeResourceId().equals("")
-                || description.getComputeResourceId().equals(airavata_commonsConstants.DEFAULT_ID)) {
-            description.setComputeResourceId(AppCatalogUtils.getID(description.getHostName()));
+                || description.getComputeResourceId().equals("DO_NOT_SET_AT_CLIENTS")) {
+            description = description.toBuilder()
+                    .setComputeResourceId(AppCatalogUtils.getID(description.getHostName()))
+                    .build();
         }
         return saveComputeResourceDescriptorData(description);
     }
@@ -142,7 +144,7 @@ public class ComputeResourceRepository
         }
     }
 
-    protected Map<FileSystems, String> getFileSystems(String computeResourceId) {
+    protected Map<Integer, String> getFileSystems(String computeResourceId) {
         Map<String, Object> queryParameters = new HashMap<>();
         queryParameters.put(DBConstants.ComputeResource.COMPUTE_RESOURCE_ID, computeResourceId);
 
@@ -155,9 +157,9 @@ public class ComputeResourceRepository
         });
 
         List<ComputeResourceFileSystemEntity> computeResourceFileSystemEntityList = resultSet;
-        Map<FileSystems, String> fileSystemsMap = new HashMap<FileSystems, String>();
+        Map<Integer, String> fileSystemsMap = new HashMap<>();
         for (ComputeResourceFileSystemEntity fs : computeResourceFileSystemEntityList) {
-            fileSystemsMap.put(fs.getFileSystem(), fs.getPath());
+            fileSystemsMap.put(fs.getFileSystem().getNumber(), fs.getPath());
         }
         return fileSystemsMap;
     }
@@ -172,7 +174,9 @@ public class ComputeResourceRepository
     public ComputeResourceDescription getComputeResource(String resourceId) throws AppCatalogException {
         ComputeResourceDescription computeResourceDescription = get(resourceId);
         if (computeResourceDescription != null) {
-            computeResourceDescription.setFileSystems(getFileSystems(resourceId));
+            computeResourceDescription = computeResourceDescription.toBuilder()
+                    .putAllFileSystems(getFileSystems(resourceId))
+                    .build();
         }
         return computeResourceDescription;
     }
@@ -250,21 +254,23 @@ public class ComputeResourceRepository
     @Override
     public String addSSHJobSubmission(SSHJobSubmission sshJobSubmission) throws AppCatalogException {
         String submissionId = AppCatalogUtils.getID("SSH");
-        sshJobSubmission.setJobSubmissionInterfaceId(submissionId);
+        sshJobSubmission = sshJobSubmission.toBuilder()
+                .setJobSubmissionInterfaceId(submissionId)
+                .build();
         String resourceJobManagerId = addResourceJobManager(sshJobSubmission.getResourceJobManager());
         SshJobSubmissionEntity sshJobSubmissionEntity =
                 ComputeMapper.INSTANCE.sshJobSubmissionToEntity(sshJobSubmission);
         sshJobSubmissionEntity.getResourceJobManager().setResourceJobManagerId(resourceJobManagerId);
-        if (sshJobSubmission.getResourceJobManager().getParallelismPrefix() != null) {
+        if (sshJobSubmission.getResourceJobManager().getParallelismPrefixMap() != null) {
             (new ResourceJobManagerRepository())
                     .createParallesimPrefix(
-                            sshJobSubmission.getResourceJobManager().getParallelismPrefix(),
+                            sshJobSubmission.getResourceJobManager().getParallelismPrefixMap(),
                             sshJobSubmissionEntity.getResourceJobManager());
         }
-        if (sshJobSubmission.getResourceJobManager().getJobManagerCommands() != null) {
+        if (sshJobSubmission.getResourceJobManager().getJobManagerCommandsMap() != null) {
             (new ResourceJobManagerRepository())
                     .createJobManagerCommand(
-                            sshJobSubmission.getResourceJobManager().getJobManagerCommands(),
+                            sshJobSubmission.getResourceJobManager().getJobManagerCommandsMap(),
                             sshJobSubmissionEntity.getResourceJobManager());
         }
         if (sshJobSubmission.getMonitorMode() != null) {
@@ -284,7 +290,9 @@ public class ComputeResourceRepository
 
     @Override
     public String addCloudJobSubmission(CloudJobSubmission cloudJobSubmission) throws AppCatalogException {
-        cloudJobSubmission.setJobSubmissionInterfaceId(AppCatalogUtils.getID("Cloud"));
+        cloudJobSubmission = cloudJobSubmission.toBuilder()
+                .setJobSubmissionInterfaceId(AppCatalogUtils.getID("Cloud"))
+                .build();
         CloudJobSubmissionEntity cloudJobSubmissionEntity =
                 ComputeMapper.INSTANCE.cloudJobSubmissionToEntity(cloudJobSubmission);
         execute(entityManager -> entityManager.merge(cloudJobSubmissionEntity));
@@ -300,16 +308,18 @@ public class ComputeResourceRepository
     @Override
     public String addResourceJobManager(ResourceJobManager resourceJobManager) throws AppCatalogException {
         ResourceJobManagerRepository resourceJobManagerRepository = new ResourceJobManagerRepository();
-        resourceJobManager.setResourceJobManagerId(AppCatalogUtils.getID("RJM"));
+        resourceJobManager = resourceJobManager.toBuilder()
+                .setResourceJobManagerId(AppCatalogUtils.getID("RJM"))
+                .build();
         resourceJobManagerRepository.create(resourceJobManager);
         ResourceJobManagerEntity resourceJobManagerEntity =
                 ComputeMapper.INSTANCE.resourceJobManagerToEntity(resourceJobManager);
-        Map<JobManagerCommand, String> jobManagerCommands = resourceJobManager.getJobManagerCommands();
+        Map<Integer, String> jobManagerCommands = resourceJobManager.getJobManagerCommandsMap();
         if (jobManagerCommands != null && jobManagerCommands.size() != 0) {
             resourceJobManagerRepository.createJobManagerCommand(jobManagerCommands, resourceJobManagerEntity);
         }
 
-        Map<ApplicationParallelismType, String> parallelismPrefix = resourceJobManager.getParallelismPrefix();
+        Map<Integer, String> parallelismPrefix = resourceJobManager.getParallelismPrefixMap();
         if (parallelismPrefix != null && parallelismPrefix.size() != 0) {
             resourceJobManagerRepository.createParallesimPrefix(parallelismPrefix, resourceJobManagerEntity);
         }
@@ -320,16 +330,18 @@ public class ComputeResourceRepository
     public void updateResourceJobManager(String resourceJobManagerId, ResourceJobManager updatedResourceJobManager)
             throws AppCatalogException {
         ResourceJobManagerRepository resourceJobManagerRepository = new ResourceJobManagerRepository();
-        updatedResourceJobManager.setResourceJobManagerId(resourceJobManagerId);
+        updatedResourceJobManager = updatedResourceJobManager.toBuilder()
+                .setResourceJobManagerId(resourceJobManagerId)
+                .build();
         ResourceJobManager resourceJobManager = resourceJobManagerRepository.create(updatedResourceJobManager);
         ResourceJobManagerEntity resourceJobManagerEntity =
                 ComputeMapper.INSTANCE.resourceJobManagerToEntity(resourceJobManager);
-        Map<JobManagerCommand, String> jobManagerCommands = updatedResourceJobManager.getJobManagerCommands();
+        Map<Integer, String> jobManagerCommands = updatedResourceJobManager.getJobManagerCommandsMap();
         if (jobManagerCommands != null && jobManagerCommands.size() != 0) {
             resourceJobManagerRepository.createJobManagerCommand(jobManagerCommands, resourceJobManagerEntity);
         }
 
-        Map<ApplicationParallelismType, String> parallelismPrefix = updatedResourceJobManager.getParallelismPrefix();
+        Map<Integer, String> parallelismPrefix = updatedResourceJobManager.getParallelismPrefixMap();
         if (parallelismPrefix != null && parallelismPrefix.size() != 0) {
             resourceJobManagerRepository.createParallesimPrefix(parallelismPrefix, resourceJobManagerEntity);
         }
@@ -340,10 +352,25 @@ public class ComputeResourceRepository
         ResourceJobManagerRepository resourceJobManagerRepository = new ResourceJobManagerRepository();
         ResourceJobManager resourceJobManager = resourceJobManagerRepository.get(resourceJobManagerId);
         if (resourceJobManager != null) {
-            resourceJobManager.setJobManagerCommands(
-                    resourceJobManagerRepository.getJobManagerCommand(resourceJobManagerId));
-            resourceJobManager.setParallelismPrefix(
-                    resourceJobManagerRepository.getParallelismPrefix(resourceJobManagerId));
+            // Convert enum-keyed maps to integer-keyed maps for proto
+            Map<JobManagerCommand, String> jmCommands =
+                    resourceJobManagerRepository.getJobManagerCommand(resourceJobManagerId);
+            Map<Integer, String> jmCommandsInt = new HashMap<>();
+            for (Map.Entry<JobManagerCommand, String> entry : jmCommands.entrySet()) {
+                jmCommandsInt.put(entry.getKey().getNumber(), entry.getValue());
+            }
+
+            Map<ApplicationParallelismType, String> parPrefix =
+                    resourceJobManagerRepository.getParallelismPrefix(resourceJobManagerId);
+            Map<Integer, String> parPrefixInt = new HashMap<>();
+            for (Map.Entry<ApplicationParallelismType, String> entry : parPrefix.entrySet()) {
+                parPrefixInt.put(entry.getKey().getNumber(), entry.getValue());
+            }
+
+            resourceJobManager = resourceJobManager.toBuilder()
+                    .putAllJobManagerCommands(jmCommandsInt)
+                    .putAllParallelismPrefix(parPrefixInt)
+                    .build();
         }
         return resourceJobManager;
     }
@@ -361,21 +388,23 @@ public class ComputeResourceRepository
 
     @Override
     public String addLocalJobSubmission(LOCALSubmission localSubmission) throws AppCatalogException {
-        localSubmission.setJobSubmissionInterfaceId(AppCatalogUtils.getID("LOCAL"));
+        localSubmission = localSubmission.toBuilder()
+                .setJobSubmissionInterfaceId(AppCatalogUtils.getID("LOCAL"))
+                .build();
         String resourceJobManagerId = addResourceJobManager(localSubmission.getResourceJobManager());
         LocalSubmissionEntity localSubmissionEntity = ComputeMapper.INSTANCE.localSubmissionToEntity(localSubmission);
         localSubmissionEntity.setResourceJobManagerId(resourceJobManagerId);
         localSubmissionEntity.getResourceJobManager().setResourceJobManagerId(resourceJobManagerId);
-        if (localSubmission.getResourceJobManager().getParallelismPrefix() != null) {
+        if (localSubmission.getResourceJobManager().getParallelismPrefixMap() != null) {
             (new ResourceJobManagerRepository())
                     .createParallesimPrefix(
-                            localSubmission.getResourceJobManager().getParallelismPrefix(),
+                            localSubmission.getResourceJobManager().getParallelismPrefixMap(),
                             localSubmissionEntity.getResourceJobManager());
         }
-        if (localSubmission.getResourceJobManager().getJobManagerCommands() != null) {
+        if (localSubmission.getResourceJobManager().getJobManagerCommandsMap() != null) {
             (new ResourceJobManagerRepository())
                     .createJobManagerCommand(
-                            localSubmission.getResourceJobManager().getJobManagerCommands(),
+                            localSubmission.getResourceJobManager().getJobManagerCommandsMap(),
                             localSubmissionEntity.getResourceJobManager());
         }
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/GatewayGroupsRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/GatewayGroupsRepository.java
index d7e2a3c0db..6f2e6e9217 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/GatewayGroupsRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/GatewayGroupsRepository.java
@@ -22,7 +22,7 @@ package org.apache.airavata.compute.repository;
 import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.GatewayGroupsEntity;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.appcatalog.gatewaygroups.GatewayGroups;
+import org.apache.airavata.model.appcatalog.gatewaygroups.proto.GatewayGroups;
 
 public class GatewayGroupsRepository extends AbstractRepository<GatewayGroups, GatewayGroupsEntity, String> {
     public GatewayGroupsRepository() {
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/GroupResourceProfileRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/GroupResourceProfileRepository.java
index c463f720eb..a40530ff6f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/GroupResourceProfileRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/GroupResourceProfileRepository.java
@@ -36,14 +36,17 @@ import org.apache.airavata.compute.model.SlurmGroupComputeResourcePrefEntity;
 import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.AwsComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.BatchQueueResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.SlurmComputeResourcePreference;
-import org.apache.airavata.model.commons.airavata_commonsConstants;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.AwsComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.BatchQueueResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupResourceProfile;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourceReservation;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.EnvironmentSpecificPreferences;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupSSHAccountProvisionerConfig;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ResourceType;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.SlurmComputeResourcePreference;
+
 
 /**
  * Created by skariyat on 2/8/18.
@@ -68,66 +71,106 @@ public class GroupResourceProfileRepository
     public String addGroupResourceProfile(GroupResourceProfile groupResourceProfile) {
 
         final String groupResourceProfileId = UUID.randomUUID().toString();
-        groupResourceProfile.setGroupResourceProfileId(groupResourceProfileId);
-        groupResourceProfile.setCreationTime(System.currentTimeMillis());
-        updateChildren(groupResourceProfile, groupResourceProfileId);
+        groupResourceProfile = groupResourceProfile.toBuilder()
+                .setGroupResourceProfileId(groupResourceProfileId)
+                .setCreationTime(System.currentTimeMillis())
+                .build();
+        groupResourceProfile = updateChildren(groupResourceProfile, groupResourceProfileId);
         return updateGroupResourceProfile(groupResourceProfile);
     }
 
-    private void updateChildren(GroupResourceProfile groupResourceProfile, String groupResourceProfileId) {
-        if (groupResourceProfile.getComputePreferences() != null) {
-            for (GroupComputeResourcePreference gcrPref : groupResourceProfile.getComputePreferences()) {
-                gcrPref.setGroupResourceProfileId(groupResourceProfileId);
+    private GroupResourceProfile updateChildren(GroupResourceProfile groupResourceProfile, String groupResourceProfileId) {
+        GroupResourceProfile.Builder profileBuilder = groupResourceProfile.toBuilder();
+
+        if (groupResourceProfile.getComputePreferencesList() != null) {
+            List<GroupComputeResourcePreference> updatedPrefs = new ArrayList<>();
+            for (GroupComputeResourcePreference gcrPref : groupResourceProfile.getComputePreferencesList()) {
+                GroupComputeResourcePreference.Builder prefBuilder = gcrPref.toBuilder()
+                        .setGroupResourceProfileId(groupResourceProfileId);
 
                 if (gcrPref.getResourceType() == ResourceType.SLURM
-                        && gcrPref.isSetSpecificPreferences()
-                        && gcrPref.getSpecificPreferences().isSetSlurm()) {
+                        && gcrPref.hasSpecificPreferences()
+                        && gcrPref.getSpecificPreferences().hasSlurm()) {
 
                     SlurmComputeResourcePreference slurm =
                             gcrPref.getSpecificPreferences().getSlurm();
+                    SlurmComputeResourcePreference.Builder slurmBuilder = slurm.toBuilder();
 
                     // update SSH provisioner configs
-                    if (slurm.getGroupSSHAccountProvisionerConfigs() != null) {
-                        slurm.getGroupSSHAccountProvisionerConfigs()
-                                .forEach(gssh -> gssh.setGroupResourceProfileId(groupResourceProfileId));
+                    if (slurm.getGroupSSHAccountProvisionerConfigsList() != null) {
+                        List<GroupSSHAccountProvisionerConfig> updatedConfigs = new ArrayList<>();
+                        for (GroupSSHAccountProvisionerConfig gssh : slurm.getGroupSSHAccountProvisionerConfigsList()) {
+                            updatedConfigs.add(gssh.toBuilder()
+                                    .setGroupResourceProfileId(groupResourceProfileId)
+                                    .build());
+                        }
+                        slurmBuilder.clearGroupSSHAccountProvisionerConfigs()
+                                .addAllGroupSSHAccountProvisionerConfigs(updatedConfigs);
                     }
 
                     // update reservations
-                    if (slurm.getReservations() != null) {
-                        slurm.getReservations().forEach(res -> {
+                    if (slurm.getReservationsList() != null) {
+                        List<ComputeResourceReservation> updatedRes = new ArrayList<>();
+                        for (ComputeResourceReservation res : slurm.getReservationsList()) {
                             if (res.getReservationId().trim().isEmpty()
-                                    || res.getReservationId().equals(airavata_commonsConstants.DEFAULT_ID)) {
-                                res.setReservationId(AiravataUtils.getId(res.getReservationName()));
+                                    || res.getReservationId().equals("DO_NOT_SET_AT_CLIENTS")) {
+                                updatedRes.add(res.toBuilder()
+                                        .setReservationId(AiravataUtils.getId(res.getReservationName()))
+                                        .build());
+                            } else {
+                                updatedRes.add(res);
                             }
-                        });
+                        }
+                        slurmBuilder.clearReservations().addAllReservations(updatedRes);
                     }
+
+                    prefBuilder.setSpecificPreferences(
+                            gcrPref.getSpecificPreferences().toBuilder()
+                                    .setSlurm(slurmBuilder.build())
+                                    .build());
                 }
+                updatedPrefs.add(prefBuilder.build());
             }
+            profileBuilder.clearComputePreferences().addAllComputePreferences(updatedPrefs);
         }
-        if (groupResourceProfile.getBatchQueueResourcePolicies() != null) {
-            groupResourceProfile.getBatchQueueResourcePolicies().forEach(bq -> {
+
+        if (groupResourceProfile.getBatchQueueResourcePoliciesList() != null) {
+            List<BatchQueueResourcePolicy> updatedBqs = new ArrayList<>();
+            for (BatchQueueResourcePolicy bq : groupResourceProfile.getBatchQueueResourcePoliciesList()) {
+                BatchQueueResourcePolicy.Builder bqBuilder = bq.toBuilder();
                 if (bq.getResourcePolicyId().trim().isEmpty()
-                        || bq.getResourcePolicyId().equals(airavata_commonsConstants.DEFAULT_ID)) {
-                    bq.setResourcePolicyId(UUID.randomUUID().toString());
+                        || bq.getResourcePolicyId().equals("DO_NOT_SET_AT_CLIENTS")) {
+                    bqBuilder.setResourcePolicyId(UUID.randomUUID().toString());
                 }
-                bq.setGroupResourceProfileId(groupResourceProfileId);
-            });
+                bqBuilder.setGroupResourceProfileId(groupResourceProfileId);
+                updatedBqs.add(bqBuilder.build());
+            }
+            profileBuilder.clearBatchQueueResourcePolicies().addAllBatchQueueResourcePolicies(updatedBqs);
         }
-        if (groupResourceProfile.getComputeResourcePolicies() != null) {
-            groupResourceProfile.getComputeResourcePolicies().forEach(cr -> {
+
+        if (groupResourceProfile.getComputeResourcePoliciesList() != null) {
+            List<ComputeResourcePolicy> updatedCrs = new ArrayList<>();
+            for (ComputeResourcePolicy cr : groupResourceProfile.getComputeResourcePoliciesList()) {
+                ComputeResourcePolicy.Builder crBuilder = cr.toBuilder();
                 if (cr.getResourcePolicyId().trim().isEmpty()
-                        || cr.getResourcePolicyId().equals(airavata_commonsConstants.DEFAULT_ID)) {
-                    cr.setResourcePolicyId(UUID.randomUUID().toString());
+                        || cr.getResourcePolicyId().equals("DO_NOT_SET_AT_CLIENTS")) {
+                    crBuilder.setResourcePolicyId(UUID.randomUUID().toString());
                 }
-                cr.setGroupResourceProfileId(groupResourceProfileId);
-            });
+                crBuilder.setGroupResourceProfileId(groupResourceProfileId);
+                updatedCrs.add(crBuilder.build());
+            }
+            profileBuilder.clearComputeResourcePolicies().addAllComputeResourcePolicies(updatedCrs);
         }
+
+        return profileBuilder.build();
     }
 
     public String updateGroupResourceProfile(GroupResourceProfile updatedGroupResourceProfile) {
 
-        updatedGroupResourceProfile.setUpdatedTime(System.currentTimeMillis());
-        updateChildren(updatedGroupResourceProfile, updatedGroupResourceProfile.getGroupResourceProfileId());
+        updatedGroupResourceProfile = updatedGroupResourceProfile.toBuilder()
+                .setUpdatedTime(System.currentTimeMillis())
+                .build();
+        updatedGroupResourceProfile = updateChildren(updatedGroupResourceProfile, updatedGroupResourceProfile.getGroupResourceProfileId());
         GroupResourceProfileEntity groupResourceProfileEntity = mapToEntity(updatedGroupResourceProfile);
         patchComputePrefEntities(groupResourceProfileEntity, updatedGroupResourceProfile);
         updateChildrenEntities(groupResourceProfileEntity);
@@ -154,21 +197,21 @@ public class GroupResourceProfileRepository
     }
 
     private void patchComputePrefEntities(GroupResourceProfileEntity destEntity, GroupResourceProfile sourceModel) {
-        if (destEntity.getComputePreferences() == null || sourceModel.getComputePreferences() == null) {
+        if (destEntity.getComputePreferences() == null || sourceModel.getComputePreferencesList() == null) {
             return;
         }
         Map<String, GroupComputeResourcePreference> sourcePrefs = new HashMap<>();
-        for (GroupComputeResourcePreference pref : sourceModel.getComputePreferences()) {
+        for (GroupComputeResourcePreference pref : sourceModel.getComputePreferencesList()) {
             sourcePrefs.put(pref.getComputeResourceId(), pref);
         }
 
         for (GroupComputeResourcePrefEntity prefEntity : destEntity.getComputePreferences()) {
             GroupComputeResourcePreference sourcePref = sourcePrefs.get(prefEntity.getComputeResourceId());
-            if (sourcePref == null || !sourcePref.isSetSpecificPreferences()) {
+            if (sourcePref == null || !sourcePref.hasSpecificPreferences()) {
                 continue;
             }
             if (prefEntity instanceof SlurmGroupComputeResourcePrefEntity slurmEntity) {
-                if (sourcePref.getSpecificPreferences().isSetSlurm()) {
+                if (sourcePref.getSpecificPreferences().hasSlurm()) {
                     SlurmComputeResourcePreference slurm =
                             sourcePref.getSpecificPreferences().getSlurm();
                     slurmEntity.setAllocationProjectNumber(slurm.getAllocationProjectNumber());
@@ -179,7 +222,7 @@ public class GroupResourceProfileRepository
                     slurmEntity.setSshAccountProvisionerAdditionalInfo(slurm.getSshAccountProvisionerAdditionalInfo());
                 }
             } else if (prefEntity instanceof AWSGroupComputeResourcePrefEntity awsEntity) {
-                if (sourcePref.getSpecificPreferences().isSetAws()) {
+                if (sourcePref.getSpecificPreferences().hasAws()) {
                     AwsComputeResourcePreference aws =
                             sourcePref.getSpecificPreferences().getAws();
                     awsEntity.setRegion(aws.getRegion());
@@ -195,13 +238,16 @@ public class GroupResourceProfileRepository
 
         GrpComputePrefRepository prefRepo = new GrpComputePrefRepository();
         List<GroupComputeResourcePreference> decoratedPrefs = new ArrayList<>();
-        for (GroupComputeResourcePreference raw : groupResourceProfile.getComputePreferences()) {
+        for (GroupComputeResourcePreference raw : groupResourceProfile.getComputePreferencesList()) {
             GroupComputeResourcePrefPK pk = new GroupComputeResourcePrefPK();
             pk.setComputeResourceId(raw.getComputeResourceId());
             pk.setGroupResourceProfileId(raw.getGroupResourceProfileId());
             decoratedPrefs.add(prefRepo.get(pk));
         }
-        groupResourceProfile.setComputePreferences(decoratedPrefs);
+        groupResourceProfile = groupResourceProfile.toBuilder()
+                .clearComputePreferences()
+                .addAllComputePreferences(decoratedPrefs)
+                .build();
 
         return groupResourceProfile;
     }
@@ -228,10 +274,11 @@ public class GroupResourceProfileRepository
                             accessibleGroupResProfileIds));
 
             GrpComputePrefRepository prefRepo = new GrpComputePrefRepository();
+            List<GroupResourceProfile> decoratedProfiles = new ArrayList<>();
             for (GroupResourceProfile profile : profiles) {
                 List<GroupComputeResourcePreference> decoratedPrefs = new ArrayList<>();
 
-                for (GroupComputeResourcePreference rawPref : profile.getComputePreferences()) {
+                for (GroupComputeResourcePreference rawPref : profile.getComputePreferencesList()) {
                     GroupComputeResourcePrefPK pk = new GroupComputeResourcePrefPK();
                     pk.setComputeResourceId(rawPref.getComputeResourceId());
                     pk.setGroupResourceProfileId(rawPref.getGroupResourceProfileId());
@@ -240,9 +287,12 @@ public class GroupResourceProfileRepository
                     decoratedPrefs.add(fullPref);
                 }
 
-                profile.setComputePreferences(decoratedPrefs);
+                decoratedProfiles.add(profile.toBuilder()
+                        .clearComputePreferences()
+                        .addAllComputePreferences(decoratedPrefs)
+                        .build());
             }
-            return profiles;
+            return decoratedProfiles;
 
         } else {
             return Collections.emptyList();
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/GrpComputePrefRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/GrpComputePrefRepository.java
index d8d711d566..f057ca3e62 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/GrpComputePrefRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/GrpComputePrefRepository.java
@@ -25,11 +25,11 @@ import org.apache.airavata.compute.model.GroupComputeResourcePrefEntity;
 import org.apache.airavata.compute.model.GroupComputeResourcePrefPK;
 import org.apache.airavata.compute.model.SlurmGroupComputeResourcePrefEntity;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.AwsComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.EnvironmentSpecificPreferences;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.SlurmComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.AwsComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.EnvironmentSpecificPreferences;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ResourceType;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.SlurmComputeResourcePreference;
 
 /**
  * Created by skariyat on 2/10/18.
@@ -66,32 +66,36 @@ public class GrpComputePrefRepository
         }
 
         if (ent instanceof SlurmGroupComputeResourcePrefEntity sl) {
-            pref.setResourceType(ResourceType.SLURM);
-
-            SlurmComputeResourcePreference scrp = new SlurmComputeResourcePreference();
-            scrp.setAllocationProjectNumber(sl.getAllocationProjectNumber());
-            scrp.setPreferredBatchQueue(sl.getPreferredBatchQueue());
-            scrp.setQualityOfService(sl.getQualityOfService());
-            scrp.setUsageReportingGatewayId(sl.getUsageReportingGatewayId());
-            scrp.setSshAccountProvisioner(sl.getSshAccountProvisioner());
-            scrp.setSshAccountProvisionerAdditionalInfo(sl.getSshAccountProvisionerAdditionalInfo());
+            SlurmComputeResourcePreference.Builder scrpBuilder = SlurmComputeResourcePreference.newBuilder();
+            if (sl.getAllocationProjectNumber() != null) scrpBuilder.setAllocationProjectNumber(sl.getAllocationProjectNumber());
+            if (sl.getPreferredBatchQueue() != null) scrpBuilder.setPreferredBatchQueue(sl.getPreferredBatchQueue());
+            if (sl.getQualityOfService() != null) scrpBuilder.setQualityOfService(sl.getQualityOfService());
+            if (sl.getUsageReportingGatewayId() != null) scrpBuilder.setUsageReportingGatewayId(sl.getUsageReportingGatewayId());
+            if (sl.getSshAccountProvisioner() != null) scrpBuilder.setSshAccountProvisioner(sl.getSshAccountProvisioner());
+            if (sl.getSshAccountProvisionerAdditionalInfo() != null) scrpBuilder.setSshAccountProvisionerAdditionalInfo(sl.getSshAccountProvisionerAdditionalInfo());
             // TODO - check whether the groupSSHAccountProvisionerConfigs and reservations are needed
 
-            EnvironmentSpecificPreferences esp = new EnvironmentSpecificPreferences();
-            esp.setSlurm(scrp);
-            pref.setSpecificPreferences(esp);
+            EnvironmentSpecificPreferences esp = EnvironmentSpecificPreferences.newBuilder()
+                    .setSlurm(scrpBuilder.build())
+                    .build();
+            pref = pref.toBuilder()
+                    .setResourceType(ResourceType.SLURM)
+                    .setSpecificPreferences(esp)
+                    .build();
 
         } else if (ent instanceof AWSGroupComputeResourcePrefEntity aws) {
-            pref.setResourceType(ResourceType.AWS);
-
-            AwsComputeResourcePreference awsPref = new AwsComputeResourcePreference();
-            awsPref.setRegion(aws.getRegion());
-            awsPref.setPreferredAmiId(aws.getPreferredAmiId());
-            awsPref.setPreferredInstanceType(aws.getPreferredInstanceType());
+            AwsComputeResourcePreference.Builder awsPrefBuilder = AwsComputeResourcePreference.newBuilder();
+            if (aws.getRegion() != null) awsPrefBuilder.setRegion(aws.getRegion());
+            if (aws.getPreferredAmiId() != null) awsPrefBuilder.setPreferredAmiId(aws.getPreferredAmiId());
+            if (aws.getPreferredInstanceType() != null) awsPrefBuilder.setPreferredInstanceType(aws.getPreferredInstanceType());
 
-            EnvironmentSpecificPreferences esp = new EnvironmentSpecificPreferences();
-            esp.setAws(awsPref);
-            pref.setSpecificPreferences(esp);
+            EnvironmentSpecificPreferences esp = EnvironmentSpecificPreferences.newBuilder()
+                    .setAws(awsPrefBuilder.build())
+                    .build();
+            pref = pref.toBuilder()
+                    .setResourceType(ResourceType.AWS)
+                    .setSpecificPreferences(esp)
+                    .build();
             return pref;
         }
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/GwyResourceProfileRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/GwyResourceProfileRepository.java
index 5f99d1c57f..d3c2d3bb02 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/GwyResourceProfileRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/GwyResourceProfileRepository.java
@@ -31,9 +31,9 @@ import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.GwyResourceProfile;
-import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
-import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.ComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.GatewayResourceProfile;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.StoragePreference;
 import org.apache.airavata.storage.model.StoragePreferencePK;
 import org.apache.airavata.storage.repository.StoragePrefRepository;
 import org.slf4j.Logger;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/JobSubmissionInterfaceRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/JobSubmissionInterfaceRepository.java
index c48781587c..cab9054ca3 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/JobSubmissionInterfaceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/JobSubmissionInterfaceRepository.java
@@ -23,7 +23,7 @@ import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.JobSubmissionInterfaceEntity;
 import org.apache.airavata.compute.model.JobSubmissionInterfacePK;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionInterface;
 
 public class JobSubmissionInterfaceRepository
         extends AbstractRepository<JobSubmissionInterface, JobSubmissionInterfaceEntity, JobSubmissionInterfacePK> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserInputRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserInputRepository.java
index 54592446e8..b08d5ab44e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserInputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserInputRepository.java
@@ -23,7 +23,7 @@ import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.ParserInputEntity;
 import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
-import org.apache.airavata.model.appcatalog.parser.ParserInput;
+import org.apache.airavata.model.appcatalog.parser.proto.ParserInput;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserOutputRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserOutputRepository.java
index 808a3b027c..59d52897aa 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserOutputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserOutputRepository.java
@@ -23,7 +23,7 @@ import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.ParserOutputEntity;
 import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
-import org.apache.airavata.model.appcatalog.parser.ParserOutput;
+import org.apache.airavata.model.appcatalog.parser.proto.ParserOutput;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserRepository.java
index 5dd9f92238..b3eec170fc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserRepository.java
@@ -28,7 +28,7 @@ import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
-import org.apache.airavata.model.appcatalog.parser.Parser;
+import org.apache.airavata.model.appcatalog.parser.proto.Parser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParsingTemplateRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParsingTemplateRepository.java
index af3a99a5cc..ac1014359f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParsingTemplateRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParsingTemplateRepository.java
@@ -27,7 +27,7 @@ import org.apache.airavata.compute.model.ParsingTemplateEntity;
 import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
-import org.apache.airavata.model.appcatalog.parser.ParsingTemplate;
+import org.apache.airavata.model.appcatalog.parser.proto.ParsingTemplate;
 
 public class ParsingTemplateRepository extends AbstractRepository<ParsingTemplate, ParsingTemplateEntity, String> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ResourceJobManagerRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ResourceJobManagerRepository.java
index 475f5d8a8c..bca242b250 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ResourceJobManagerRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/ResourceJobManagerRepository.java
@@ -28,9 +28,9 @@ import org.apache.airavata.compute.model.*;
 import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
-import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManager;
-import org.apache.airavata.model.parallelism.ApplicationParallelismType;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ResourceJobManager;
+import org.apache.airavata.model.parallelism.proto.ApplicationParallelismType;
 
 public class ResourceJobManagerRepository
         extends AbstractRepository<ResourceJobManager, ResourceJobManagerEntity, String> {
@@ -50,12 +50,13 @@ public class ResourceJobManagerRepository
     }
 
     public void createJobManagerCommand(
-            Map<JobManagerCommand, String> jobManagerCommands, ResourceJobManagerEntity resourceJobManagerEntity) {
-        for (JobManagerCommand commandType : jobManagerCommands.keySet()) {
-            if (jobManagerCommands.get(commandType) != null
-                    && !jobManagerCommands.get(commandType).isEmpty()) {
+            Map<Integer, String> jobManagerCommands, ResourceJobManagerEntity resourceJobManagerEntity) {
+        for (Integer commandTypeValue : jobManagerCommands.keySet()) {
+            JobManagerCommand commandType = JobManagerCommand.forNumber(commandTypeValue);
+            if (commandType != null && jobManagerCommands.get(commandTypeValue) != null
+                    && !jobManagerCommands.get(commandTypeValue).isEmpty()) {
                 JobManagerCommandEntity jobManagerCommandEntity = new JobManagerCommandEntity();
-                jobManagerCommandEntity.setCommand(jobManagerCommands.get(commandType));
+                jobManagerCommandEntity.setCommand(jobManagerCommands.get(commandTypeValue));
                 jobManagerCommandEntity.setResourceJobManager(resourceJobManagerEntity);
                 jobManagerCommandEntity.setResourceJobManagerId(resourceJobManagerEntity.getResourceJobManagerId());
                 jobManagerCommandEntity.setCommandType(commandType);
@@ -65,13 +66,14 @@ public class ResourceJobManagerRepository
     }
 
     public void createParallesimPrefix(
-            Map<ApplicationParallelismType, String> parallelismPrefix,
+            Map<Integer, String> parallelismPrefix,
             ResourceJobManagerEntity resourceJobManagerEntity) {
-        for (ApplicationParallelismType commandType : parallelismPrefix.keySet()) {
-            if (parallelismPrefix.get(commandType) != null
-                    && !parallelismPrefix.get(commandType).isEmpty()) {
+        for (Integer commandTypeValue : parallelismPrefix.keySet()) {
+            ApplicationParallelismType commandType = ApplicationParallelismType.forNumber(commandTypeValue);
+            if (commandType != null && parallelismPrefix.get(commandTypeValue) != null
+                    && !parallelismPrefix.get(commandTypeValue).isEmpty()) {
                 ParallelismCommandEntity parallelismCommandEntity = new ParallelismCommandEntity();
-                parallelismCommandEntity.setCommand(parallelismPrefix.get(commandType));
+                parallelismCommandEntity.setCommand(parallelismPrefix.get(commandTypeValue));
                 parallelismCommandEntity.setResourceJobManager(resourceJobManagerEntity);
                 parallelismCommandEntity.setCommandType(commandType);
                 parallelismCommandEntity.setResourceJobManagerId(resourceJobManagerEntity.getResourceJobManagerId());
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/UserComputeResourcePreferenceRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/UserComputeResourcePreferenceRepository.java
index 35db26245c..5fd456634e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/UserComputeResourcePreferenceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/UserComputeResourcePreferenceRepository.java
@@ -23,7 +23,7 @@ import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.UserComputeResourcePreferenceEntity;
 import org.apache.airavata.compute.model.UserComputeResourcePreferencePK;
 import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserComputeResourcePreference;
 
 public class UserComputeResourcePreferenceRepository
         extends AbstractRepository<
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/UserResourceProfileRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/UserResourceProfileRepository.java
index e8596fbe1e..c4144830fd 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/UserResourceProfileRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/repository/UserResourceProfileRepository.java
@@ -30,9 +30,9 @@ import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.UsrResourceProfile;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserResourceProfile;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserStoragePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserResourceProfile;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserStoragePreference;
 import org.apache.airavata.storage.model.UserStoragePreferencePK;
 import org.apache.airavata.storage.repository.UserStoragePreferenceRepository;
 import org.slf4j.Logger;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/service/ApplicationCatalogService.java b/airavata-api/src/main/java/org/apache/airavata/compute/service/ApplicationCatalogService.java
index ffc3407b26..819c7504f7 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/service/ApplicationCatalogService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/service/ApplicationCatalogService.java
@@ -27,16 +27,16 @@ import org.apache.airavata.execution.handler.RegistryServerHandler;
 import org.apache.airavata.execution.service.RequestContext;
 import org.apache.airavata.execution.service.ServiceAuthorizationException;
 import org.apache.airavata.execution.service.ServiceException;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationModule;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.commons.airavata_commonsConstants;
-import org.apache.airavata.model.group.ResourcePermissionType;
-import org.apache.airavata.model.group.ResourceType;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationDeploymentDescription;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationModule;
+import org.apache.airavata.model.appcatalog.appinterface.proto.ApplicationInterfaceDescription;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupResourceProfile;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+
+import org.apache.airavata.model.group.proto.ResourcePermissionType;
+import org.apache.airavata.model.group.proto.ResourceType;
 import org.apache.airavata.sharing.handler.SharingRegistryServerHandler;
 import org.apache.airavata.sharing.registry.models.Entity;
 import org.apache.airavata.sharing.registry.models.EntitySearchField;
@@ -286,7 +286,7 @@ public class ApplicationCatalogService {
             }
             GroupResourceProfile groupResourceProfile = registryHandler.getGroupResourceProfile(groupResourceProfileId);
             List<String> accessibleComputeResourceIds = new ArrayList<>();
-            for (GroupComputeResourcePreference pref : groupResourceProfile.getComputePreferences()) {
+            for (GroupComputeResourcePreference pref : groupResourceProfile.getComputePreferencesList()) {
                 accessibleComputeResourceIds.add(pref.getComputeResourceId());
             }
 
@@ -342,8 +342,10 @@ public class ApplicationCatalogService {
             if (existingInterface == null) {
                 throw new ServiceException("Provided application interface does not exist: " + existingAppInterfaceId);
             }
-            existingInterface.setApplicationName(newApplicationName);
-            existingInterface.setApplicationInterfaceId(airavata_commonsConstants.DEFAULT_ID);
+            existingInterface = existingInterface.toBuilder()
+                    .setApplicationName(newApplicationName)
+                    .setApplicationInterfaceId("DO_NOT_SET_AT_CLIENTS")
+                    .build();
             String interfaceId = registryHandler.registerApplicationInterface(gatewayId, existingInterface);
             logger.debug("Cloned application interface {} for gateway {}", existingAppInterfaceId, gatewayId);
             return interfaceId;
@@ -444,7 +446,7 @@ public class ApplicationCatalogService {
                     registryHandler.getGroupResourceList(gatewayId, accessibleGroupResProfileIds);
             for (GroupResourceProfile groupResourceProfile : groupResourceProfiles) {
                 List<GroupComputeResourcePreference> groupComputeResourcePreferenceList =
-                        groupResourceProfile.getComputePreferences();
+                        groupResourceProfile.getComputePreferencesList();
                 for (GroupComputeResourcePreference pref : groupComputeResourcePreferenceList) {
                     accessibleComputeResourceIds.add(pref.getComputeResourceId());
                 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/service/GatewayResourceProfileService.java b/airavata-api/src/main/java/org/apache/airavata/compute/service/GatewayResourceProfileService.java
index cc74efc425..742a640978 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/service/GatewayResourceProfileService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/service/GatewayResourceProfileService.java
@@ -27,12 +27,12 @@ import org.apache.airavata.credential.service.provisioning.SSHAccountProvisioner
 import org.apache.airavata.execution.handler.RegistryServerHandler;
 import org.apache.airavata.execution.service.RequestContext;
 import org.apache.airavata.execution.service.ServiceException;
-import org.apache.airavata.model.appcatalog.accountprovisioning.SSHAccountProvisioner;
-import org.apache.airavata.model.appcatalog.accountprovisioning.SSHAccountProvisionerConfigParam;
-import org.apache.airavata.model.appcatalog.accountprovisioning.SSHAccountProvisionerConfigParamType;
-import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
-import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
+import org.apache.airavata.model.appcatalog.accountprovisioning.proto.SSHAccountProvisioner;
+import org.apache.airavata.model.appcatalog.accountprovisioning.proto.SSHAccountProvisionerConfigParam;
+import org.apache.airavata.model.appcatalog.accountprovisioning.proto.SSHAccountProvisionerConfigParamType;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.ComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.GatewayResourceProfile;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.StoragePreference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -201,27 +201,29 @@ public class GatewayResourceProfileService {
             List<SSHAccountProvisionerProvider> providers =
                     SSHAccountProvisionerFactory.getSSHAccountProvisionerProviders();
             for (SSHAccountProvisionerProvider provider : providers) {
-                SSHAccountProvisioner provisioner = new SSHAccountProvisioner();
-                provisioner.setCanCreateAccount(provider.canCreateAccount());
-                provisioner.setCanInstallSSHKey(provider.canInstallSSHKey());
-                provisioner.setName(provider.getName());
                 List<SSHAccountProvisionerConfigParam> configParams = new ArrayList<>();
                 for (ConfigParam configParam : provider.getConfigParams()) {
-                    SSHAccountProvisionerConfigParam param = new SSHAccountProvisionerConfigParam();
-                    param.setName(configParam.getName());
-                    param.setDescription(configParam.getDescription());
-                    param.setIsOptional(configParam.isOptional());
+                    SSHAccountProvisionerConfigParam.Builder paramBuilder =
+                            SSHAccountProvisionerConfigParam.newBuilder()
+                                    .setName(configParam.getName())
+                                    .setDescription(configParam.getDescription())
+                                    .setIsOptional(configParam.isOptional());
                     switch (configParam.getType()) {
                         case STRING:
-                            param.setType(SSHAccountProvisionerConfigParamType.STRING);
+                            paramBuilder.setType(SSHAccountProvisionerConfigParamType.STRING);
                             break;
                         case CRED_STORE_PASSWORD_TOKEN:
-                            param.setType(SSHAccountProvisionerConfigParamType.CRED_STORE_PASSWORD_TOKEN);
+                            paramBuilder.setType(SSHAccountProvisionerConfigParamType.CRED_STORE_PASSWORD_TOKEN);
                             break;
                     }
-                    configParams.add(param);
+                    configParams.add(paramBuilder.build());
                 }
-                provisioner.setConfigParams(configParams);
+                SSHAccountProvisioner provisioner = SSHAccountProvisioner.newBuilder()
+                        .setCanCreateAccount(provider.canCreateAccount())
+                        .setCanInstallSSHKey(provider.canInstallSSHKey())
+                        .setName(provider.getName())
+                        .addAllConfigParams(configParams)
+                        .build();
                 sshAccountProvisioners.add(provisioner);
             }
             return sshAccountProvisioners;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/service/GroupResourceProfileService.java b/airavata-api/src/main/java/org/apache/airavata/compute/service/GroupResourceProfileService.java
index 1ac3a72647..4bfde4e4b7 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/service/GroupResourceProfileService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/service/GroupResourceProfileService.java
@@ -27,13 +27,13 @@ import org.apache.airavata.execution.handler.RegistryServerHandler;
 import org.apache.airavata.execution.service.RequestContext;
 import org.apache.airavata.execution.service.ServiceAuthorizationException;
 import org.apache.airavata.execution.service.ServiceException;
-import org.apache.airavata.model.appcatalog.gatewaygroups.GatewayGroups;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.BatchQueueResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.group.ResourcePermissionType;
-import org.apache.airavata.model.group.ResourceType;
+import org.apache.airavata.model.appcatalog.gatewaygroups.proto.GatewayGroups;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.BatchQueueResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupResourceProfile;
+import org.apache.airavata.model.group.proto.ResourcePermissionType;
+import org.apache.airavata.model.group.proto.ResourceType;
 import org.apache.airavata.sharing.handler.SharingRegistryServerHandler;
 import org.apache.airavata.sharing.registry.models.Entity;
 import org.apache.airavata.sharing.registry.models.EntitySearchField;
@@ -535,8 +535,8 @@ public class GroupResourceProfileService {
         String gatewayId = ctx.getGatewayId();
         String userId = ctx.getUserId();
         Set<String> tokenIds = new HashSet<>();
-        if (groupResourceProfile.getComputePreferences() != null) {
-            for (GroupComputeResourcePreference pref : groupResourceProfile.getComputePreferences()) {
+        if (groupResourceProfile.getComputePreferencesList() != null) {
+            for (GroupComputeResourcePreference pref : groupResourceProfile.getComputePreferencesList()) {
                 if (pref.getResourceSpecificCredentialStoreToken() != null) {
                     tokenIds.add(pref.getResourceSpecificCredentialStoreToken());
                 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/service/ParserService.java b/airavata-api/src/main/java/org/apache/airavata/compute/service/ParserService.java
index 3c208d7275..72400050da 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/service/ParserService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/service/ParserService.java
@@ -23,8 +23,8 @@ import java.util.List;
 import org.apache.airavata.execution.handler.RegistryServerHandler;
 import org.apache.airavata.execution.service.RequestContext;
 import org.apache.airavata.execution.service.ServiceException;
-import org.apache.airavata.model.appcatalog.parser.Parser;
-import org.apache.airavata.model.appcatalog.parser.ParsingTemplate;
+import org.apache.airavata.model.appcatalog.parser.proto.Parser;
+import org.apache.airavata.model.appcatalog.parser.proto.ParsingTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/service/ResourceService.java b/airavata-api/src/main/java/org/apache/airavata/compute/service/ResourceService.java
index b631356018..f93c33de37 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/service/ResourceService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/service/ResourceService.java
@@ -29,23 +29,22 @@ import org.apache.airavata.execution.orchestrator.AdaptorSupportImpl;
 import org.apache.airavata.execution.service.RequestContext;
 import org.apache.airavata.execution.service.ServiceAuthorizationException;
 import org.apache.airavata.execution.service.ServiceException;
-import org.apache.airavata.model.appcatalog.computeresource.*;
-import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
-import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.appcatalog.storageresource.StorageDirectoryInfo;
-import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
-import org.apache.airavata.model.appcatalog.storageresource.StorageVolumeInfo;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserResourceProfile;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserStoragePreference;
-import org.apache.airavata.model.data.movement.DMType;
-import org.apache.airavata.model.data.movement.GridFTPDataMovement;
-import org.apache.airavata.model.data.movement.LOCALDataMovement;
-import org.apache.airavata.model.data.movement.SCPDataMovement;
-import org.apache.airavata.model.data.movement.UnicoreDataMovement;
-import org.apache.thrift.TApplicationException;
+import org.apache.airavata.model.appcatalog.computeresource.proto.*;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.GatewayResourceProfile;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.StoragePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupResourceProfile;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageDirectoryInfo;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageResourceDescription;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageVolumeInfo;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserResourceProfile;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserStoragePreference;
+import org.apache.airavata.model.data.movement.proto.DMType;
+import org.apache.airavata.model.data.movement.proto.GridFTPDataMovement;
+import org.apache.airavata.model.data.movement.proto.LOCALDataMovement;
+import org.apache.airavata.model.data.movement.proto.SCPDataMovement;
+import org.apache.airavata.model.data.movement.proto.UnicoreDataMovement;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -493,8 +492,8 @@ public class ResourceService {
             if (cr != null) {
                 computeResourceOp = Optional.of(cr);
             }
-        } catch (TApplicationException e) {
-            logger.debug("Compute resource {} not found (TApplicationException): {}", resourceId, e.getMessage());
+        } catch (RuntimeException e) {
+            logger.debug("Compute resource {} not found (RuntimeException): {}", resourceId, e.getMessage());
         } catch (Exception e) {
             throw new ServiceException("Error looking up compute resource " + resourceId + ": " + e.getMessage(), e);
         }
@@ -506,8 +505,8 @@ public class ResourceService {
                 if (sr != null) {
                     storageResourceOp = Optional.of(sr);
                 }
-            } catch (TApplicationException e) {
-                logger.debug("Storage resource {} not found (TApplicationException): {}", resourceId, e.getMessage());
+            } catch (RuntimeException e) {
+                logger.debug("Storage resource {} not found (RuntimeException): {}", resourceId, e.getMessage());
             } catch (Exception e) {
                 throw new ServiceException(
                         "Error looking up storage resource " + resourceId + ": " + e.getMessage(), e);
@@ -578,7 +577,7 @@ public class ResourceService {
                 throw new ServiceException("Error retrieving group resource profiles: " + e.getMessage(), e);
             }
             for (GroupResourceProfile groupProfile : groupResourceProfiles) {
-                List<GroupComputeResourcePreference> groupComputePrefs = groupProfile.getComputePreferences();
+                List<GroupComputeResourcePreference> groupComputePrefs = groupProfile.getComputePreferencesList();
                 if (groupComputePrefs != null && !groupComputePrefs.isEmpty()) {
                     for (GroupComputeResourcePreference groupPref : groupComputePrefs) {
                         if (resourceId.equals(groupPref.getComputeResourceId())
@@ -712,7 +711,7 @@ public class ResourceService {
                         "Gateway resource profile does not exist for gateway {}, will check user preference",
                         gatewayId);
             }
-        } catch (TApplicationException e) {
+        } catch (RuntimeException e) {
             logger.debug("Gateway resource profile does not exist for gateway {}: {}", gatewayId, e.getMessage());
         } catch (Exception e) {
             throw new ServiceException("Error retrieving gateway storage preference: " + e.getMessage(), e);
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/service/UserResourceProfileService.java b/airavata-api/src/main/java/org/apache/airavata/compute/service/UserResourceProfileService.java
index bddecc91bd..7fe4d165eb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/service/UserResourceProfileService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/service/UserResourceProfileService.java
@@ -23,10 +23,10 @@ import java.util.List;
 import org.apache.airavata.execution.handler.RegistryServerHandler;
 import org.apache.airavata.execution.service.RequestContext;
 import org.apache.airavata.execution.service.ServiceException;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserResourceProfile;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserStoragePreference;
-import org.apache.airavata.model.status.QueueStatusModel;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserResourceProfile;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserStoragePreference;
+import org.apache.airavata.model.status.proto.QueueStatusModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/AiravataCustomCommandOutputParser.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/AiravataCustomCommandOutputParser.java
index c6fb6de08f..8a9de01d00 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/AiravataCustomCommandOutputParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/AiravataCustomCommandOutputParser.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.compute.task;
 
 import java.util.Map;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.status.proto.JobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/DefaultJobSubmissionTask.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/DefaultJobSubmissionTask.java
index 176797a278..12f0372a16 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/DefaultJobSubmissionTask.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/DefaultJobSubmissionTask.java
@@ -28,10 +28,10 @@ import org.apache.airavata.compute.util.JobSubmissionOutput;
 import org.apache.airavata.execution.orchestrator.TaskContext;
 import org.apache.airavata.execution.orchestrator.TaskDef;
 import org.apache.airavata.execution.orchestrator.TaskHelper;
-import org.apache.airavata.model.commons.ErrorModel;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.status.*;
-import org.apache.airavata.model.workspace.GatewayUsageReportingCommand;
+import org.apache.airavata.model.commons.proto.ErrorModel;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.status.proto.*;
+import org.apache.airavata.model.workspace.proto.GatewayUsageReportingCommand;
 import org.apache.helix.task.TaskResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -77,31 +77,34 @@ public class DefaultJobSubmissionTask extends JobSubmissionTask {
             saveAndPublishProcessStatus(ProcessState.EXECUTING);
             GroovyMapData mapData = new GroovyMapBuilder(getTaskContext()).build();
 
-            JobModel jobModel = new JobModel();
-            jobModel.setProcessId(getProcessId());
-            jobModel.setWorkingDir(mapData.getWorkingDirectory());
-            jobModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-            jobModel.setTaskId(getTaskId());
-            jobModel.setJobName(mapData.getJobName());
-            jobModel.setJobDescription("Sample description");
-
             JobSubmissionOutput submissionOutput = submitBatchJob(adaptor, mapData, mapData.getWorkingDirectory());
 
-            jobModel.setJobDescription(submissionOutput.getDescription());
-            jobModel.setExitCode(submissionOutput.getExitCode());
-            jobModel.setStdErr(submissionOutput.getStdErr());
-            jobModel.setStdOut(submissionOutput.getStdOut());
+            JobModel jobModel = JobModel.newBuilder()
+                    .setProcessId(getProcessId())
+                    .setWorkingDir(mapData.getWorkingDirectory())
+                    .setCreationTime(AiravataUtils.getCurrentTimestamp().getTime())
+                    .setTaskId(getTaskId())
+                    .setJobName(mapData.getJobName())
+                    .setJobDescription(submissionOutput.getDescription())
+                    .setExitCode(submissionOutput.getExitCode())
+                    .setStdErr(submissionOutput.getStdErr())
+                    .setStdOut(submissionOutput.getStdOut())
+                    .build();
 
             jobId = submissionOutput.getJobId();
 
             if (submissionOutput.getExitCode() != 0 || submissionOutput.isJobSubmissionFailed()) {
 
-                jobModel.setJobId(DEFAULT_JOB_ID);
+                jobModel = jobModel.toBuilder().setJobId(DEFAULT_JOB_ID).build();
                 if (submissionOutput.isJobSubmissionFailed()) {
-                    List<JobStatus> statusList = new ArrayList<>();
-                    statusList.add(new JobStatus(JobState.FAILED));
-                    statusList.get(0).setReason(submissionOutput.getFailureReason());
-                    jobModel.setJobStatuses(statusList);
+                    JobStatus failedStatus = JobStatus.newBuilder()
+                            .setJobState(JobState.FAILED)
+                            .setReason(submissionOutput.getFailureReason())
+                            .build();
+                    jobModel = jobModel.toBuilder()
+                            .clearJobStatuses()
+                            .addJobStatuses(failedStatus)
+                            .build();
                     saveJobModel(jobModel);
                     logger.error("Job submission failed for job name " + jobModel.getJobName()
                             + ". Exit code : " + submissionOutput.getExitCode() + ", Submission failed : "
@@ -118,19 +121,19 @@ public class DefaultJobSubmissionTask extends JobSubmissionTask {
                 } else {
                     String msg;
                     saveJobModel(jobModel);
-                    ErrorModel errorModel = new ErrorModel();
+                    ErrorModel.Builder errorModelBuilder = ErrorModel.newBuilder();
                     if (submissionOutput.getExitCode() != Integer.MIN_VALUE) {
                         msg = "Returned non zero exit code:" + submissionOutput.getExitCode() + "  for JobName:"
                                 + jobModel.getJobName() + ", with failure reason : "
                                 + submissionOutput.getFailureReason()
                                 + " Hence changing job state to Failed.";
-                        errorModel.setActualErrorMessage(submissionOutput.getFailureReason());
+                        errorModelBuilder.setActualErrorMessage(submissionOutput.getFailureReason());
                     } else {
                         msg = "Didn't return valid job submission exit code for JobName:" + jobModel.getJobName()
                                 + ", with failure reason : stdout ->"
                                 + submissionOutput.getStdOut() + " stderr -> "
                                 + submissionOutput.getStdErr() + " Hence changing job state to Failed.";
-                        errorModel.setActualErrorMessage(msg);
+                        errorModelBuilder.setActualErrorMessage(msg);
                     }
                     logger.error(msg);
                     return onFail(msg, false, null);
@@ -139,24 +142,33 @@ public class DefaultJobSubmissionTask extends JobSubmissionTask {
             } else if (jobId != null && !jobId.isEmpty()) {
 
                 logger.info("Received job id " + jobId + " from compute resource");
-                jobModel.setJobId(jobId);
+                jobModel = jobModel.toBuilder().setJobId(jobId).build();
                 saveJobModel(jobModel);
 
-                JobStatus jobStatus = new JobStatus();
-                jobStatus.setJobState(JobState.SUBMITTED);
-                jobStatus.setReason("Successfully Submitted to "
-                        + getComputeResourceDescription().getHostName());
-                jobStatus.setTimeOfStateChange(
-                        AiravataUtils.getCurrentTimestamp().getTime());
-                jobModel.setJobStatuses(Collections.singletonList(jobStatus));
+                JobStatus jobStatus = JobStatus.newBuilder()
+                        .setJobState(JobState.SUBMITTED)
+                        .setReason("Successfully Submitted to "
+                                + getComputeResourceDescription().getHostName())
+                        .setTimeOfStateChange(
+                                AiravataUtils.getCurrentTimestamp().getTime())
+                        .build();
+                jobModel = jobModel.toBuilder()
+                        .clearJobStatuses()
+                        .addJobStatuses(jobStatus)
+                        .build();
                 saveAndPublishJobStatus(jobModel);
 
                 if (verifyJobSubmissionByJobId(adaptor, jobId)) {
-                    jobStatus.setJobState(JobState.QUEUED);
-                    jobStatus.setReason("Verification step succeeded");
-                    jobStatus.setTimeOfStateChange(
-                            AiravataUtils.getCurrentTimestamp().getTime());
-                    jobModel.setJobStatuses(Collections.singletonList(jobStatus));
+                    JobStatus queuedStatus = JobStatus.newBuilder()
+                            .setJobState(JobState.QUEUED)
+                            .setReason("Verification step succeeded")
+                            .setTimeOfStateChange(
+                                    AiravataUtils.getCurrentTimestamp().getTime())
+                            .build();
+                    jobModel = jobModel.toBuilder()
+                            .clearJobStatuses()
+                            .addJobStatuses(queuedStatus)
+                            .build();
                     saveAndPublishJobStatus(jobModel);
                 }
 
@@ -169,14 +181,18 @@ public class DefaultJobSubmissionTask extends JobSubmissionTask {
                     if (verifyJobId != null && !verifyJobId.isEmpty()) {
                         // JobStatus either changed from SUBMITTED to QUEUED or directly to QUEUED
                         jobId = verifyJobId;
-                        jobModel.setJobId(jobId);
+                        jobModel = jobModel.toBuilder().setJobId(jobId).build();
                         saveJobModel(jobModel);
-                        JobStatus jobStatus = new JobStatus();
-                        jobStatus.setJobState(JobState.QUEUED);
-                        jobStatus.setReason("Verification step succeeded");
-                        jobStatus.setTimeOfStateChange(
-                                AiravataUtils.getCurrentTimestamp().getTime());
-                        jobModel.setJobStatuses(Collections.singletonList(jobStatus));
+                        JobStatus jobStatus = JobStatus.newBuilder()
+                                .setJobState(JobState.QUEUED)
+                                .setReason("Verification step succeeded")
+                                .setTimeOfStateChange(
+                                        AiravataUtils.getCurrentTimestamp().getTime())
+                                .build();
+                        jobModel = jobModel.toBuilder()
+                                .clearJobStatuses()
+                                .addJobStatuses(jobStatus)
+                                .build();
                         saveAndPublishJobStatus(jobModel);
                         logger.info("Job id " + verifyJobId + " verification succeeded");
                         break;
@@ -188,7 +204,7 @@ public class DefaultJobSubmissionTask extends JobSubmissionTask {
             }
 
             if (jobId == null || jobId.isEmpty()) {
-                jobModel.setJobId(DEFAULT_JOB_ID);
+                jobModel = jobModel.toBuilder().setJobId(DEFAULT_JOB_ID).build();
                 saveJobModel(jobModel);
                 String msg = "expId:" + getExperimentId() + " Couldn't find " + "remote jobId for JobName:"
                         + jobModel.getJobName() + ", both submit and verify steps " + "doesn't return a valid JobId. "
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkJobConfiguration.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkJobConfiguration.java
index 75774fb0a6..d3370a640f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkJobConfiguration.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkJobConfiguration.java
@@ -21,11 +21,11 @@ package org.apache.airavata.compute.task;
 
 import java.io.File;
 import java.util.Map;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
 import org.apache.commons.io.FilenameUtils;
 
 public class ForkJobConfiguration implements JobManagerConfiguration {
-    private final Map<JobManagerCommand, String> jobManagerCommands;
+    private final Map<Integer, String> jobManagerCommands;
     private String jobDescriptionTemplateName;
     private String scriptExtension;
     private String installedPath;
@@ -35,7 +35,7 @@ public class ForkJobConfiguration implements JobManagerConfiguration {
             String jobDescriptionTemplateName,
             String scriptExtension,
             String installedPath,
-            Map<JobManagerCommand, String> jobManagerCommands,
+            Map<Integer, String> jobManagerCommands,
             OutputParser parser) {
         this.jobDescriptionTemplateName = jobDescriptionTemplateName;
         this.scriptExtension = scriptExtension;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkJobSubmissionTask.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkJobSubmissionTask.java
index 246719f2d8..61c9cb0b5c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkJobSubmissionTask.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkJobSubmissionTask.java
@@ -26,9 +26,9 @@ import org.apache.airavata.compute.util.JobSubmissionOutput;
 import org.apache.airavata.execution.orchestrator.TaskContext;
 import org.apache.airavata.execution.orchestrator.TaskDef;
 import org.apache.airavata.execution.orchestrator.TaskHelper;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.status.JobState;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.status.proto.JobState;
+import org.apache.airavata.model.status.proto.JobStatus;
 import org.apache.helix.task.TaskResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,13 +45,6 @@ public class ForkJobSubmissionTask extends JobSubmissionTask {
         try {
             GroovyMapData mapData = new GroovyMapBuilder(getTaskContext()).build();
 
-            JobModel jobModel = new JobModel();
-            jobModel.setProcessId(getProcessId());
-            jobModel.setWorkingDir(mapData.getWorkingDirectory());
-            jobModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-            jobModel.setTaskId(getTaskId());
-            jobModel.setJobName(mapData.getJobName());
-
             AgentAdaptor adaptor = taskHelper
                     .getAdaptorSupport()
                     .fetchAdaptor(
@@ -63,23 +56,34 @@ public class ForkJobSubmissionTask extends JobSubmissionTask {
 
             JobSubmissionOutput submissionOutput = submitBatchJob(adaptor, mapData, mapData.getWorkingDirectory());
 
-            jobModel.setJobDescription(submissionOutput.getDescription());
-            jobModel.setExitCode(submissionOutput.getExitCode());
-            jobModel.setStdErr(submissionOutput.getStdErr());
-            jobModel.setStdOut(submissionOutput.getStdOut());
+            JobModel jobModel = JobModel.newBuilder()
+                    .setProcessId(getProcessId())
+                    .setWorkingDir(mapData.getWorkingDirectory())
+                    .setCreationTime(AiravataUtils.getCurrentTimestamp().getTime())
+                    .setTaskId(getTaskId())
+                    .setJobName(mapData.getJobName())
+                    .setJobDescription(submissionOutput.getDescription())
+                    .setExitCode(submissionOutput.getExitCode())
+                    .setStdErr(submissionOutput.getStdErr())
+                    .setStdOut(submissionOutput.getStdOut())
+                    .build();
 
             String jobId = submissionOutput.getJobId();
 
             if (jobId != null && !jobId.isEmpty()) {
-                jobModel.setJobId(jobId);
+                JobStatus jobStatus = JobStatus.newBuilder()
+                        .setJobState(JobState.SUBMITTED)
+                        .setReason("Successfully Submitted to "
+                                + getComputeResourceDescription().getHostName())
+                        .setTimeOfStateChange(
+                                AiravataUtils.getCurrentTimestamp().getTime())
+                        .build();
+                jobModel = jobModel.toBuilder()
+                        .setJobId(jobId)
+                        .clearJobStatuses()
+                        .addJobStatuses(jobStatus)
+                        .build();
                 saveJobModel(jobModel);
-                JobStatus jobStatus = new JobStatus();
-                jobStatus.setJobState(JobState.SUBMITTED);
-                jobStatus.setReason("Successfully Submitted to "
-                        + getComputeResourceDescription().getHostName());
-                jobStatus.setTimeOfStateChange(
-                        AiravataUtils.getCurrentTimestamp().getTime());
-                jobModel.setJobStatuses(Collections.singletonList(jobStatus));
                 saveAndPublishJobStatus(jobModel);
 
                 return onSuccess("Job submitted successfully");
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkOutputParser.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkOutputParser.java
index 9be6948c30..e66b13ab79 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkOutputParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/ForkOutputParser.java
@@ -21,7 +21,7 @@ package org.apache.airavata.compute.task;
 
 import java.util.Map;
 import org.apache.airavata.common.util.AiravataUtils;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.status.proto.JobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/GroovyMapBuilder.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/GroovyMapBuilder.java
index c7fc9c6e29..b975a83a21 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/GroovyMapBuilder.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/GroovyMapBuilder.java
@@ -31,18 +31,17 @@ import java.util.stream.Collectors;
 import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.execution.orchestrator.TaskContext;
 import org.apache.airavata.execution.orchestrator.TaskOnFailException;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription;
-import org.apache.airavata.model.appcatalog.appdeployment.CommandObject;
-import org.apache.airavata.model.appcatalog.appdeployment.SetEnvPaths;
-import org.apache.airavata.model.appcatalog.computeresource.*;
-import org.apache.airavata.model.application.io.DataType;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.parallelism.ApplicationParallelismType;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
-import org.apache.airavata.model.task.JobSubmissionTaskModel;
-import org.apache.thrift.TException;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationDeploymentDescription;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.CommandObject;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.SetEnvPaths;
+import org.apache.airavata.model.appcatalog.computeresource.proto.*;
+import org.apache.airavata.model.application.io.proto.DataType;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.parallelism.proto.ApplicationParallelismType;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.scheduling.proto.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.task.proto.JobSubmissionTaskModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -92,25 +91,25 @@ public class GroovyMapBuilder {
         // }
 
         List<String> inputValues =
-                getProcessInputValues(taskContext.getProcessModel().getProcessInputs(), true);
-        inputValues.addAll(getProcessOutputValues(taskContext.getProcessModel().getProcessOutputs(), true));
+                getProcessInputValues(taskContext.getProcessModel().getProcessInputsList(), true);
+        inputValues.addAll(getProcessOutputValues(taskContext.getProcessModel().getProcessOutputsList(), true));
         mapData.setInputs(inputValues);
 
         List<String> inputFiles =
-                getProcessInputFiles(taskContext.getProcessModel().getProcessInputs(), false);
+                getProcessInputFiles(taskContext.getProcessModel().getProcessInputsList(), false);
         mapData.setInputFiles(inputFiles);
 
         List<String> inputValuesAll =
-                getProcessInputValues(taskContext.getProcessModel().getProcessInputs(), false);
+                getProcessInputValues(taskContext.getProcessModel().getProcessInputsList(), false);
         inputValuesAll.addAll(
-                getProcessOutputValues(taskContext.getProcessModel().getProcessOutputs(), false));
+                getProcessOutputValues(taskContext.getProcessModel().getProcessOutputsList(), false));
         mapData.setInputsAll(inputValuesAll);
 
         mapData.setUserName(taskContext.getComputeResourceLoginUserName());
         mapData.setShellName("/bin/bash");
 
         String hostName = taskContext.getComputeResourceDescription().getHostName();
-        List<String> hostAliases = taskContext.getComputeResourceDescription().getHostAliases();
+        List<String> hostAliases = taskContext.getComputeResourceDescription().getHostAliasesList();
         if (hostAliases != null && hostAliases.size() > 0) {
             hostName = hostAliases.get(0);
         }
@@ -124,7 +123,7 @@ public class GroovyMapBuilder {
                     mapData.setMaxWallTime(maxWallTimeCalculator(jobSubmissionTaskModel.getWallTime()));
                     mapData.setWallTimeInSeconds(jobSubmissionTaskModel.getWallTime() * 60);
                 }
-            } catch (TException e) {
+            } catch (Exception e) {
                 logger.error("Error while getting job submission sub task model", e);
             }
         }
@@ -176,7 +175,7 @@ public class GroovyMapBuilder {
 
         ApplicationDeploymentDescription appDepDescription = taskContext.getApplicationDeploymentDescription();
 
-        List<SetEnvPaths> exportCommands = appDepDescription.getSetEnvironment();
+        List<SetEnvPaths> exportCommands = appDepDescription.getSetEnvironmentList();
         if (exportCommands != null) {
             List<String> exportCommandList = exportCommands.stream()
                     .sorted((e1, e2) -> e1.getEnvPathOrder() - e2.getEnvPathOrder())
@@ -185,7 +184,7 @@ public class GroovyMapBuilder {
             mapData.setExports(exportCommandList);
         }
 
-        List<CommandObject> moduleCmds = appDepDescription.getModuleLoadCmds();
+        List<CommandObject> moduleCmds = appDepDescription.getModuleLoadCmdsList();
         if (moduleCmds != null) {
             List<String> modulesCmdCollect = moduleCmds.stream()
                     .sorted((e1, e2) -> e1.getCommandOrder() - e2.getCommandOrder())
@@ -194,7 +193,7 @@ public class GroovyMapBuilder {
             mapData.setModuleCommands(modulesCmdCollect);
         }
 
-        List<CommandObject> preJobCommands = appDepDescription.getPreJobCommands();
+        List<CommandObject> preJobCommands = appDepDescription.getPreJobCommandsList();
         if (preJobCommands != null) {
             List<String> preJobCmdCollect = preJobCommands.stream()
                     .sorted((e1, e2) -> e1.getCommandOrder() - e2.getCommandOrder())
@@ -203,7 +202,7 @@ public class GroovyMapBuilder {
             mapData.setPreJobCommands(preJobCmdCollect);
         }
 
-        List<CommandObject> postJobCommands = appDepDescription.getPostJobCommands();
+        List<CommandObject> postJobCommands = appDepDescription.getPostJobCommandsList();
         if (postJobCommands != null) {
             List<String> postJobCmdCollect = postJobCommands.stream()
                     .sorted((e1, e2) -> e1.getCommandOrder() - e2.getCommandOrder())
@@ -215,10 +214,10 @@ public class GroovyMapBuilder {
         ApplicationParallelismType parallelism = appDepDescription.getParallelism();
         if (parallelism != null) {
             if (parallelism != ApplicationParallelismType.SERIAL) {
-                Map<ApplicationParallelismType, String> parallelismPrefix =
-                        taskContext.getResourceJobManager().getParallelismPrefix();
+                Map<Integer, String> parallelismPrefix =
+                        taskContext.getResourceJobManager().getParallelismPrefixMap();
                 if (parallelismPrefix != null) {
-                    String parallelismCommand = parallelismPrefix.get(parallelism);
+                    String parallelismCommand = parallelismPrefix.get(parallelism.getNumber());
                     if (parallelismCommand != null) {
                         mapData.setJobSubmitterCommand(parallelismCommand);
                     } else {
@@ -259,11 +258,11 @@ public class GroovyMapBuilder {
                 sortedInputSet.add(input);
             }
             for (InputDataObjectType inputDataObjectType : sortedInputSet) {
-                if (commandLineOnly && !inputDataObjectType.isRequiredToAddedToCommandLine()) {
+                if (commandLineOnly && !inputDataObjectType.getRequiredToAddedToCommandLine()) {
                     continue;
                 }
 
-                if (!inputDataObjectType.isIsRequired()
+                if (!inputDataObjectType.getIsRequired()
                         && (inputDataObjectType.getValue() == null || "".equals(inputDataObjectType.getValue()))) {
                     // For URI/ Collection non required inputs, if the value is empty, ignore it. Fix for airavata-3276
                     continue;
@@ -320,7 +319,7 @@ public class GroovyMapBuilder {
                 sortedInputSet.add(input);
             }
             for (InputDataObjectType inputDataObjectType : sortedInputSet) {
-                if (!inputDataObjectType.isIsRequired()
+                if (!inputDataObjectType.getIsRequired()
                         && (inputDataObjectType.getValue() == null || "".equals(inputDataObjectType.getValue()))) {
                     // For URI/ Collection non required inputs, if the value is empty, ignore it. Fix for airavata-3276
                     continue;
@@ -366,7 +365,7 @@ public class GroovyMapBuilder {
                 if (commandLineOnly) {
                     if (output.getValue() != null
                             && !output.getValue().equals("")
-                            && output.isRequiredToAddedToCommandLine()) {
+                            && output.getRequiredToAddedToCommandLine()) {
                         if (output.getType() == DataType.URI) {
                             String filePath = output.getValue();
                             filePath =
@@ -456,8 +455,8 @@ public class GroovyMapBuilder {
                     emailIds = userJobNotifEmailIds;
                 }
             }
-            if (processModel.isEnableEmailNotification()) {
-                List<String> emailList = processModel.getEmailAddresses();
+            if (processModel.getEnableEmailNotification()) {
+                List<String> emailList = processModel.getEmailAddressesList();
                 if (emailList == null) {
                     throw new TaskOnFailException(
                             "At least one email should be provided as the email notification is turned on",
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/HTCondorJobConfiguration.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/HTCondorJobConfiguration.java
index 5677078d80..564fc69a67 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/HTCondorJobConfiguration.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/HTCondorJobConfiguration.java
@@ -21,11 +21,11 @@ package org.apache.airavata.compute.task;
 
 import java.io.File;
 import java.util.Map;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
 import org.apache.commons.io.FilenameUtils;
 
 public class HTCondorJobConfiguration implements JobManagerConfiguration {
-    private final Map<JobManagerCommand, String> jMCommands;
+    private final Map<Integer, String> jMCommands;
     private String jobDescriptionTemplateName;
     private String scriptExtension;
     private String installedPath;
@@ -35,7 +35,7 @@ public class HTCondorJobConfiguration implements JobManagerConfiguration {
             String jobDescriptionTemplateName,
             String scriptExtension,
             String installedPath,
-            Map<JobManagerCommand, String> jobManagerCommands,
+            Map<Integer, String> jobManagerCommands,
             OutputParser parser) {
         this.jobDescriptionTemplateName = jobDescriptionTemplateName;
         this.scriptExtension = scriptExtension;
@@ -51,7 +51,7 @@ public class HTCondorJobConfiguration implements JobManagerConfiguration {
 
     public RawCommandInfo getCancelCommand(String jobID) {
         return new RawCommandInfo(
-                this.installedPath + jMCommands.get(JobManagerCommand.DELETION).trim() + " " + jobID);
+                this.installedPath + jMCommands.get(JobManagerCommand.DELETION.getNumber()).trim() + " " + jobID);
     }
 
     public String getJobDescriptionTemplateName() {
@@ -64,7 +64,7 @@ public class HTCondorJobConfiguration implements JobManagerConfiguration {
 
     public RawCommandInfo getMonitorCommand(String jobID) {
         return new RawCommandInfo(this.installedPath
-                + jMCommands.get(JobManagerCommand.JOB_MONITORING).trim() + " " + jobID + " -nobatch");
+                + jMCommands.get(JobManagerCommand.JOB_MONITORING.getNumber()).trim() + " " + jobID + " -nobatch");
     }
 
     public String getScriptExtension() {
@@ -73,7 +73,7 @@ public class HTCondorJobConfiguration implements JobManagerConfiguration {
 
     public RawCommandInfo getSubmitCommand(String workingDirectory, String pbsFilePath) {
         return new RawCommandInfo(this.installedPath
-                + jMCommands.get(JobManagerCommand.SUBMISSION).trim() + " " + workingDirectory + File.separator
+                + jMCommands.get(JobManagerCommand.SUBMISSION.getNumber()).trim() + " " + workingDirectory + File.separator
                 + FilenameUtils.getName(pbsFilePath));
     }
 
@@ -95,28 +95,28 @@ public class HTCondorJobConfiguration implements JobManagerConfiguration {
 
     public RawCommandInfo getUserBasedMonitorCommand(String userName) {
         return new RawCommandInfo(this.installedPath
-                + jMCommands.get(JobManagerCommand.JOB_MONITORING).trim() + " -submitter " + userName);
+                + jMCommands.get(JobManagerCommand.JOB_MONITORING.getNumber()).trim() + " -submitter " + userName);
     }
 
     @Override
     public RawCommandInfo getJobIdMonitorCommand(String jobName, String userName) {
         return new RawCommandInfo(this.installedPath
-                + jMCommands.get(JobManagerCommand.JOB_MONITORING).trim() + " " + jobName + " -submitter " + userName);
+                + jMCommands.get(JobManagerCommand.JOB_MONITORING.getNumber()).trim() + " " + jobName + " -submitter " + userName);
     }
 
     @Override
     public String getBaseCancelCommand() {
-        return jMCommands.get(JobManagerCommand.DELETION).trim();
+        return jMCommands.get(JobManagerCommand.DELETION.getNumber()).trim();
     }
 
     @Override
     public String getBaseMonitorCommand() {
-        return jMCommands.get(JobManagerCommand.JOB_MONITORING).trim();
+        return jMCommands.get(JobManagerCommand.JOB_MONITORING.getNumber()).trim();
     }
 
     @Override
     public String getBaseSubmitCommand() {
-        return jMCommands.get(JobManagerCommand.SUBMISSION).trim();
+        return jMCommands.get(JobManagerCommand.SUBMISSION.getNumber()).trim();
     }
 
     @Override
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/HTCondorOutputParser.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/HTCondorOutputParser.java
index 958954e0c5..ec5323e8ad 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/HTCondorOutputParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/HTCondorOutputParser.java
@@ -24,8 +24,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import org.apache.airavata.model.status.JobState;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.status.proto.JobState;
+import org.apache.airavata.model.status.proto.JobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -80,9 +80,9 @@ public class HTCondorOutputParser implements OutputParser {
             if (matcher.find()) {
                 if (matcher.group(STATUS).equals("E")) {
                     log.info("parsing the job status returned : " + STATUS);
-                    return new JobStatus(JobState.FAILED);
+                    return JobStatus.newBuilder().setJobState(JobState.FAILED).build();
                 }
-                return new JobStatus(JobUtil.getJobState(matcher.group(STATUS)));
+                return JobStatus.newBuilder().setJobState(JobUtil.getJobState(matcher.group(STATUS)).build());
             }
         }
         return null;
@@ -125,9 +125,9 @@ public class HTCondorOutputParser implements OutputParser {
                         columnList.set(4, "Er");
                     }
                     try {
-                        statusMap.put(jobID, new JobStatus(JobState.valueOf(columnList.get(4))));
+                        statusMap.put(jobID, JobStatus.newBuilder().setJobState(JobState.valueOf(columnList.get(4)).build()));
                     } catch (IndexOutOfBoundsException e) {
-                        statusMap.put(jobID, new JobStatus(JobState.valueOf("U")));
+                        statusMap.put(jobID, JobStatus.newBuilder().setJobState(JobState.valueOf("U")).build());
                     }
                     found = true;
                     break;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/JobFactory.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/JobFactory.java
index 1280de0456..7799308285 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/JobFactory.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/JobFactory.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.compute.task;
 
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
-import org.apache.airavata.model.appcatalog.computeresource.*;
+import org.apache.airavata.model.appcatalog.computeresource.proto.*;
 import org.apache.airavata.registry.api.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -116,42 +116,42 @@ public class JobFactory {
                         templateFileName,
                         ".pbs",
                         resourceJobManager.getJobManagerBinPath(),
-                        resourceJobManager.getJobManagerCommands(),
+                        resourceJobManager.getJobManagerCommandsMap(),
                         new PBSOutputParser());
             case SLURM:
                 return new SlurmJobConfiguration(
                         templateFileName,
                         ".slurm",
                         resourceJobManager.getJobManagerBinPath(),
-                        resourceJobManager.getJobManagerCommands(),
+                        resourceJobManager.getJobManagerCommandsMap(),
                         new SlurmOutputParser());
             case LSF:
                 return new LSFJobConfiguration(
                         templateFileName,
                         ".lsf",
                         resourceJobManager.getJobManagerBinPath(),
-                        resourceJobManager.getJobManagerCommands(),
+                        resourceJobManager.getJobManagerCommandsMap(),
                         new LSFOutputParser());
             case UGE:
                 return new UGEJobConfiguration(
                         templateFileName,
                         ".pbs",
                         resourceJobManager.getJobManagerBinPath(),
-                        resourceJobManager.getJobManagerCommands(),
+                        resourceJobManager.getJobManagerCommandsMap(),
                         new UGEOutputParser());
             case FORK:
                 return new ForkJobConfiguration(
                         templateFileName,
                         ".sh",
                         resourceJobManager.getJobManagerBinPath(),
-                        resourceJobManager.getJobManagerCommands(),
+                        resourceJobManager.getJobManagerCommandsMap(),
                         new ForkOutputParser());
             case HTCONDOR:
                 return new HTCondorJobConfiguration(
                         templateFileName,
                         ".submit",
                         resourceJobManager.getJobManagerBinPath(),
-                        resourceJobManager.getJobManagerCommands(),
+                        resourceJobManager.getJobManagerCommandsMap(),
                         new HTCondorOutputParser());
             case CLOUD:
                 return new CloudJobManagerConfiguration(templateFileName);
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/JobSubmissionTask.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/JobSubmissionTask.java
index 6b659cf75b..e5f7bd833d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/JobSubmissionTask.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/JobSubmissionTask.java
@@ -31,13 +31,12 @@ import org.apache.airavata.compute.util.AgentException;
 import org.apache.airavata.compute.util.CommandOutput;
 import org.apache.airavata.compute.util.JobSubmissionOutput;
 import org.apache.airavata.execution.orchestrator.AiravataTask;
-import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManager;
-import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManagerType;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ResourceJobManager;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ResourceJobManagerType;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.status.proto.JobStatus;
 import org.apache.commons.io.FileUtils;
 import org.apache.helix.HelixManager;
-import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -222,7 +221,7 @@ public abstract class JobSubmissionTask extends AiravataTask {
     }
 
     @SuppressWarnings("WeakerAccess")
-    public void saveJobModel(JobModel jobModel) throws TException {
+    public void saveJobModel(JobModel jobModel) throws Exception {
         getRegistryServiceClient().addJob(jobModel, getProcessId());
     }
 
@@ -231,22 +230,19 @@ public abstract class JobSubmissionTask extends AiravataTask {
         try {
             // first we save job jobModel to the registry for sa and then save the job status.
             JobStatus jobStatus;
-            if (jobModel.getJobStatuses() != null && !jobModel.getJobStatuses().isEmpty()) {
-                jobStatus = jobModel.getJobStatuses().get(0);
+            if (jobModel.getJobStatusesList() != null && !jobModel.getJobStatusesList().isEmpty()) {
+                jobStatus = jobModel.getJobStatusesList().get(0);
             } else {
                 logger.error("Job statuses can not be empty");
                 return;
             }
 
-            List<JobStatus> statuses = new ArrayList<>();
-            statuses.add(jobStatus);
-            jobModel.setJobStatuses(statuses);
-
-            if (jobStatus.getTimeOfStateChange() == 0 || jobStatus.getTimeOfStateChange() > 0) {
-                jobStatus.setTimeOfStateChange(
-                        AiravataUtils.getCurrentTimestamp().getTime());
-            } else {
-                jobStatus.setTimeOfStateChange(jobStatus.getTimeOfStateChange());
+            // Ensure timeOfStateChange is set
+            if (jobStatus.getTimeOfStateChange() == 0) {
+                jobStatus = jobStatus.toBuilder()
+                        .setTimeOfStateChange(
+                                AiravataUtils.getCurrentTimestamp().getTime())
+                        .build();
             }
 
             getRegistryServiceClient().addJobStatus(jobStatus, jobModel.getTaskId(), jobModel.getJobId());
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/JobUtil.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/JobUtil.java
index 9b524311d2..f0ec1fc854 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/JobUtil.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/JobUtil.java
@@ -19,7 +19,7 @@
 */
 package org.apache.airavata.compute.task;
 
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/LSFJobConfiguration.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/LSFJobConfiguration.java
index 33013254d6..7c11c35389 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/LSFJobConfiguration.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/LSFJobConfiguration.java
@@ -21,14 +21,14 @@ package org.apache.airavata.compute.task;
 
 import java.io.File;
 import java.util.Map;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
 import org.apache.commons.io.FilenameUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class LSFJobConfiguration implements JobManagerConfiguration {
     private static final Logger logger = LoggerFactory.getLogger(LSFJobConfiguration.class);
-    private final Map<JobManagerCommand, String> jobMangerCommands;
+    private final Map<Integer, String> jobMangerCommands;
     private String jobDescriptionTemplateName;
     private String scriptExtension;
     private String installedPath;
@@ -38,7 +38,7 @@ public class LSFJobConfiguration implements JobManagerConfiguration {
             String jobDescriptionTemplateName,
             String scriptExtension,
             String installedPath,
-            Map<JobManagerCommand, String> jobManagerCommands,
+            Map<Integer, String> jobManagerCommands,
             OutputParser parser) {
         this.jobDescriptionTemplateName = jobDescriptionTemplateName;
         this.scriptExtension = scriptExtension;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/LSFOutputParser.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/LSFOutputParser.java
index bd9b47f79f..2564b623bb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/LSFOutputParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/LSFOutputParser.java
@@ -25,8 +25,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import org.apache.airavata.model.status.JobState;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.status.proto.JobState;
+import org.apache.airavata.model.status.proto.JobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -79,9 +79,9 @@ public class LSFOutputParser implements OutputParser {
                     }
                     //                    lastStop = i + 1;
                     try {
-                        statusMap.put(jobID, new JobStatus(JobState.valueOf(columnList.get(2))));
+                        statusMap.put(jobID, JobStatus.newBuilder().setJobState(JobState.valueOf(columnList.get(2)).build()));
                     } catch (IndexOutOfBoundsException e) {
-                        statusMap.put(jobID, new JobStatus(JobState.valueOf("U")));
+                        statusMap.put(jobID, JobStatus.newBuilder().setJobState(JobState.valueOf("U")).build());
                     }
                     found = true;
                     break;
@@ -119,7 +119,7 @@ public class LSFOutputParser implements OutputParser {
                 + "2636607 lg11w   RUN   long       ghpcc06     c11b02      *069656647 Mar  7 00:58\n"
                 + "2636582 lg11w   RUN   long       ghpcc06     c02b01      2134490944 Mar  7 00:48";
         Map<String, JobStatus> statusMap = new HashMap<String, JobStatus>();
-        statusMap.put("2477983,2134490944", new JobStatus(JobState.UNKNOWN));
+        statusMap.put("2477983,2134490944", JobStatus.newBuilder().setJobState(JobState.UNKNOWN).build());
         LSFOutputParser lsfOutputParser = new LSFOutputParser();
         try {
             lsfOutputParser.parseJobStatuses("cjh", statusMap, test1);
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/LocalJobSubmissionTask.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/LocalJobSubmissionTask.java
index e09394262f..6b649b7a83 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/LocalJobSubmissionTask.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/LocalJobSubmissionTask.java
@@ -24,7 +24,7 @@ import org.apache.airavata.common.util.AiravataUtils;
 import org.apache.airavata.execution.orchestrator.TaskContext;
 import org.apache.airavata.execution.orchestrator.TaskDef;
 import org.apache.airavata.execution.orchestrator.TaskHelper;
-import org.apache.airavata.model.job.JobModel;
+import org.apache.airavata.model.job.proto.JobModel;
 import org.apache.helix.task.TaskResult;
 
 @TaskDef(name = "Local Job Submission")
@@ -37,12 +37,13 @@ public class LocalJobSubmissionTask extends JobSubmissionTask {
             GroovyMapData groovyMapData = new GroovyMapData();
             String jobId = "JOB_ID_" + UUID.randomUUID().toString();
 
-            JobModel jobModel = new JobModel();
-            jobModel.setProcessId(getProcessId());
-            jobModel.setWorkingDir(groovyMapData.getWorkingDirectory());
-            jobModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-            jobModel.setTaskId(getTaskId());
-            jobModel.setJobId(jobId);
+            JobModel jobModel = JobModel.newBuilder()
+                    .setProcessId(getProcessId())
+                    .setWorkingDir(groovyMapData.getWorkingDirectory())
+                    .setCreationTime(AiravataUtils.getCurrentTimestamp().getTime())
+                    .setTaskId(getTaskId())
+                    .setJobId(jobId)
+                    .build();
 
             return null;
         } catch (Exception e) {
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/OutputParser.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/OutputParser.java
index 68dfa0a5a2..fdf41f4080 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/OutputParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/OutputParser.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.compute.task;
 
 import java.util.Map;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.status.proto.JobStatus;
 
 public interface OutputParser {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/PBSJobConfiguration.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/PBSJobConfiguration.java
index 1f362c9b7a..35dbc286fd 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/PBSJobConfiguration.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/PBSJobConfiguration.java
@@ -21,12 +21,12 @@ package org.apache.airavata.compute.task;
 
 import java.io.File;
 import java.util.Map;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
 import org.apache.commons.io.FilenameUtils;
 
 public class PBSJobConfiguration implements JobManagerConfiguration {
 
-    private final Map<JobManagerCommand, String> jobManagerCommands;
+    private final Map<Integer, String> jobManagerCommands;
     private String jobDescriptionTemplateName;
     private String scriptExtension;
     private String installedPath;
@@ -36,7 +36,7 @@ public class PBSJobConfiguration implements JobManagerConfiguration {
             String jobDescriptionTemplateName,
             String scriptExtension,
             String installedPath,
-            Map<JobManagerCommand, String> jobManagerCommands,
+            Map<Integer, String> jobManagerCommands,
             OutputParser parser) {
         this.jobDescriptionTemplateName = jobDescriptionTemplateName;
         this.scriptExtension = scriptExtension;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/PBSOutputParser.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/PBSOutputParser.java
index 46042d212b..85664d4a01 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/PBSOutputParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/PBSOutputParser.java
@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.status.proto.JobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -70,7 +70,7 @@ public class PBSOutputParser implements OutputParser {
                     line = anInfo.split("=", 2);
                     if (line.length != 0) {
                         if (line[0].contains("job_state")) {
-                            return new JobStatus(JobUtil.getJobState(line[1].replaceAll(" ", "")));
+                            return JobStatus.newBuilder().setJobState(JobUtil.getJobState(line[1].replaceAll(" ", "")).build());
                         }
                     }
                 }
@@ -100,9 +100,9 @@ public class PBSOutputParser implements OutputParser {
                     }
                     //                    lastStop = i + 1;
                     try {
-                        statusMap.put(jobID, new JobStatus(JobUtil.getJobState(columnList.get(9))));
+                        statusMap.put(jobID, JobStatus.newBuilder().setJobState(JobUtil.getJobState(columnList.get(9)).build()));
                     } catch (IndexOutOfBoundsException e) {
-                        statusMap.put(jobID, new JobStatus(JobUtil.getJobState("U")));
+                        statusMap.put(jobID, JobStatus.newBuilder().setJobState(JobUtil.getJobState("U")).build());
                     }
                     found = true;
                     break;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/SlurmJobConfiguration.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/SlurmJobConfiguration.java
index 36826e22a0..250c29e480 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/SlurmJobConfiguration.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/SlurmJobConfiguration.java
@@ -21,11 +21,11 @@ package org.apache.airavata.compute.task;
 
 import java.io.File;
 import java.util.Map;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
 import org.apache.commons.io.FilenameUtils;
 
 public class SlurmJobConfiguration implements JobManagerConfiguration {
-    private final Map<JobManagerCommand, String> jMCommands;
+    private final Map<Integer, String> jMCommands;
     private String jobDescriptionTemplateName;
     private String scriptExtension;
     private String installedPath;
@@ -35,7 +35,7 @@ public class SlurmJobConfiguration implements JobManagerConfiguration {
             String jobDescriptionTemplateName,
             String scriptExtension,
             String installedPath,
-            Map<JobManagerCommand, String> jobManagerCommands,
+            Map<Integer, String> jobManagerCommands,
             OutputParser parser) {
         this.jobDescriptionTemplateName = jobDescriptionTemplateName;
         this.scriptExtension = scriptExtension;
@@ -51,7 +51,7 @@ public class SlurmJobConfiguration implements JobManagerConfiguration {
 
     public RawCommandInfo getCancelCommand(String jobID) {
         return new RawCommandInfo(
-                this.installedPath + jMCommands.get(JobManagerCommand.DELETION).trim() + " " + jobID);
+                this.installedPath + jMCommands.get(JobManagerCommand.DELETION.getNumber()).trim() + " " + jobID);
     }
 
     public String getJobDescriptionTemplateName() {
@@ -64,7 +64,7 @@ public class SlurmJobConfiguration implements JobManagerConfiguration {
 
     public RawCommandInfo getMonitorCommand(String jobID) {
         return new RawCommandInfo(this.installedPath
-                + jMCommands.get(JobManagerCommand.JOB_MONITORING).trim() + " -j " + jobID);
+                + jMCommands.get(JobManagerCommand.JOB_MONITORING.getNumber()).trim() + " -j " + jobID);
     }
 
     public String getScriptExtension() {
@@ -73,7 +73,7 @@ public class SlurmJobConfiguration implements JobManagerConfiguration {
 
     public RawCommandInfo getSubmitCommand(String workingDirectory, String pbsFilePath) {
         return new RawCommandInfo(this.installedPath
-                + jMCommands.get(JobManagerCommand.SUBMISSION).trim() + " " + workingDirectory + File.separator
+                + jMCommands.get(JobManagerCommand.SUBMISSION.getNumber()).trim() + " " + workingDirectory + File.separator
                 + FilenameUtils.getName(pbsFilePath));
     }
 
@@ -95,33 +95,33 @@ public class SlurmJobConfiguration implements JobManagerConfiguration {
 
     public RawCommandInfo getUserBasedMonitorCommand(String userName) {
         return new RawCommandInfo(this.installedPath
-                + jMCommands.get(JobManagerCommand.JOB_MONITORING).trim() + " -u " + userName);
+                + jMCommands.get(JobManagerCommand.JOB_MONITORING.getNumber()).trim() + " -u " + userName);
     }
 
     @Override
     public RawCommandInfo getJobIdMonitorCommand(String jobName, String userName) {
         return new RawCommandInfo(this.installedPath
-                + jMCommands.get(JobManagerCommand.JOB_MONITORING).trim() + " -n " + jobName + " -u " + userName);
+                + jMCommands.get(JobManagerCommand.JOB_MONITORING.getNumber()).trim() + " -n " + jobName + " -u " + userName);
     }
 
     @Override
     public String getBaseCancelCommand() {
-        return jMCommands.get(JobManagerCommand.DELETION).trim();
+        return jMCommands.get(JobManagerCommand.DELETION.getNumber()).trim();
     }
 
     @Override
     public String getBaseMonitorCommand() {
-        return jMCommands.get(JobManagerCommand.JOB_MONITORING).trim();
+        return jMCommands.get(JobManagerCommand.JOB_MONITORING.getNumber()).trim();
     }
 
     @Override
     public String getBaseSubmitCommand() {
-        return jMCommands.get(JobManagerCommand.SUBMISSION).trim();
+        return jMCommands.get(JobManagerCommand.SUBMISSION.getNumber()).trim();
     }
 
     @Override
     public String getLivenessCheckCommand(String queueName, String projectNumber) {
-        String command = jMCommands.get(JobManagerCommand.SHOW_CLUSTER_INFO).trim() + " --account"
+        String command = jMCommands.get(JobManagerCommand.SHOW_CLUSTER_INFO.getNumber()).trim() + " --account"
                 + projectNumber + " --partition "
                 + queueName;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/SlurmOutputParser.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/SlurmOutputParser.java
index 3ae56d9ead..88aaa8a684 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/SlurmOutputParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/SlurmOutputParser.java
@@ -24,8 +24,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import org.apache.airavata.model.status.JobState;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.status.proto.JobState;
+import org.apache.airavata.model.status.proto.JobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,7 +63,7 @@ public class SlurmOutputParser implements OutputParser {
         Pattern pattern = Pattern.compile(jobID + "(?=\\s+\\S+\\s+\\S+\\s+\\S+\\s+(?<" + STATUS + ">\\w+))");
         Matcher matcher = pattern.matcher(rawOutput);
         if (matcher.find()) {
-            return new JobStatus(JobUtil.getJobState(matcher.group(STATUS)));
+            return JobStatus.newBuilder().setJobState(JobUtil.getJobState(matcher.group(STATUS)).build());
         }
         return null;
     }
@@ -94,9 +94,9 @@ public class SlurmOutputParser implements OutputParser {
                         }
                     }
                     try {
-                        statusMap.put(jobID, new JobStatus(JobState.valueOf(columnList.get(4))));
+                        statusMap.put(jobID, JobStatus.newBuilder().setJobState(JobState.valueOf(columnList.get(4)).build()));
                     } catch (IndexOutOfBoundsException e) {
-                        statusMap.put(jobID, new JobStatus(JobState.valueOf("U")));
+                        statusMap.put(jobID, JobStatus.newBuilder().setJobState(JobState.valueOf("U")).build());
                     }
                     found = true;
                     break;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/UGEJobConfiguration.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/UGEJobConfiguration.java
index 24dc16cab6..e72d57c06c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/UGEJobConfiguration.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/UGEJobConfiguration.java
@@ -21,11 +21,11 @@ package org.apache.airavata.compute.task;
 
 import java.io.File;
 import java.util.Map;
-import org.apache.airavata.model.appcatalog.computeresource.JobManagerCommand;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobManagerCommand;
 import org.apache.commons.io.FilenameUtils;
 
 public class UGEJobConfiguration implements JobManagerConfiguration {
-    private final Map<JobManagerCommand, String> jobManagerCommands;
+    private final Map<Integer, String> jobManagerCommands;
     private String jobDescriptionTemplateName;
     private String scriptExtension;
     private String installedPath;
@@ -35,7 +35,7 @@ public class UGEJobConfiguration implements JobManagerConfiguration {
             String jobDescriptionTemplateName,
             String scriptExtension,
             String installedPath,
-            Map<JobManagerCommand, String> jobManagerCommands,
+            Map<Integer, String> jobManagerCommands,
             OutputParser parser) {
         this.jobDescriptionTemplateName = jobDescriptionTemplateName;
         this.scriptExtension = scriptExtension;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/UGEOutputParser.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/UGEOutputParser.java
index 140f0edd3b..6a57d7ee17 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/UGEOutputParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/UGEOutputParser.java
@@ -24,8 +24,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import org.apache.airavata.model.status.JobState;
-import org.apache.airavata.model.status.JobStatus;
+import org.apache.airavata.model.status.proto.JobState;
+import org.apache.airavata.model.status.proto.JobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -55,9 +55,9 @@ public class UGEOutputParser implements OutputParser {
         Pattern pattern = Pattern.compile("job_number:[\\s]+" + jobID);
         Matcher matcher = pattern.matcher(rawOutput);
         if (matcher.find()) {
-            return new JobStatus(JobState.QUEUED); // fixme; return correct status.
+            return JobStatus.newBuilder().setJobState(JobState.QUEUED).build(); // fixme; return correct status.
         }
-        return new JobStatus(JobState.UNKNOWN);
+        return JobStatus.newBuilder().setJobState(JobState.UNKNOWN).build();
     }
 
     public void parseJobStatuses(String userName, Map<String, JobStatus> statusMap, String rawOutput) {
@@ -83,7 +83,7 @@ public class UGEOutputParser implements OutputParser {
                         // to avoid that we make a small tweek to the job status
                         columnList.set(4, "Er");
                     }
-                    statusMap.put(jobID, new JobStatus(JobState.valueOf(columnList.get(4))));
+                    statusMap.put(jobID, JobStatus.newBuilder().setJobState(JobState.valueOf(columnList.get(4)).build()));
                     break;
                 }
             }
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSCompletingTask.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSCompletingTask.java
index 3d0d20da3b..492f888752 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSCompletingTask.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSCompletingTask.java
@@ -23,7 +23,7 @@ import org.apache.airavata.execution.orchestrator.AiravataTask;
 import org.apache.airavata.execution.orchestrator.TaskContext;
 import org.apache.airavata.execution.orchestrator.TaskDef;
 import org.apache.airavata.execution.orchestrator.TaskHelper;
-import org.apache.airavata.model.status.ProcessState;
+import org.apache.airavata.model.status.proto.ProcessState;
 import org.apache.helix.task.TaskResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSJobSubmissionTask.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSJobSubmissionTask.java
index 7ba9f175d4..2ffb6d0214 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSJobSubmissionTask.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSJobSubmissionTask.java
@@ -37,15 +37,14 @@ import org.apache.airavata.compute.util.SSHJAgentAdaptor;
 import org.apache.airavata.execution.orchestrator.TaskContext;
 import org.apache.airavata.execution.orchestrator.TaskDef;
 import org.apache.airavata.execution.orchestrator.TaskHelper;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.AwsComputeResourcePreference;
-import org.apache.airavata.model.credential.store.SSHCredential;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.status.JobState;
-import org.apache.airavata.model.status.JobStatus;
-import org.apache.airavata.model.status.ProcessState;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.AwsComputeResourcePreference;
+import org.apache.airavata.model.credential.store.proto.SSHCredential;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.status.proto.JobState;
+import org.apache.airavata.model.status.proto.JobStatus;
+import org.apache.airavata.model.status.proto.ProcessState;
 import org.apache.commons.io.FileUtils;
 import org.apache.helix.task.TaskResult;
-import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import software.amazon.awssdk.services.ec2.Ec2Client;
@@ -112,7 +111,10 @@ public class AWSJobSubmissionTask extends JobSubmissionTask {
                     "aws-job-" + new SecureRandom().nextInt() + jobManagerConfig.getScriptExtension());
             FileUtils.writeStringToFile(localScriptFile, scriptContent, StandardCharsets.UTF_8);
 
-            jobModel.setJobStatuses(Collections.singletonList(new JobStatus(JobState.QUEUED)));
+            jobModel = jobModel.toBuilder()
+                    .clearJobStatuses()
+                    .addJobStatuses(JobStatus.newBuilder().setJobState(JobState.QUEUED).build())
+                    .build();
             saveJobModel(jobModel);
             saveAndPublishJobStatus(jobModel);
 
@@ -136,7 +138,10 @@ public class AWSJobSubmissionTask extends JobSubmissionTask {
                 return onFail(reason, false, e);
             }
 
-            jobModel.setJobStatuses(Collections.singletonList(new JobStatus(JobState.ACTIVE)));
+            jobModel = jobModel.toBuilder()
+                    .clearJobStatuses()
+                    .addJobStatuses(JobStatus.newBuilder().setJobState(JobState.ACTIVE).build())
+                    .build();
             saveJobModel(jobModel);
             saveAndPublishJobStatus(jobModel);
 
@@ -280,39 +285,42 @@ public class AWSJobSubmissionTask extends JobSubmissionTask {
         }
     }
 
-    private TaskResult handleJobSubmissionFailure(GroovyMapData mapData, String reason) throws TException {
+    private TaskResult handleJobSubmissionFailure(GroovyMapData mapData, String reason) throws Exception {
         LOGGER.error(reason);
-        JobModel jobModel = new JobModel();
-        jobModel.setProcessId(getProcessId());
-        jobModel.setWorkingDir(mapData.getWorkingDirectory());
-        jobModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-        jobModel.setTaskId(getTaskId());
-        jobModel.setJobName(mapData.getJobName());
-
-        JobStatus jobStatus = new JobStatus(JobState.FAILED);
-        jobStatus.setReason(reason);
-        jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-        jobModel.setJobStatuses(Collections.singletonList(jobStatus));
+        JobStatus jobStatus = JobStatus.newBuilder()
+                .setJobState(JobState.FAILED)
+                .setReason(reason)
+                .setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime())
+                .build();
+        JobModel jobModel = JobModel.newBuilder()
+                .setProcessId(getProcessId())
+                .setWorkingDir(mapData.getWorkingDirectory())
+                .setCreationTime(AiravataUtils.getCurrentTimestamp().getTime())
+                .setTaskId(getTaskId())
+                .setJobName(mapData.getJobName())
+                .addJobStatuses(jobStatus)
+                .build();
 
         saveJobModel(jobModel);
         return onFail(reason, false, null);
     }
 
     private JobModel createJobModel(GroovyMapData mapData, String jobScript) throws Exception {
-        JobModel jobModel = new JobModel();
-        jobModel.setJobId("DEFAULT_JOB_ID");
-        jobModel.setProcessId(getProcessId());
-        jobModel.setWorkingDir(mapData.getWorkingDirectory());
-        jobModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-        jobModel.setTaskId(getTaskId());
-        jobModel.setJobName(mapData.getJobName());
-        jobModel.setJobDescription(jobScript);
-
-        JobStatus jobStatus = new JobStatus(JobState.SUBMITTED);
-        jobStatus.setReason("Job submitted to EC2 instance with PID: " + "DEFAULT_JOB_ID");
-        jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-
-        jobModel.setJobStatuses(Collections.singletonList(jobStatus));
+        JobStatus jobStatus = JobStatus.newBuilder()
+                .setJobState(JobState.SUBMITTED)
+                .setReason("Job submitted to EC2 instance with PID: " + "DEFAULT_JOB_ID")
+                .setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime())
+                .build();
+        JobModel jobModel = JobModel.newBuilder()
+                .setJobId("DEFAULT_JOB_ID")
+                .setProcessId(getProcessId())
+                .setWorkingDir(mapData.getWorkingDirectory())
+                .setCreationTime(AiravataUtils.getCurrentTimestamp().getTime())
+                .setTaskId(getTaskId())
+                .setJobName(mapData.getJobName())
+                .setJobDescription(jobScript)
+                .addJobStatuses(jobStatus)
+                .build();
 
         saveJobModel(jobModel);
         saveAndPublishJobStatus(jobModel);
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSProcessContextManager.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSProcessContextManager.java
index d8c1f7764d..968ceebdc2 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSProcessContextManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSProcessContextManager.java
@@ -26,9 +26,8 @@ import java.util.HashMap;
 import java.util.Map;
 import org.apache.airavata.compute.util.AgentUtils;
 import org.apache.airavata.execution.orchestrator.TaskContext;
-import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,7 +61,7 @@ public class AWSProcessContextManager {
         return getContextMap().get(AWS_INSTANCE_ID_KEY);
     }
 
-    public void saveInstanceId(String instanceId) throws TException, IOException {
+    public void saveInstanceId(String instanceId) throws Exception, IOException {
         updateContext(AWS_INSTANCE_ID_KEY, instanceId);
     }
 
@@ -70,7 +69,7 @@ public class AWSProcessContextManager {
         return getContextMap().get(AWS_SECURITY_GROUP_ID_KEY);
     }
 
-    public void saveSecurityGroupId(String securityGroupId) throws TException, IOException {
+    public void saveSecurityGroupId(String securityGroupId) throws Exception, IOException {
         updateContext(AWS_SECURITY_GROUP_ID_KEY, securityGroupId);
     }
 
@@ -78,7 +77,7 @@ public class AWSProcessContextManager {
         return getContextMap().get(AWS_KEY_PAIR_NAME_KEY);
     }
 
-    public void saveKeyPairName(String keyPairName) throws TException, IOException {
+    public void saveKeyPairName(String keyPairName) throws Exception, IOException {
         updateContext(AWS_KEY_PAIR_NAME_KEY, keyPairName);
     }
 
@@ -86,7 +85,7 @@ public class AWSProcessContextManager {
         return getContextMap().get(AWS_SSH_CREDENTIAL_TOKEN);
     }
 
-    public void saveSSHCredentialToken(String credentialToken) throws TException, IOException {
+    public void saveSSHCredentialToken(String credentialToken) throws Exception, IOException {
         updateContext(AWS_SSH_CREDENTIAL_TOKEN, credentialToken);
     }
 
@@ -94,7 +93,7 @@ public class AWSProcessContextManager {
         return getContextMap().get(AWS_PUBLIC_IP);
     }
 
-    public void savePublicIp(String publicIp) throws TException, IOException {
+    public void savePublicIp(String publicIp) throws Exception, IOException {
         updateContext(AWS_PUBLIC_IP, publicIp);
     }
 
@@ -102,11 +101,11 @@ public class AWSProcessContextManager {
         return getContextMap().get(AWS_JOB_ID);
     }
 
-    public void saveJobId(String jobId) throws TException, IOException {
+    public void saveJobId(String jobId) throws Exception, IOException {
         updateContext(AWS_JOB_ID, jobId);
     }
 
-    public void cleanup() throws TException, IOException {
+    public void cleanup() throws Exception, IOException {
         updateContext(AWS_INSTANCE_ID_KEY, null);
         updateContext(AWS_SECURITY_GROUP_ID_KEY, null);
         updateContext(AWS_KEY_PAIR_NAME_KEY, null);
@@ -120,11 +119,13 @@ public class AWSProcessContextManager {
         return MAPPER.readValue(jsonContext, new TypeReference<>() {});
     }
 
-    private void updateContext(String key, String value) throws TException, IOException {
+    private void updateContext(String key, String value) throws Exception, IOException {
         Map<String, String> contextMap = getContextMap();
         contextMap.put(key, value);
-        ProcessModel processModel = taskContext.getProcessModel();
-        processModel.setProcessDetail(MAPPER.writeValueAsString(contextMap));
+        ProcessModel processModel = taskContext.getProcessModel()
+                .toBuilder()
+                .setProcessDetail(MAPPER.writeValueAsString(contextMap))
+                .build();
         registryClient.updateProcess(processModel, processId);
         LOGGER.info("Updated process detail for process {} with key '{}'", processId, key);
     }
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSTaskUtil.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSTaskUtil.java
index c019d5d598..b40c0d2aad 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSTaskUtil.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/AWSTaskUtil.java
@@ -22,8 +22,8 @@ package org.apache.airavata.compute.task.aws;
 import java.util.concurrent.TimeUnit;
 import org.apache.airavata.compute.util.AgentUtils;
 import org.apache.airavata.execution.orchestrator.TaskContext;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.AwsComputeResourcePreference;
-import org.apache.airavata.model.credential.store.PasswordCredential;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.AwsComputeResourcePreference;
+import org.apache.airavata.model.credential.store.proto.PasswordCredential;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/CreateEC2InstanceTask.java b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/CreateEC2InstanceTask.java
index d37561baf5..d47e54e6a2 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/CreateEC2InstanceTask.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/task/aws/CreateEC2InstanceTask.java
@@ -27,8 +27,8 @@ import org.apache.airavata.execution.orchestrator.AiravataTask;
 import org.apache.airavata.execution.orchestrator.TaskContext;
 import org.apache.airavata.execution.orchestrator.TaskDef;
 import org.apache.airavata.execution.orchestrator.TaskHelper;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.AwsComputeResourcePreference;
-import org.apache.airavata.model.credential.store.SSHCredential;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.AwsComputeResourcePreference;
+import org.apache.airavata.model.credential.store.proto.SSHCredential;
 import org.apache.helix.task.TaskResult;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.slf4j.Logger;
@@ -133,12 +133,13 @@ public class CreateEC2InstanceTask extends AiravataTask {
     }
 
     private String saveSSHCredential(String privateKey, String publicKey) throws Exception {
-        SSHCredential credential = new SSHCredential();
-        credential.setGatewayId(getGatewayId());
-        credential.setToken(UUID.randomUUID().toString());
-        credential.setPrivateKey(privateKey);
-        credential.setPublicKey(publicKey);
-        credential.setUsername(getProcessModel().getUserName());
+        SSHCredential credential = SSHCredential.newBuilder()
+                .setGatewayId(getGatewayId())
+                .setToken(UUID.randomUUID().toString())
+                .setPrivateKey(privateKey)
+                .setPublicKey(publicKey)
+                .setUsername(getProcessModel().getUserName())
+                .build();
 
         String savedToken = AgentUtils.getCredentialClient().addSSHCredential(credential);
         LOGGER.info("Successfully saved temporary SSH credential with token {}", savedToken);
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/util/AgentAdaptor.java b/airavata-api/src/main/java/org/apache/airavata/compute/util/AgentAdaptor.java
index 8a7f9ef44c..080a35ddf1 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/util/AgentAdaptor.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/util/AgentAdaptor.java
@@ -22,8 +22,8 @@ package org.apache.airavata.compute.util;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.List;
-import org.apache.airavata.model.appcatalog.storageresource.StorageDirectoryInfo;
-import org.apache.airavata.model.appcatalog.storageresource.StorageVolumeInfo;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageDirectoryInfo;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageVolumeInfo;
 import org.apache.airavata.storage.util.FileMetadata;
 
 /**
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/util/AppDeploymentUtil.java b/airavata-api/src/main/java/org/apache/airavata/compute/util/AppDeploymentUtil.java
index 21db76bd9d..af4b4d706f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/util/AppDeploymentUtil.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/util/AppDeploymentUtil.java
@@ -19,8 +19,8 @@
 */
 package org.apache.airavata.compute.util;
 
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription;
-import org.apache.airavata.model.appcatalog.appdeployment.SetEnvPaths;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationDeploymentDescription;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.SetEnvPaths;
 
 public class AppDeploymentUtil {
     public static ApplicationDeploymentDescription createAppDeployment(
@@ -29,18 +29,18 @@ public class AppDeploymentUtil {
             String executablePath,
             String appDepDescription,
             String moduleLoadCmd) {
-        ApplicationDeploymentDescription description = new ApplicationDeploymentDescription();
-        description.setAppModuleId(moduleId);
-        description.setComputeHostId(computeHost);
-        description.setExecutablePath(executablePath);
-        description.setAppDeploymentDescription(appDepDescription);
-        return description;
+        return ApplicationDeploymentDescription.newBuilder()
+                .setAppModuleId(moduleId)
+                .setComputeHostId(computeHost)
+                .setExecutablePath(executablePath)
+                .setAppDeploymentDescription(appDepDescription)
+                .build();
     }
 
     public static SetEnvPaths createEnvPath(String name, String val) {
-        SetEnvPaths setEnvPaths = new SetEnvPaths();
-        setEnvPaths.setName(name);
-        setEnvPaths.setValue(val);
-        return setEnvPaths;
+        return SetEnvPaths.newBuilder()
+                .setName(name)
+                .setValue(val)
+                .build();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/util/AppInterfaceUtil.java b/airavata-api/src/main/java/org/apache/airavata/compute/util/AppInterfaceUtil.java
index d5934a0bdb..dba4dacf06 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/util/AppInterfaceUtil.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/util/AppInterfaceUtil.java
@@ -20,10 +20,10 @@
 package org.apache.airavata.compute.util;
 
 import java.util.List;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.application.io.DataType;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
+import org.apache.airavata.model.appcatalog.appinterface.proto.ApplicationInterfaceDescription;
+import org.apache.airavata.model.application.io.proto.DataType;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
 
 public class AppInterfaceUtil {
     public static ApplicationInterfaceDescription createAppInterface(
@@ -31,12 +31,12 @@ public class AppInterfaceUtil {
             List<String> appModules,
             List<InputDataObjectType> appInputs,
             List<OutputDataObjectType> appOutputs) {
-        ApplicationInterfaceDescription interfaceDescription = new ApplicationInterfaceDescription();
-        interfaceDescription.setApplicationName(applicationName);
-        interfaceDescription.setApplicationModules(appModules);
-        interfaceDescription.setApplicationInputs(appInputs);
-        interfaceDescription.setApplicationOutputs(appOutputs);
-        return interfaceDescription;
+        return ApplicationInterfaceDescription.newBuilder()
+                .setApplicationName(applicationName)
+                .addAllApplicationModules(appModules)
+                .addAllApplicationInputs(appInputs)
+                .addAllApplicationOutputs(appOutputs)
+                .build();
     }
 
     public static InputDataObjectType createApplicationInput(
@@ -48,23 +48,23 @@ public class AppInterfaceUtil {
             boolean standardInput,
             String userFriendlyDesc,
             String metadata) {
-        InputDataObjectType appInput = new InputDataObjectType();
-        appInput.setName(name);
-        appInput.setValue(value);
-        appInput.setType(type);
-        appInput.setMetaData(metadata);
-        appInput.setApplicationArgument(applicationArgument);
-        appInput.setInputOrder(order);
-        appInput.setUserFriendlyDescription(userFriendlyDesc);
-        appInput.setStandardInput(standardInput);
-        return appInput;
+        return InputDataObjectType.newBuilder()
+                .setName(name)
+                .setValue(value)
+                .setType(type)
+                .setMetaData(metadata)
+                .setApplicationArgument(applicationArgument)
+                .setInputOrder(order)
+                .setUserFriendlyDescription(userFriendlyDesc)
+                .setStandardInput(standardInput)
+                .build();
     }
 
     public static OutputDataObjectType createApplicationOutput(String name, String value, DataType type) {
-        OutputDataObjectType appOutput = new OutputDataObjectType();
-        appOutput.setName(name);
-        appOutput.setValue(value);
-        appOutput.setType(type);
-        return appOutput;
+        return OutputDataObjectType.newBuilder()
+                .setName(name)
+                .setValue(value)
+                .setType(type)
+                .build();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/util/GroupComputeResourcePreferenceUtil.java b/airavata-api/src/main/java/org/apache/airavata/compute/util/GroupComputeResourcePreferenceUtil.java
index 68602790b3..73e3d94642 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/util/GroupComputeResourcePreferenceUtil.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/util/GroupComputeResourcePreferenceUtil.java
@@ -19,11 +19,11 @@
 */
 package org.apache.airavata.compute.util;
 
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourceReservation;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.EnvironmentSpecificPreferences;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.SlurmComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourceReservation;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.EnvironmentSpecificPreferences;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ResourceType;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.SlurmComputeResourcePreference;
 
 public class GroupComputeResourcePreferenceUtil {
 
@@ -36,18 +36,18 @@ public class GroupComputeResourcePreferenceUtil {
         }
 
         EnvironmentSpecificPreferences esp = groupComputeResourcePreference.getSpecificPreferences();
-        if (esp == null || !esp.isSetSlurm()) {
+        if (esp == null || !esp.hasSlurm()) {
             return null;
         }
 
         SlurmComputeResourcePreference slurm = esp.getSlurm();
-        if (!slurm.isSetReservations() || slurm.getReservationsSize() == 0) {
+        if (slurm.getReservationsList().isEmpty()) {
             return null;
         }
 
         long now = System.currentTimeMillis();
-        for (ComputeResourceReservation reservation : slurm.getReservations()) {
-            if (reservation.getQueueNames().contains(queueName)
+        for (ComputeResourceReservation reservation : slurm.getReservationsList()) {
+            if (reservation.getQueueNamesList().contains(queueName)
                     && now > reservation.getStartTime()
                     && now < reservation.getEndTime()) {
                 return reservation;
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/util/SSHJAgentAdaptor.java b/airavata-api/src/main/java/org/apache/airavata/compute/util/SSHJAgentAdaptor.java
index cbeedd190f..e8171e9b42 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/util/SSHJAgentAdaptor.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/util/SSHJAgentAdaptor.java
@@ -42,13 +42,13 @@ import net.schmizz.sshj.xfer.FilePermission;
 import net.schmizz.sshj.xfer.LocalDestFile;
 import net.schmizz.sshj.xfer.LocalFileFilter;
 import net.schmizz.sshj.xfer.LocalSourceFile;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.appcatalog.computeresource.SSHJobSubmission;
-import org.apache.airavata.model.appcatalog.storageresource.StorageDirectoryInfo;
-import org.apache.airavata.model.appcatalog.storageresource.StorageVolumeInfo;
-import org.apache.airavata.model.credential.store.SSHCredential;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionInterface;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.SSHJobSubmission;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageDirectoryInfo;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageVolumeInfo;
+import org.apache.airavata.model.credential.store.proto.SSHCredential;
 import org.apache.airavata.storage.util.FileMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -723,9 +723,10 @@ public class SSHJAgentAdaptor implements AgentAdaptor {
 
             long numberOfKBytes = Long.parseLong(numberOfKBytesStr);
 
-            StorageDirectoryInfo storageDirectoryInfo = new StorageDirectoryInfo();
-            storageDirectoryInfo.setTotalSizeBytes(numberOfKBytes * 1024);
-            storageDirectoryInfo.setTotalSize(numberOfKBytes + "kb");
+            StorageDirectoryInfo storageDirectoryInfo = StorageDirectoryInfo.newBuilder()
+                    .setTotalSizeBytes(numberOfKBytes * 1024)
+                    .setTotalSize(numberOfKBytes + "kb")
+                    .build();
             return storageDirectoryInfo;
 
         } catch (Exception e) {
@@ -794,16 +795,17 @@ public class SSHJAgentAdaptor implements AgentAdaptor {
 
             double percentageUsed = Double.parseDouble(capacityStr);
 
-            StorageVolumeInfo volumeInfo = new StorageVolumeInfo();
-            volumeInfo.setTotalSize(totalSizeHuman);
-            volumeInfo.setUsedSize(usedSizeHuman);
-            volumeInfo.setAvailableSize(availableSizeHuman);
-            volumeInfo.setTotalSizeBytes(totalSizeBytes);
-            volumeInfo.setUsedSizeBytes(usedSizeBytes);
-            volumeInfo.setAvailableSizeBytes(availableSizeBytes);
-            volumeInfo.setPercentageUsed(percentageUsed);
-            volumeInfo.setMountPoint(mountPoint);
-            volumeInfo.setFilesystemType(filesystemType);
+            StorageVolumeInfo volumeInfo = StorageVolumeInfo.newBuilder()
+                    .setTotalSize(totalSizeHuman)
+                    .setUsedSize(usedSizeHuman)
+                    .setAvailableSize(availableSizeHuman)
+                    .setTotalSizeBytes(totalSizeBytes)
+                    .setUsedSizeBytes(usedSizeBytes)
+                    .setAvailableSizeBytes(availableSizeBytes)
+                    .setPercentageUsed(percentageUsed)
+                    .setMountPoint(mountPoint)
+                    .setFilesystemType(filesystemType)
+                    .build();
 
             return volumeInfo;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/util/SshAgentAdaptor.java b/airavata-api/src/main/java/org/apache/airavata/compute/util/SshAgentAdaptor.java
index 7984a027d4..a5d6be0b05 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/util/SshAgentAdaptor.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/util/SshAgentAdaptor.java
@@ -24,10 +24,10 @@ import java.io.*;
 import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
-import org.apache.airavata.model.appcatalog.computeresource.*;
-import org.apache.airavata.model.appcatalog.storageresource.StorageDirectoryInfo;
-import org.apache.airavata.model.appcatalog.storageresource.StorageVolumeInfo;
-import org.apache.airavata.model.credential.store.SSHCredential;
+import org.apache.airavata.model.appcatalog.computeresource.proto.*;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageDirectoryInfo;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageVolumeInfo;
+import org.apache.airavata.model.credential.store.proto.SSHCredential;
 import org.apache.airavata.storage.util.FileMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/credential/task/EnvSetupTask.java b/airavata-api/src/main/java/org/apache/airavata/credential/task/EnvSetupTask.java
index 582c2c4e8e..1557f2c37b 100644
--- a/airavata-api/src/main/java/org/apache/airavata/credential/task/EnvSetupTask.java
+++ b/airavata-api/src/main/java/org/apache/airavata/credential/task/EnvSetupTask.java
@@ -25,7 +25,7 @@ import org.apache.airavata.execution.orchestrator.AiravataTask;
 import org.apache.airavata.execution.orchestrator.TaskContext;
 import org.apache.airavata.execution.orchestrator.TaskDef;
 import org.apache.airavata.execution.orchestrator.TaskHelper;
-import org.apache.airavata.model.status.ProcessState;
+import org.apache.airavata.model.status.proto.ProcessState;
 import org.apache.helix.task.TaskResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServerHandler.java b/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServerHandler.java
index 8d4b5f100a..858984c06e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServerHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServerHandler.java
@@ -30,53 +30,53 @@ import org.apache.airavata.execution.repository.WorkflowRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.cpi.*;
 import org.apache.airavata.execution.util.cpi.Constants;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationModule;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.*;
-import org.apache.airavata.model.appcatalog.gatewaygroups.GatewayGroups;
-import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
-import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.BatchQueueResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.appcatalog.parser.Parser;
-import org.apache.airavata.model.appcatalog.parser.ParserInput;
-import org.apache.airavata.model.appcatalog.parser.ParserOutput;
-import org.apache.airavata.model.appcatalog.parser.ParsingTemplate;
-import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserResourceProfile;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserStoragePreference;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.commons.ErrorModel;
-import org.apache.airavata.model.data.movement.*;
-import org.apache.airavata.model.data.movement.DMType;
-import org.apache.airavata.model.data.replica.DataProductModel;
-import org.apache.airavata.model.data.replica.DataReplicaLocationModel;
-import org.apache.airavata.model.error.*;
-import org.apache.airavata.model.experiment.*;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.process.ProcessWorkflow;
-import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
-import org.apache.airavata.model.status.*;
-import org.apache.airavata.model.task.TaskModel;
-import org.apache.airavata.model.user.UserProfile;
-import org.apache.airavata.model.workspace.Gateway;
-import org.apache.airavata.model.workspace.GatewayUsageReportingCommand;
-import org.apache.airavata.model.workspace.Notification;
-import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationDeploymentDescription;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationModule;
+import org.apache.airavata.model.appcatalog.appinterface.proto.ApplicationInterfaceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.*;
+import org.apache.airavata.model.appcatalog.gatewaygroups.proto.GatewayGroups;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.ComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.GatewayResourceProfile;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.StoragePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.BatchQueueResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupResourceProfile;
+import org.apache.airavata.model.appcatalog.parser.proto.Parser;
+import org.apache.airavata.model.appcatalog.parser.proto.ParserInput;
+import org.apache.airavata.model.appcatalog.parser.proto.ParserOutput;
+import org.apache.airavata.model.appcatalog.parser.proto.ParsingTemplate;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageResourceDescription;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserResourceProfile;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserStoragePreference;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.commons.proto.ErrorModel;
+import org.apache.airavata.model.data.movement.proto.*;
+import org.apache.airavata.model.data.movement.proto.DMType;
+import org.apache.airavata.model.data.replica.proto.DataProductModel;
+import org.apache.airavata.model.data.replica.proto.DataReplicaLocationModel;
+import org.apache.airavata.model.error.proto.*;
+import org.apache.airavata.model.experiment.proto.*;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.process.proto.ProcessWorkflow;
+import org.apache.airavata.model.scheduling.proto.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.status.proto.*;
+import org.apache.airavata.model.task.proto.TaskModel;
+import org.apache.airavata.model.user.proto.UserProfile;
+import org.apache.airavata.model.workspace.proto.Gateway;
+import org.apache.airavata.model.workspace.proto.GatewayUsageReportingCommand;
+import org.apache.airavata.model.workspace.proto.Notification;
+import org.apache.airavata.model.workspace.proto.Project;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.airavata.registry.api.registry_apiConstants;
 import org.apache.airavata.storage.repository.DataProductRepository;
 import org.apache.airavata.storage.repository.DataReplicaLocationRepository;
 import org.apache.airavata.storage.repository.StorageResourceRepository;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -131,7 +131,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Fetch Apache Registry API version
      */
     @Override
-    public String getAPIVersion() throws TException {
+    public String getAPIVersion() throws Exception {
         return registry_apiConstants.REGISTRY_API_VERSION;
     }
 
@@ -143,7 +143,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @return true/false
      */
     @Override
-    public boolean isUserExists(String gatewayId, String userName) throws RegistryServiceException, TException {
+    public boolean isUserExists(String gatewayId, String userName) throws RegistryServiceException, Exception {
         try {
             return userRepository.isUserExists(gatewayId, userName);
         } catch (RegistryException e) {
@@ -162,7 +162,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * list of usernames of the users in the gateway
      */
     @Override
-    public List<String> getAllUsersInGateway(String gatewayId) throws RegistryServiceException, TException {
+    public List<String> getAllUsersInGateway(String gatewayId) throws RegistryServiceException, Exception {
         try {
             return userRepository.getAllUsernamesInGateway(gatewayId);
         } catch (RegistryException e) {
@@ -181,7 +181,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Gateway obejct.
      */
     @Override
-    public Gateway getGateway(String gatewayId) throws RegistryServiceException, TException {
+    public Gateway getGateway(String gatewayId) throws RegistryServiceException, Exception {
         try {
             if (!gatewayRepository.isGatewayExist(gatewayId)) {
                 logger.error("Gateway does not exist in the system. Please provide a valid gateway ID...");
@@ -208,7 +208,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Boolean identifier for the success or failure of the deletion operation.
      */
     @Override
-    public boolean deleteGateway(String gatewayId) throws RegistryServiceException, TException {
+    public boolean deleteGateway(String gatewayId) throws RegistryServiceException, Exception {
         try {
             if (!gatewayRepository.isGatewayExist(gatewayId)) {
                 logger.error("Gateway does not exist in the system. Please provide a valid gateway ID...");
@@ -231,7 +231,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Get All the Gateways Connected to Airavata.
      */
     @Override
-    public List<Gateway> getAllGateways() throws RegistryServiceException, TException {
+    public List<Gateway> getAllGateways() throws RegistryServiceException, Exception {
         try {
             List<Gateway> gateways = gatewayRepository.getAllGateways();
             logger.debug("Airavata retrieved all available gateways...");
@@ -252,7 +252,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * return the gatewayId of the existing gateway.
      */
     @Override
-    public boolean isGatewayExist(String gatewayId) throws RegistryServiceException, TException {
+    public boolean isGatewayExist(String gatewayId) throws RegistryServiceException, Exception {
         try {
             return gatewayRepository.isGatewayExist(gatewayId);
         } catch (RegistryException e) {
@@ -265,7 +265,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean deleteNotification(String gatewayId, String notificationId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             notificationRepository.deleteNotification(notificationId);
             return true;
@@ -279,7 +279,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public Notification getNotification(String gatewayId, String notificationId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             return notificationRepository.getNotification(notificationId);
         } catch (RegistryException e) {
@@ -291,7 +291,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<Notification> getAllNotifications(String gatewayId) throws RegistryServiceException, TException {
+    public List<Notification> getAllNotifications(String gatewayId) throws RegistryServiceException, Exception {
         try {
             List<Notification> notifications = notificationRepository.getAllGatewayNotifications(gatewayId);
             return notifications;
@@ -312,7 +312,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * project data model will be returned.
      */
     @Override
-    public Project getProject(String projectId) throws RegistryServiceException, TException {
+    public Project getProject(String projectId) throws RegistryServiceException, Exception {
         try {
             if (!projectRepository.isProjectExist(projectId)) {
                 logger.error("Project does not exist in the system. Please provide a valid project ID...");
@@ -343,7 +343,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * NOTE: This method is not used within gateways connected with Airavata.
      */
     @Override
-    public boolean deleteProject(String projectId) throws RegistryServiceException, TException {
+    public boolean deleteProject(String projectId) throws RegistryServiceException, Exception {
         try {
             if (!projectRepository.isProjectExist(projectId)) {
                 logger.error("Project does not exist in the system. Please provide a valid project ID...");
@@ -374,7 +374,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<Project> getUserProjects(String gatewayId, String userName, int limit, int offset)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!validateString(userName)) {
             logger.error("Username cannot be empty. Please provide a valid user..");
             RegistryServiceException exception = new RegistryServiceException();
@@ -429,7 +429,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             List<String> accessibleExpIds,
             int limit,
             int offset)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
@@ -481,7 +481,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<ExperimentModel> getExperimentsInProject(String gatewayId, String projectId, int limit, int offset)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
@@ -529,7 +529,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<ExperimentModel> getUserExperiments(String gatewayId, String userName, int limit, int offset)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!validateString(userName)) {
             logger.error("Username cannot be empty. Please provide a valid user..");
             AiravataSystemException exception = new AiravataSystemException();
@@ -573,7 +573,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      *                            Identifier for the success or failure of the deletion operation.
      */
     @Override
-    public boolean deleteExperiment(String experimentId) throws RegistryServiceException, TException {
+    public boolean deleteExperiment(String experimentId) throws RegistryServiceException, Exception {
         try {
             if (!experimentRepository.isExperimentExist(experimentId)) {
                 throw new ExperimentNotFoundException(
@@ -581,7 +581,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             }
             ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
 
-            if (!(experimentModel.getExperimentStatus().get(0).getState() == ExperimentState.CREATED)) {
+            if (!(experimentModel.getExperimentStatusList().get(0).getState() == ExperimentState.CREATED)) {
                 logger.error("Error while deleting the experiment");
                 throw new ExperimentCatalogException(
                         "Experiment is not in CREATED state. Hence cannot deleted. ID:" + experimentId);
@@ -636,7 +636,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @param airavataExperimentId
      */
     @Override
-    public ExperimentModel getExperiment(String airavataExperimentId) throws RegistryServiceException, TException {
+    public ExperimentModel getExperiment(String airavataExperimentId) throws RegistryServiceException, Exception {
         ExperimentModel experimentModel = getExperimentInternal(airavataExperimentId);
         return experimentModel;
     }
@@ -668,18 +668,19 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public ExperimentModel getDetailedExperimentTree(String airavataExperimentId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ExperimentModel experimentModel = getExperimentInternal(airavataExperimentId);
             List<ProcessModel> processList = processRepository.getProcessList(
                     Constants.FieldConstants.ExperimentConstants.EXPERIMENT_ID, experimentModel.getExperimentId());
             if (processList != null) {
-                processList.stream().forEach(p -> {
-                    // Process already has the task object
-                    (p).getTasks().stream().forEach(t -> {
+                List<ProcessModel> updatedProcessList = new ArrayList<>();
+                for (ProcessModel p : processList) {
+                    List<TaskModel> updatedTasks = new ArrayList<>();
+                    for (TaskModel t : p.getTasksList()) {
                         try {
                             List<JobModel> jobList = jobRepository.getJobList(
-                                    Constants.FieldConstants.JobConstants.TASK_ID, ((TaskModel) t).getTaskId());
+                                    Constants.FieldConstants.JobConstants.TASK_ID, t.getTaskId());
                             if (jobList != null) {
                                 Collections.sort(jobList, new Comparator<JobModel>() {
                                     @Override
@@ -687,14 +688,17 @@ public class RegistryServerHandler implements RegistryService.Iface {
                                         return (int) (o1.getCreationTime() - o2.getCreationTime());
                                     }
                                 });
-                                t.setJobs(jobList);
+                                t = t.toBuilder().clearJobs().addAllJobs(jobList).build();
                             }
                         } catch (RegistryException e) {
                             logger.error(e.getMessage(), e);
                         }
-                    });
-                });
-                experimentModel.setProcesses(processList);
+                        updatedTasks.add(t);
+                    }
+                    updatedProcessList.add(p.toBuilder().clearTasks().addAllTasks(updatedTasks).build());
+                }
+                experimentModel = experimentModel.toBuilder()
+                        .clearProcesses().addAllProcesses(updatedProcessList).build();
             }
             logger.debug("Airavata retrieved detailed experiment with experiment id : " + airavataExperimentId);
             return experimentModel;
@@ -717,7 +721,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public ExperimentStatus getExperimentStatus(String airavataExperimentId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         ExperimentStatus experimentStatus = getExperimentStatusInternal(airavataExperimentId);
         logger.debug("Airavata retrieved experiment status for experiment id : " + airavataExperimentId);
         return experimentStatus;
@@ -733,7 +737,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<OutputDataObjectType> getExperimentOutputs(String airavataExperimentId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!experimentRepository.isExperimentExist(airavataExperimentId)) {
                 logger.error(
@@ -763,7 +767,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<OutputDataObjectType> getIntermediateOutputs(String airavataExperimentId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         return null;
     }
 
@@ -776,7 +780,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public Map<String, JobStatus> getJobStatuses(String airavataExperimentId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!experimentRepository.isExperimentExist(airavataExperimentId)) {
                 logger.error(
@@ -791,7 +795,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             Map<String, JobStatus> jobStatus = new HashMap<String, JobStatus>();
             if (processModels != null && !processModels.isEmpty()) {
                 for (ProcessModel processModel : processModels) {
-                    List<TaskModel> tasks = processModel.getTasks();
+                    List<TaskModel> tasks = processModel.getTasksList();
                     if (tasks != null && !tasks.isEmpty()) {
                         for (TaskModel task : tasks) {
                             String taskId = task.getTaskId();
@@ -800,7 +804,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
                             if (jobs != null && !jobs.isEmpty()) {
                                 for (JobModel jobModel : jobs) {
                                     String jobID = jobModel.getJobId();
-                                    List<JobStatus> status = jobModel.getJobStatuses();
+                                    List<JobStatus> status = jobModel.getJobStatusesList();
                                     if (status != null && status.size() > 0) {
                                         JobStatus latestStatus = status.get(status.size() - 1);
                                         jobStatus.put(jobID, latestStatus);
@@ -824,7 +828,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void addExperimentProcessOutputs(String outputType, List<OutputDataObjectType> outputs, String id)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
 
         try {
             if (ExpCatChildDataType.PROCESS_OUTPUT.equals(ExpCatChildDataType.valueOf(outputType))) {
@@ -843,7 +847,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void addErrors(String errorType, ErrorModel errorModel, String id)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
 
         try {
             if (ExpCatChildDataType.EXPERIMENT_ERROR.equals(ExpCatChildDataType.valueOf(errorType))) {
@@ -863,7 +867,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public void addTaskStatus(TaskStatus taskStatus, String taskId) throws RegistryServiceException, TException {
+    public void addTaskStatus(TaskStatus taskStatus, String taskId) throws RegistryServiceException, Exception {
         try {
             taskStatusRepository.addTaskStatus(taskStatus, taskId);
         } catch (Exception e) {
@@ -877,7 +881,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void addProcessStatus(ProcessStatus processStatus, String processId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             processStatusRepository.addProcessStatus(processStatus, processId);
         } catch (Exception e) {
@@ -891,7 +895,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void updateProcessStatus(ProcessStatus processStatus, String processId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             processStatusRepository.updateProcessStatus(processStatus, processId);
         } catch (Exception e) {
@@ -905,7 +909,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void updateExperimentStatus(ExperimentStatus experimentStatus, String experimentId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             experimentStatusRepository.updateExperimentStatus(experimentStatus, experimentId);
         } catch (Exception e) {
@@ -919,7 +923,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void addJobStatus(JobStatus jobStatus, String taskId, String jobId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             JobPK jobPK = new JobPK();
             jobPK.setJobId(jobId);
@@ -935,7 +939,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public void addJob(JobModel jobModel, String processId) throws RegistryServiceException, TException {
+    public void addJob(JobModel jobModel, String processId) throws RegistryServiceException, Exception {
         try {
             jobRepository.addJob(jobModel, processId);
         } catch (Exception e) {
@@ -948,7 +952,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public void deleteJobs(String processId) throws RegistryServiceException, TException {
+    public void deleteJobs(String processId) throws RegistryServiceException, Exception {
         try {
             List<JobModel> jobs = jobRepository.getJobList(Constants.FieldConstants.JobConstants.PROCESS_ID, processId);
             for (JobModel jobModel : jobs) {
@@ -965,7 +969,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public String addProcess(ProcessModel processModel, String experimentId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             return processRepository.addProcess(processModel, experimentId);
         } catch (Exception e) {
@@ -978,7 +982,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public void updateProcess(ProcessModel processModel, String processId) throws RegistryServiceException, TException {
+    public void updateProcess(ProcessModel processModel, String processId) throws RegistryServiceException, Exception {
         try {
             processRepository.updateProcess(processModel, processId);
         } catch (Exception e) {
@@ -991,7 +995,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public String addTask(TaskModel taskModel, String processId) throws RegistryServiceException, TException {
+    public String addTask(TaskModel taskModel, String processId) throws RegistryServiceException, Exception {
         try {
             return taskRepository.addTask(taskModel, processId);
         } catch (Exception e) {
@@ -1004,7 +1008,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public void deleteTasks(String processId) throws RegistryServiceException, TException {
+    public void deleteTasks(String processId) throws RegistryServiceException, Exception {
         try {
             taskRepository.deleteTasks(processId);
         } catch (Exception e) {
@@ -1018,7 +1022,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public UserConfigurationDataModel getUserConfigurationData(String experimentId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             return experimentRepository.getUserConfigurationData(experimentId);
         } catch (Exception e) {
@@ -1031,7 +1035,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public ProcessModel getProcess(String processId) throws RegistryServiceException, TException {
+    public ProcessModel getProcess(String processId) throws RegistryServiceException, Exception {
         try {
             return processRepository.getProcess(processId);
         } catch (Exception e) {
@@ -1044,7 +1048,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<ProcessModel> getProcessList(String experimentId) throws RegistryServiceException, TException {
+    public List<ProcessModel> getProcessList(String experimentId) throws RegistryServiceException, Exception {
         try {
             List<ProcessModel> processModels = processRepository.getProcessList(
                     Constants.FieldConstants.ExperimentConstants.EXPERIMENT_ID, experimentId);
@@ -1060,7 +1064,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public ProcessStatus getProcessStatus(String processId) throws RegistryServiceException, TException {
+    public ProcessStatus getProcessStatus(String processId) throws RegistryServiceException, Exception {
         try {
             return processStatusRepository.getProcessStatus(processId);
         } catch (Exception e) {
@@ -1074,7 +1078,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public List<ProcessModel> getProcessListInState(ProcessState processState)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
 
             List<ProcessModel> finalProcessList = new ArrayList<>();
@@ -1104,7 +1108,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<ProcessStatus> getProcessStatusList(String processId) throws RegistryServiceException, TException {
+    public List<ProcessStatus> getProcessStatusList(String processId) throws RegistryServiceException, Exception {
         try {
             return processStatusRepository.getProcessStatusList(processId);
         } catch (Exception e) {
@@ -1120,7 +1124,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * queryType can be PROCESS_ID or TASK_ID
      */
     @Override
-    public boolean isJobExist(String queryType, String id) throws RegistryServiceException, TException {
+    public boolean isJobExist(String queryType, String id) throws RegistryServiceException, Exception {
         try {
             JobModel jobModel = fetchJobModel(queryType, id);
             return jobModel != null;
@@ -1137,7 +1141,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * queryType can be PROCESS_ID or TASK_ID
      */
     @Override
-    public JobModel getJob(String queryType, String id) throws RegistryServiceException, TException {
+    public JobModel getJob(String queryType, String id) throws RegistryServiceException, Exception {
         try {
             JobModel jobModel = fetchJobModel(queryType, id);
             if (jobModel != null) return jobModel;
@@ -1152,7 +1156,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<JobModel> getJobs(String queryType, String id) throws RegistryServiceException, TException {
+    public List<JobModel> getJobs(String queryType, String id) throws RegistryServiceException, Exception {
 
         try {
             return fetchJobModels(queryType, id);
@@ -1169,7 +1173,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public int getJobCount(
             org.apache.airavata.model.status.JobStatus jobStatus, String gatewayId, double searchBackTimeInMinutes)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
 
         List<JobStatus> jobStatusList = jobStatusRepository.getDistinctListofJobStatus(
                 gatewayId, jobStatus.getJobState().name(), searchBackTimeInMinutes);
@@ -1178,7 +1182,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public Map<String, Double> getAVGTimeDistribution(String gatewayId, double searchBackTimeInMinutes)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         return processRepository.getAVGTimeDistribution(gatewayId, searchBackTimeInMinutes);
     }
 
@@ -1222,7 +1226,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<OutputDataObjectType> getProcessOutputs(String processId) throws RegistryServiceException, TException {
+    public List<OutputDataObjectType> getProcessOutputs(String processId) throws RegistryServiceException, Exception {
         try {
             return processOutputRepository.getProcessOutputs(processId);
         } catch (Exception e) {
@@ -1235,7 +1239,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<ProcessWorkflow> getProcessWorkflows(String processId) throws RegistryServiceException, TException {
+    public List<ProcessWorkflow> getProcessWorkflows(String processId) throws RegistryServiceException, Exception {
 
         try {
             return processWorkflowRepository.getProcessWorkflows(processId);
@@ -1250,7 +1254,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public void addProcessWorkflow(ProcessWorkflow processWorkflow) throws RegistryServiceException, TException {
+    public void addProcessWorkflow(ProcessWorkflow processWorkflow) throws RegistryServiceException, Exception {
         try {
             processWorkflowRepository.addProcessWorkflow(processWorkflow, processWorkflow.getProcessId());
         } catch (Exception e) {
@@ -1264,7 +1268,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<String> getProcessIds(String experimentId) throws RegistryServiceException, TException {
+    public List<String> getProcessIds(String experimentId) throws RegistryServiceException, Exception {
         try {
             return processRepository.getProcessIds(DBConstants.Process.EXPERIMENT_ID, experimentId);
         } catch (Exception e) {
@@ -1284,7 +1288,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      *                                    Job details.
      */
     @Override
-    public List<JobModel> getJobDetails(String airavataExperimentId) throws RegistryServiceException, TException {
+    public List<JobModel> getJobDetails(String airavataExperimentId) throws RegistryServiceException, Exception {
         try {
             if (!experimentRepository.isExperimentExist(airavataExperimentId)) {
                 logger.error(
@@ -1299,7 +1303,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             List<JobModel> jobList = new ArrayList<>();
             if (processModels != null && !processModels.isEmpty()) {
                 for (ProcessModel processModel : processModels) {
-                    List<TaskModel> tasks = processModel.getTasks();
+                    List<TaskModel> tasks = processModel.getTasksList();
                     if (tasks != null && !tasks.isEmpty()) {
                         for (TaskModel taskModel : tasks) {
                             String taskId = taskModel.getTaskId();
@@ -1328,7 +1332,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns an Application Module Object.
      */
     @Override
-    public ApplicationModule getApplicationModule(String appModuleId) throws RegistryServiceException, TException {
+    public ApplicationModule getApplicationModule(String appModuleId) throws RegistryServiceException, Exception {
         try {
             ApplicationModule module = applicationInterfaceRepository.getApplicationModule(appModuleId);
             logger.debug("Airavata retrieved application module with module id : " + appModuleId);
@@ -1349,7 +1353,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns the list of all Application Module Objects.
      */
     @Override
-    public List<ApplicationModule> getAllAppModules(String gatewayId) throws RegistryServiceException, TException {
+    public List<ApplicationModule> getAllAppModules(String gatewayId) throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -1377,7 +1381,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public List<ApplicationModule> getAccessibleAppModules(
             String gatewayId, List<String> accessibleAppIds, List<String> accessibleComputeResourceIds)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -1403,7 +1407,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns a success/failure of the deletion.
      */
     @Override
-    public boolean deleteApplicationModule(String appModuleId) throws RegistryServiceException, TException {
+    public boolean deleteApplicationModule(String appModuleId) throws RegistryServiceException, Exception {
         try {
             logger.debug("Airavata deleted application module with module id : " + appModuleId);
             return applicationInterfaceRepository.removeApplicationModule(appModuleId);
@@ -1424,7 +1428,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public ApplicationDeploymentDescription getApplicationDeployment(String appDeploymentId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ApplicationDeploymentDescription deployement =
                     applicationDeploymentRepository.getApplicationDeployement(appDeploymentId);
@@ -1446,7 +1450,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns a success/failure of the deletion.
      */
     @Override
-    public boolean deleteApplicationDeployment(String appDeploymentId) throws RegistryServiceException, TException {
+    public boolean deleteApplicationDeployment(String appDeploymentId) throws RegistryServiceException, Exception {
         try {
             applicationDeploymentRepository.removeAppDeployment(appDeploymentId);
             logger.debug("Airavata removed application deployment with deployment id : " + appDeploymentId);
@@ -1469,7 +1473,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<ApplicationDeploymentDescription> getAllApplicationDeployments(String gatewayId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -1498,7 +1502,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public List<ApplicationDeploymentDescription> getAccessibleApplicationDeployments(
             String gatewayId, List<String> accessibleAppDeploymentIds, List<String> accessibleComputeResourceIds)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -1533,7 +1537,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             String appModuleId,
             List<String> accessibleAppDeploymentIds,
             List<String> accessibleComputeResourceIds)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -1559,7 +1563,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns a list of Deployed Resources.
      */
     @Override
-    public List<String> getAppModuleDeployedResources(String appModuleId) throws RegistryServiceException, TException {
+    public List<String> getAppModuleDeployedResources(String appModuleId) throws RegistryServiceException, Exception {
         try {
             List<String> appDeployments = new ArrayList<>();
             Map<String, String> filters = new HashMap<>();
@@ -1581,7 +1585,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public List<ApplicationDeploymentDescription> getApplicationDeployments(String appModuleId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             Map<String, String> filters = new HashMap<>();
             filters.put(DBConstants.ApplicationDeployment.APPLICATION_MODULE_ID, appModuleId);
@@ -1605,7 +1609,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public ApplicationInterfaceDescription getApplicationInterface(String appInterfaceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ApplicationInterfaceDescription interfaceDescription =
                     applicationInterfaceRepository.getApplicationInterface(appInterfaceId);
@@ -1627,7 +1631,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns a success/failure of the deletion.
      */
     @Override
-    public boolean deleteApplicationInterface(String appInterfaceId) throws RegistryServiceException, TException {
+    public boolean deleteApplicationInterface(String appInterfaceId) throws RegistryServiceException, Exception {
         try {
             boolean removeApplicationInterface =
                     applicationInterfaceRepository.removeApplicationInterface(appInterfaceId);
@@ -1650,7 +1654,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public Map<String, String> getAllApplicationInterfaceNames(String gatewayId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -1685,7 +1689,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<ApplicationInterfaceDescription> getAllApplicationInterfaces(String gatewayId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -1712,7 +1716,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<InputDataObjectType> getApplicationInputs(String appInterfaceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             List<InputDataObjectType> applicationInputs =
                     applicationInterfaceRepository.getApplicationInputs(appInterfaceId);
@@ -1735,7 +1739,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<OutputDataObjectType> getApplicationOutputs(String appInterfaceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         List<OutputDataObjectType> list = getApplicationOutputsInternal(appInterfaceId);
         logger.debug("Airavata retrieved application outputs for app interface id : " + appInterfaceId);
         return list;
@@ -1751,7 +1755,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public Map<String, String> getAvailableAppInterfaceComputeResources(String appInterfaceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             Map<String, String> allComputeResources =
                     new ComputeResourceRepository().getAvailableComputeResourceIdList();
@@ -1794,7 +1798,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public ComputeResourceDescription getComputeResource(String computeResourceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceDescription computeResource =
                     new ComputeResourceRepository().getComputeResource(computeResourceId);
@@ -1815,7 +1819,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Compute Resource Object created from the datamodel..
      */
     @Override
-    public Map<String, String> getAllComputeResourceNames() throws RegistryServiceException, TException {
+    public Map<String, String> getAllComputeResourceNames() throws RegistryServiceException, Exception {
         try {
             Map<String, String> computeResourceIdList = new ComputeResourceRepository().getAllComputeResourceIdList();
             logger.debug("Airavata retrieved all the available compute resources...");
@@ -1836,7 +1840,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns a success/failure of the deletion.
      */
     @Override
-    public boolean deleteComputeResource(String computeResourceId) throws RegistryServiceException, TException {
+    public boolean deleteComputeResource(String computeResourceId) throws RegistryServiceException, Exception {
         try {
             new ComputeResourceRepository().removeComputeResource(computeResourceId);
             logger.debug("Airavata deleted compute resource with compute resource Id : " + computeResourceId);
@@ -1858,7 +1862,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public StorageResourceDescription getStorageResource(String storageResourceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             StorageResourceDescription storageResource =
                     storageResourceRepository.getStorageResource(storageResourceId);
@@ -1879,7 +1883,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Compute Resource Object created from the datamodel..
      */
     @Override
-    public Map<String, String> getAllStorageResourceNames() throws RegistryServiceException, TException {
+    public Map<String, String> getAllStorageResourceNames() throws RegistryServiceException, Exception {
         try {
             Map<String, String> resourceIdList = storageResourceRepository.getAllStorageResourceIdList();
             logger.debug("Airavata retrieved storage resources list...");
@@ -1900,7 +1904,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns a success/failure of the deletion.
      */
     @Override
-    public boolean deleteStorageResource(String storageResourceId) throws RegistryServiceException, TException {
+    public boolean deleteStorageResource(String storageResourceId) throws RegistryServiceException, Exception {
         try {
             storageResourceRepository.removeStorageResource(storageResourceId);
             logger.debug("Airavata deleted storage resource with storage resource Id : " + storageResourceId);
@@ -1919,7 +1923,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @param jobSubmissionId@return LOCALSubmission instance
      */
     @Override
-    public LOCALSubmission getLocalJobSubmission(String jobSubmissionId) throws RegistryServiceException, TException {
+    public LOCALSubmission getLocalJobSubmission(String jobSubmissionId) throws RegistryServiceException, Exception {
         try {
             LOCALSubmission localJobSubmission = new ComputeResourceRepository().getLocalJobSubmission(jobSubmissionId);
             logger.debug("Airavata retrieved local job submission for job submission interface id: " + jobSubmissionId);
@@ -1939,7 +1943,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @param jobSubmissionId@return SSHJobSubmission instance
      */
     @Override
-    public SSHJobSubmission getSSHJobSubmission(String jobSubmissionId) throws RegistryServiceException, TException {
+    public SSHJobSubmission getSSHJobSubmission(String jobSubmissionId) throws RegistryServiceException, Exception {
         try {
             SSHJobSubmission sshJobSubmission = new ComputeResourceRepository().getSSHJobSubmission(jobSubmissionId);
             logger.debug("Airavata retrieved SSH job submission for job submission interface id: " + jobSubmissionId);
@@ -1967,7 +1971,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public UnicoreJobSubmission getUnicoreJobSubmission(String jobSubmissionId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             UnicoreJobSubmission unicoreJobSubmission =
                     new ComputeResourceRepository().getUNICOREJobSubmission(jobSubmissionId);
@@ -1995,7 +1999,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public CloudJobSubmission getCloudJobSubmission(String jobSubmissionId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             CloudJobSubmission cloudJobSubmission =
                     new ComputeResourceRepository().getCloudJobSubmission(jobSubmissionId);
@@ -2017,7 +2021,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @return LOCALDataMovement instance
      */
     @Override
-    public LOCALDataMovement getLocalDataMovement(String dataMovementId) throws RegistryServiceException, TException {
+    public LOCALDataMovement getLocalDataMovement(String dataMovementId) throws RegistryServiceException, Exception {
         try {
             LOCALDataMovement localDataMovement = new ComputeResourceRepository().getLocalDataMovement(dataMovementId);
             logger.debug("Airavata retrieved local data movement with data movement id: " + dataMovementId);
@@ -2038,7 +2042,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @return SCPDataMovement instance
      */
     @Override
-    public SCPDataMovement getSCPDataMovement(String dataMovementId) throws RegistryServiceException, TException {
+    public SCPDataMovement getSCPDataMovement(String dataMovementId) throws RegistryServiceException, Exception {
         try {
             SCPDataMovement scpDataMovement = new ComputeResourceRepository().getSCPDataMovement(dataMovementId);
             logger.debug("Airavata retrieved SCP data movement with data movement id: " + dataMovementId);
@@ -2060,7 +2064,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public UnicoreDataMovement getUnicoreDataMovement(String dataMovementId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             UnicoreDataMovement unicoreDataMovement =
                     new ComputeResourceRepository().getUNICOREDataMovement(dataMovementId);
@@ -2083,7 +2087,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public GridFTPDataMovement getGridFTPDataMovement(String dataMovementId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GridFTPDataMovement gridFTPDataMovement =
                     new ComputeResourceRepository().getGridFTPDataMovement(dataMovementId);
@@ -2108,7 +2112,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean changeJobSubmissionPriority(String jobSubmissionInterfaceId, int newPriorityOrder)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         return false;
     }
 
@@ -2122,7 +2126,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean changeDataMovementPriority(String dataMovementInterfaceId, int newPriorityOrder)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         return false;
     }
 
@@ -2135,7 +2139,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean changeJobSubmissionPriorities(Map<String, Integer> jobSubmissionPriorityMap)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         return false;
     }
 
@@ -2148,7 +2152,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean changeDataMovementPriorities(Map<String, Integer> dataMovementPriorityMap)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         return false;
     }
 
@@ -2162,7 +2166,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean deleteJobSubmissionInterface(String computeResourceId, String jobSubmissionInterfaceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             new ComputeResourceRepository().removeJobSubmissionInterface(computeResourceId, jobSubmissionInterfaceId);
             logger.debug("Airavata deleted job submission interface with interface id : " + jobSubmissionInterfaceId);
@@ -2177,7 +2181,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public ResourceJobManager getResourceJobManager(String resourceJobManagerId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             return new ComputeResourceRepository().getResourceJobManager(resourceJobManagerId);
         } catch (AppCatalogException e) {
@@ -2189,7 +2193,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public boolean deleteResourceJobManager(String resourceJobManagerId) throws RegistryServiceException, TException {
+    public boolean deleteResourceJobManager(String resourceJobManagerId) throws RegistryServiceException, Exception {
         try {
             new ComputeResourceRepository().deleteResourceJobManager(resourceJobManagerId);
             return true;
@@ -2211,7 +2215,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean deleteBatchQueue(String computeResourceId, String queueName)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             new ComputeResourceRepository().removeBatchQueue(computeResourceId, queueName);
             return true;
@@ -2232,7 +2236,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public GatewayResourceProfile getGatewayResourceProfile(String gatewayID)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2258,7 +2262,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns a success/failure of the deletion.
      */
     @Override
-    public boolean deleteGatewayResourceProfile(String gatewayID) throws RegistryServiceException, TException {
+    public boolean deleteGatewayResourceProfile(String gatewayID) throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2286,7 +2290,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public ComputeResourcePreference getGatewayComputeResourcePreference(String gatewayID, String computeResourceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2336,7 +2340,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public StoragePreference getGatewayStoragePreference(String gatewayID, String storageId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2375,14 +2379,14 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<ComputeResourcePreference> getAllGatewayComputeResourcePreferences(String gatewayID)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
                 throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
             }
             GwyResourceProfileRepository gwyResourceProfileRepository = new GwyResourceProfileRepository();
-            return gwyResourceProfileRepository.getGatewayProfile(gatewayID).getComputeResourcePreferences();
+            return gwyResourceProfileRepository.getGatewayProfile(gatewayID).getComputeResourcePreferencesList();
         } catch (Exception e) {
             logger.error(gatewayID, "Error while reading gateway compute resource preferences...", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -2401,14 +2405,14 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<StoragePreference> getAllGatewayStoragePreferences(String gatewayID)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
                 throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
             }
             GwyResourceProfileRepository gwyResourceProfileRepository = new GwyResourceProfileRepository();
-            return gwyResourceProfileRepository.getGatewayProfile(gatewayID).getStoragePreferences();
+            return gwyResourceProfileRepository.getGatewayProfile(gatewayID).getStoragePreferencesList();
         } catch (Exception e) {
             logger.error(gatewayID, "Error while reading gateway data storage preferences...", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -2424,7 +2428,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns all the GatewayResourcePrifle list object.
      */
     @Override
-    public List<GatewayResourceProfile> getAllGatewayResourceProfiles() throws RegistryServiceException, TException {
+    public List<GatewayResourceProfile> getAllGatewayResourceProfiles() throws RegistryServiceException, Exception {
         try {
             GwyResourceProfileRepository gwyResourceProfileRepository = new GwyResourceProfileRepository();
             return gwyResourceProfileRepository.getAllGatewayProfiles();
@@ -2445,7 +2449,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean deleteGatewayComputeResourcePreference(String gatewayID, String computeResourceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2474,7 +2478,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean deleteGatewayStoragePreference(String gatewayID, String storageId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2492,7 +2496,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public DataProductModel getDataProduct(String productUri) throws RegistryServiceException, TException {
+    public DataProductModel getDataProduct(String productUri) throws RegistryServiceException, Exception {
         try {
             DataProductModel dataProductModel = dataProductRepository.getDataProduct(productUri);
             return dataProductModel;
@@ -2506,7 +2510,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public DataProductModel getParentDataProduct(String productUri) throws RegistryServiceException, TException {
+    public DataProductModel getParentDataProduct(String productUri) throws RegistryServiceException, Exception {
         try {
             DataProductModel dataProductModel = dataProductRepository.getParentDataProduct(productUri);
             return dataProductModel;
@@ -2520,7 +2524,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<DataProductModel> getChildDataProducts(String productUri) throws RegistryServiceException, TException {
+    public List<DataProductModel> getChildDataProducts(String productUri) throws RegistryServiceException, Exception {
         try {
             List<DataProductModel> dataProductModels = dataProductRepository.getChildDataProducts(productUri);
             return dataProductModels;
@@ -2536,7 +2540,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public List<DataProductModel> searchDataProductsByName(
             String gatewayId, String userId, String productName, int limit, int offset)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             List<DataProductModel> dataProductModels =
                     dataProductRepository.searchDataProductsByName(gatewayId, userId, productName, limit, offset);
@@ -2552,7 +2556,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public String createGroupResourceProfile(GroupResourceProfile groupResourceProfile)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(groupResourceProfile.getGatewayId())) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2573,7 +2577,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void updateGroupResourceProfile(GroupResourceProfile groupResourceProfile)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             if (!groupResourceProfileRepository.isGroupResourceProfileExists(
@@ -2598,7 +2602,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public GroupResourceProfile getGroupResourceProfile(String groupResourceProfileId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             if (!groupResourceProfileRepository.isGroupResourceProfileExists(groupResourceProfileId)) {
@@ -2620,7 +2624,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean isGroupResourceProfileExists(String groupResourceProfileId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             return groupResourceProfileRepository.isGroupResourceProfileExists(groupResourceProfileId);
@@ -2634,7 +2638,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean removeGroupResourceProfile(String groupResourceProfileId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             if (!groupResourceProfileRepository.isGroupResourceProfileExists(groupResourceProfileId)) {
@@ -2656,7 +2660,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public List<GroupResourceProfile> getGroupResourceList(String gatewayId, List<String> accessibleGroupResProfileIds)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             return groupResourceProfileRepository.getAllGroupResourceProfiles(gatewayId, accessibleGroupResProfileIds);
@@ -2670,7 +2674,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean removeGroupComputePrefs(String computeResourceId, String groupResourceProfileId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             groupResourceProfileRepository.removeGroupComputeResourcePreference(
@@ -2687,7 +2691,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean removeGroupComputeResourcePolicy(String resourcePolicyId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             groupResourceProfileRepository.removeComputeResourcePolicy(resourcePolicyId);
@@ -2703,7 +2707,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean removeGroupBatchQueueResourcePolicy(String resourcePolicyId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             groupResourceProfileRepository.removeBatchQueueResourcePolicy(resourcePolicyId);
@@ -2720,7 +2724,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public GroupComputeResourcePreference getGroupComputeResourcePreference(
-            String computeResourceId, String groupResourceProfileId) throws RegistryServiceException, TException {
+            String computeResourceId, String groupResourceProfileId) throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             GroupComputeResourcePreference groupComputeResourcePreference =
@@ -2745,7 +2749,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean isGroupComputeResourcePreferenceExists(String computeResourceId, String groupResourceProfileId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             return groupResourceProfileRepository.isGroupComputeResourcePreferenceExists(
@@ -2761,7 +2765,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public ComputeResourcePolicy getGroupComputeResourcePolicy(String resourcePolicyId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             ComputeResourcePolicy computeResourcePolicy =
@@ -2783,7 +2787,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public BatchQueueResourcePolicy getBatchQueueResourcePolicy(String resourcePolicyId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             BatchQueueResourcePolicy batchQueueResourcePolicy =
@@ -2805,7 +2809,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public List<GroupComputeResourcePreference> getGroupComputeResourcePrefList(String groupResourceProfileId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             return groupResourceProfileRepository.getAllGroupComputeResourcePreferences(groupResourceProfileId);
@@ -2821,7 +2825,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public List<BatchQueueResourcePolicy> getGroupBatchQueueResourcePolicyList(String groupResourceProfileId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             return groupResourceProfileRepository.getAllGroupBatchQueueResourcePolicies(groupResourceProfileId);
@@ -2837,7 +2841,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public List<ComputeResourcePolicy> getGroupComputeResourcePolicyList(String groupResourceProfileId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             GroupResourceProfileRepository groupResourceProfileRepository = new GroupResourceProfileRepository();
             return groupResourceProfileRepository.getAllGroupComputeResourcePolicies(groupResourceProfileId);
@@ -2852,7 +2856,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public String registerReplicaLocation(DataReplicaLocationModel replicaLocationModel)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             String replicaId = dataReplicaLocationRepository.registerReplicaLocation(replicaLocationModel);
             return replicaId;
@@ -2871,7 +2875,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @param dataProductModel
      */
     @Override
-    public String registerDataProduct(DataProductModel dataProductModel) throws RegistryServiceException, TException {
+    public String registerDataProduct(DataProductModel dataProductModel) throws RegistryServiceException, Exception {
         try {
             String productUrl = dataProductRepository.registerDataProduct(dataProductModel);
             return productUrl;
@@ -2896,7 +2900,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateGatewayStoragePreference(
             String gatewayID, String storageId, StoragePreference storagePreference)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2904,7 +2908,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             }
             GwyResourceProfileRepository gwyResourceProfileRepository = new GwyResourceProfileRepository();
             GatewayResourceProfile profile = gwyResourceProfileRepository.getGatewayProfile(gatewayID);
-            List<StoragePreference> dataStoragePreferences = profile.getStoragePreferences();
+            List<StoragePreference> dataStoragePreferences = profile.getStoragePreferencesList();
             StoragePreference preferenceToRemove = null;
             for (StoragePreference preference : dataStoragePreferences) {
                 if (preference.getStorageResourceId().equals(storageId)) {
@@ -2912,11 +2916,13 @@ public class RegistryServerHandler implements RegistryService.Iface {
                     break;
                 }
             }
+            GatewayResourceProfile.Builder profileBuilder = profile.toBuilder();
             if (preferenceToRemove != null) {
-                profile.getStoragePreferences().remove(preferenceToRemove);
+                int idx = dataStoragePreferences.indexOf(preferenceToRemove);
+                if (idx >= 0) profileBuilder.removeStoragePreferences(idx);
             }
-            profile.getStoragePreferences().add(storagePreference);
-            gwyResourceProfileRepository.updateGatewayResourceProfile(profile);
+            profileBuilder.addStoragePreferences(storagePreference);
+            gwyResourceProfileRepository.updateGatewayResourceProfile(profileBuilder.build());
             logger.debug("Airavata updated storage resource preference with gateway id : " + gatewayID
                     + " and for storage resource id : " + storageId);
             return true;
@@ -2940,7 +2946,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateGatewayComputeResourcePreference(
             String gatewayID, String computeResourceId, ComputeResourcePreference computeResourcePreference)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2948,7 +2954,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             }
             GwyResourceProfileRepository gwyResourceProfileRepository = new GwyResourceProfileRepository();
             GatewayResourceProfile profile = gwyResourceProfileRepository.getGatewayProfile(gatewayID);
-            List<ComputeResourcePreference> computeResourcePreferences = profile.getComputeResourcePreferences();
+            List<ComputeResourcePreference> computeResourcePreferences = profile.getComputeResourcePreferencesList();
             ComputeResourcePreference preferenceToRemove = null;
             for (ComputeResourcePreference preference : computeResourcePreferences) {
                 if (preference.getComputeResourceId().equals(computeResourceId)) {
@@ -2956,11 +2962,13 @@ public class RegistryServerHandler implements RegistryService.Iface {
                     break;
                 }
             }
+            GatewayResourceProfile.Builder profileBuilder = profile.toBuilder();
             if (preferenceToRemove != null) {
-                profile.getComputeResourcePreferences().remove(preferenceToRemove);
+                int idx = computeResourcePreferences.indexOf(preferenceToRemove);
+                if (idx >= 0) profileBuilder.removeComputeResourcePreferences(idx);
             }
-            profile.getComputeResourcePreferences().add(computeResourcePreference);
-            gwyResourceProfileRepository.updateGatewayResourceProfile(profile);
+            profileBuilder.addComputeResourcePreferences(computeResourcePreference);
+            gwyResourceProfileRepository.updateGatewayResourceProfile(profileBuilder.build());
             logger.debug("Airavata updated compute resource preference with gateway id : " + gatewayID
                     + " and for compute resource id : " + computeResourceId);
             return true;
@@ -2986,7 +2994,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean addGatewayStoragePreference(
             String gatewayID, String storageResourceId, StoragePreference dataStoragePreference)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -2999,8 +3007,8 @@ public class RegistryServerHandler implements RegistryService.Iface {
             }
             GatewayResourceProfile profile = gwyResourceProfileRepository.getGatewayProfile(gatewayID);
 
-            dataStoragePreference.setStorageResourceId(storageResourceId);
-            profile.addToStoragePreferences(dataStoragePreference);
+            dataStoragePreference = dataStoragePreference.toBuilder().setStorageResourceId(storageResourceId).build();
+            profile = profile.toBuilder().addStoragePreferences(dataStoragePreference).build();
             gwyResourceProfileRepository.updateGatewayResourceProfile(profile);
             logger.debug("Airavata added storage resource preference with gateway id : " + gatewayID
                     + " and for storage resource id : " + storageResourceId);
@@ -3027,7 +3035,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean addGatewayComputeResourcePreference(
             String gatewayID, String computeResourceId, ComputeResourcePreference computeResourcePreference)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -3038,7 +3046,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
                 throw new RegistryServiceException("Gateway resource profile '" + gatewayID + "' does not exist!!!");
             }
             GatewayResourceProfile profile = gwyResourceProfileRepository.getGatewayProfile(gatewayID);
-            profile.addToComputeResourcePreferences(computeResourcePreference);
+            profile = profile.toBuilder().addComputeResourcePreferences(computeResourcePreference).build();
             gwyResourceProfileRepository.updateGatewayResourceProfile(profile);
             logger.debug("Airavata added gateway compute resource preference with gateway id : " + gatewayID
                     + " and for compute resource id : " + computeResourceId);
@@ -3062,7 +3070,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean updateGatewayResourceProfile(String gatewayID, GatewayResourceProfile gatewayResourceProfile)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isGatewayExistInternal(gatewayID)) {
                 logger.error("Gateway does not exist.Please provide a valid gateway id...");
@@ -3091,7 +3099,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public String registerGatewayResourceProfile(GatewayResourceProfile gatewayResourceProfile)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!validateString(gatewayResourceProfile.getGatewayID())) {
                 logger.error("Cannot create gateway profile with empty gateway id");
@@ -3118,7 +3126,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean updateResourceJobManager(String resourceJobManagerId, ResourceJobManager updatedResourceJobManager)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             new ComputeResourceRepository().updateResourceJobManager(resourceJobManagerId, updatedResourceJobManager);
             return true;
@@ -3132,7 +3140,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public String registerResourceJobManager(ResourceJobManager resourceJobManager)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             return new ComputeResourceRepository().addResourceJobManager(resourceJobManager);
         } catch (AppCatalogException e) {
@@ -3153,7 +3161,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean deleteDataMovementInterface(String resourceId, String dataMovementInterfaceId, DMType dmType)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             switch (dmType) {
                 case COMPUTE_RESOURCE:
@@ -3191,7 +3199,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateGridFTPDataMovementDetails(
             String dataMovementInterfaceId, GridFTPDataMovement gridFTPDataMovement)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         throw new RegistryServiceException("updateGridFTPDataMovementDetails is not yet implemented");
     }
 
@@ -3210,7 +3218,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String addGridFTPDataMovementDetails(
             String computeResourceId, DMType dmType, int priorityOrder, GridFTPDataMovement gridFTPDataMovement)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
             String addDataMovementInterface = addDataMovementInterface(
@@ -3245,7 +3253,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateUnicoreDataMovementDetails(
             String dataMovementInterfaceId, UnicoreDataMovement unicoreDataMovement)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         throw new RegistryServiceException("updateUnicoreDataMovementDetails is not yet implemented");
     }
 
@@ -3264,7 +3272,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String addUnicoreDataMovementDetails(
             String resourceId, DMType dmType, int priorityOrder, UnicoreDataMovement unicoreDataMovement)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
             String movementInterface = addDataMovementInterface(
@@ -3296,7 +3304,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean updateSCPDataMovementDetails(String dataMovementInterfaceId, SCPDataMovement scpDataMovement)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             computeResourceRepository.updateScpDataMovement(scpDataMovement);
             logger.debug("Airavata updated SCP data movement with data movement id: " + dataMovementInterfaceId);
@@ -3329,7 +3337,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String addSCPDataMovementDetails(
             String resourceId, DMType dmType, int priorityOrder, SCPDataMovement scpDataMovement)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
             String movementInterface = addDataMovementInterface(
@@ -3360,7 +3368,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean updateLocalDataMovementDetails(String dataMovementInterfaceId, LOCALDataMovement localDataMovement)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             computeResourceRepository.updateLocalDataMovement(localDataMovement);
             logger.debug("Airavata updated local data movement with data movement id: " + dataMovementInterfaceId);
@@ -3388,7 +3396,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String addLocalDataMovementDetails(
             String resourceId, DMType dataMoveType, int priorityOrder, LOCALDataMovement localDataMovement)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
             String movementInterface = addDataMovementInterface(
@@ -3420,7 +3428,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateUnicoreJobSubmissionDetails(
             String jobSubmissionInterfaceId, UnicoreJobSubmission unicoreJobSubmission)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         throw new RegistryServiceException("updateUnicoreJobSubmissionDetails is not yet implemented");
     }
 
@@ -3434,7 +3442,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean updateCloudJobSubmissionDetails(String jobSubmissionInterfaceId, CloudJobSubmission sshJobSubmission)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             computeResourceRepository.updateCloudJobSubmission(sshJobSubmission);
             logger.debug("Airavata updated Cloud job submission for job submission interface id: "
@@ -3463,7 +3471,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean updateSSHJobSubmissionDetails(String jobSubmissionInterfaceId, SSHJobSubmission sshJobSubmission)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             computeResourceRepository.updateSSHJobSubmission(sshJobSubmission);
             logger.debug(
@@ -3508,7 +3516,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String addCloudJobSubmissionDetails(
             String computeResourceId, int priorityOrder, CloudJobSubmission cloudSubmission)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
             String submissionInterface = addJobSubmissionInterface(
@@ -3545,7 +3553,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String addUNICOREJobSubmissionDetails(
             String computeResourceId, int priorityOrder, UnicoreJobSubmission unicoreJobSubmission)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
             String submissionInterface = addJobSubmissionInterface(
@@ -3579,7 +3587,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String addSSHForkJobSubmissionDetails(
             String computeResourceId, int priorityOrder, SSHJobSubmission sshJobSubmission)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
             String submissionDetails = addJobSubmissionInterface(
@@ -3616,7 +3624,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String addSSHJobSubmissionDetails(
             String computeResourceId, int priorityOrder, SSHJobSubmission sshJobSubmission)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
             String submissionInterface = addJobSubmissionInterface(
@@ -3650,7 +3658,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean updateLocalSubmissionDetails(String jobSubmissionInterfaceId, LOCALSubmission localSubmission)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             computeResourceRepository.updateLocalJobSubmission(localSubmission);
             logger.debug("Airavata updated local job submission for job submission interface id: "
@@ -3682,7 +3690,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String addLocalSubmissionDetails(
             String computeResourceId, int priorityOrder, LOCALSubmission localSubmission)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
             String submissionInterface = addJobSubmissionInterface(
@@ -3717,7 +3725,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateStorageResource(
             String storageResourceId, StorageResourceDescription storageResourceDescription)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             storageResourceRepository.updateStorageResource(storageResourceId, storageResourceDescription);
             logger.debug("Airavata updated storage resource with storage resource Id : " + storageResourceId);
@@ -3739,7 +3747,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public String registerStorageResource(StorageResourceDescription storageResourceDescription)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             String storageResource = storageResourceRepository.addStorageResource(storageResourceDescription);
             logger.debug("Airavata registered storage resource with storage resource Id : " + storageResource);
@@ -3763,7 +3771,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateComputeResource(
             String computeResourceId, ComputeResourceDescription computeResourceDescription)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             new ComputeResourceRepository().updateComputeResource(computeResourceId, computeResourceDescription);
             logger.debug("Airavata updated compute resource with compute resource Id : " + computeResourceId);
@@ -3785,7 +3793,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public String registerComputeResource(ComputeResourceDescription computeResourceDescription)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             String computeResource = new ComputeResourceRepository().addComputeResource(computeResourceDescription);
             logger.debug("Airavata registered compute resource with compute resource Id : " + computeResource);
@@ -3809,7 +3817,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateApplicationInterface(
             String appInterfaceId, ApplicationInterfaceDescription applicationInterface)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             applicationInterfaceRepository.updateApplicationInterface(appInterfaceId, applicationInterface);
             logger.debug("Airavata updated application interface with interface id : " + appInterfaceId);
@@ -3832,7 +3840,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public String registerApplicationInterface(String gatewayId, ApplicationInterfaceDescription applicationInterface)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -3861,7 +3869,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateApplicationDeployment(
             String appDeploymentId, ApplicationDeploymentDescription applicationDeployment)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             applicationDeploymentRepository.updateApplicationDeployment(appDeploymentId, applicationDeployment);
             logger.debug("Airavata updated application deployment for deployment id : " + appDeploymentId);
@@ -3885,7 +3893,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public String registerApplicationDeployment(
             String gatewayId, ApplicationDeploymentDescription applicationDeployment)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -3913,7 +3921,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean updateApplicationModule(String appModuleId, ApplicationModule applicationModule)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             applicationInterfaceRepository.updateApplicationModule(appModuleId, applicationModule);
             logger.debug("Airavata updated application module with module id: " + appModuleId);
@@ -3937,7 +3945,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public String registerApplicationModule(String gatewayId, ApplicationModule applicationModule)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!isGatewayExistInternal(gatewayId)) {
             logger.error("Gateway does not exist.Please provide a valid gateway id...");
             throw new RegistryServiceException("Gateway does not exist.Please provide a valid gateway id...");
@@ -3957,7 +3965,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public void updateResourceScheduleing(
             String airavataExperimentId, ComputationalResourceSchedulingModel resourceScheduling)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!experimentRepository.isExperimentExist(airavataExperimentId)) {
                 logger.debug(
@@ -4010,7 +4018,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void updateExperimentConfiguration(String airavataExperimentId, UserConfigurationDataModel userConfiguration)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!experimentRepository.isExperimentExist(airavataExperimentId)) {
                 logger.error(
@@ -4088,7 +4096,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public void updateExperiment(String airavataExperimentId, ExperimentModel experiment)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!experimentRepository.isExperimentExist(airavataExperimentId)) {
                 logger.error(
@@ -4119,7 +4127,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
                                     .getResourceHostId();
                             ComputeResourceDescription computeResourceDescription =
                                     new ComputeResourceRepository().getComputeResource(compResourceId);
-                            if (!computeResourceDescription.isEnabled()) {
+                            if (!computeResourceDescription.getEnabled()) {
                                 logger.error("Compute Resource is not enabled by the Admin!");
                                 AiravataSystemException exception = new AiravataSystemException();
                                 exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
@@ -4207,7 +4215,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public String createExperiment(String gatewayId, ExperimentModel experiment)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!validateString(experiment.getExperimentName())) {
                 logger.error("Cannot create experiments with empty experiment name");
@@ -4236,7 +4244,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
                         .getResourceHostId();
                 ComputeResourceDescription computeResourceDescription =
                         new ComputeResourceRepository().getComputeResource(compResourceId);
-                if (!computeResourceDescription.isEnabled()) {
+                if (!computeResourceDescription.getEnabled()) {
                     logger.error("Compute Resource is not enabled by the Admin!");
                     AiravataSystemException exception = new AiravataSystemException();
                     exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
@@ -4251,7 +4259,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
                         experiment.getUserConfigurationData().getAutoScheduledCompResourceSchedulingList()) {
                     ComputeResourceDescription computeResourceDescription = new ComputeResourceRepository()
                             .getComputeResource(computationalResourceScheduling.getResourceHostId());
-                    if (!computeResourceDescription.isEnabled()) {
+                    if (!computeResourceDescription.getEnabled()) {
                         logger.error("Compute Resource  with id" + computationalResourceScheduling.getResourceHostId()
                                 + "" + " is not enabled by the Admin!");
                         AiravataSystemException exception = new AiravataSystemException();
@@ -4300,7 +4308,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             Map<ExperimentSearchFields, String> filters,
             int limit,
             int offset)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!validateString(userName)) {
             logger.error("Username cannot be empty. Please provide a valid user..");
             AiravataSystemException exception = new AiravataSystemException();
@@ -4386,7 +4394,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             Map<ProjectSearchFields, String> filters,
             int limit,
             int offset)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         if (!validateString(userName)) {
             logger.error("Username cannot be empty. Please provide a valid user..");
             AiravataSystemException exception = new AiravataSystemException();
@@ -4449,7 +4457,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Currently this does not return any value.
      */
     @Override
-    public void updateProject(String projectId, Project updatedProject) throws RegistryServiceException, TException {
+    public void updateProject(String projectId, Project updatedProject) throws RegistryServiceException, Exception {
         if (!validateString(projectId) || !validateString(projectId)) {
             logger.error("Project id cannot be empty...");
             AiravataSystemException exception = new AiravataSystemException();
@@ -4483,7 +4491,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @param project
      */
     @Override
-    public String createProject(String gatewayId, Project project) throws RegistryServiceException, TException {
+    public String createProject(String gatewayId, Project project) throws RegistryServiceException, Exception {
         try {
             if (!validateString(project.getName()) || !validateString(project.getOwner())) {
                 logger.error("Project name and owner cannot be empty...");
@@ -4508,7 +4516,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public boolean updateNotification(Notification notification) throws RegistryServiceException, TException {
+    public boolean updateNotification(Notification notification) throws RegistryServiceException, Exception {
         try {
             notificationRepository.updateNotification(notification);
             return true;
@@ -4527,7 +4535,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @param notification
      */
     @Override
-    public String createNotification(Notification notification) throws RegistryServiceException, TException {
+    public String createNotification(Notification notification) throws RegistryServiceException, Exception {
         try {
             return notificationRepository.createNotification(notification);
         } catch (RegistryException e) {
@@ -4548,7 +4556,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * @throws AiravataClientException
      */
     @Override
-    public boolean updateGateway(String gatewayId, Gateway updatedGateway) throws RegistryServiceException, TException {
+    public boolean updateGateway(String gatewayId, Gateway updatedGateway) throws RegistryServiceException, Exception {
         try {
             if (!gatewayRepository.isGatewayExist(gatewayId)) {
                 logger.error("Gateway does not exist in the system. Please provide a valid gateway ID...");
@@ -4593,7 +4601,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Th unique identifier of the  newly registered gateway.
      */
     @Override
-    public String addGateway(Gateway gateway) throws RegistryServiceException, DuplicateEntryException, TException {
+    public String addGateway(Gateway gateway) throws RegistryServiceException, DuplicateEntryException, Exception {
         try {
             if (!validateString(gateway.getGatewayId())) {
                 logger.error("Gateway id cannot be empty...");
@@ -4660,7 +4668,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     /*This private method wraps the logic of getExperiment method as this method is called internally in the API.*/
     private ExperimentModel getExperimentInternal(String airavataExperimentId)
             throws InvalidRequestException, ExperimentNotFoundException, AiravataClientException,
-                    AiravataSystemException, TException {
+                    AiravataSystemException, Exception {
         try {
             if (!experimentRepository.isExperimentExist(airavataExperimentId)) {
                 throw new ExperimentNotFoundException(
@@ -4678,7 +4686,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     /*Private method wraps the logic of getExperimentStatus method since this method is called internally.*/
     private ExperimentStatus getExperimentStatusInternal(String airavataExperimentId)
             throws InvalidRequestException, ExperimentNotFoundException, AiravataClientException,
-                    AiravataSystemException, TException {
+                    AiravataSystemException, Exception {
         try {
             if (!experimentRepository.isExperimentExist(airavataExperimentId)) {
                 logger.error(
@@ -4700,7 +4708,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     /*This private method wraps the logic of getApplicationOutputs method as this method is called internally in the API.*/
     private List<OutputDataObjectType> getApplicationOutputsInternal(String appInterfaceId)
-            throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
+            throws InvalidRequestException, AiravataClientException, AiravataSystemException, Exception {
         try {
             List<OutputDataObjectType> applicationOutputs =
                     applicationInterfaceRepository.getApplicationOutputs(appInterfaceId);
@@ -4761,7 +4769,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public String registerUserResourceProfile(UserResourceProfile userResourceProfile)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!validateString(userResourceProfile.getUserId())) {
                 logger.error("Cannot create user resource profile with empty user id");
@@ -4799,7 +4807,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean isUserResourceProfileExists(String userId, String gatewayId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayId, userId)) {
                 logger.error("user does not exist.Please provide a valid gateway id...");
@@ -4829,7 +4837,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public UserResourceProfile getUserResourceProfile(String userId, String gatewayId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayId, userId)) {
                 logger.error("user does not exist.Please provide a valid gateway id...");
@@ -4862,7 +4870,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean updateUserResourceProfile(String userId, String gatewayID, UserResourceProfile userResourceProfile)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("User does not exist.Please provide a valid user id...");
@@ -4894,7 +4902,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean deleteUserResourceProfile(String userId, String gatewayID)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("user does not exist.Please provide a valid user id...");
@@ -4918,7 +4926,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public String addUser(UserProfile userProfile)
-            throws RegistryServiceException, DuplicateEntryException, TException {
+            throws RegistryServiceException, DuplicateEntryException, Exception {
         try {
             logger.info("Adding User in Registry: " + userProfile);
             if (isUserExists(userProfile.getGatewayId(), userProfile.getUserId())) {
@@ -4952,7 +4960,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             String gatewayID,
             String computeResourceId,
             UserComputeResourcePreference userComputeResourcePreference)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("user does not exist.Please provide a valid user id...");
@@ -4964,7 +4972,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             }
             UserResourceProfile profile = userResourceProfileRepository.getUserResourceProfile(userId, gatewayID);
             //            gatewayProfile.removeGatewayResourceProfile(gatewayID);
-            profile.addToUserComputeResourcePreferences(userComputeResourcePreference);
+            profile = profile.toBuilder().addUserComputeResourcePreferences(userComputeResourcePreference).build();
             userResourceProfileRepository.updateUserResourceProfile(userId, gatewayID, profile);
             logger.debug("Airavata added User compute resource preference with gateway id : " + gatewayID
                     + " and for compute resource id : " + computeResourceId);
@@ -4994,7 +5002,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean isUserComputeResourcePreferenceExists(String userId, String gatewayID, String computeResourceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (userRepository.isUserExists(gatewayID, userId)
                     && userResourceProfileRepository.isUserResourceProfileExists(userId, gatewayID)) {
@@ -5028,7 +5036,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean addUserStoragePreference(
             String userId, String gatewayID, String storageResourceId, UserStoragePreference dataStoragePreference)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("user does not exist.Please provide a valid user id...");
@@ -5040,8 +5048,8 @@ public class RegistryServerHandler implements RegistryService.Iface {
             }
             UserResourceProfile profile = userResourceProfileRepository.getUserResourceProfile(userId, gatewayID);
             //            gatewayProfile.removeGatewayResourceProfile(gatewayID);
-            dataStoragePreference.setStorageResourceId(storageResourceId);
-            profile.addToUserStoragePreferences(dataStoragePreference);
+            dataStoragePreference = dataStoragePreference.toBuilder().setStorageResourceId(storageResourceId).build();
+            profile = profile.toBuilder().addUserStoragePreferences(dataStoragePreference).build();
             userResourceProfileRepository.updateUserResourceProfile(userId, gatewayID, profile);
             logger.debug("Airavata added storage resource preference with gateway id : " + gatewayID
                     + " and for storage resource id : " + storageResourceId);
@@ -5071,7 +5079,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public UserComputeResourcePreference getUserComputeResourcePreference(
-            String userId, String gatewayID, String userComputeResourceId) throws RegistryServiceException, TException {
+            String userId, String gatewayID, String userComputeResourceId) throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("user does not exist.Please provide a valid user id...");
@@ -5121,7 +5129,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public UserStoragePreference getUserStoragePreference(String userId, String gatewayID, String storageId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("user does not exist.Please provide a valid user id...");
@@ -5157,7 +5165,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * Returns all the UserResourceProfile list object.
      */
     @Override
-    public List<UserResourceProfile> getAllUserResourceProfiles() throws RegistryServiceException, TException {
+    public List<UserResourceProfile> getAllUserResourceProfiles() throws RegistryServiceException, Exception {
         try {
             return userResourceProfileRepository.getAllUserResourceProfiles();
         } catch (AppCatalogException e) {
@@ -5183,7 +5191,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             String gatewayID,
             String computeResourceId,
             UserComputeResourcePreference userComputeResourcePreference)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("user does not exist.Please provide a valid user id...");
@@ -5191,7 +5199,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             }
             UserResourceProfile profile = userResourceProfileRepository.getUserResourceProfile(userId, gatewayID);
             List<UserComputeResourcePreference> userComputeResourcePreferences =
-                    profile.getUserComputeResourcePreferences();
+                    profile.getUserComputeResourcePreferencesList();
             UserComputeResourcePreference preferenceToRemove = null;
             for (UserComputeResourcePreference preference : userComputeResourcePreferences) {
                 if (preference.getComputeResourceId().equals(computeResourceId)) {
@@ -5199,11 +5207,13 @@ public class RegistryServerHandler implements RegistryService.Iface {
                     break;
                 }
             }
+            UserResourceProfile.Builder profileBuilder = profile.toBuilder();
             if (preferenceToRemove != null) {
-                profile.getUserComputeResourcePreferences().remove(preferenceToRemove);
+                int idx = userComputeResourcePreferences.indexOf(preferenceToRemove);
+                if (idx >= 0) profileBuilder.removeUserComputeResourcePreferences(idx);
             }
-            profile.getUserComputeResourcePreferences().add(userComputeResourcePreference);
-            userResourceProfileRepository.updateUserResourceProfile(userId, gatewayID, profile);
+            profileBuilder.addUserComputeResourcePreferences(userComputeResourcePreference);
+            userResourceProfileRepository.updateUserResourceProfile(userId, gatewayID, profileBuilder.build());
             logger.debug("Airavata updated compute resource preference with gateway id : " + gatewayID
                     + " and for compute resource id : " + computeResourceId);
             return true;
@@ -5234,14 +5244,14 @@ public class RegistryServerHandler implements RegistryService.Iface {
     @Override
     public boolean updateUserStoragePreference(
             String userId, String gatewayID, String storageId, UserStoragePreference userStoragePreference)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("user does not exist.Please provide a valid user id...");
                 throw new RegistryServiceException("user does not exist.Please provide a valid user id...");
             }
             UserResourceProfile profile = userResourceProfileRepository.getUserResourceProfile(userId, gatewayID);
-            List<UserStoragePreference> dataStoragePreferences = profile.getUserStoragePreferences();
+            List<UserStoragePreference> dataStoragePreferences = profile.getUserStoragePreferencesList();
             UserStoragePreference preferenceToRemove = null;
             for (UserStoragePreference preference : dataStoragePreferences) {
                 if (preference.getStorageResourceId().equals(storageId)) {
@@ -5249,11 +5259,13 @@ public class RegistryServerHandler implements RegistryService.Iface {
                     break;
                 }
             }
+            UserResourceProfile.Builder profileBuilder = profile.toBuilder();
             if (preferenceToRemove != null) {
-                profile.getUserStoragePreferences().remove(preferenceToRemove);
+                int idx = dataStoragePreferences.indexOf(preferenceToRemove);
+                if (idx >= 0) profileBuilder.removeUserStoragePreferences(idx);
             }
-            profile.getUserStoragePreferences().add(userStoragePreference);
-            userResourceProfileRepository.updateUserResourceProfile(userId, gatewayID, profile);
+            profileBuilder.addUserStoragePreferences(userStoragePreference);
+            userResourceProfileRepository.updateUserResourceProfile(userId, gatewayID, profileBuilder.build());
             logger.debug("Airavata updated user storage resource preference with gateway id : " + gatewayID
                     + " and for storage resource id : " + storageId);
             return true;
@@ -5281,7 +5293,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean deleteUserComputeResourcePreference(String userId, String gatewayID, String computeResourceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("user does not exist.Please provide a valid user id...");
@@ -5314,7 +5326,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public boolean deleteUserStoragePreference(String userId, String gatewayID, String storageId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!userRepository.isUserExists(gatewayID, userId)) {
                 logger.error("user does not exist.Please provide a valid user id...");
@@ -5340,7 +5352,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      * *
      */
     @Override
-    public List<QueueStatusModel> getLatestQueueStatuses() throws RegistryServiceException, TException {
+    public List<QueueStatusModel> getLatestQueueStatuses() throws RegistryServiceException, Exception {
         try {
             List<QueueStatusModel> queueStatusModels = queueStatusRepository.getLatestQueueStatuses();
             return queueStatusModels;
@@ -5354,7 +5366,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void registerQueueStatuses(List<QueueStatusModel> queueStatuses)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             queueStatusRepository.createQueueStatuses(queueStatuses);
         } catch (RegistryException e) {
@@ -5367,7 +5379,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public QueueStatusModel getQueueStatus(String hostName, String queueName)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             Optional<QueueStatusModel> optionalQueueStatusModel =
                     queueStatusRepository.getQueueStatus(hostName, queueName);
@@ -5375,14 +5387,14 @@ public class RegistryServerHandler implements RegistryService.Iface {
             if (optionalQueueStatusModel.isPresent()) {
                 return optionalQueueStatusModel.get();
             } else {
-                QueueStatusModel queueStatusModel = new QueueStatusModel();
-                queueStatusModel.setHostName(hostName);
-                queueStatusModel.setQueueName(queueName);
-                queueStatusModel.setQueueUp(false);
-                queueStatusModel.setRunningJobs(0);
-                queueStatusModel.setQueuedJobs(0);
-                queueStatusModel.setTime(0);
-                return queueStatusModel;
+                return QueueStatusModel.newBuilder()
+                        .setHostName(hostName)
+                        .setQueueName(queueName)
+                        .setQueueUp(false)
+                        .setRunningJobs(0)
+                        .setQueuedJobs(0)
+                        .setTime(0)
+                        .build();
             }
         } catch (RegistryException e) {
             logger.error("Error while storing queue status models....", e);
@@ -5402,7 +5414,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<UserComputeResourcePreference> getAllUserComputeResourcePreferences(String userId, String gatewayID)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isUserExists(gatewayID, userId)) {
                 logger.error("User Resource Profile does not exist.Please provide a valid gateway id...");
@@ -5411,7 +5423,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             }
             return userResourceProfileRepository
                     .getUserResourceProfile(userId, gatewayID)
-                    .getUserComputeResourcePreferences();
+                    .getUserComputeResourcePreferencesList();
         } catch (AppCatalogException e) {
             logger.error(userId, "Error while reading User Resource Profile compute resource preferences...", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -5431,7 +5443,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
      */
     @Override
     public List<UserStoragePreference> getAllUserStoragePreferences(String userId, String gatewayID)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (!isUserExists(gatewayID, userId)) {
                 logger.error("User does not exist.Please provide a valid gateway id...");
@@ -5439,7 +5451,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
             }
             return userResourceProfileRepository
                     .getUserResourceProfile(userId, gatewayID)
-                    .getUserStoragePreferences();
+                    .getUserStoragePreferencesList();
         } catch (AppCatalogException e) {
             logger.error(userId, "Error while reading user resource Profile data storage preferences...", e);
             RegistryServiceException exception = new RegistryServiceException();
@@ -5451,7 +5463,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void createGatewayGroups(GatewayGroups gatewayGroups)
-            throws RegistryServiceException, DuplicateEntryException, TException {
+            throws RegistryServiceException, DuplicateEntryException, Exception {
         try {
             if (gatewayGroupsRepository.isExists(gatewayGroups.getGatewayId())) {
                 logger.error("GatewayGroups already exists for " + gatewayGroups.getGatewayId());
@@ -5473,7 +5485,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public void updateGatewayGroups(GatewayGroups gatewayGroups) throws RegistryServiceException, TException {
+    public void updateGatewayGroups(GatewayGroups gatewayGroups) throws RegistryServiceException, Exception {
         try {
             if (!gatewayGroupsRepository.isExists(gatewayGroups.getGatewayId())) {
                 final String message = "No GatewayGroups entry exists for " + gatewayGroups.getGatewayId();
@@ -5495,7 +5507,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public boolean isGatewayGroupsExists(String gatewayId) throws RegistryServiceException, TException {
+    public boolean isGatewayGroupsExists(String gatewayId) throws RegistryServiceException, Exception {
         try {
             return gatewayGroupsRepository.isExists(gatewayId);
         } catch (Exception e) {
@@ -5508,7 +5520,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public GatewayGroups getGatewayGroups(String gatewayId) throws RegistryServiceException, TException {
+    public GatewayGroups getGatewayGroups(String gatewayId) throws RegistryServiceException, Exception {
         try {
             if (!gatewayGroupsRepository.isExists(gatewayId)) {
                 final String message = "No GatewayGroups entry exists for " + gatewayId;
@@ -5529,7 +5541,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public Parser getParser(String parserId, String gatewayId) throws RegistryServiceException, TException {
+    public Parser getParser(String parserId, String gatewayId) throws RegistryServiceException, Exception {
 
         try {
             if (!parserRepository.isExists(parserId)) {
@@ -5552,7 +5564,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public String saveParser(Parser parser) throws RegistryServiceException, TException {
+    public String saveParser(Parser parser) throws RegistryServiceException, Exception {
 
         try {
             Parser created = parserRepository.saveParser(parser);
@@ -5568,7 +5580,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<Parser> listAllParsers(String gatewayId) throws RegistryServiceException, TException {
+    public List<Parser> listAllParsers(String gatewayId) throws RegistryServiceException, Exception {
 
         try {
             return parserRepository.getAllParsers(gatewayId);
@@ -5583,7 +5595,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public void removeParser(String parserId, String gatewayId) throws RegistryServiceException, TException {
+    public void removeParser(String parserId, String gatewayId) throws RegistryServiceException, Exception {
 
         try {
             boolean exists = parserRepository.isExists(parserId);
@@ -5607,7 +5619,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public ParserInput getParserInput(String parserInputId, String gatewayId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ParserInput parserInput = parserInputRepository.getParserInput(parserInputId);
             // TODO check the gateway
@@ -5622,7 +5634,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public ParserOutput getParserOutput(String parserOutputId, String gatewayId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             ParserOutput parserOutput = parserOutputRepository.getParserOutput(parserOutputId);
             // TODO check the gateway
@@ -5637,7 +5649,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public ParsingTemplate getParsingTemplate(String templateId, String gatewayId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
 
         try {
             if (!parsingTemplateRepository.isExists(templateId)) {
@@ -5661,10 +5673,10 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public List<ParsingTemplate> getParsingTemplatesForExperiment(String experimentId, String gatewayId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
 
         try {
-            List<ProcessModel> processes = getExperiment(experimentId).getProcesses();
+            List<ProcessModel> processes = getExperiment(experimentId).getProcessesList();
             if (processes.size() > 0) {
                 return parsingTemplateRepository.getParsingTemplatesForApplication(
                         processes.get(processes.size() - 1).getApplicationInterfaceId());
@@ -5681,7 +5693,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public String saveParsingTemplate(ParsingTemplate parsingTemplate) throws RegistryServiceException, TException {
+    public String saveParsingTemplate(ParsingTemplate parsingTemplate) throws RegistryServiceException, Exception {
 
         try {
             ParsingTemplate saved = parsingTemplateRepository.create(parsingTemplate);
@@ -5697,7 +5709,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public List<ParsingTemplate> listAllParsingTemplates(String gatewayId) throws RegistryServiceException, TException {
+    public List<ParsingTemplate> listAllParsingTemplates(String gatewayId) throws RegistryServiceException, Exception {
 
         try {
             return parsingTemplateRepository.getAllParsingTemplates(gatewayId);
@@ -5712,7 +5724,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
     }
 
     @Override
-    public void removeParsingTemplate(String templateId, String gatewayId) throws RegistryServiceException, TException {
+    public void removeParsingTemplate(String templateId, String gatewayId) throws RegistryServiceException, Exception {
 
         try {
             boolean exists = parsingTemplateRepository.isExists(templateId);
@@ -5739,7 +5751,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public boolean isGatewayUsageReportingAvailable(String gatewayId, String computeResourceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             return usageReportingCommandRepository.isGatewayUsageReportingCommandExists(gatewayId, computeResourceId);
         } catch (Exception e) {
@@ -5754,7 +5766,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public GatewayUsageReportingCommand getGatewayReportingCommand(String gatewayId, String computeResourceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             if (usageReportingCommandRepository.isGatewayUsageReportingCommandExists(gatewayId, computeResourceId)) {
                 return usageReportingCommandRepository.getGatewayUsageReportingCommand(gatewayId, computeResourceId);
@@ -5779,7 +5791,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void addGatewayUsageReportingCommand(GatewayUsageReportingCommand command)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             usageReportingCommandRepository.addGatewayUsageReportingCommand(command);
         } catch (Exception e) {
@@ -5794,7 +5806,7 @@ public class RegistryServerHandler implements RegistryService.Iface {
 
     @Override
     public void removeGatewayUsageReportingCommand(String gatewayId, String computeResourceId)
-            throws RegistryServiceException, TException {
+            throws RegistryServiceException, Exception {
         try {
             usageReportingCommandRepository.removeGatewayUsageReportingCommand(gatewayId, computeResourceId);
         } catch (Exception e) {
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServiceDBEventHandler.java b/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServiceDBEventHandler.java
index 217bc9da07..b51113b804 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServiceDBEventHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServiceDBEventHandler.java
@@ -27,16 +27,16 @@ import org.apache.airavata.messaging.service.MessageContext;
 import org.apache.airavata.messaging.service.MessageHandler;
 import org.apache.airavata.messaging.util.DBEventPublisherUtils;
 import org.apache.airavata.messaging.util.DBEventService;
-import org.apache.airavata.model.dbevent.CrudType;
-import org.apache.airavata.model.dbevent.DBEventMessage;
-import org.apache.airavata.model.dbevent.DBEventPublisherContext;
-import org.apache.airavata.model.dbevent.EntityType;
-import org.apache.airavata.model.error.DuplicateEntryException;
-import org.apache.airavata.model.user.UserProfile;
-import org.apache.airavata.model.workspace.Gateway;
-import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.model.dbevent.proto.CrudType;
+import org.apache.airavata.model.dbevent.proto.DBEventMessage;
+import org.apache.airavata.model.dbevent.proto.DBEventPublisherContext;
+import org.apache.airavata.model.dbevent.proto.EntityType;
+import org.apache.airavata.model.error.proto.DuplicateEntryException;
+import org.apache.airavata.model.user.proto.UserProfile;
+import org.apache.airavata.model.workspace.proto.Gateway;
+import org.apache.airavata.model.workspace.proto.Project;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -180,7 +180,7 @@ public class RegistryServiceDBEventHandler implements MessageHandler {
             logger.info("RegistryServiceDBEventHandler | Sending ack. Message Delivery Tag: "
                     + messageContext.getDeliveryTag());
             RegistryServiceDBEventMessagingFactory.getDBEventSubscriber().sendAck(messageContext.getDeliveryTag());
-        } catch (TException ex) {
+        } catch (Exception ex) {
             logger.error("Error processing message: " + ex, ex);
         } catch (ApplicationSettingsException ex) {
             logger.error("Error fetching application settings: " + ex, ex);
@@ -193,19 +193,20 @@ public class RegistryServiceDBEventHandler implements MessageHandler {
     }
 
     private Project createDefaultProject(RegistryService.Iface registryClient, UserProfile userProfile)
-            throws TException {
+            throws Exception {
         // Just retrieve the first project to see if the user has any projects
         List<Project> projects =
                 registryClient.getUserProjects(userProfile.getGatewayId(), userProfile.getUserId(), 1, 0);
         if (projects.isEmpty()) {
-            Project defaultProject = new Project();
-            defaultProject.setOwner(userProfile.getUserId());
-            defaultProject.setName("Default Project");
-            defaultProject.setGatewayId(userProfile.getGatewayId());
-            defaultProject.setDescription("This is the default project for user " + userProfile.getUserId());
+            Project defaultProject = Project.newBuilder()
+                    .setOwner(userProfile.getUserId())
+                    .setName("Default Project")
+                    .setGatewayId(userProfile.getGatewayId())
+                    .setDescription("This is the default project for user " + userProfile.getUserId())
+                    .build();
             String defaultProjectId = registryClient.createProject(userProfile.getGatewayId(), defaultProject);
             logger.info("Default project created for user {}", userProfile.getUserId());
-            defaultProject.setProjectID(defaultProjectId);
+            defaultProject = defaultProject.toBuilder().setProjectID(defaultProjectId).build();
             return defaultProject;
         }
         return null;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServiceDBEventMessagingFactory.java b/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServiceDBEventMessagingFactory.java
index d64fe5f71b..b9e51dac46 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServiceDBEventMessagingFactory.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/handler/RegistryServiceDBEventMessagingFactory.java
@@ -27,11 +27,11 @@ import org.apache.airavata.messaging.service.Publisher;
 import org.apache.airavata.messaging.service.Subscriber;
 import org.apache.airavata.messaging.util.DBEventManagerConstants;
 import org.apache.airavata.messaging.util.DBEventService;
-import org.apache.airavata.model.dbevent.DBEventMessage;
-import org.apache.airavata.model.dbevent.DBEventMessageContext;
-import org.apache.airavata.model.dbevent.DBEventSubscriber;
-import org.apache.airavata.model.dbevent.DBEventType;
-import org.apache.airavata.model.messaging.event.MessageType;
+import org.apache.airavata.model.dbevent.proto.DBEventMessage;
+import org.apache.airavata.model.dbevent.proto.DBEventMessageContext;
+import org.apache.airavata.model.dbevent.proto.DBEventSubscriber;
+import org.apache.airavata.model.dbevent.proto.DBEventType;
+import org.apache.airavata.model.messaging.event.proto.MessageType;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/mapper/ExecutionMapper.java b/airavata-api/src/main/java/org/apache/airavata/execution/mapper/ExecutionMapper.java
index 961a054849..e2a898093d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/mapper/ExecutionMapper.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/mapper/ExecutionMapper.java
@@ -24,28 +24,28 @@ import java.util.Arrays;
 import java.util.List;
 import org.apache.airavata.execution.model.*;
 import org.apache.airavata.execution.model.workflow.AiravataWorkflowEntity;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.commons.ErrorModel;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.experiment.ExperimentSummaryModel;
-import org.apache.airavata.model.experiment.UserConfigurationDataModel;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.process.ProcessWorkflow;
-import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
-import org.apache.airavata.model.status.ExperimentStatus;
-import org.apache.airavata.model.status.JobStatus;
-import org.apache.airavata.model.status.ProcessStatus;
-import org.apache.airavata.model.status.QueueStatusModel;
-import org.apache.airavata.model.status.TaskStatus;
-import org.apache.airavata.model.task.TaskModel;
-import org.apache.airavata.model.user.UserProfile;
-import org.apache.airavata.model.workflow.AiravataWorkflow;
-import org.apache.airavata.model.workspace.Gateway;
-import org.apache.airavata.model.workspace.GatewayUsageReportingCommand;
-import org.apache.airavata.model.workspace.Notification;
-import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.commons.proto.ErrorModel;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.experiment.proto.ExperimentSummaryModel;
+import org.apache.airavata.model.experiment.proto.UserConfigurationDataModel;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.process.proto.ProcessWorkflow;
+import org.apache.airavata.model.scheduling.proto.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.status.proto.ExperimentStatus;
+import org.apache.airavata.model.status.proto.JobStatus;
+import org.apache.airavata.model.status.proto.ProcessStatus;
+import org.apache.airavata.model.status.proto.QueueStatusModel;
+import org.apache.airavata.model.status.proto.TaskStatus;
+import org.apache.airavata.model.task.proto.TaskModel;
+import org.apache.airavata.model.user.proto.UserProfile;
+import org.apache.airavata.model.workflow.proto.AiravataWorkflow;
+import org.apache.airavata.model.workspace.proto.Gateway;
+import org.apache.airavata.model.workspace.proto.GatewayUsageReportingCommand;
+import org.apache.airavata.model.workspace.proto.Notification;
+import org.apache.airavata.model.workspace.proto.Project;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.ReportingPolicy;
@@ -189,36 +189,36 @@ public interface ExecutionMapper {
      */
     default UserConfigurationDataModel userConfigDataToModel(UserConfigurationDataEntity entity) {
         if (entity == null) return null;
-        UserConfigurationDataModel model = new UserConfigurationDataModel();
-        model.setAiravataAutoSchedule(entity.isAiravataAutoSchedule());
-        model.setOverrideManualScheduledParams(entity.isOverrideManualScheduledParams());
-        model.setShareExperimentPublicly(entity.isShareExperimentPublicly());
-        model.setThrottleResources(entity.isThrottleResources());
-        model.setUserDN(entity.getUserDN());
-        model.setGenerateCert(entity.isGenerateCert());
-        model.setExperimentDataDir(entity.getExperimentDataDir());
-        model.setGroupResourceProfileId(entity.getGroupResourceProfileId());
-        model.setUseUserCRPref(entity.isUseUserCRPref());
 
         // Map flattened scheduling fields into nested ComputationalResourceSchedulingModel
-        ComputationalResourceSchedulingModel scheduling = new ComputationalResourceSchedulingModel();
-        scheduling.setResourceHostId(entity.getResourceHostId());
-        scheduling.setTotalCPUCount(entity.getTotalCPUCount());
-        scheduling.setNodeCount(entity.getNodeCount());
-        scheduling.setNumberOfThreads(entity.getNumberOfThreads());
-        scheduling.setQueueName(entity.getQueueName());
-        scheduling.setWallTimeLimit(entity.getWallTimeLimit());
-        scheduling.setTotalPhysicalMemory(entity.getTotalPhysicalMemory());
-        scheduling.setStaticWorkingDir(entity.getStaticWorkingDir());
-        scheduling.setOverrideLoginUserName(entity.getOverrideLoginUserName());
-        scheduling.setOverrideScratchLocation(entity.getOverrideScratchLocation());
-        scheduling.setOverrideAllocationProjectNumber(entity.getOverrideAllocationProjectNumber());
-        model.setComputationalResourceScheduling(scheduling);
-
-        model.setInputStorageResourceId(entity.getInputStorageResourceId());
-        model.setOutputStorageResourceId(entity.getOutputStorageResourceId());
-
-        return model;
+        ComputationalResourceSchedulingModel scheduling = ComputationalResourceSchedulingModel.newBuilder()
+                .setResourceHostId(entity.getResourceHostId())
+                .setTotalCPUCount(entity.getTotalCPUCount())
+                .setNodeCount(entity.getNodeCount())
+                .setNumberOfThreads(entity.getNumberOfThreads())
+                .setQueueName(entity.getQueueName())
+                .setWallTimeLimit(entity.getWallTimeLimit())
+                .setTotalPhysicalMemory(entity.getTotalPhysicalMemory())
+                .setStaticWorkingDir(entity.getStaticWorkingDir())
+                .setOverrideLoginUserName(entity.getOverrideLoginUserName())
+                .setOverrideScratchLocation(entity.getOverrideScratchLocation())
+                .setOverrideAllocationProjectNumber(entity.getOverrideAllocationProjectNumber())
+                .build();
+
+        return UserConfigurationDataModel.newBuilder()
+                .setAiravataAutoSchedule(entity.getAiravataAutoSchedule())
+                .setOverrideManualScheduledParams(entity.getOverrideManualScheduledParams())
+                .setShareExperimentPublicly(entity.getShareExperimentPublicly())
+                .setThrottleResources(entity.getThrottleResources())
+                .setUserDN(entity.getUserDN())
+                .setGenerateCert(entity.getGenerateCert())
+                .setExperimentDataDir(entity.getExperimentDataDir())
+                .setGroupResourceProfileId(entity.getGroupResourceProfileId())
+                .setUseUserCRPref(entity.getUseUserCRPref())
+                .setComputationalResourceScheduling(scheduling)
+                .setInputStorageResourceId(entity.getInputStorageResourceId())
+                .setOutputStorageResourceId(entity.getOutputStorageResourceId())
+                .build();
     }
 
     /**
@@ -227,21 +227,21 @@ public interface ExecutionMapper {
     default UserConfigurationDataEntity userConfigDataToEntity(UserConfigurationDataModel model) {
         if (model == null) return null;
         UserConfigurationDataEntity entity = new UserConfigurationDataEntity();
-        entity.setAiravataAutoSchedule(model.isAiravataAutoSchedule());
-        entity.setOverrideManualScheduledParams(model.isOverrideManualScheduledParams());
-        entity.setShareExperimentPublicly(model.isShareExperimentPublicly());
-        entity.setThrottleResources(model.isThrottleResources());
+        entity.setAiravataAutoSchedule(model.getAiravataAutoSchedule());
+        entity.setOverrideManualScheduledParams(model.getOverrideManualScheduledParams());
+        entity.setShareExperimentPublicly(model.getShareExperimentPublicly());
+        entity.setThrottleResources(model.getThrottleResources());
         entity.setUserDN(model.getUserDN());
-        entity.setGenerateCert(model.isGenerateCert());
+        entity.setGenerateCert(model.getGenerateCert());
         entity.setExperimentDataDir(model.getExperimentDataDir());
         entity.setGroupResourceProfileId(model.getGroupResourceProfileId());
-        entity.setUseUserCRPref(model.isUseUserCRPref());
+        entity.setUseUserCRPref(model.getUseUserCRPref());
         entity.setInputStorageResourceId(model.getInputStorageResourceId());
         entity.setOutputStorageResourceId(model.getOutputStorageResourceId());
 
         // Extract scheduling fields from nested object
-        ComputationalResourceSchedulingModel scheduling = model.getComputationalResourceScheduling();
-        if (scheduling != null) {
+        if (model.hasComputationalResourceScheduling()) {
+            ComputationalResourceSchedulingModel scheduling = model.getComputationalResourceScheduling();
             entity.setResourceHostId(scheduling.getResourceHostId());
             entity.setTotalCPUCount(scheduling.getTotalCPUCount());
             entity.setNodeCount(scheduling.getNodeCount());
@@ -258,7 +258,7 @@ public interface ExecutionMapper {
         return entity;
     }
 
-    /** boolean to int (Thrift boolean fields stored as int in some entities) */
+    /** boolean to int (boolean fields stored as int in some entities) */
     default int booleanToInt(boolean value) {
         return value ? 1 : 0;
     }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentEntity.java
index 033b637b1f..860dffa26b 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentEntity.java
@@ -23,8 +23,8 @@ import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
 import java.util.List;
-import org.apache.airavata.model.experiment.ExperimentCleanupStrategy;
-import org.apache.airavata.model.experiment.ExperimentType;
+import org.apache.airavata.model.experiment.proto.ExperimentCleanupStrategy;
+import org.apache.airavata.model.experiment.proto.ExperimentType;
 
 /**
  * The persistent class for the experiment database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentInputEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentInputEntity.java
index ce2eed1fc1..d05f1f13cf 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentInputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentInputEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.execution.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.proto.DataType;
 
 /**
  * The persistent class for the experiment_input database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentOutputEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentOutputEntity.java
index e1c12e6fc7..195dc36464 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentOutputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentOutputEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.execution.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.proto.DataType;
 
 /**
  * The persistent class for the experiment_output database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentStatusEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentStatusEntity.java
index f61d238c92..eda3950470 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentStatusEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentStatusEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.status.ExperimentState;
+import org.apache.airavata.model.status.proto.ExperimentState;
 
 /**
  * The persistent class for the experiment_status database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/GatewayEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/GatewayEntity.java
index bf24b88004..c1a6abb0f8 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/GatewayEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/GatewayEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.workspace.GatewayApprovalStatus;
+import org.apache.airavata.model.workspace.proto.GatewayApprovalStatus;
 
 /**
  * The persistent class for the gateway database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/JobStatusEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/JobStatusEntity.java
index 6ca741b037..baf3cde821 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/JobStatusEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/JobStatusEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 
 /**
  * The persistent class for the job_status database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/NotificationEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/NotificationEntity.java
index 3162512541..c4dda92e47 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/NotificationEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/NotificationEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.workspace.NotificationPriority;
+import org.apache.airavata.model.workspace.proto.NotificationPriority;
 
 /**
  * The persistent class for the notification database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessInputEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessInputEntity.java
index a7ef78fd82..a4e131251d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessInputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessInputEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.execution.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.proto.DataType;
 
 /**
  * The primary key class for the process_input database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessOutputEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessOutputEntity.java
index 802f043180..49ef4923e8 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessOutputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessOutputEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.execution.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.proto.DataType;
 
 /**
  * The persistent class for the process_output database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessStatusEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessStatusEntity.java
index 34e37948cc..952b69e269 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessStatusEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessStatusEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.status.ProcessState;
+import org.apache.airavata.model.status.proto.ProcessState;
 
 /**
  * The persistent class for the process_status database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskEntity.java
index 506f63b25e..9ccd083ce5 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskEntity.java
@@ -23,7 +23,7 @@ import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
 import java.util.List;
-import org.apache.airavata.model.task.TaskTypes;
+import org.apache.airavata.model.task.proto.TaskTypes;
 
 /**
  * The persistent class for the task database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskStatusEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskStatusEntity.java
index 87b60008d0..8b42db5f7e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskStatusEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskStatusEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.status.TaskState;
+import org.apache.airavata.model.status.proto.TaskState;
 
 /**
  * The persistent class for the task_status database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/AiravataWorkflowStatusEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/AiravataWorkflowStatusEntity.java
index 6449d08504..78e690b575 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/AiravataWorkflowStatusEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/AiravataWorkflowStatusEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model.workflow;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.workflow.WorkflowState;
+import org.apache.airavata.model.workflow.proto.WorkflowState;
 
 @Entity
 @Table(name = "AIRAVATA_WORKFLOW_STATUS")
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/ApplicationStatusEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/ApplicationStatusEntity.java
index 59cc928153..07d9588411 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/ApplicationStatusEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/ApplicationStatusEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model.workflow;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.workflow.ApplicationState;
+import org.apache.airavata.model.workflow.proto.ApplicationState;
 
 @Entity
 @Table(name = "APPLICATION_STATUS")
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/EdgeEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/EdgeEntity.java
index f1d71925ad..0b0bc9b18c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/EdgeEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/EdgeEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model.workflow;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.ComponentStatus;
+import org.apache.airavata.model.proto.ComponentStatus;
 
 /**
  * The persistent class for the edge database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerInputEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerInputEntity.java
index 6f39165f5d..58e03deb08 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerInputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerInputEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.execution.model.workflow;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.proto.DataType;
 
 @Entity
 @Table(name = "HANDLER_INPUT")
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerOutputEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerOutputEntity.java
index c14133d1a0..7429f100b1 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerOutputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerOutputEntity.java
@@ -21,7 +21,7 @@ package org.apache.airavata.execution.model.workflow;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.proto.DataType;
 
 @Entity
 @Table(name = "HANDLER_OUTPUT")
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/NodeEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/NodeEntity.java
index 495614fcc0..87b9fd62ac 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/NodeEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/NodeEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model.workflow;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.ComponentStatus;
+import org.apache.airavata.model.proto.ComponentStatus;
 
 /**
  * The persistent class for the node database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/PortEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/PortEntity.java
index 336be26686..80622adda1 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/PortEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/PortEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model.workflow;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.ComponentStatus;
+import org.apache.airavata.model.proto.ComponentStatus;
 
 /**
  * The persistent class for the port database table.
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowConnectionEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowConnectionEntity.java
index 466af601b3..02df783c5c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowConnectionEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowConnectionEntity.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.model.workflow;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
-import org.apache.airavata.model.workflow.ComponentType;
+import org.apache.airavata.model.workflow.proto.ComponentType;
 
 @Entity
 @Table(name = "WORKFLOW_CONNECTION")
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowHandlerEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowHandlerEntity.java
index 6b25430d2b..5d42a5b5fc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowHandlerEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowHandlerEntity.java
@@ -23,7 +23,7 @@ import jakarta.persistence.*;
 import java.io.Serializable;
 import java.sql.Timestamp;
 import java.util.List;
-import org.apache.airavata.model.workflow.HandlerType;
+import org.apache.airavata.model.workflow.proto.HandlerType;
 
 @Entity
 @Table(name = "WORKFLOW_HANDLER")
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/AiravataCustomMailParser.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/AiravataCustomMailParser.java
index 47352e279f..44bedadd00 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/AiravataCustomMailParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/AiravataCustomMailParser.java
@@ -24,7 +24,7 @@ import jakarta.mail.MessagingException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 import org.apache.airavata.registry.api.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ClusterStatusMonitorJob.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ClusterStatusMonitorJob.java
index 8e66368f3c..85fad77edd 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ClusterStatusMonitorJob.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ClusterStatusMonitorJob.java
@@ -29,14 +29,14 @@ import java.util.List;
 import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.credential.store.cpi.CredentialStoreService;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
-import org.apache.airavata.model.credential.store.SSHCredential;
-import org.apache.airavata.model.status.QueueStatusModel;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionInterface;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.ComputeResourcePreference;
+import org.apache.airavata.model.credential.store.proto.SSHCredential;
+import org.apache.airavata.model.status.proto.QueueStatusModel;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.thrift.TException;
+
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.transport.TSocket;
@@ -85,12 +85,12 @@ public class ClusterStatusMonitorJob implements Job {
                         hostName = computeResourceDescription.getHostName();
                         // FIXME This should come from compute resource description
                         port = 22;
-                        computeResourceDescription.getBatchQueues().stream().forEach(q -> {
+                        computeResourceDescription.getBatchQueuesList().stream().forEach(q -> {
                             queueNames.add(q.getQueueName());
                         });
 
                         List<JobSubmissionInterface> jobSubmissionInterfaces =
-                                computeResourceDescription.getJobSubmissionInterfaces();
+                                computeResourceDescription.getJobSubmissionInterfacesList();
                         if (jobSubmissionInterfaces != null && jobSubmissionInterfaces.size() > 0) {
                             if (jobSubmissionInterfaces
                                     .get(0)
@@ -112,7 +112,7 @@ public class ClusterStatusMonitorJob implements Job {
                                 computeResourceProfiles.add(computeResourceProfile);
                             }
                         }
-                    } catch (TException e) {
+                    } catch (Exception e) {
                         logger.error(e.getMessage());
                     }
                 });
@@ -193,8 +193,10 @@ public class ClusterStatusMonitorJob implements Job {
                                 sparts = knts.split("/");
                                 int running = Integer.parseInt(sparts[0].trim());
                                 int queued = Integer.parseInt(sparts[1].trim());
-                                queueStatus = new QueueStatusModel(
-                                        hostName, queue, isUp, running, queued, System.currentTimeMillis());
+                                queueStatus = QueueStatusModel.newBuilder()
+                                        .setHostName(hostName).setQueueName(queue).setQueueUp(isUp)
+                                        .setRunningJobs(running).setQueuedJobs(queued)
+                                        .setTime(System.currentTimeMillis()).build();
 
                             } else if (computeResourceProfile
                                     .getResourceManagerType()
@@ -204,8 +206,10 @@ public class ClusterStatusMonitorJob implements Job {
                                 boolean isUp = sparts[3].equalsIgnoreCase("yes");
                                 int running = Integer.parseInt(sparts[6].trim());
                                 int queued = Integer.parseInt(sparts[5].trim());
-                                queueStatus = new QueueStatusModel(
-                                        hostName, queue, isUp, running, queued, System.currentTimeMillis());
+                                queueStatus = QueueStatusModel.newBuilder()
+                                        .setHostName(hostName).setQueueName(queue).setQueueUp(isUp)
+                                        .setRunningJobs(running).setQueuedJobs(queued)
+                                        .setTime(System.currentTimeMillis()).build();
                             }
 
                             if (queueStatus != null) queueStatuses.add(queueStatus);
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ComputeResourceMonitor.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ComputeResourceMonitor.java
index 5f218701a2..2ca1eff462 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ComputeResourceMonitor.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ComputeResourceMonitor.java
@@ -20,10 +20,10 @@
 package org.apache.airavata.execution.monitor;
 
 import org.apache.airavata.execution.scheduler.Utils;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserResourceProfile;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupResourceProfile;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserResourceProfile;
 import org.apache.airavata.registry.api.RegistryService;
 
 public abstract class ComputeResourceMonitor {
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/EmailBasedMonitor.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/EmailBasedMonitor.java
index ea2428e015..2088e9bfcb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/EmailBasedMonitor.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/EmailBasedMonitor.java
@@ -35,8 +35,8 @@ import org.apache.airavata.common.config.ApplicationSettings;
 import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.AiravataException;
 import org.apache.airavata.common.server.IServer;
-import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManagerType;
-import org.apache.airavata.model.job.JobModel;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ResourceJobManagerType;
+import org.apache.airavata.model.job.proto.JobModel;
 import org.apache.airavata.registry.api.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/HTCondorEmailParser.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/HTCondorEmailParser.java
index c5c830a171..19c8b8da9f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/HTCondorEmailParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/HTCondorEmailParser.java
@@ -26,8 +26,8 @@ import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.status.proto.JobState;
 import org.apache.airavata.registry.api.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStateValidator.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStateValidator.java
index f45ebe9beb..35e1d1d795 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStateValidator.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStateValidator.java
@@ -29,7 +29,7 @@ import static org.apache.airavata.model.status.JobState.SUBMITTED;
 import static org.apache.airavata.model.status.JobState.SUSPENDED;
 import static org.apache.airavata.model.status.JobState.UNKNOWN;
 
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 
 public class JobStateValidator {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStatusResult.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStatusResult.java
index ba943b76b1..c77955ac3f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStatusResult.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStatusResult.java
@@ -19,7 +19,7 @@
 */
 package org.apache.airavata.execution.monitor;
 
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 
 public class JobStatusResult {
     private JobState state;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStatusResultDeserializer.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStatusResultDeserializer.java
index 951dd6c737..5583b9a2bb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStatusResultDeserializer.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/JobStatusResultDeserializer.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.execution.monitor;
 
 import java.util.Map;
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 import org.apache.kafka.common.serialization.Deserializer;
 
 public class JobStatusResultDeserializer implements Deserializer<JobStatusResult> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/LSFEmailParser.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/LSFEmailParser.java
index ba76acc627..6765f519aa 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/LSFEmailParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/LSFEmailParser.java
@@ -25,7 +25,7 @@ import java.io.IOException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 import org.apache.airavata.registry.api.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/MonitoringJob.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/MonitoringJob.java
index d1dd8bbdbb..07807b11c3 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/MonitoringJob.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/MonitoringJob.java
@@ -28,10 +28,10 @@ import org.apache.airavata.compute.util.AgentAdaptor;
 import org.apache.airavata.compute.util.CommandOutput;
 import org.apache.airavata.execution.orchestrator.AdaptorSupport;
 import org.apache.airavata.execution.orchestrator.AdaptorSupportImpl;
-import org.apache.airavata.model.appcatalog.computeresource.*;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.status.QueueStatusModel;
+import org.apache.airavata.model.appcatalog.computeresource.proto.*;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupResourceProfile;
+import org.apache.airavata.model.status.proto.QueueStatusModel;
 import org.apache.airavata.registry.api.RegistryService;
 import org.quartz.Job;
 import org.quartz.JobDataMap;
@@ -114,7 +114,7 @@ public class MonitoringJob extends ComputeResourceMonitor implements Job {
             throws Exception {
         String computeResourceId = computeResourcePolicy.getComputeResourceId();
         ComputeResourceDescription comResourceDes = client.getComputeResource(computeResourceId);
-        List<JobSubmissionInterface> jobSubmissionInterfaces = comResourceDes.getJobSubmissionInterfaces();
+        List<JobSubmissionInterface> jobSubmissionInterfaces = comResourceDes.getJobSubmissionInterfacesList();
         Collections.sort(jobSubmissionInterfaces, Comparator.comparingInt(JobSubmissionInterface::getPriorityOrder));
         JobSubmissionInterface jobSubmissionInterface = jobSubmissionInterfaces.get(0);
         JobSubmissionProtocol jobSubmissionProtocol = jobSubmissionInterface.getJobSubmissionProtocol();
@@ -126,11 +126,11 @@ public class MonitoringJob extends ComputeResourceMonitor implements Job {
         if (resourceJobManager.getResourceJobManagerType().name().equals("SLURM")) {
             String baseCommand = "sinfo";
 
-            if (resourceJobManager.getJobManagerCommands().containsKey(JobManagerCommand.SHOW_CLUSTER_INFO)) {
-                baseCommand = resourceJobManager.getJobManagerCommands().get(JobManagerCommand.SHOW_CLUSTER_INFO);
+            if (resourceJobManager.getJobManagerCommandsMap().containsKey(JobManagerCommand.SHOW_CLUSTER_INFO)) {
+                baseCommand = resourceJobManager.getJobManagerCommandsMap().get(JobManagerCommand.SHOW_CLUSTER_INFO);
             }
 
-            List<String> allowedBatchQueues = computeResourcePolicy.getAllowedBatchQueues();
+            List<String> allowedBatchQueues = computeResourcePolicy.getAllowedBatchQueuesList();
             List<QueueStatusModel> queueStatusModels = new ArrayList<>();
             for (String queue : allowedBatchQueues) {
 
@@ -169,18 +169,18 @@ public class MonitoringJob extends ComputeResourceMonitor implements Job {
                     String runningJobCommand = "squeue";
                     String pendingJobCommand = "squeue";
                     if (resourceJobManager
-                            .getJobManagerCommands()
+                            .getJobManagerCommandsMap()
                             .containsKey(JobManagerCommand.SHOW_NO_OF_RUNNING_JOBS)) {
                         runningJobCommand = resourceJobManager
-                                .getJobManagerCommands()
+                                .getJobManagerCommandsMap()
                                 .get(JobManagerCommand.SHOW_NO_OF_RUNNING_JOBS);
                     }
 
                     if (resourceJobManager
-                            .getJobManagerCommands()
+                            .getJobManagerCommandsMap()
                             .containsKey(JobManagerCommand.SHOW_NO_OF_PENDING_JOBS)) {
                         pendingJobCommand = resourceJobManager
-                                .getJobManagerCommands()
+                                .getJobManagerCommandsMap()
                                 .get(JobManagerCommand.SHOW_NO_OF_PENDING_JOBS);
                     }
 
@@ -197,14 +197,15 @@ public class MonitoringJob extends ComputeResourceMonitor implements Job {
                             pendingJobsCommandOutput, Constants.JOB_SUBMISSION_PROTOCOL_SLURM);
                 }
 
-                QueueStatusModel queueStatusModel = new QueueStatusModel();
-                queueStatusModel.setHostName(comResourceDes.getHostName());
-                queueStatusModel.setQueueName(queue);
-                queueStatusModel.setQueueUp(queueStatus);
-                queueStatusModel.setRunningJobs(runningJobs);
-                queueStatusModel.setQueuedJobs(pendingJobs);
+                QueueStatusModel queueStatusModel = QueueStatusModel.newBuilder()
+                        .setHostName(comResourceDes.getHostName())
+                        .setQueueName(queue)
+                        .setQueueUp(queueStatus)
+                        .setRunningJobs(runningJobs)
+                        .setQueuedJobs(pendingJobs)
+                        .setTime(System.currentTimeMillis())
+                        .build();
                 queueStatusModels.add(queueStatusModel);
-                queueStatusModel.setTime(System.currentTimeMillis());
             }
             client.registerQueueStatuses(queueStatusModels);
         }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/PBSEmailParser.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/PBSEmailParser.java
index 4c5c7bbbd6..57e324201f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/PBSEmailParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/PBSEmailParser.java
@@ -24,7 +24,7 @@ import jakarta.mail.MessagingException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 import org.apache.airavata.registry.api.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/RealtimeJobStatusParser.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/RealtimeJobStatusParser.java
index b3d86f53a7..347ecfa95c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/RealtimeJobStatusParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/RealtimeJobStatusParser.java
@@ -24,8 +24,8 @@ import com.google.gson.JsonSyntaxException;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.status.proto.JobState;
 import org.apache.airavata.registry.api.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/RealtimeMonitor.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/RealtimeMonitor.java
index 523fb5925e..e87d5807b6 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/RealtimeMonitor.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/RealtimeMonitor.java
@@ -26,7 +26,7 @@ import java.util.Properties;
 import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.server.IServer;
-import org.apache.airavata.model.job.JobModel;
+import org.apache.airavata.model.job.proto.JobModel;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.kafka.clients.consumer.Consumer;
 import org.apache.kafka.clients.consumer.ConsumerConfig;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ResourceConfig.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ResourceConfig.java
index 2145597c75..b8c867181a 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ResourceConfig.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/ResourceConfig.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.execution.monitor;
 
 import java.util.List;
-import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManagerType;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ResourceJobManagerType;
 
 public class ResourceConfig {
     private ResourceJobManagerType jobManagerType;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/SLURMEmailParser.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/SLURMEmailParser.java
index 5cac465376..917a8034f4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/SLURMEmailParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/SLURMEmailParser.java
@@ -24,7 +24,7 @@ import jakarta.mail.MessagingException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 import org.apache.airavata.registry.api.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/UGEEmailParser.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/UGEEmailParser.java
index 3cab3ac6da..100b96807a 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/UGEEmailParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/UGEEmailParser.java
@@ -25,7 +25,7 @@ import java.io.IOException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.model.status.JobState;
+import org.apache.airavata.model.status.proto.JobState;
 import org.apache.airavata.registry.api.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AbstractOrchestrator.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AbstractOrchestrator.java
index 9bbb96db40..ad16933f20 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AbstractOrchestrator.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AbstractOrchestrator.java
@@ -22,7 +22,7 @@ package org.apache.airavata.execution.orchestrator;
 import java.io.IOException;
 import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,7 +61,7 @@ public abstract class AbstractOrchestrator implements Orchestrator {
         this.airavataUserName = airavataUserName;
     }
 
-    public AbstractOrchestrator() throws OrchestratorException, TException {
+    public AbstractOrchestrator() throws OrchestratorException, Exception {
         try {
             /* Initializing the OrchestratorConfiguration object */
             orchestratorConfiguration = OrchestratorUtils.loadOrchestratorConfiguration();
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AdaptorSupport.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AdaptorSupport.java
index c7778356b7..c52a0004d3 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AdaptorSupport.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AdaptorSupport.java
@@ -21,8 +21,8 @@ package org.apache.airavata.execution.orchestrator;
 
 import org.apache.airavata.compute.util.AgentAdaptor;
 import org.apache.airavata.compute.util.AgentException;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.data.movement.DataMovementProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.data.movement.proto.DataMovementProtocol;
 import org.apache.airavata.storage.util.StorageResourceAdaptor;
 
 /**
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AdaptorSupportImpl.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AdaptorSupportImpl.java
index 12a9dae22f..9f1230a6e6 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AdaptorSupportImpl.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AdaptorSupportImpl.java
@@ -23,8 +23,8 @@ import java.util.Optional;
 import org.apache.airavata.compute.util.AgentAdaptor;
 import org.apache.airavata.compute.util.AgentException;
 import org.apache.airavata.compute.util.SSHJAgentAdaptor;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.data.movement.DataMovementProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.data.movement.proto.DataMovementProtocol;
 import org.apache.airavata.storage.util.SSHJStorageAdaptor;
 import org.apache.airavata.storage.util.StorageResourceAdaptor;
 import org.slf4j.Logger;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AgentStore.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AgentStore.java
index 2f47a57e4d..7bd53538ce 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AgentStore.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AgentStore.java
@@ -23,8 +23,8 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 import org.apache.airavata.compute.util.AgentAdaptor;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.data.movement.DataMovementProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.data.movement.proto.DataMovementProtocol;
 import org.apache.airavata.storage.util.StorageResourceAdaptor;
 
 /**
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AiravataTask.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AiravataTask.java
index 49e246fe31..552063df9a 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AiravataTask.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/AiravataTask.java
@@ -35,14 +35,14 @@ import org.apache.airavata.messaging.service.MessagingFactory;
 import org.apache.airavata.messaging.service.Publisher;
 import org.apache.airavata.messaging.service.RabbitMQPublisher;
 import org.apache.airavata.messaging.service.Type;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.commons.ErrorModel;
-import org.apache.airavata.model.data.replica.*;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.messaging.event.*;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.status.*;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.commons.proto.ErrorModel;
+import org.apache.airavata.model.data.replica.proto.*;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.messaging.event.proto.*;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.status.proto.*;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.security.profile.user.core.repositories.UserProfileRepository;
 import org.apache.commons.io.FileUtils;
@@ -130,7 +130,7 @@ public abstract class AiravataTask extends AbstractTask {
         }
 
         if (currentRetryCount >= getRetryCount() || fatal) {
-            ProcessStatus status = new ProcessStatus(ProcessState.FAILED);
+            ProcessStatus status = ProcessStatus.newBuilder().setState(ProcessState.FAILED).build();
             StringWriter errors = new StringWriter();
 
             String errorCode = UUID.randomUUID().toString();
@@ -140,21 +140,24 @@ public abstract class AiravataTask extends AbstractTask {
             // wrapping from new error object with error code
             error = new TaskOnFailException(errorMessage, true, error);
 
-            status.setReason(errorMessage);
+            status = status.toBuilder()
+                    .setReason(errorMessage)
+                    .setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime())
+                    .build();
             errors.write(ExceptionUtils.getStackTrace(error));
             logger.error(errorMessage, error);
 
-            status.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
             if (getTaskContext() != null) { // task context could be null if the initialization failed
                 getTaskContext().setProcessStatus(status);
             } else {
                 logger.warn("Task context is null. So can not store the process status in the context");
             }
 
-            ErrorModel errorModel = new ErrorModel();
-            errorModel.setUserFriendlyMessage(reason);
-            errorModel.setActualErrorMessage(errors.toString());
-            errorModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
+            ErrorModel errorModel = ErrorModel.newBuilder()
+                    .setUserFriendlyMessage(reason)
+                    .setActualErrorMessage(errors.toString())
+                    .setCreationTime(AiravataUtils.getCurrentTimestamp().getTime())
+                    .build();
 
             if (!skipAllStatusPublish) {
                 publishTaskState(TaskState.FAILED);
@@ -180,7 +183,9 @@ public abstract class AiravataTask extends AbstractTask {
             cleanup();
 
             if (autoSchedule) {
-                ProcessStatus requeueStatus = new ProcessStatus(ProcessState.REQUEUED);
+                ProcessStatus requeueStatus = ProcessStatus.newBuilder()
+                        .setState(ProcessState.REQUEUED)
+                        .build();
                 saveAndPublishProcessStatus(requeueStatus);
             }
 
@@ -211,9 +216,10 @@ public abstract class AiravataTask extends AbstractTask {
     protected void saveAndPublishProcessStatus(ProcessState state) {
 
         if (!skipProcessStatusPublish) {
-            ProcessStatus processStatus = new ProcessStatus(state);
-            processStatus.setTimeOfStateChange(
-                    AiravataUtils.getCurrentTimestamp().getTime());
+            ProcessStatus processStatus = ProcessStatus.newBuilder()
+                    .setState(state)
+                    .setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime())
+                    .build();
             if (getTaskContext() != null) {
                 getTaskContext().setProcessStatus(processStatus);
             } else {
@@ -228,15 +234,20 @@ public abstract class AiravataTask extends AbstractTask {
         try {
             if (!skipProcessStatusPublish) {
                 if (status.getTimeOfStateChange() == 0 || status.getTimeOfStateChange() > 0) {
-                    status.setTimeOfStateChange(
-                            AiravataUtils.getCurrentTimestamp().getTime());
-                } else {
-                    status.setTimeOfStateChange(status.getTimeOfStateChange());
+                    status = status.toBuilder()
+                            .setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime())
+                            .build();
                 }
                 getRegistryServiceClient().addProcessStatus(status, getProcessId());
-                ProcessIdentifier identifier = new ProcessIdentifier(getProcessId(), getExperimentId(), getGatewayId());
-                ProcessStatusChangeEvent processStatusChangeEvent =
-                        new ProcessStatusChangeEvent(status.getState(), identifier);
+                ProcessIdentifier identifier = ProcessIdentifier.newBuilder()
+                        .setProcessId(getProcessId())
+                        .setExperimentId(getExperimentId())
+                        .setGatewayId(getGatewayId())
+                        .build();
+                ProcessStatusChangeEvent processStatusChangeEvent = ProcessStatusChangeEvent.newBuilder()
+                        .setState(status.getState())
+                        .setProcessIdentity(identifier)
+                        .build();
                 MessageContext msgCtx = new MessageContext(
                         processStatusChangeEvent,
                         MessageType.PROCESS,
@@ -255,23 +266,27 @@ public abstract class AiravataTask extends AbstractTask {
             throws Exception {
         try {
 
-            JobStatus jobStatus = new JobStatus();
-            jobStatus.setReason(jobState.name());
-            jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-            jobStatus.setJobState(jobState);
-
-            if (jobStatus.getTimeOfStateChange() == 0 || jobStatus.getTimeOfStateChange() > 0) {
-                jobStatus.setTimeOfStateChange(
-                        AiravataUtils.getCurrentTimestamp().getTime());
-            } else {
-                jobStatus.setTimeOfStateChange(jobStatus.getTimeOfStateChange());
-            }
+            long now = AiravataUtils.getCurrentTimestamp().getTime();
+            JobStatus jobStatus = JobStatus.newBuilder()
+                    .setReason(jobState.name())
+                    .setTimeOfStateChange(now)
+                    .setJobState(jobState)
+                    .build();
 
             getRegistryServiceClient().addJobStatus(jobStatus, taskId, jobId);
 
-            JobIdentifier identifier = new JobIdentifier(jobId, taskId, processId, experimentId, gateway);
-
-            JobStatusChangeEvent jobStatusChangeEvent = new JobStatusChangeEvent(jobStatus.getJobState(), identifier);
+            JobIdentifier identifier = JobIdentifier.newBuilder()
+                    .setJobId(jobId)
+                    .setTaskId(taskId)
+                    .setProcessId(processId)
+                    .setExperimentId(experimentId)
+                    .setGatewayId(gateway)
+                    .build();
+
+            JobStatusChangeEvent jobStatusChangeEvent = JobStatusChangeEvent.newBuilder()
+                    .setJobState(jobStatus.getJobState())
+                    .setJobIdentity(identifier)
+                    .build();
             MessageContext msgCtx = new MessageContext(
                     jobStatusChangeEvent, MessageType.JOB, AiravataUtils.getId(MessageType.JOB.name()), gateway);
             msgCtx.setUpdatedTime(AiravataUtils.getCurrentTimestamp());
@@ -285,23 +300,23 @@ public abstract class AiravataTask extends AbstractTask {
     public void saveExperimentOutput(String outputName, String outputVal) throws TaskOnFailException {
         try {
             ExperimentModel experiment = getRegistryServiceClient().getExperiment(experimentId);
-            List<OutputDataObjectType> experimentOutputs = experiment.getExperimentOutputs();
-            if (experimentOutputs != null && !experimentOutputs.isEmpty()) {
+            List<OutputDataObjectType> experimentOutputs = experiment.getExperimentOutputsList();
+            if (!experimentOutputs.isEmpty()) {
                 for (OutputDataObjectType expOutput : experimentOutputs) {
                     if (expOutput.getName().equals(outputName)) {
                         String productUri = saveDataProduct(outputName, outputVal, expOutput.getMetaData());
-                        expOutput.setValue(productUri);
+                        OutputDataObjectType updatedOutput = expOutput.toBuilder().setValue(productUri).build();
 
                         if (!skipExperimentStatusPublish) {
                             getRegistryServiceClient()
                                     .addExperimentProcessOutputs(
-                                            "EXPERIMENT_OUTPUT", Collections.singletonList(expOutput), experimentId);
+                                            "EXPERIMENT_OUTPUT", Collections.singletonList(updatedOutput), experimentId);
                         }
 
                         if (!skipProcessStatusPublish) {
                             getRegistryServiceClient()
                                     .addExperimentProcessOutputs(
-                                            "PROCESS_OUTPUT", Collections.singletonList(expOutput), processId);
+                                            "PROCESS_OUTPUT", Collections.singletonList(updatedOutput), processId);
                         }
                     }
                 }
@@ -317,8 +332,8 @@ public abstract class AiravataTask extends AbstractTask {
     public void saveExperimentOutputCollection(String outputName, List<String> outputVals) throws TaskOnFailException {
         try {
             ExperimentModel experiment = getRegistryServiceClient().getExperiment(experimentId);
-            List<OutputDataObjectType> experimentOutputs = experiment.getExperimentOutputs();
-            if (experimentOutputs != null && !experimentOutputs.isEmpty()) {
+            List<OutputDataObjectType> experimentOutputs = experiment.getExperimentOutputsList();
+            if (!experimentOutputs.isEmpty()) {
                 for (OutputDataObjectType expOutput : experimentOutputs) {
                     if (expOutput.getName().equals(outputName)) {
                         List<String> productUris = new ArrayList<String>();
@@ -326,17 +341,18 @@ public abstract class AiravataTask extends AbstractTask {
                             String productUri = saveDataProduct(outputName, outputVal, expOutput.getMetaData());
                             productUris.add(productUri);
                         }
-                        expOutput.setValue(String.join(",", productUris));
+                        OutputDataObjectType updatedOutput = expOutput.toBuilder()
+                                .setValue(String.join(",", productUris)).build();
                         if (!skipExperimentStatusPublish) {
                             getRegistryServiceClient()
                                     .addExperimentProcessOutputs(
-                                            "EXPERIMENT_OUTPUT", Collections.singletonList(expOutput), experimentId);
+                                            "EXPERIMENT_OUTPUT", Collections.singletonList(updatedOutput), experimentId);
                         }
 
                         if (!skipProcessStatusPublish) {
                             getRegistryServiceClient()
                                     .addExperimentProcessOutputs(
-                                            "PROCESS_OUTPUT", Collections.singletonList(expOutput), processId);
+                                            "PROCESS_OUTPUT", Collections.singletonList(updatedOutput), processId);
                         }
                     }
                 }
@@ -351,11 +367,11 @@ public abstract class AiravataTask extends AbstractTask {
 
     private String saveDataProduct(String outputName, String outputVal, String outputMetadata) throws Exception {
 
-        DataProductModel dataProductModel = new DataProductModel();
-        dataProductModel.setGatewayId(getGatewayId());
-        dataProductModel.setOwnerName(getProcessModel().getUserName());
-        dataProductModel.setProductName(outputName);
-        dataProductModel.setDataProductType(DataProductType.FILE);
+        DataProductModel.Builder dataProductBuilder = DataProductModel.newBuilder()
+                .setGatewayId(getGatewayId())
+                .setOwnerName(getProcessModel().getUserName())
+                .setProductName(outputName)
+                .setDataProductType(DataProductType.FILE);
         // Copy experiment output's file-metadata to data product's metadata
         if (outputMetadata != null) {
             try {
@@ -364,7 +380,7 @@ public abstract class AiravataTask extends AbstractTask {
                     JSONObject fileMetadata = outputMetadataJSON.getJSONObject("file-metadata");
                     for (Object key : fileMetadata.keySet()) {
                         String k = key.toString();
-                        dataProductModel.putToProductMetadata(k, fileMetadata.getString(k));
+                        dataProductBuilder.putProductMetadata(k, fileMetadata.getString(k));
                     }
                 }
             } catch (JSONException e) {
@@ -372,22 +388,22 @@ public abstract class AiravataTask extends AbstractTask {
             }
         }
 
-        DataReplicaLocationModel replicaLocationModel = new DataReplicaLocationModel();
-        replicaLocationModel.setStorageResourceId(
-                getTaskContext().getStorageResourceDescription().getStorageResourceId());
-        replicaLocationModel.setReplicaName(outputName + " gateway data store copy");
-        replicaLocationModel.setReplicaLocationCategory(ReplicaLocationCategory.GATEWAY_DATA_STORE);
-        replicaLocationModel.setReplicaPersistentType(ReplicaPersistentType.TRANSIENT);
-        replicaLocationModel.setFilePath(outputVal);
-        dataProductModel.addToReplicaLocations(replicaLocationModel);
+        DataReplicaLocationModel replicaLocationModel = DataReplicaLocationModel.newBuilder()
+                .setStorageResourceId(getTaskContext().getStorageResourceDescription().getStorageResourceId())
+                .setReplicaName(outputName + " gateway data store copy")
+                .setReplicaLocationCategory(ReplicaLocationCategory.GATEWAY_DATA_STORE)
+                .setReplicaPersistentType(ReplicaPersistentType.TRANSIENT)
+                .setFilePath(outputVal)
+                .build();
+        dataProductBuilder.addReplicaLocations(replicaLocationModel);
 
-        return getRegistryServiceClient().registerDataProduct(dataProductModel);
+        return getRegistryServiceClient().registerDataProduct(dataProductBuilder.build());
     }
 
     @SuppressWarnings("WeakerAccess")
     private void saveExperimentError(ErrorModel errorModel) {
         try {
-            errorModel.setErrorId(AiravataUtils.getId("EXP_ERROR"));
+            errorModel = errorModel.toBuilder().setErrorId(AiravataUtils.getId("EXP_ERROR")).build();
             getRegistryServiceClient().addErrors("EXPERIMENT_ERROR", errorModel, experimentId);
         } catch (Exception e) {
             String msg = "expId: " + getExperimentId() + " processId: " + getProcessId()
@@ -399,7 +415,7 @@ public abstract class AiravataTask extends AbstractTask {
     @SuppressWarnings("WeakerAccess")
     private void saveProcessError(ErrorModel errorModel) {
         try {
-            errorModel.setErrorId(AiravataUtils.getId("PROCESS_ERROR"));
+            errorModel = errorModel.toBuilder().setErrorId(AiravataUtils.getId("PROCESS_ERROR")).build();
             getRegistryServiceClient().addErrors("PROCESS_ERROR", errorModel, getProcessId());
         } catch (Exception e) {
             logger.error(
@@ -412,7 +428,7 @@ public abstract class AiravataTask extends AbstractTask {
     @SuppressWarnings("WeakerAccess")
     private void saveTaskError(ErrorModel errorModel) {
         try {
-            errorModel.setErrorId(AiravataUtils.getId("TASK_ERROR"));
+            errorModel = errorModel.toBuilder().setErrorId(AiravataUtils.getId("TASK_ERROR")).build();
             getRegistryServiceClient().addErrors("TASK_ERROR", errorModel, getTaskId());
         } catch (Exception e) {
             logger.error(
@@ -542,13 +558,17 @@ public abstract class AiravataTask extends AbstractTask {
     protected void publishTaskState(TaskState ts) {
 
         try {
-            TaskStatus taskStatus = new TaskStatus();
-            taskStatus.setState(ts);
-            taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
+            TaskStatus taskStatus = TaskStatus.newBuilder()
+                    .setState(ts)
+                    .setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime())
+                    .build();
             getRegistryServiceClient().addTaskStatus(taskStatus, getTaskId());
-            TaskIdentifier identifier =
-                    new TaskIdentifier(getTaskId(), getProcessId(), getExperimentId(), getGatewayId());
-            TaskStatusChangeEvent taskStatusChangeEvent = new TaskStatusChangeEvent(ts, identifier);
+            TaskIdentifier identifier = TaskIdentifier.newBuilder()
+                    .setTaskId(getTaskId()).setProcessId(getProcessId())
+                    .setExperimentId(getExperimentId()).setGatewayId(getGatewayId())
+                    .build();
+            TaskStatusChangeEvent taskStatusChangeEvent = TaskStatusChangeEvent.newBuilder()
+                    .setState(ts).setTaskIdentity(identifier).build();
             MessageContext msgCtx = new MessageContext(
                     taskStatusChangeEvent,
                     MessageType.TASK,
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/BatchQueueValidator.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/BatchQueueValidator.java
index 5ffd47ceac..86fc4cbd0b 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/BatchQueueValidator.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/BatchQueueValidator.java
@@ -22,15 +22,15 @@ package org.apache.airavata.execution.orchestrator;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.airavata.execution.scheduler.Utils;
-import org.apache.airavata.model.appcatalog.computeresource.BatchQueue;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.error.ValidationResults;
-import org.apache.airavata.model.error.ValidatorResult;
-import org.apache.airavata.model.experiment.*;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.appcatalog.computeresource.proto.BatchQueue;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+import org.apache.airavata.model.error.proto.ValidationResults;
+import org.apache.airavata.model.error.proto.ValidatorResult;
+import org.apache.airavata.model.experiment.proto.*;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.scheduling.proto.ComputationalResourceSchedulingModel;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,34 +44,34 @@ public class BatchQueueValidator implements JobMetadataValidator {
     }
 
     public ValidationResults validate(ExperimentModel experiment, ProcessModel processModel) {
-        ValidationResults validationResults = new ValidationResults();
-        validationResults.setValidationState(true);
+        boolean valid = true;
+        List<ValidatorResult> validatorResultList;
         try {
-            List<ValidatorResult> validatorResultList = validateUserConfiguration(experiment, processModel);
+            validatorResultList = validateUserConfiguration(experiment, processModel);
             for (ValidatorResult result : validatorResultList) {
-                if (!result.isResult()) {
-                    validationResults.setValidationState(false);
+                if (!result.getResult()) {
+                    valid = false;
                     break;
                 }
             }
-            validationResults.setValidationResultList(validatorResultList);
-        } catch (TException e) {
+        } catch (Exception e) {
             throw new RuntimeException("Error while validating", e);
         }
-        return validationResults;
+        return ValidationResults.newBuilder()
+                .setValidationState(valid)
+                .addAllValidationResultList(validatorResultList)
+                .build();
     }
 
     private List<ValidatorResult> validateUserConfiguration(ExperimentModel experiment, ProcessModel processModel)
-            throws TException {
+            throws Exception {
         List<ValidatorResult> validatorResultList = new ArrayList<ValidatorResult>();
         UserConfigurationDataModel userConfigurationData = experiment.getUserConfigurationData();
         ComputationalResourceSchedulingModel computationalResourceScheduling =
                 userConfigurationData.getComputationalResourceScheduling();
-        if (userConfigurationData.isAiravataAutoSchedule()) {
+        if (userConfigurationData.getAiravataAutoSchedule()) {
             logger.info("User enabled Auto-Schedule. Hence we don't do validation..");
-            ValidatorResult validatorResult = new ValidatorResult();
-            validatorResult.setResult(true);
-            validatorResultList.add(validatorResult);
+            validatorResultList.add(ValidatorResult.newBuilder().setResult(true).build());
         } else {
             ComputeResourceDescription computeResource;
             if (processModel == null) {
@@ -84,139 +84,133 @@ public class BatchQueueValidator implements JobMetadataValidator {
                         processModel.getProcessResourceSchedule().getResourceHostId());
             }
 
-            List<BatchQueue> batchQueues = computeResource.getBatchQueues();
+            List<BatchQueue> batchQueues = computeResource.getBatchQueuesList();
 
-            if (computationalResourceScheduling == null) {
-                ValidatorResult queueNameResult = new ValidatorResult();
-                queueNameResult.setResult(false);
-                queueNameResult.setErrorDetails(
-                        "No compute resource scheduling for experiment " + experiment.getExperimentId());
-                validatorResultList.add(queueNameResult);
+            if (!experiment.hasUserConfigurationData()
+                    || !userConfigurationData.hasComputationalResourceScheduling()) {
+                validatorResultList.add(ValidatorResult.newBuilder()
+                        .setResult(false)
+                        .setErrorDetails("No compute resource scheduling for experiment " + experiment.getExperimentId())
+                        .build());
                 return validatorResultList;
             }
 
-            if (computationalResourceScheduling.getQueueName() == null) {
-                ValidatorResult queueNameResult = new ValidatorResult();
-                queueNameResult.setResult(false);
-                queueNameResult.setErrorDetails("No queue name for experiment " + experiment.getExperimentId());
-                validatorResultList.add(queueNameResult);
+            if (computationalResourceScheduling.getQueueName().isEmpty()) {
+                validatorResultList.add(ValidatorResult.newBuilder()
+                        .setResult(false)
+                        .setErrorDetails("No queue name for experiment " + experiment.getExperimentId())
+                        .build());
                 return validatorResultList;
             }
 
-            if (batchQueues != null && !batchQueues.isEmpty()) {
+            if (!batchQueues.isEmpty()) {
                 String experimentQueueName =
                         computationalResourceScheduling.getQueueName().trim();
                 int experimentWallTimeLimit = computationalResourceScheduling.getWallTimeLimit();
                 int experimentNodeCount = computationalResourceScheduling.getNodeCount();
                 int experimentCPUCount = computationalResourceScheduling.getTotalCPUCount();
-                ValidatorResult queueNameResult = new ValidatorResult();
 
                 // Set the validation to false. Once all the queue's are looped, if nothing matches, then this gets
                 // passed.
-                queueNameResult.setResult(false);
-                queueNameResult.setErrorDetails(
-                        "The specified queue " + experimentQueueName
-                                + " does not exist. If you believe this is an error, contact the administrator to verify App-Catalog Configurations");
+                ValidatorResult.Builder queueNameResultBuilder = ValidatorResult.newBuilder()
+                        .setResult(false)
+                        .setErrorDetails(
+                                "The specified queue " + experimentQueueName
+                                        + " does not exist. If you believe this is an error, contact the administrator to verify App-Catalog Configurations");
                 for (BatchQueue queue : batchQueues) {
                     String resourceQueueName = queue.getQueueName();
                     int maxQueueRunTime = queue.getMaxRunTime();
                     int maxNodeCount = queue.getMaxNodes();
                     int maxcpuCount = queue.getMaxProcessors();
-                    if (resourceQueueName != null && resourceQueueName.equals(experimentQueueName)) {
-                        queueNameResult.setResult(true);
-                        queueNameResult.setErrorDetails("");
+                    if (!resourceQueueName.isEmpty() && resourceQueueName.equals(experimentQueueName)) {
+                        queueNameResultBuilder.setResult(true).setErrorDetails("");
 
                         // Validate if the specified wall time is within allowable limit
-                        ValidatorResult wallTimeResult = new ValidatorResult();
+                        ValidatorResult.Builder wallTimeResultBuilder = ValidatorResult.newBuilder();
                         if (experimentWallTimeLimit == 0) {
-                            wallTimeResult.setResult(false);
-                            wallTimeResult.setErrorDetails("Walltime cannot be zero for queue " + resourceQueueName);
+                            wallTimeResultBuilder.setResult(false)
+                                    .setErrorDetails("Walltime cannot be zero for queue " + resourceQueueName);
                         } else {
                             if (maxQueueRunTime == 0) {
-                                wallTimeResult.setResult(true);
-                                wallTimeResult.setErrorDetails("Maximum wall time is not configured for the queue,"
-                                        + "Validation is being skipped");
+                                wallTimeResultBuilder.setResult(true)
+                                        .setErrorDetails("Maximum wall time is not configured for the queue,"
+                                                + "Validation is being skipped");
                                 logger.info("Maximum wall time is not configured for the queue"
                                         + "Validation is being skipped");
                             } else {
                                 if (maxQueueRunTime < experimentWallTimeLimit) {
-                                    wallTimeResult.setResult(false);
-                                    wallTimeResult.setErrorDetails("Job Execution walltime " + experimentWallTimeLimit
-                                            + "exceeds the allowable walltime"
-                                            + maxQueueRunTime + "for queue "
-                                            + resourceQueueName);
+                                    wallTimeResultBuilder.setResult(false)
+                                            .setErrorDetails("Job Execution walltime " + experimentWallTimeLimit
+                                                    + "exceeds the allowable walltime"
+                                                    + maxQueueRunTime + "for queue "
+                                                    + resourceQueueName);
                                 } else {
-                                    wallTimeResult.setResult(true);
-                                    wallTimeResult.setErrorDetails("");
+                                    wallTimeResultBuilder.setResult(true).setErrorDetails("");
                                 }
                             }
                         }
                         // validate max node count
-                        ValidatorResult nodeCountResult = new ValidatorResult();
+                        ValidatorResult.Builder nodeCountResultBuilder = ValidatorResult.newBuilder();
                         if (maxNodeCount == 0) {
-                            nodeCountResult.setResult(true);
-                            nodeCountResult.setErrorDetails(
-                                    "Max node count is not configured for the queue," + "Validation is being skipped");
+                            nodeCountResultBuilder.setResult(true)
+                                    .setErrorDetails(
+                                            "Max node count is not configured for the queue," + "Validation is being skipped");
                             logger.info(
                                     "Max node count is not configured for the queue" + "Validation is being skipped");
                         } else {
                             if (experimentNodeCount == 0) {
-                                nodeCountResult.setResult(false);
-                                nodeCountResult.setErrorDetails(
-                                        "Job Execution node count cannot be zero for queue " + resourceQueueName);
+                                nodeCountResultBuilder.setResult(false)
+                                        .setErrorDetails(
+                                                "Job Execution node count cannot be zero for queue " + resourceQueueName);
                             } else {
                                 if (maxNodeCount < experimentNodeCount) {
-                                    nodeCountResult.setResult(false);
-                                    nodeCountResult.setErrorDetails("Job Execution node count " + experimentNodeCount
-                                            + "exceeds the allowable node count"
-                                            + maxNodeCount + "for queue "
-                                            + resourceQueueName);
+                                    nodeCountResultBuilder.setResult(false)
+                                            .setErrorDetails("Job Execution node count " + experimentNodeCount
+                                                    + "exceeds the allowable node count"
+                                                    + maxNodeCount + "for queue "
+                                                    + resourceQueueName);
                                 } else {
-                                    nodeCountResult.setResult(true);
-                                    nodeCountResult.setErrorDetails("");
+                                    nodeCountResultBuilder.setResult(true).setErrorDetails("");
                                 }
                             }
                         }
                         // validate cpu count
-                        ValidatorResult cpuCountResult = new ValidatorResult();
+                        ValidatorResult.Builder cpuCountResultBuilder = ValidatorResult.newBuilder();
                         if (maxcpuCount == 0) {
-                            cpuCountResult.setResult(true);
-                            cpuCountResult.setErrorDetails(
-                                    "Max cpu count is not configured for the queue," + "Validation is being skipped");
+                            cpuCountResultBuilder.setResult(true)
+                                    .setErrorDetails(
+                                            "Max cpu count is not configured for the queue," + "Validation is being skipped");
                             logger.info(
                                     "Max cpu count is not configured for the queue" + "Validation is being skipped");
                         } else {
                             if (experimentCPUCount == 0) {
-                                cpuCountResult.setResult(false);
-                                cpuCountResult.setErrorDetails(
-                                        "Job Execution cpu count cannot be zero for queue " + resourceQueueName);
+                                cpuCountResultBuilder.setResult(false)
+                                        .setErrorDetails(
+                                                "Job Execution cpu count cannot be zero for queue " + resourceQueueName);
                             } else {
                                 if (maxcpuCount < experimentCPUCount) {
-                                    cpuCountResult.setResult(false);
-                                    cpuCountResult.setErrorDetails("Job Execution cpu count " + experimentCPUCount
-                                            + "exceeds the allowable cpu count"
-                                            + maxcpuCount + "for queue "
-                                            + resourceQueueName);
+                                    cpuCountResultBuilder.setResult(false)
+                                            .setErrorDetails("Job Execution cpu count " + experimentCPUCount
+                                                    + "exceeds the allowable cpu count"
+                                                    + maxcpuCount + "for queue "
+                                                    + resourceQueueName);
                                 } else {
-                                    cpuCountResult.setResult(true);
-                                    cpuCountResult.setErrorDetails("");
+                                    cpuCountResultBuilder.setResult(true).setErrorDetails("");
                                 }
                             }
                         }
-                        validatorResultList.add(wallTimeResult);
-                        validatorResultList.add(nodeCountResult);
-                        validatorResultList.add(cpuCountResult);
+                        validatorResultList.add(wallTimeResultBuilder.build());
+                        validatorResultList.add(nodeCountResultBuilder.build());
+                        validatorResultList.add(cpuCountResultBuilder.build());
                     }
                 }
-                validatorResultList.add(queueNameResult);
+                validatorResultList.add(queueNameResultBuilder.build());
 
             } else {
                 // for some compute resources, you dnt need to specify queue names
-                ValidatorResult result = new ValidatorResult();
                 logger.info("There are not queues defined under the compute resource. Airavata assumes this experiment "
                         + "does not need a queue name...");
-                result.setResult(true);
-                validatorResultList.add(result);
+                validatorResultList.add(ValidatorResult.newBuilder().setResult(true).build());
             }
         }
         return validatorResultList;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/DefaultHostScheduler.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/DefaultHostScheduler.java
index 4c79be8ea3..346fbf44f8 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/DefaultHostScheduler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/DefaultHostScheduler.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.execution.orchestrator;
 
 import java.util.List;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
 
 public class DefaultHostScheduler implements HostScheduler {
     @Override
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/ExperimentStatusValidator.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/ExperimentStatusValidator.java
index 4749cd35b0..bc9021179c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/ExperimentStatusValidator.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/ExperimentStatusValidator.java
@@ -21,11 +21,11 @@ package org.apache.airavata.execution.orchestrator;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.airavata.model.error.ValidationResults;
-import org.apache.airavata.model.error.ValidatorResult;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.status.ExperimentState;
+import org.apache.airavata.model.error.proto.ValidationResults;
+import org.apache.airavata.model.error.proto.ValidatorResult;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.status.proto.ExperimentState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,20 +35,19 @@ public class ExperimentStatusValidator implements JobMetadataValidator {
     public ValidationResults validate(ExperimentModel experiment, ProcessModel processModel) {
         String error =
                 "During the validation step experiment status should be CREATED, But this experiment status is : ";
-        ValidationResults validationResults = new ValidationResults();
-        validationResults.setValidationState(true);
-        ValidatorResult validatorResult = new ValidatorResult();
-        List<ValidatorResult> validatorResultList = new ArrayList<ValidatorResult>();
-        if (!experiment.getExperimentStatus().get(0).getState().equals(ExperimentState.CREATED)) {
-            error += experiment.getExperimentStatus().get(0).getState().toString();
+        boolean valid = true;
+        ValidatorResult.Builder validatorResultBuilder = ValidatorResult.newBuilder().setResult(true);
+        if (!experiment.getExperimentStatusList().get(0).getState().equals(ExperimentState.CREATED)) {
+            error += experiment.getExperimentStatusList().get(0).getState().toString();
             log.error(error);
-            validatorResult.setErrorDetails(error);
-            validatorResult.setResult(false);
-            validationResults.setValidationState(false);
+            validatorResultBuilder.setErrorDetails(error).setResult(false);
+            valid = false;
         }
-        validatorResult.setResult(true);
-        validatorResultList.add(validatorResult);
-        validationResults.setValidationResultList(validatorResultList);
-        return validationResults;
+        List<ValidatorResult> validatorResultList = new ArrayList<ValidatorResult>();
+        validatorResultList.add(validatorResultBuilder.build());
+        return ValidationResults.newBuilder()
+                .setValidationState(valid)
+                .addAllValidationResultList(validatorResultList)
+                .build();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/GFACPassiveJobSubmitter.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/GFACPassiveJobSubmitter.java
index 1da3be2c08..5c976e4bcc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/GFACPassiveJobSubmitter.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/GFACPassiveJobSubmitter.java
@@ -28,9 +28,9 @@ import org.apache.airavata.messaging.service.MessageContext;
 import org.apache.airavata.messaging.service.MessagingFactory;
 import org.apache.airavata.messaging.service.Publisher;
 import org.apache.airavata.messaging.service.Type;
-import org.apache.airavata.model.messaging.event.MessageType;
-import org.apache.airavata.model.messaging.event.ProcessSubmitEvent;
-import org.apache.airavata.model.messaging.event.ProcessTerminateEvent;
+import org.apache.airavata.model.messaging.event.proto.MessageType;
+import org.apache.airavata.model.messaging.event.proto.ProcessSubmitEvent;
+import org.apache.airavata.model.messaging.event.proto.ProcessTerminateEvent;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
 import org.slf4j.Logger;
@@ -81,7 +81,12 @@ public class GFACPassiveJobSubmitter implements JobSubmitter, Watcher {
             if (gatewayId == null || gatewayId.isEmpty()) {
                 gatewayId = ServerSettings.getDefaultUserGateway();
             }
-            ProcessSubmitEvent processSubmitEvent = new ProcessSubmitEvent(processId, gatewayId, experimentId, tokenId);
+            ProcessSubmitEvent processSubmitEvent = ProcessSubmitEvent.newBuilder()
+                    .setProcessId(processId)
+                    .setGatewayId(gatewayId)
+                    .setExperimentId(experimentId)
+                    .setTokenId(tokenId)
+                    .build();
             MessageContext messageContext = new MessageContext(
                     processSubmitEvent,
                     MessageType.LAUNCHPROCESS,
@@ -118,7 +123,11 @@ public class GFACPassiveJobSubmitter implements JobSubmitter, Watcher {
 
                 gatewayId = ServerSettings.getDefaultUserGateway();
             }
-            ProcessTerminateEvent processTerminateEvent = new ProcessTerminateEvent(processId, gatewayId, tokenId);
+            ProcessTerminateEvent processTerminateEvent = ProcessTerminateEvent.newBuilder()
+                    .setProcessId(processId)
+                    .setGatewayId(gatewayId)
+                    .setTokenId(tokenId)
+                    .build();
             MessageContext messageContext = new MessageContext(
                     processTerminateEvent,
                     MessageType.TERMINATEPROCESS,
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/GroupResourceProfileValidator.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/GroupResourceProfileValidator.java
index 69e3b3658d..a6ad4609eb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/GroupResourceProfileValidator.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/GroupResourceProfileValidator.java
@@ -22,16 +22,16 @@ package org.apache.airavata.execution.orchestrator;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.airavata.execution.scheduler.Utils;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.BatchQueueResourcePolicy;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
-import org.apache.airavata.model.error.ValidationResults;
-import org.apache.airavata.model.error.ValidatorResult;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.experiment.UserConfigurationDataModel;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.BatchQueueResourcePolicy;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourcePolicy;
+import org.apache.airavata.model.error.proto.ValidationResults;
+import org.apache.airavata.model.error.proto.ValidatorResult;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.experiment.proto.UserConfigurationDataModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.scheduling.proto.ComputationalResourceSchedulingModel;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,25 +47,27 @@ public class GroupResourceProfileValidator implements JobMetadataValidator {
 
     @Override
     public ValidationResults validate(ExperimentModel experiment, ProcessModel processModel) {
-        ValidationResults validationResults = new ValidationResults();
-        validationResults.setValidationState(true);
+        boolean valid = true;
+        List<ValidatorResult> validatorResultList;
         try {
-            List<ValidatorResult> validatorResultList = validateGroupResourceProfile(experiment, processModel);
+            validatorResultList = validateGroupResourceProfile(experiment, processModel);
             for (ValidatorResult result : validatorResultList) {
-                if (!result.isResult()) {
-                    validationResults.setValidationState(false);
+                if (!result.getResult()) {
+                    valid = false;
                     break;
                 }
             }
-            validationResults.setValidationResultList(validatorResultList);
-        } catch (TException e) {
+        } catch (Exception e) {
             throw new RuntimeException("Error while validating Group Resource Profile", e);
         }
-        return validationResults;
+        return ValidationResults.newBuilder()
+                .setValidationState(valid)
+                .addAllValidationResultList(validatorResultList)
+                .build();
     }
 
     private List<ValidatorResult> validateGroupResourceProfile(ExperimentModel experiment, ProcessModel processModel)
-            throws TException {
+            throws Exception {
         List<ValidatorResult> validatorResultList = new ArrayList<ValidatorResult>();
         UserConfigurationDataModel userConfigurationData = experiment.getUserConfigurationData();
         ComputationalResourceSchedulingModel computationalResourceScheduling =
@@ -89,8 +91,7 @@ public class GroupResourceProfileValidator implements JobMetadataValidator {
                 .get();
 
         if (groupComputeResourcePolicy != null) {
-            ValidatorResult queueNameResult = new ValidatorResult();
-            List<String> ComputeResourcePolicyBatchQueues = groupComputeResourcePolicy.getAllowedBatchQueues();
+            List<String> ComputeResourcePolicyBatchQueues = groupComputeResourcePolicy.getAllowedBatchQueuesList();
             String queueName = computationalResourceScheduling.getQueueName().trim();
             if (ComputeResourcePolicyBatchQueues.contains(queueName)) {
                 BatchQueueResourcePolicy batchQueueResourcePolicy = batchQueueResourcePolicies.stream()
@@ -103,23 +104,20 @@ public class GroupResourceProfileValidator implements JobMetadataValidator {
                     validatorResultList.addAll(
                             batchQueuePolicyValidate(computationalResourceScheduling, batchQueueResourcePolicy));
                 } else {
-                    ValidatorResult batchQueuePolicyResult = new ValidatorResult();
                     logger.info(
                             "There is no batch queue resource policy specified for the group resource profile and queue name");
-                    batchQueuePolicyResult.setResult(true);
-                    validatorResultList.add(batchQueuePolicyResult);
+                    validatorResultList.add(ValidatorResult.newBuilder().setResult(true).build());
                 }
             } else {
-                queueNameResult.setResult(false);
-                queueNameResult.setErrorDetails("The specified queue " + queueName
-                        + " does not exist in the list of allowed queues for the group resource profile.");
-                validatorResultList.add(queueNameResult);
+                validatorResultList.add(ValidatorResult.newBuilder()
+                        .setResult(false)
+                        .setErrorDetails("The specified queue " + queueName
+                                + " does not exist in the list of allowed queues for the group resource profile.")
+                        .build());
             }
         } else {
-            ValidatorResult result = new ValidatorResult();
             logger.info("There is no compute resource policy specified for the group resource profile");
-            result.setResult(true);
-            validatorResultList.add(result);
+            validatorResultList.add(ValidatorResult.newBuilder().setResult(true).build());
 
             // verify if batchQueueResourcePolicy exists without computeResourcePolicy
             if (batchQueueResourcePolicies != null && !batchQueueResourcePolicies.isEmpty()) {
@@ -135,11 +133,9 @@ public class GroupResourceProfileValidator implements JobMetadataValidator {
                     validatorResultList.addAll(
                             batchQueuePolicyValidate(computationalResourceScheduling, batchQueueResourcePolicy));
                 } else {
-                    ValidatorResult batchQueuePolicyResult = new ValidatorResult();
                     logger.info(
                             "There is no batch queue resource policy specified for the group resource profile and queue name");
-                    batchQueuePolicyResult.setResult(true);
-                    validatorResultList.add(batchQueuePolicyResult);
+                    validatorResultList.add(ValidatorResult.newBuilder().setResult(true).build());
                 }
             } else {
                 logger.info("There is no batch resource policy specified for the group resource profile");
@@ -156,43 +152,40 @@ public class GroupResourceProfileValidator implements JobMetadataValidator {
         int experimentNodeCount = computationalResourceScheduling.getNodeCount();
         int experimentCPUCount = computationalResourceScheduling.getTotalCPUCount();
 
-        ValidatorResult wallTimeResult = new ValidatorResult();
-
+        ValidatorResult wallTimeResult;
         if (experimentWallTimeLimit > batchQueueResourcePolicy.getMaxAllowedWalltime()) {
-            wallTimeResult.setResult(false);
-            wallTimeResult.setErrorDetails("Job Execution walltime " + experimentWallTimeLimit
-                    + " exceeds the allowable walltime for the group resource profile "
-                    + batchQueueResourcePolicy.getMaxAllowedWalltime() + " for queue "
-                    + batchQueueResourcePolicy.getQueuename());
+            wallTimeResult = ValidatorResult.newBuilder().setResult(false)
+                    .setErrorDetails("Job Execution walltime " + experimentWallTimeLimit
+                            + " exceeds the allowable walltime for the group resource profile "
+                            + batchQueueResourcePolicy.getMaxAllowedWalltime() + " for queue "
+                            + batchQueueResourcePolicy.getQueuename())
+                    .build();
         } else {
-            wallTimeResult.setResult(true);
-            wallTimeResult.setErrorDetails("");
+            wallTimeResult = ValidatorResult.newBuilder().setResult(true).build();
         }
 
-        ValidatorResult nodeCountResult = new ValidatorResult();
-
+        ValidatorResult nodeCountResult;
         if (experimentNodeCount > batchQueueResourcePolicy.getMaxAllowedNodes()) {
-            nodeCountResult.setResult(false);
-            nodeCountResult.setErrorDetails("Job Execution node count " + experimentNodeCount
-                    + " exceeds the allowable node count for the group resource profile "
-                    + batchQueueResourcePolicy.getMaxAllowedNodes() + " for queue "
-                    + batchQueueResourcePolicy.getQueuename());
+            nodeCountResult = ValidatorResult.newBuilder().setResult(false)
+                    .setErrorDetails("Job Execution node count " + experimentNodeCount
+                            + " exceeds the allowable node count for the group resource profile "
+                            + batchQueueResourcePolicy.getMaxAllowedNodes() + " for queue "
+                            + batchQueueResourcePolicy.getQueuename())
+                    .build();
         } else {
-            nodeCountResult.setResult(true);
-            nodeCountResult.setErrorDetails("");
+            nodeCountResult = ValidatorResult.newBuilder().setResult(true).build();
         }
 
-        ValidatorResult cpuCountResult = new ValidatorResult();
-
+        ValidatorResult cpuCountResult;
         if (experimentCPUCount > batchQueueResourcePolicy.getMaxAllowedCores()) {
-            cpuCountResult.setResult(false);
-            cpuCountResult.setErrorDetails("Job Execution cpu count " + experimentCPUCount
-                    + " exceeds the allowable cpu count for the group resource profile "
-                    + batchQueueResourcePolicy.getMaxAllowedCores() + " for queue "
-                    + batchQueueResourcePolicy.getQueuename());
+            cpuCountResult = ValidatorResult.newBuilder().setResult(false)
+                    .setErrorDetails("Job Execution cpu count " + experimentCPUCount
+                            + " exceeds the allowable cpu count for the group resource profile "
+                            + batchQueueResourcePolicy.getMaxAllowedCores() + " for queue "
+                            + batchQueueResourcePolicy.getQueuename())
+                    .build();
         } else {
-            cpuCountResult.setResult(true);
-            cpuCountResult.setErrorDetails("");
+            cpuCountResult = ValidatorResult.newBuilder().setResult(true).build();
         }
 
         batchQueuevalidatorResultList.add(wallTimeResult);
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/HostScheduler.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/HostScheduler.java
index 71b651f750..fc0e06717f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/HostScheduler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/HostScheduler.java
@@ -20,7 +20,7 @@
 package org.apache.airavata.execution.orchestrator;
 
 import java.util.List;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
 
 public interface HostScheduler {
     /**
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/JobMetadataValidator.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/JobMetadataValidator.java
index 723b131450..6502000bd6 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/JobMetadataValidator.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/JobMetadataValidator.java
@@ -19,9 +19,9 @@
 */
 package org.apache.airavata.execution.orchestrator;
 
-import org.apache.airavata.model.error.ValidationResults;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.error.proto.ValidationResults;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
 
 /**
  * This is the interface to implement a validation logic, users can implement their validation
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/Orchestrator.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/Orchestrator.java
index 1d3bb5e876..a298fef998 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/Orchestrator.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/Orchestrator.java
@@ -19,10 +19,9 @@
 */
 package org.apache.airavata.execution.orchestrator;
 
-import org.apache.airavata.model.error.LaunchValidationException;
-import org.apache.airavata.model.error.ValidationResults;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.error.proto.ValidationResults;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
 
 /*
    This is the interface for orchestrator functionality exposed to the out side of the
@@ -39,7 +38,7 @@ public interface Orchestrator {
      * @throws OrchestratorException
      */
     ValidationResults validateExperiment(ExperimentModel experiment)
-            throws OrchestratorException, LaunchValidationException;
+            throws OrchestratorException;
 
     /**
      * This method can be used to run all custom validators plugged in to the orchestrator and make
@@ -51,7 +50,7 @@ public interface Orchestrator {
      * @throws OrchestratorException
      */
     ValidationResults validateProcess(ExperimentModel experiment, ProcessModel processModel)
-            throws OrchestratorException, LaunchValidationException;
+            throws OrchestratorException;
 
     /**
      * After creating the experiment Data user have the
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorClientFactory.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorClientFactory.java
index 0a073da432..895b47c184 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorClientFactory.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorClientFactory.java
@@ -19,7 +19,7 @@
 */
 package org.apache.airavata.execution.orchestrator;
 
-import org.apache.airavata.model.error.AiravataClientException;
+import org.apache.airavata.model.error.proto.AiravataClientException;
 import org.apache.airavata.orchestrator.cpi.OrchestratorService;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TProtocol;
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorClientSample.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorClientSample.java
index 9579ff3789..522b0c8301 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorClientSample.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorClientSample.java
@@ -27,14 +27,14 @@ package org.apache.airavata.execution.orchestrator;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.airavata.execution.util.ExperimentModelUtil;
-import org.apache.airavata.model.application.io.DataType;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.experiment.UserConfigurationDataModel;
-import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.application.io.proto.DataType;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.experiment.proto.UserConfigurationDataModel;
+import org.apache.airavata.model.scheduling.proto.ComputationalResourceSchedulingModel;
 import org.apache.airavata.orchestrator.cpi.OrchestratorService;
-import org.apache.thrift.TException;
+
 
 public class OrchestratorClientSample {
     //    private static DocumentCreator documentCreator;
@@ -86,17 +86,19 @@ public class OrchestratorClientSample {
             Thread thread = new Thread() {
                 public void run() {
                     List<InputDataObjectType> exInputs = new ArrayList<InputDataObjectType>();
-                    InputDataObjectType input = new InputDataObjectType();
-                    input.setName("echo_input");
-                    input.setType(DataType.STRING);
-                    input.setValue("echo_output=Hello World");
+                    InputDataObjectType input = InputDataObjectType.newBuilder()
+                            .setName("echo_input")
+                            .setType(DataType.STRING)
+                            .setValue("echo_output=Hello World")
+                            .build();
                     exInputs.add(input);
 
                     List<OutputDataObjectType> exOut = new ArrayList<OutputDataObjectType>();
-                    OutputDataObjectType output = new OutputDataObjectType();
-                    output.setName("echo_output");
-                    output.setType(DataType.STRING);
-                    output.setValue("");
+                    OutputDataObjectType output = OutputDataObjectType.newBuilder()
+                            .setName("echo_output")
+                            .setType(DataType.STRING)
+                            .setValue("")
+                            .build();
                     exOut.add(output);
 
                     ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
@@ -107,15 +109,17 @@ public class OrchestratorClientSample {
                             "SimpleEcho2",
                             "SimpleEcho2",
                             exInputs);
-                    simpleExperiment.setExperimentOutputs(exOut);
+                    simpleExperiment = simpleExperiment.toBuilder()
+                            .addAllExperimentOutputs(exOut).build();
 
                     ComputationalResourceSchedulingModel scheduling =
                             ExperimentModelUtil.createComputationResourceScheduling(
-                                    "trestles.sdsc.edu", 1, 1, 1, "normal", 0, 0);
-                    scheduling.setResourceHostId("gsissh-trestles");
-                    UserConfigurationDataModel userConfigurationDataModel = new UserConfigurationDataModel();
-                    userConfigurationDataModel.setComputationalResourceScheduling(scheduling);
-                    simpleExperiment.setUserConfigurationData(userConfigurationDataModel);
+                                    "trestles.sdsc.edu", 1, 1, 1, "normal", 0, 0)
+                                    .toBuilder().setResourceHostId("gsissh-trestles").build();
+                    UserConfigurationDataModel userConfigurationDataModel = UserConfigurationDataModel.newBuilder()
+                            .setComputationalResourceScheduling(scheduling).build();
+                    simpleExperiment = simpleExperiment.toBuilder()
+                            .setUserConfigurationData(userConfigurationDataModel).build();
                     String expId = null;
                     try {
                         //                        expId = (String) registry.add(ParentDataType.EXPERIMENT,
@@ -126,7 +130,7 @@ public class OrchestratorClientSample {
 
                     try {
                         orchestratorClient.launchExperiment(expId, "airavataToken");
-                    } catch (TException e) {
+                    } catch (Exception e) {
                         throw new RuntimeException("Error while storing experiment details", e);
                     }
                 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorServerUtils.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorServerUtils.java
index 5a19f7d36c..7961173e4d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorServerUtils.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorServerUtils.java
@@ -24,12 +24,12 @@ import org.apache.airavata.common.util.AiravataUtils;
 import org.apache.airavata.execution.scheduler.Utils;
 import org.apache.airavata.messaging.service.MessageContext;
 import org.apache.airavata.messaging.service.Publisher;
-import org.apache.airavata.model.messaging.event.ExperimentStatusChangeEvent;
-import org.apache.airavata.model.messaging.event.MessageType;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.status.ExperimentStatus;
+import org.apache.airavata.model.messaging.event.proto.ExperimentStatusChangeEvent;
+import org.apache.airavata.model.messaging.event.proto.MessageType;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.status.proto.ExperimentStatus;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,12 +37,15 @@ public class OrchestratorServerUtils {
     private static final Logger log = LoggerFactory.getLogger(OrchestratorUtils.class);
 
     public static void updateAndPublishExperimentStatus(
-            String experimentId, ExperimentStatus status, Publisher publisher, String gatewayId) throws TException {
+            String experimentId, ExperimentStatus status, Publisher publisher, String gatewayId) throws Exception {
         try {
             RegistryService.Iface registryHandler = Utils.getRegistryHandler();
             registryHandler.updateExperimentStatus(status, experimentId);
-            ExperimentStatusChangeEvent event =
-                    new ExperimentStatusChangeEvent(status.getState(), experimentId, gatewayId);
+            ExperimentStatusChangeEvent event = ExperimentStatusChangeEvent.newBuilder()
+                    .setState(status.getState())
+                    .setExperimentId(experimentId)
+                    .setGatewayId(gatewayId)
+                    .build();
             String messageId = AiravataUtils.getId("EXPERIMENT");
             MessageContext messageContext = new MessageContext(event, MessageType.EXPERIMENT, messageId, gatewayId);
             messageContext.setUpdatedTime(AiravataUtils.getCurrentTimestamp());
@@ -53,11 +56,11 @@ public class OrchestratorServerUtils {
         }
     }
 
-    public static ExperimentStatus getExperimentStatus(String experimentId) throws TException {
+    public static ExperimentStatus getExperimentStatus(String experimentId) throws Exception {
         return Utils.getRegistryHandler().getExperimentStatus(experimentId);
     }
 
-    public static ProcessModel getProcess(String processId) throws TException {
+    public static ProcessModel getProcess(String processId) throws Exception {
         return Utils.getRegistryHandler().getProcess(processId);
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorUtils.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorUtils.java
index 44e7f58698..c303c67349 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorUtils.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/OrchestratorUtils.java
@@ -31,25 +31,25 @@ import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.credential.repository.CredentialReader;
 import org.apache.airavata.credential.repository.CredentialReaderImpl;
 import org.apache.airavata.execution.scheduler.Utils;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.CloudJobSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.appcatalog.computeresource.LOCALSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.SSHJobSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.UnicoreJobSubmission;
-import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
-import org.apache.airavata.model.data.movement.DataMovementInterface;
-import org.apache.airavata.model.data.movement.DataMovementProtocol;
-import org.apache.airavata.model.data.movement.SCPDataMovement;
-import org.apache.airavata.model.data.movement.SecurityProtocol;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.appcatalog.appinterface.proto.ApplicationInterfaceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.CloudJobSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionInterface;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.LOCALSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.SSHJobSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.UnicoreJobSubmission;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.StoragePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserComputeResourcePreference;
+import org.apache.airavata.model.data.movement.proto.DataMovementInterface;
+import org.apache.airavata.model.data.movement.proto.DataMovementProtocol;
+import org.apache.airavata.model.data.movement.proto.SCPDataMovement;
+import org.apache.airavata.model.data.movement.proto.SecurityProtocol;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.scheduling.proto.ComputationalResourceSchedulingModel;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,17 +74,17 @@ public class OrchestratorUtils {
     }
 
     public static JobSubmissionProtocol getPreferredJobSubmissionProtocol(ProcessModel model, String gatewayId)
-            throws TException, OrchestratorException {
+            throws Exception, OrchestratorException {
         return getPreferredJobSubmissionInterface(model, gatewayId).getJobSubmissionProtocol();
     }
 
     public static GroupComputeResourcePreference getGroupComputeResourcePreference(ProcessModel model)
-            throws TException {
+            throws Exception {
         return getRegistryHandler()
                 .getGroupComputeResourcePreference(model.getComputeResourceId(), model.getGroupResourceProfileId());
     }
 
-    public static String getApplicationInterfaceName(ProcessModel model) throws TException, OrchestratorException {
+    public static String getApplicationInterfaceName(ProcessModel model) throws Exception, OrchestratorException {
         try {
             ApplicationInterfaceDescription appInterface =
                     getRegistryHandler().getApplicationInterface(model.getApplicationInterfaceId());
@@ -95,7 +95,7 @@ public class OrchestratorUtils {
     }
 
     public static DataMovementProtocol getPreferredDataMovementProtocol(ProcessModel model, String gatewayId)
-            throws TException, OrchestratorException {
+            throws Exception, OrchestratorException {
         return getPreferredDataMovementInterface(model, gatewayId).getDataMovementProtocol();
     }
 
@@ -111,12 +111,12 @@ public class OrchestratorUtils {
     }
 
     public static String getLoginUserName(ProcessModel processModel, String gatewayId)
-            throws AiravataException, TException {
+            throws AiravataException, Exception {
         try {
             RegistryService.Iface registryHandler = getRegistryHandler();
             GroupComputeResourcePreference computeResourcePreference = getGroupComputeResourcePreference(processModel);
             ComputationalResourceSchedulingModel processResourceSchedule = processModel.getProcessResourceSchedule();
-            if (processModel.isUseUserCRPref()) {
+            if (processModel.getUseUserCRPref()) {
                 UserComputeResourcePreference userComputeResourcePreference =
                         registryHandler.getUserComputeResourcePreference(
                                 processModel.getUserName(), gatewayId, processModel.getComputeResourceId());
@@ -154,14 +154,14 @@ public class OrchestratorUtils {
     }
 
     public static String getScratchLocation(ProcessModel processModel, String gatewayId)
-            throws AiravataException, TException {
+            throws AiravataException, Exception {
         try {
             RegistryService.Iface registryHandler = getRegistryHandler();
             GroupComputeResourcePreference computeResourcePreference = getGroupComputeResourcePreference(processModel);
             ComputationalResourceSchedulingModel processResourceSchedule = processModel.getProcessResourceSchedule();
             String scratchLocation = computeResourcePreference.getScratchLocation();
 
-            if (processModel.isUseUserCRPref()) {
+            if (processModel.getUseUserCRPref()) {
                 UserComputeResourcePreference userComputeResourcePreference =
                         registryHandler.getUserComputeResourcePreference(
                                 processModel.getUserName(), gatewayId, processModel.getComputeResourceId());
@@ -204,7 +204,7 @@ public class OrchestratorUtils {
             String resourceHostId = processModel.getComputeResourceId();
             ComputeResourceDescription resourceDescription =
                     getRegistryHandler().getComputeResource(resourceHostId);
-            List<JobSubmissionInterface> jobSubmissionInterfaces = resourceDescription.getJobSubmissionInterfaces();
+            List<JobSubmissionInterface> jobSubmissionInterfaces = resourceDescription.getJobSubmissionInterfacesList();
             if (jobSubmissionInterfaces != null && !jobSubmissionInterfaces.isEmpty()) {
                 Collections.sort(
                         jobSubmissionInterfaces, Comparator.comparingInt(JobSubmissionInterface::getPriorityOrder));
@@ -224,7 +224,7 @@ public class OrchestratorUtils {
             String resourceHostId = processModel.getComputeResourceId();
             ComputeResourceDescription resourceDescription =
                     getRegistryHandler().getComputeResource(resourceHostId);
-            List<DataMovementInterface> dataMovementInterfaces = resourceDescription.getDataMovementInterfaces();
+            List<DataMovementInterface> dataMovementInterfaces = resourceDescription.getDataMovementInterfacesList();
             if (dataMovementInterfaces != null && !dataMovementInterfaces.isEmpty()) {
                 Collections.sort(
                         dataMovementInterfaces, Comparator.comparingInt(DataMovementInterface::getPriorityOrder));
@@ -239,7 +239,7 @@ public class OrchestratorUtils {
     }
 
     public static int getDataMovementPort(ProcessModel processModel, String gatewayId)
-            throws TException, ApplicationSettingsException, OrchestratorException {
+            throws Exception, ApplicationSettingsException, OrchestratorException {
         try {
             DataMovementProtocol protocol = getPreferredDataMovementProtocol(processModel, gatewayId);
             DataMovementInterface dataMovementInterface = getPreferredDataMovementInterface(processModel, gatewayId);
@@ -257,7 +257,7 @@ public class OrchestratorUtils {
     }
 
     public static SecurityProtocol getSecurityProtocol(ProcessModel processModel, String gatewayId)
-            throws TException, ApplicationSettingsException, OrchestratorException {
+            throws Exception, ApplicationSettingsException, OrchestratorException {
         try {
             JobSubmissionProtocol submissionProtocol = getPreferredJobSubmissionProtocol(processModel, gatewayId);
             JobSubmissionInterface jobSubmissionInterface = getPreferredJobSubmissionInterface(processModel, gatewayId);
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/ParserWorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/ParserWorkflowManager.java
index 7a14f563bf..5ba5b29f8d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/ParserWorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/ParserWorkflowManager.java
@@ -31,16 +31,16 @@ import org.apache.airavata.execution.task.ParsingTaskOutput;
 import org.apache.airavata.execution.task.ParsingTaskOutputs;
 import org.apache.airavata.execution.task.ProcessCompletionMessage;
 import org.apache.airavata.execution.task.ProcessCompletionMessageDeserializer;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.appcatalog.parser.*;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.appcatalog.appinterface.proto.ApplicationInterfaceDescription;
+import org.apache.airavata.model.appcatalog.parser.proto.*;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.kafka.clients.consumer.*;
 import org.apache.kafka.common.TopicPartition;
 import org.apache.kafka.common.serialization.StringDeserializer;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -244,7 +244,7 @@ public class ParserWorkflowManager implements IServer {
         try {
             parsingTask.setGroupResourceProfileId(
                     registryHandler.getProcess(completionMessage.getProcessId()).getGroupResourceProfileId());
-        } catch (TException e) {
+        } catch (Exception e) {
             logger.error("Failed while fetching process model for process id  " + completionMessage.getProcessId());
             throw new Exception(
                     "Failed while fetching process model for process id  " + completionMessage.getProcessId());
@@ -274,12 +274,12 @@ public class ParserWorkflowManager implements IServer {
                     ExperimentModel experiment = registryHandler.getExperiment(completionMessage.getExperimentId());
                     Optional<OutputDataObjectType> expOutputData;
                     if (applicationOutputName.contains("*")) {
-                        expOutputData = experiment.getExperimentOutputs().stream()
+                        expOutputData = experiment.getExperimentOutputsList().stream()
                                 .filter(outputDataObjectType ->
                                         isWildcardMatch(outputDataObjectType.getName(), applicationOutputName))
                                 .findFirst();
                     } else {
-                        expOutputData = experiment.getExperimentOutputs().stream()
+                        expOutputData = experiment.getExperimentOutputsList().stream()
                                 .filter(outputDataObjectType ->
                                         outputDataObjectType.getName().equals(applicationOutputName))
                                 .findFirst();
@@ -289,7 +289,7 @@ public class ParserWorkflowManager implements IServer {
                     } else {
                         throw new Exception("Could not find an experiment output with name " + applicationOutputName);
                     }
-                } catch (TException e) {
+                } catch (Exception e) {
                     logger.error("Failed while fetching experiment " + completionMessage.getExperimentId());
                     throw new Exception("Failed while fetching experiment " + completionMessage.getExperimentId());
                 }
@@ -397,7 +397,7 @@ public class ParserWorkflowManager implements IServer {
                     parsingTask.setGroupResourceProfileId(registryHandler
                             .getProcess(completionMessage.getProcessId())
                             .getGroupResourceProfileId());
-                } catch (TException e) {
+                } catch (Exception e) {
                     logger.error(
                             "Failed while fetching process model for process id  " + completionMessage.getProcessId());
                     throw new Exception(
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/PostWorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/PostWorkflowManager.java
index f0ddd9af1f..628de812db 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/PostWorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/PostWorkflowManager.java
@@ -31,20 +31,20 @@ import org.apache.airavata.execution.monitor.JobStateValidator;
 import org.apache.airavata.execution.monitor.JobStatusResult;
 import org.apache.airavata.execution.monitor.JobStatusResultDeserializer;
 import org.apache.airavata.messaging.service.MessageContext;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.messaging.event.JobIdentifier;
-import org.apache.airavata.model.messaging.event.JobStatusChangeEvent;
-import org.apache.airavata.model.messaging.event.MessageType;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.status.JobState;
-import org.apache.airavata.model.status.JobStatus;
-import org.apache.airavata.model.status.ProcessState;
-import org.apache.airavata.model.status.ProcessStatus;
-import org.apache.airavata.model.task.DataStagingTaskModel;
-import org.apache.airavata.model.task.TaskModel;
-import org.apache.airavata.model.task.TaskTypes;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ResourceType;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.messaging.event.proto.JobIdentifier;
+import org.apache.airavata.model.messaging.event.proto.JobStatusChangeEvent;
+import org.apache.airavata.model.messaging.event.proto.MessageType;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.status.proto.JobState;
+import org.apache.airavata.model.status.proto.JobStatus;
+import org.apache.airavata.model.status.proto.ProcessState;
+import org.apache.airavata.model.status.proto.ProcessStatus;
+import org.apache.airavata.model.task.proto.DataStagingTaskModel;
+import org.apache.airavata.model.task.proto.TaskModel;
+import org.apache.airavata.model.task.proto.TaskTypes;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.kafka.clients.consumer.*;
 import org.apache.kafka.common.serialization.StringDeserializer;
@@ -127,10 +127,10 @@ public class PostWorkflowManager implements IServer {
             var processState = processStatus.getState();
 
             if (experimentModel != null) {
-                jobModel.getJobStatuses()
+                jobModel.getJobStatusesList()
                         .sort(Comparator.comparingLong(JobStatus::getTimeOfStateChange)
                                 .reversed());
-                JobState currentJobStatus = jobModel.getJobStatuses().get(0).getJobState();
+                JobState currentJobStatus = jobModel.getJobStatusesList().get(0).getJobState();
                 logger.info("Last known state of job {} is {}", jobId, jobName);
 
                 if (!JobStateValidator.isValid(currentJobStatus, jobState)) {
@@ -224,7 +224,7 @@ public class PostWorkflowManager implements IServer {
         }
 
         String taskDag = processModel.getTaskDag();
-        List<TaskModel> taskList = processModel.getTasks();
+        List<TaskModel> taskList = processModel.getTasksList();
 
         String[] taskIds = taskDag.split(",");
         final List<AiravataTask> allTasks = new ArrayList<>();
@@ -385,17 +385,12 @@ public class PostWorkflowManager implements IServer {
             throws Exception {
         try {
 
-            JobStatus jobStatus = new JobStatus();
-            jobStatus.setReason(jobState.name());
-            jobStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-            jobStatus.setJobState(jobState);
-
-            if (jobStatus.getTimeOfStateChange() == 0 || jobStatus.getTimeOfStateChange() > 0) {
-                jobStatus.setTimeOfStateChange(
-                        AiravataUtils.getCurrentTimestamp().getTime());
-            } else {
-                jobStatus.setTimeOfStateChange(jobStatus.getTimeOfStateChange());
-            }
+            long now = AiravataUtils.getCurrentTimestamp().getTime();
+            JobStatus jobStatus = JobStatus.newBuilder()
+                    .setReason(jobState.name())
+                    .setTimeOfStateChange(now)
+                    .setJobState(jobState)
+                    .build();
 
             try {
                 wfManager.getRegistryHandler().addJobStatus(jobStatus, taskId, jobId);
@@ -403,9 +398,12 @@ public class PostWorkflowManager implements IServer {
                 logger.error("Failed to add job status " + jobId, e);
             }
 
-            JobIdentifier identifier = new JobIdentifier(jobId, taskId, processId, experimentId, gateway);
+            JobIdentifier identifier = JobIdentifier.newBuilder()
+                    .setJobId(jobId).setTaskId(taskId).setProcessId(processId)
+                    .setExperimentId(experimentId).setGatewayId(gateway).build();
 
-            JobStatusChangeEvent jobStatusChangeEvent = new JobStatusChangeEvent(jobStatus.getJobState(), identifier);
+            JobStatusChangeEvent jobStatusChangeEvent = JobStatusChangeEvent.newBuilder()
+                    .setJobState(jobStatus.getJobState()).setJobIdentity(identifier).build();
             MessageContext msgCtx = new MessageContext(
                     jobStatusChangeEvent, MessageType.JOB, AiravataUtils.getId(MessageType.JOB.name()), gateway);
             msgCtx.setUpdatedTime(AiravataUtils.getCurrentTimestamp());
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/PreWorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/PreWorkflowManager.java
index d11c1560a6..5c077b60a4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/PreWorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/PreWorkflowManager.java
@@ -40,21 +40,21 @@ import org.apache.airavata.messaging.service.MessageHandler;
 import org.apache.airavata.messaging.service.MessagingFactory;
 import org.apache.airavata.messaging.service.Subscriber;
 import org.apache.airavata.messaging.service.Type;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.messaging.event.MessageType;
-import org.apache.airavata.model.messaging.event.ProcessSubmitEvent;
-import org.apache.airavata.model.messaging.event.ProcessTerminateEvent;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.process.ProcessWorkflow;
-import org.apache.airavata.model.status.ProcessState;
-import org.apache.airavata.model.status.ProcessStatus;
-import org.apache.airavata.model.task.TaskModel;
-import org.apache.airavata.model.task.TaskTypes;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ResourceType;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.messaging.event.proto.MessageType;
+import org.apache.airavata.model.messaging.event.proto.ProcessSubmitEvent;
+import org.apache.airavata.model.messaging.event.proto.ProcessTerminateEvent;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.process.proto.ProcessWorkflow;
+import org.apache.airavata.model.status.proto.ProcessState;
+import org.apache.airavata.model.status.proto.ProcessStatus;
+import org.apache.airavata.model.task.proto.TaskModel;
+import org.apache.airavata.model.task.proto.TaskTypes;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.thrift.TBase;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -142,7 +142,7 @@ public class PreWorkflowManager implements IServer {
         }
 
         String taskDag = processModel.getTaskDag();
-        List<TaskModel> taskList = processModel.getTasks();
+        List<TaskModel> taskList = processModel.getTasksList();
 
         boolean intermediateTransfer =
                 taskList.stream().anyMatch(task -> task.getTaskType() == TaskTypes.OUTPUT_FETCHING);
@@ -193,7 +193,7 @@ public class PreWorkflowManager implements IServer {
                     airavataTask.setTaskId(taskModel.getTaskId());
                     airavataTask.setRetryCount(taskModel.getMaxRetry());
                     airavataTask.setAutoSchedule(
-                            experimentModel.getUserConfigurationData().isAiravataAutoSchedule());
+                            experimentModel.getUserConfigurationData().getAiravataAutoSchedule());
                     if (allTasks.size() > 0) {
                         allTasks.get(allTasks.size() - 1)
                                 .setNextTask(new OutPort(airavataTask.getTaskId(), airavataTask));
@@ -331,7 +331,7 @@ public class PreWorkflowManager implements IServer {
                 try {
                     byte[] bytes = ThriftUtils.serializeThriftObject(messageEvent);
                     ThriftUtils.createThriftFromBytes(bytes, event);
-                } catch (TException e) {
+                } catch (Exception e) {
                     logger.error("Failed to fetch process submit event", e);
                     subscriber.sendAck(messageContext.getDeliveryTag());
                 }
@@ -351,9 +351,10 @@ public class PreWorkflowManager implements IServer {
                             + " of experiment " + experimentId + " in gateway " + gateway);
 
                     // updating the process status
-                    ProcessStatus status = new ProcessStatus();
-                    status.setState(ProcessState.STARTED);
-                    status.setTimeOfStateChange(Calendar.getInstance().getTimeInMillis());
+                    ProcessStatus status = ProcessStatus.newBuilder()
+                            .setState(ProcessState.STARTED)
+                            .setTimeOfStateChange(Calendar.getInstance().getTimeInMillis())
+                            .build();
                     wfManager.publishProcessStatus(processId, experimentId, gateway, ProcessState.STARTED);
                     subscriber.sendAck(messageContext.getDeliveryTag());
                 } catch (Exception e) {
@@ -369,7 +370,7 @@ public class PreWorkflowManager implements IServer {
                 try {
                     byte[] bytes = ThriftUtils.serializeThriftObject(messageEvent);
                     ThriftUtils.createThriftFromBytes(bytes, event);
-                } catch (TException e) {
+                } catch (Exception e) {
                     logger.error("Failed to fetch process cancellation event", e);
                     subscriber.sendAck(messageContext.getDeliveryTag());
                 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/SimpleOrchestratorImpl.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/SimpleOrchestratorImpl.java
index e95849351c..19abce89a9 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/SimpleOrchestratorImpl.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/SimpleOrchestratorImpl.java
@@ -32,38 +32,37 @@ import java.util.Optional;
 import java.util.concurrent.ExecutorService;
 import org.apache.airavata.common.exception.AiravataException;
 import org.apache.airavata.common.util.AiravataUtils;
-import org.apache.airavata.common.util.ThriftUtils;
 import org.apache.airavata.execution.util.ExperimentModelUtil;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.appcatalog.computeresource.MonitorMode;
-import org.apache.airavata.model.appcatalog.computeresource.SSHJobSubmission;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType;
-import org.apache.airavata.model.application.io.DataType;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.commons.ErrorModel;
-import org.apache.airavata.model.data.movement.DataMovementProtocol;
-import org.apache.airavata.model.error.LaunchValidationException;
-import org.apache.airavata.model.error.ValidationResults;
-import org.apache.airavata.model.error.ValidatorResult;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
-import org.apache.airavata.model.status.TaskState;
-import org.apache.airavata.model.status.TaskStatus;
-import org.apache.airavata.model.task.DataStageType;
-import org.apache.airavata.model.task.DataStagingTaskModel;
-import org.apache.airavata.model.task.EnvironmentSetupTaskModel;
-import org.apache.airavata.model.task.JobSubmissionTaskModel;
-import org.apache.airavata.model.task.MonitorTaskModel;
-import org.apache.airavata.model.task.TaskModel;
-import org.apache.airavata.model.task.TaskTypes;
+import org.apache.airavata.model.appcatalog.appinterface.proto.ApplicationInterfaceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionInterface;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.MonitorMode;
+import org.apache.airavata.model.appcatalog.computeresource.proto.SSHJobSubmission;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ResourceType;
+import org.apache.airavata.model.application.io.proto.DataType;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.commons.proto.ErrorModel;
+import org.apache.airavata.model.data.movement.proto.DataMovementProtocol;
+import org.apache.airavata.model.error.proto.LaunchValidationException;
+import org.apache.airavata.model.error.proto.ValidationResults;
+import org.apache.airavata.model.error.proto.ValidatorResult;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.scheduling.proto.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.status.proto.TaskState;
+import org.apache.airavata.model.status.proto.TaskStatus;
+import org.apache.airavata.model.task.proto.DataStageType;
+import org.apache.airavata.model.task.proto.DataStagingTaskModel;
+import org.apache.airavata.model.task.proto.EnvironmentSetupTaskModel;
+import org.apache.airavata.model.task.proto.JobSubmissionTaskModel;
+import org.apache.airavata.model.task.proto.MonitorTaskModel;
+import org.apache.airavata.model.task.proto.TaskModel;
+import org.apache.airavata.model.task.proto.TaskTypes;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,7 +73,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     // this is going to be null unless the thread count is 0
     private JobSubmitter jobSubmitter = null;
 
-    public SimpleOrchestratorImpl() throws OrchestratorException, TException {
+    public SimpleOrchestratorImpl() throws OrchestratorException, Exception {
         try {
             try {
                 // We are only going to use GFacPassiveJobSubmitter
@@ -101,10 +100,9 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     }
 
     public ValidationResults validateExperiment(ExperimentModel experiment)
-            throws OrchestratorException, LaunchValidationException {
-        ValidationResults validationResults = new ValidationResults();
-        validationResults.setValidationState(
-                true); // initially making it to success, if atleast one failed them simply mark it failed.
+            throws OrchestratorException {
+        ValidationResults.Builder validationResultsBuilder = ValidationResults.newBuilder()
+                .setValidationState(true); // initially making it to success, if atleast one failed them simply mark it failed.
         String errorMsg = "Validation Errors : ";
         if (this.orchestratorConfiguration.isEnableValidation()) {
             List<String> validatorClasses =
@@ -114,64 +112,67 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                     Class<? extends JobMetadataValidator> vClass =
                             Class.forName(validator.trim()).asSubclass(JobMetadataValidator.class);
                     JobMetadataValidator jobMetadataValidator = vClass.newInstance();
-                    validationResults = jobMetadataValidator.validate(experiment, null);
-                    if (validationResults.isValidationState()) {
+                    ValidationResults validationResults = jobMetadataValidator.validate(experiment, null);
+                    if (validationResults.getValidationState()) {
                         logger.info("Validation of " + validator + " is SUCCESSFUL");
                     } else {
-                        List<ValidatorResult> validationResultList = validationResults.getValidationResultList();
+                        List<ValidatorResult> validationResultList = validationResults.getValidationResultListList();
                         for (ValidatorResult result : validationResultList) {
-                            if (!result.isResult()) {
+                            if (!result.getResult()) {
                                 String validationError = result.getErrorDetails();
-                                if (validationError != null) {
+                                if (!validationError.isEmpty()) {
                                     errorMsg += validationError + " ";
                                 }
                             }
                         }
                         logger.error("Validation of " + validator + " for experiment Id " + experiment.getExperimentId()
                                 + " is FAILED:[error]. " + errorMsg);
-                        validationResults.setValidationState(false);
+                        validationResultsBuilder.setValidationState(false)
+                                .addAllValidationResultList(validationResults.getValidationResultListList());
                         try {
-                            ErrorModel details = new ErrorModel();
-                            details.setActualErrorMessage(errorMsg);
-                            details.setCreationTime(Calendar.getInstance().getTimeInMillis());
+                            ErrorModel details = ErrorModel.newBuilder()
+                                    .setActualErrorMessage(errorMsg)
+                                    .setCreationTime(Calendar.getInstance().getTimeInMillis())
+                                    .build();
                             final RegistryService.Iface registryClient = getRegistryHandler();
                             registryClient.addErrors(
                                     OrchestratorConstants.EXPERIMENT_ERROR, details, experiment.getExperimentId());
-                        } catch (TException e) {
+                        } catch (Exception e) {
                             throw new RuntimeException("Error while saving error details to registry", e);
                         }
                         break;
                     }
                 } catch (ClassNotFoundException e) {
                     logger.error("Error loading the validation class: ", validator, e);
-                    validationResults.setValidationState(false);
+                    validationResultsBuilder.setValidationState(false);
                 } catch (InstantiationException e) {
                     logger.error("Error loading the validation class: ", validator, e);
-                    validationResults.setValidationState(false);
+                    validationResultsBuilder.setValidationState(false);
                 } catch (IllegalAccessException e) {
                     logger.error("Error loading the validation class: ", validator, e);
-                    validationResults.setValidationState(false);
+                    validationResultsBuilder.setValidationState(false);
                 }
             }
         }
-        if (validationResults.isValidationState()) {
+        ValidationResults validationResults = validationResultsBuilder.build();
+        if (validationResults.getValidationState()) {
             return validationResults;
         } else {
             // atleast one validation has failed, so we throw an exception
-            LaunchValidationException launchValidationException = new LaunchValidationException();
-            launchValidationException.setValidationResult(validationResults);
-            launchValidationException.setErrorMessage("Validation failed refer the validationResults list for "
-                    + "detail error. Validation errors : " + errorMsg);
-            throw launchValidationException;
+            LaunchValidationException launchValidationException = LaunchValidationException.newBuilder()
+                    .setValidationResult(validationResults)
+                    .setErrorMessage("Validation failed refer the validationResults list for "
+                            + "detail error. Validation errors : " + errorMsg)
+                    .build();
+            throw new OrchestratorException(launchValidationException.getErrorMessage());
         }
     }
 
     public ValidationResults validateProcess(ExperimentModel experiment, ProcessModel processModel)
-            throws OrchestratorException, LaunchValidationException {
+            throws OrchestratorException {
 
-        ValidationResults validationResults = new ValidationResults();
-        validationResults.setValidationState(
-                true); // initially making it to success, if atleast one failed them simply mark it failed.
+        ValidationResults.Builder validationResultsBuilder = ValidationResults.newBuilder()
+                .setValidationState(true); // initially making it to success, if atleast one failed them simply mark it failed.
         String errorMsg = "Validation Errors : ";
         if (this.orchestratorConfiguration.isEnableValidation()) {
             List<String> validatorClzzez =
@@ -181,49 +182,53 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                     Class<? extends JobMetadataValidator> vClass =
                             Class.forName(validator.trim()).asSubclass(JobMetadataValidator.class);
                     JobMetadataValidator jobMetadataValidator = vClass.newInstance();
-                    validationResults = jobMetadataValidator.validate(experiment, processModel);
-                    if (validationResults.isValidationState()) {
+                    ValidationResults validationResults = jobMetadataValidator.validate(experiment, processModel);
+                    if (validationResults.getValidationState()) {
                         logger.info("Validation of " + validator + " is SUCCESSFUL");
                     } else {
-                        List<ValidatorResult> validationResultList = validationResults.getValidationResultList();
+                        List<ValidatorResult> validationResultList = validationResults.getValidationResultListList();
                         for (ValidatorResult result : validationResultList) {
-                            if (!result.isResult()) {
+                            if (!result.getResult()) {
                                 String validationError = result.getErrorDetails();
-                                if (validationError != null) {
+                                if (!validationError.isEmpty()) {
                                     errorMsg += validationError + " ";
                                 }
                             }
                         }
                         logger.error("Validation of " + validator + " for experiment Id " + experiment.getExperimentId()
                                 + " is FAILED:[error]. " + errorMsg);
-                        validationResults.setValidationState(false);
+                        validationResultsBuilder.setValidationState(false)
+                                .addAllValidationResultList(validationResults.getValidationResultListList());
                         try {
-                            ErrorModel details = new ErrorModel();
-                            details.setActualErrorMessage(errorMsg);
-                            details.setCreationTime(Calendar.getInstance().getTimeInMillis());
+                            ErrorModel details = ErrorModel.newBuilder()
+                                    .setActualErrorMessage(errorMsg)
+                                    .setCreationTime(Calendar.getInstance().getTimeInMillis())
+                                    .build();
                             final RegistryService.Iface registryClient = getRegistryHandler();
                             registryClient.addErrors(
                                     OrchestratorConstants.PROCESS_ERROR, details, processModel.getProcessId());
-                        } catch (TException e) {
+                        } catch (Exception e) {
                             throw new RuntimeException("Error while saving error details to registry", e);
                         }
                         break;
                     }
                 } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                     logger.error("Error loading the validation class: ", validator, e);
-                    validationResults.setValidationState(false);
+                    validationResultsBuilder.setValidationState(false);
                 }
             }
         }
-        if (validationResults.isValidationState()) {
+        ValidationResults validationResults = validationResultsBuilder.build();
+        if (validationResults.getValidationState()) {
             return validationResults;
         } else {
             // atleast one validation has failed, so we throw an exception
-            LaunchValidationException launchValidationException = new LaunchValidationException();
-            launchValidationException.setValidationResult(validationResults);
-            launchValidationException.setErrorMessage("Validation failed refer the validationResults "
-                    + "list for detail error. Validation errors : " + errorMsg);
-            throw launchValidationException;
+            LaunchValidationException launchValidationException = LaunchValidationException.newBuilder()
+                    .setValidationResult(validationResults)
+                    .setErrorMessage("Validation failed refer the validationResults "
+                            + "list for detail error. Validation errors : " + errorMsg)
+                    .build();
+            throw new OrchestratorException(launchValidationException.getErrorMessage());
         }
     }
 
@@ -241,7 +246,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             } else {
                 logger.warn("No processes found for experiment " + experiment.getExperimentId() + " to cancel");
             }
-        } catch (TException e) {
+        } catch (Exception e) {
             logger.error("Failed to fetch process ids for experiment " + experiment.getExperimentId(), e);
             throw new OrchestratorException(
                     "Failed to fetch process ids for experiment " + experiment.getExperimentId(), e);
@@ -360,30 +365,29 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             String gatewayId,
             ProcessModel processModel,
             ResourceType resourceType)
-            throws TException, AiravataException, OrchestratorException {
+            throws Exception, AiravataException, OrchestratorException {
         List<String> envTaskIds = new ArrayList<>();
 
-        TaskModel envSetupTask = new TaskModel();
-        envSetupTask.setTaskType(TaskTypes.ENV_SETUP);
-        envSetupTask.setTaskStatuses(List.of(new TaskStatus(TaskState.CREATED)));
-        envSetupTask.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-        envSetupTask.setLastUpdateTime(AiravataUtils.getCurrentTimestamp().getTime());
-        envSetupTask.setParentProcessId(processModel.getProcessId());
-
-        EnvironmentSetupTaskModel envSetupSubModel = new EnvironmentSetupTaskModel();
-        envSetupSubModel.setProtocol(
-                OrchestratorUtils.getSecurityProtocol(processModel, gatewayId)); // TODO support for CLOUD (AWS)
-
         String scratchLocation = OrchestratorUtils.getScratchLocation(processModel, gatewayId);
         String workingDir = scratchLocation + File.separator + processModel.getProcessId();
-        envSetupSubModel.setLocation(workingDir);
 
-        byte[] envSetupSub = ThriftUtils.serializeThriftObject(envSetupSubModel);
-        envSetupTask.setSubTaskModel(envSetupSub);
-        envSetupTask.setMaxRetry(3);
-        envSetupTask.setCurrentRetry(0);
+        EnvironmentSetupTaskModel envSetupSubModel = EnvironmentSetupTaskModel.newBuilder()
+                .setProtocol(OrchestratorUtils.getSecurityProtocol(processModel, gatewayId)) // TODO support for CLOUD (AWS)
+                .setLocation(workingDir)
+                .build();
+
+        TaskModel envSetupTask = TaskModel.newBuilder()
+                .setTaskType(TaskTypes.ENV_SETUP)
+                .addTaskStatuses(TaskStatus.newBuilder().setState(TaskState.CREATED).build())
+                .setCreationTime(AiravataUtils.getCurrentTimestamp().getTime())
+                .setLastUpdateTime(AiravataUtils.getCurrentTimestamp().getTime())
+                .setParentProcessId(processModel.getProcessId())
+                .setSubTaskModel(com.google.protobuf.ByteString.copyFrom(envSetupSubModel.toByteArray()))
+                .setMaxRetry(3)
+                .setCurrentRetry(0)
+                .build();
         String envSetupTaskId = registryClient.addTask(envSetupTask, processModel.getProcessId());
-        envSetupTask.setTaskId(envSetupTaskId);
+        envSetupTask = envSetupTask.toBuilder().setTaskId(envSetupTaskId).build();
         envTaskIds.add(envSetupTaskId);
 
         return envTaskIds;
@@ -393,10 +397,10 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             ProcessModel processModel, String gatewayId, ResourceType resourceType) throws AiravataException {
 
         List<String> dataStagingTaskIds = new ArrayList<>();
-        List<InputDataObjectType> processInputs = processModel.getProcessInputs();
+        List<InputDataObjectType> processInputs = processModel.getProcessInputsList();
 
         sortByInputOrder(processInputs);
-        if (processInputs != null) {
+        if (!processInputs.isEmpty()) {
             for (InputDataObjectType processInput : processInputs) {
                 DataType type = processInput.getType();
                 switch (type) {
@@ -406,9 +410,8 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                         break;
                     case URI:
                     case URI_COLLECTION:
-                        if ((processInput.getValue() == null
-                                        || processInput.getValue().isEmpty())
-                                && !processInput.isIsRequired()) {
+                        if (processInput.getValue().isEmpty()
+                                && !processInput.getIsRequired()) {
                             logger.debug(
                                     "Skipping input data staging task for {} since value is empty and not required",
                                     processInput.getName());
@@ -419,7 +422,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                             TaskModel inputDataStagingTask = getInputDataStagingTask(
                                     registryClient, processModel, processInput, gatewayId, resourceType);
                             String taskId = registryClient.addTask(inputDataStagingTask, processModel.getProcessId());
-                            inputDataStagingTask.setTaskId(taskId);
+                            inputDataStagingTask = inputDataStagingTask.toBuilder().setTaskId(taskId).build();
                             dataStagingTaskIds.add(inputDataStagingTask.getTaskId());
                         } catch (Exception e) {
                             throw new AiravataException("Error while serializing data staging sub task model", e);
@@ -436,20 +439,19 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
 
     public List<String> createAndSaveOutputDataStagingTasks(
             ProcessModel processModel, String gatewayId, ResourceType resourceType)
-            throws AiravataException, TException, OrchestratorException {
+            throws AiravataException, Exception, OrchestratorException {
 
         final RegistryService.Iface registryClient = getRegistryHandler();
         List<String> dataStagingTaskIds = new ArrayList<>();
-        List<OutputDataObjectType> processOutputs = processModel.getProcessOutputs();
+        List<OutputDataObjectType> processOutputs = processModel.getProcessOutputsList();
         String appName = OrchestratorUtils.getApplicationInterfaceName(processModel);
-        if (processOutputs != null) {
+        if (!processOutputs.isEmpty()) {
             for (OutputDataObjectType processOutput : processOutputs) {
                 DataType type = processOutput.getType();
                 switch (type) {
                     case STDOUT:
-                        if (null == processOutput.getValue()
-                                || processOutput.getValue().trim().isEmpty()) {
-                            processOutput.setValue(appName + ".stdout");
+                        if (processOutput.getValue().trim().isEmpty()) {
+                            processOutput = processOutput.toBuilder().setValue(appName + ".stdout").build();
                         }
                         createOutputDataSatagingTasks(
                                 registryClient,
@@ -460,9 +462,8 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                                 resourceType);
                         break;
                     case STDERR:
-                        if (null == processOutput.getValue()
-                                || processOutput.getValue().trim().isEmpty()) {
-                            processOutput.setValue(appName + ".stderr");
+                        if (processOutput.getValue().trim().isEmpty()) {
+                            processOutput = processOutput.toBuilder().setValue(appName + ".stderr").build();
                         }
                         createOutputDataSatagingTasks(
                                 registryClient,
@@ -502,20 +503,19 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
 
     public List<String> createAndSaveIntermediateOutputDataStagingTasks(
             ProcessModel processModel, String gatewayId, ProcessModel parentProcess, ResourceType resourceType)
-            throws AiravataException, TException, OrchestratorException {
+            throws AiravataException, Exception, OrchestratorException {
 
         final RegistryService.Iface registryClient = getRegistryHandler();
         List<String> dataStagingTaskIds = new ArrayList<>();
-        List<OutputDataObjectType> processOutputs = processModel.getProcessOutputs();
+        List<OutputDataObjectType> processOutputs = processModel.getProcessOutputsList();
         String appName = OrchestratorUtils.getApplicationInterfaceName(processModel);
-        if (processOutputs != null) {
+        if (!processOutputs.isEmpty()) {
             for (OutputDataObjectType processOutput : processOutputs) {
                 DataType type = processOutput.getType();
                 switch (type) {
                     case STDOUT:
-                        if (null == processOutput.getValue()
-                                || processOutput.getValue().trim().isEmpty()) {
-                            processOutput.setValue(appName + ".stdout");
+                        if (processOutput.getValue().trim().isEmpty()) {
+                            processOutput = processOutput.toBuilder().setValue(appName + ".stdout").build();
                         }
                         createIntermediateOutputDataStagingTasks(
                                 registryClient,
@@ -527,9 +527,8 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                                 resourceType);
                         break;
                     case STDERR:
-                        if (null == processOutput.getValue()
-                                || processOutput.getValue().trim().isEmpty()) {
-                            processOutput.setValue(appName + ".stderr");
+                        if (processOutput.getValue().trim().isEmpty()) {
+                            processOutput = processOutput.toBuilder().setValue(appName + ".stderr").build();
                         }
                         createIntermediateOutputDataStagingTasks(
                                 registryClient,
@@ -560,10 +559,10 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
         return dataStagingTaskIds;
     }
 
-    private boolean isArchive(RegistryService.Iface registryClient, ProcessModel processModel) throws TException {
+    private boolean isArchive(RegistryService.Iface registryClient, ProcessModel processModel) throws Exception {
         ApplicationInterfaceDescription appInterface =
                 registryClient.getApplicationInterface(processModel.getApplicationInterfaceId());
-        return appInterface.isArchiveWorkingDirectory();
+        return appInterface.getArchiveWorkingDirectory();
     }
 
     private void createArchiveDataStatgingTask(
@@ -572,15 +571,15 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             String gatewayId,
             List<String> dataStagingTaskIds,
             ResourceType resourceType)
-            throws AiravataException, TException, OrchestratorException {
+            throws AiravataException, Exception, OrchestratorException {
         TaskModel archiveTask;
         try {
             archiveTask = getOutputDataStagingTask(registryClient, processModel, null, gatewayId, null, resourceType);
-        } catch (TException e) {
+        } catch (Exception e) {
             throw new AiravataException("Error! DataStaging sub task serialization failed", e);
         }
         String taskId = registryClient.addTask(archiveTask, processModel.getProcessId());
-        archiveTask.setTaskId(taskId);
+        archiveTask = archiveTask.toBuilder().setTaskId(taskId).build();
         dataStagingTaskIds.add(archiveTask.getTaskId());
     }
 
@@ -596,9 +595,9 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             TaskModel outputDataStagingTask = getOutputDataStagingTask(
                     registryClient, processModel, processOutput, gatewayId, null, resourceType);
             String taskId = registryClient.addTask(outputDataStagingTask, processModel.getProcessId());
-            outputDataStagingTask.setTaskId(taskId);
+            outputDataStagingTask = outputDataStagingTask.toBuilder().setTaskId(taskId).build();
             dataStagingTaskIds.add(outputDataStagingTask.getTaskId());
-        } catch (TException e) {
+        } catch (Exception e) {
             throw new AiravataException("Error while serializing data staging sub task model", e);
         }
     }
@@ -615,11 +614,11 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
         try {
             TaskModel outputDataStagingTask = getOutputDataStagingTask(
                     registryClient, processModel, processOutput, gatewayId, parentProcess, resourceType);
-            outputDataStagingTask.setTaskType(TaskTypes.OUTPUT_FETCHING);
+            outputDataStagingTask = outputDataStagingTask.toBuilder().setTaskType(TaskTypes.OUTPUT_FETCHING).build();
             String taskId = registryClient.addTask(outputDataStagingTask, processModel.getProcessId());
-            outputDataStagingTask.setTaskId(taskId);
+            outputDataStagingTask = outputDataStagingTask.toBuilder().setTaskId(taskId).build();
             dataStagingTaskIds.add(outputDataStagingTask.getTaskId());
-        } catch (TException e) {
+        } catch (Exception e) {
             throw new AiravataException("Error while serializing data staging sub task model", e);
         }
     }
@@ -629,7 +628,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             JobSubmissionInterface jobSubmissionInterface,
             ProcessModel processModel,
             int wallTime)
-            throws TException, OrchestratorException {
+            throws Exception, OrchestratorException {
 
         JobSubmissionProtocol jobSubmissionProtocol = jobSubmissionInterface.getJobSubmissionProtocol();
         MonitorMode monitorMode;
@@ -655,50 +654,57 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
         }
 
         List<String> submissionTaskIds = new ArrayList<>();
-        TaskStatus taskStatus = new TaskStatus(TaskState.CREATED);
-        taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-
-        JobSubmissionTaskModel submissionSubTask = new JobSubmissionTaskModel();
-        submissionSubTask.setMonitorMode(monitorMode);
-        submissionSubTask.setJobSubmissionProtocol(jobSubmissionProtocol);
-        submissionSubTask.setWallTime(wallTime);
-
-        byte[] bytes = ThriftUtils.serializeThriftObject(submissionSubTask);
-
-        TaskModel taskModel = new TaskModel();
-        taskModel.setParentProcessId(processModel.getProcessId());
-        taskModel.setCreationTime(System.currentTimeMillis());
-        taskModel.setLastUpdateTime(taskModel.getCreationTime());
-        taskModel.setTaskStatuses(List.of(taskStatus));
-        taskModel.setTaskType(TaskTypes.JOB_SUBMISSION);
-        taskModel.setSubTaskModel(bytes);
-        taskModel.setMaxRetry(1);
-        taskModel.setCurrentRetry(0);
+        TaskStatus taskStatus = TaskStatus.newBuilder()
+                .setState(TaskState.CREATED)
+                .setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime())
+                .build();
+
+        JobSubmissionTaskModel submissionSubTask = JobSubmissionTaskModel.newBuilder()
+                .setMonitorMode(monitorMode)
+                .setJobSubmissionProtocol(jobSubmissionProtocol)
+                .setWallTime(wallTime)
+                .build();
+
+        long creationTime = System.currentTimeMillis();
+        TaskModel taskModel = TaskModel.newBuilder()
+                .setParentProcessId(processModel.getProcessId())
+                .setCreationTime(creationTime)
+                .setLastUpdateTime(creationTime)
+                .addTaskStatuses(taskStatus)
+                .setTaskType(TaskTypes.JOB_SUBMISSION)
+                .setSubTaskModel(com.google.protobuf.ByteString.copyFrom(submissionSubTask.toByteArray()))
+                .setMaxRetry(1)
+                .setCurrentRetry(0)
+                .build();
 
         String taskId = registryClient.addTask(taskModel, processModel.getProcessId());
-        taskModel.setTaskId(taskId);
+        taskModel = taskModel.toBuilder().setTaskId(taskId).build();
         submissionTaskIds.add(taskModel.getTaskId());
 
         // create monitor task for this Email based monitor mode job
         if (monitorMode == MonitorMode.JOB_EMAIL_NOTIFICATION_MONITOR || monitorMode == MonitorMode.CLOUD_JOB_MONITOR) {
 
-            TaskStatus monitorTaskStatus = new TaskStatus(TaskState.CREATED);
-            monitorTaskStatus.setTimeOfStateChange(
-                    AiravataUtils.getCurrentTimestamp().getTime());
-
-            TaskModel monitorTaskModel = new TaskModel();
-            monitorTaskModel.setParentProcessId(processModel.getProcessId());
-            monitorTaskModel.setCreationTime(System.currentTimeMillis());
-            monitorTaskModel.setLastUpdateTime(monitorTaskModel.getCreationTime());
-            monitorTaskModel.setTaskStatuses(List.of(monitorTaskStatus));
-            monitorTaskModel.setTaskType(TaskTypes.MONITORING);
-
-            MonitorTaskModel monitorSubTaskModel = new MonitorTaskModel();
-            monitorSubTaskModel.setMonitorMode(monitorMode);
-            monitorTaskModel.setSubTaskModel(ThriftUtils.serializeThriftObject(monitorSubTaskModel));
+            TaskStatus monitorTaskStatus = TaskStatus.newBuilder()
+                    .setState(TaskState.CREATED)
+                    .setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime())
+                    .build();
+
+            MonitorTaskModel monitorSubTaskModel = MonitorTaskModel.newBuilder()
+                    .setMonitorMode(monitorMode)
+                    .build();
+
+            long monitorCreationTime = System.currentTimeMillis();
+            TaskModel monitorTaskModel = TaskModel.newBuilder()
+                    .setParentProcessId(processModel.getProcessId())
+                    .setCreationTime(monitorCreationTime)
+                    .setLastUpdateTime(monitorCreationTime)
+                    .addTaskStatuses(monitorTaskStatus)
+                    .setTaskType(TaskTypes.MONITORING)
+                    .setSubTaskModel(com.google.protobuf.ByteString.copyFrom(monitorSubTaskModel.toByteArray()))
+                    .build();
 
             String mTaskId = registryClient.addTask(monitorTaskModel, processModel.getProcessId());
-            monitorTaskModel.setTaskId(mTaskId);
+            monitorTaskModel = monitorTaskModel.toBuilder().setTaskId(mTaskId).build();
             submissionTaskIds.add(monitorTaskModel.getTaskId());
         }
 
@@ -720,18 +726,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             InputDataObjectType processInput,
             String gatewayId,
             ResourceType resourceType)
-            throws TException, AiravataException, OrchestratorException {
-        // create new task model for this task
-        TaskModel taskModel = new TaskModel();
-        taskModel.setParentProcessId(processModel.getProcessId());
-        taskModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-        taskModel.setLastUpdateTime(taskModel.getCreationTime());
-        TaskStatus taskStatus = new TaskStatus(TaskState.CREATED);
-        taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-        taskModel.setTaskStatuses(Arrays.asList(taskStatus));
-        taskModel.setTaskType(TaskTypes.DATA_STAGING);
-        // create data staging sub task model
-        DataStagingTaskModel submodel = new DataStagingTaskModel();
+            throws Exception, AiravataException, OrchestratorException {
         ComputeResourceDescription computeResource =
                 registryClient.getComputeResource(processModel.getComputeResourceId());
 
@@ -747,8 +742,10 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                     OrchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId);
             String loginUserName = OrchestratorUtils.getLoginUserName(processModel, gatewayId);
             StringBuilder destinationPath = new StringBuilder(workingDir);
-            Optional.ofNullable(processInput.getOverrideFilename())
-                    .ifPresent(destinationPath::append); // If an override filename is provided
+            String overrideFilename = processInput.getOverrideFilename();
+            if (!overrideFilename.isEmpty()) {
+                destinationPath.append(overrideFilename);
+            }
 
             destination = new URI(
                     dataMovementProtocol.name(),
@@ -764,14 +761,31 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             throw new OrchestratorException("Error while constructing destination file URI", e);
         }
 
-        submodel.setDestination(destination.toString());
-        submodel.setType(DataStageType.INPUT);
-        submodel.setSource(processInput.getValue());
-        submodel.setProcessInput(processInput);
-        taskModel.setSubTaskModel(ThriftUtils.serializeThriftObject(submodel));
-        taskModel.setMaxRetry(3);
-        taskModel.setCurrentRetry(0);
-        return taskModel;
+        // create data staging sub task model
+        DataStagingTaskModel submodel = DataStagingTaskModel.newBuilder()
+                .setDestination(destination.toString())
+                .setType(DataStageType.INPUT)
+                .setSource(processInput.getValue())
+                .setProcessInput(processInput)
+                .build();
+
+        long now = AiravataUtils.getCurrentTimestamp().getTime();
+        TaskStatus taskStatus = TaskStatus.newBuilder()
+                .setState(TaskState.CREATED)
+                .setTimeOfStateChange(now)
+                .build();
+
+        // create new task model for this task
+        return TaskModel.newBuilder()
+                .setParentProcessId(processModel.getProcessId())
+                .setCreationTime(now)
+                .setLastUpdateTime(now)
+                .addTaskStatuses(taskStatus)
+                .setTaskType(TaskTypes.DATA_STAGING)
+                .setSubTaskModel(com.google.protobuf.ByteString.copyFrom(submodel.toByteArray()))
+                .setMaxRetry(3)
+                .setCurrentRetry(0)
+                .build();
     }
 
     private TaskModel getOutputDataStagingTask(
@@ -781,22 +795,10 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             String gatewayId,
             ProcessModel parentProcess,
             ResourceType resourceType)
-            throws TException, AiravataException, OrchestratorException {
+            throws Exception, AiravataException, OrchestratorException {
         try {
-            // create new task model for this task
-            TaskStatus taskStatus = new TaskStatus(TaskState.CREATED);
-            taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
-
-            TaskModel taskModel = new TaskModel();
-            taskModel.setParentProcessId(processModel.getProcessId());
-            taskModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-            taskModel.setLastUpdateTime(taskModel.getCreationTime());
-            taskModel.setTaskStatuses(List.of(taskStatus));
-            taskModel.setTaskType(TaskTypes.DATA_STAGING);
-
             ComputeResourceDescription computeResource =
                     registryClient.getComputeResource(processModel.getComputeResourceId());
-            DataStagingTaskModel submodel = new DataStagingTaskModel();
 
             String workingDir = OrchestratorUtils.getScratchLocation(processModel, gatewayId)
                     + File.separator
@@ -804,12 +806,14 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                     + File.separator;
             DataMovementProtocol dataMovementProtocol =
                     OrchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId);
+
+            DataStagingTaskModel.Builder submodelBuilder = DataStagingTaskModel.newBuilder();
             URI source;
             try {
                 String loginUserName = OrchestratorUtils.getLoginUserName(processModel, gatewayId);
                 if (processOutput != null) {
-                    submodel.setType(DataStageType.OUPUT);
-                    submodel.setProcessOutput(processOutput);
+                    submodelBuilder.setType(DataStageType.OUPUT)
+                            .setProcessOutput(processOutput);
                     source = new URI(
                             dataMovementProtocol.name(),
                             loginUserName,
@@ -820,7 +824,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                             null);
                 } else {
                     // archive
-                    submodel.setType(DataStageType.ARCHIVE_OUTPUT);
+                    submodelBuilder.setType(DataStageType.ARCHIVE_OUTPUT);
                     source = new URI(
                             dataMovementProtocol.name(),
                             loginUserName,
@@ -835,14 +839,30 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                 throw new OrchestratorException("Error while constructing source file URI", e);
             }
 
-            submodel.setSource(source.toString());
-            // We don't know destination location at this time, data staging task will set this.
-            // because destination is required field we set dummy destination
-            submodel.setDestination("dummy://temp/file/location");
-            taskModel.setSubTaskModel(ThriftUtils.serializeThriftObject(submodel));
-            taskModel.setMaxRetry(3);
-            taskModel.setCurrentRetry(0);
-            return taskModel;
+            DataStagingTaskModel submodel = submodelBuilder
+                    .setSource(source.toString())
+                    // We don't know destination location at this time, data staging task will set this.
+                    // because destination is required field we set dummy destination
+                    .setDestination("dummy://temp/file/location")
+                    .build();
+
+            long now = AiravataUtils.getCurrentTimestamp().getTime();
+            TaskStatus taskStatus = TaskStatus.newBuilder()
+                    .setState(TaskState.CREATED)
+                    .setTimeOfStateChange(now)
+                    .build();
+
+            // create new task model for this task
+            return TaskModel.newBuilder()
+                    .setParentProcessId(processModel.getProcessId())
+                    .setCreationTime(now)
+                    .setLastUpdateTime(now)
+                    .addTaskStatuses(taskStatus)
+                    .setTaskType(TaskTypes.DATA_STAGING)
+                    .setSubTaskModel(com.google.protobuf.ByteString.copyFrom(submodel.toByteArray()))
+                    .setMaxRetry(3)
+                    .setCurrentRetry(0)
+                    .build();
 
         } catch (OrchestratorException e) {
             throw new OrchestratorException("Error occurred while retrieving data movement from app catalog", e);
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/TaskContext.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/TaskContext.java
index d52a9e975b..2eb30437fb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/TaskContext.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/TaskContext.java
@@ -33,43 +33,43 @@ import org.apache.airavata.common.util.AiravataUtils;
 import org.apache.airavata.common.util.ThriftUtils;
 import org.apache.airavata.compute.util.GroupComputeResourcePreferenceUtil;
 import org.apache.airavata.messaging.service.Publisher;
-import org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.BatchQueue;
-import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
-import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
-import org.apache.airavata.model.appcatalog.computeresource.LOCALSubmission;
-import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManager;
-import org.apache.airavata.model.appcatalog.computeresource.SSHJobSubmission;
-import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
-import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourceReservation;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.EnvironmentSpecificPreferences;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType;
-import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserResourceProfile;
-import org.apache.airavata.model.appcatalog.userresourceprofile.UserStoragePreference;
-import org.apache.airavata.model.application.io.DataType;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.data.movement.DataMovementInterface;
-import org.apache.airavata.model.data.movement.DataMovementProtocol;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.job.JobModel;
-import org.apache.airavata.model.process.ProcessModel;
-import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
-import org.apache.airavata.model.status.ProcessState;
-import org.apache.airavata.model.status.ProcessStatus;
-import org.apache.airavata.model.status.TaskState;
-import org.apache.airavata.model.status.TaskStatus;
-import org.apache.airavata.model.task.TaskModel;
-import org.apache.airavata.model.user.UserProfile;
+import org.apache.airavata.model.appcatalog.appdeployment.proto.ApplicationDeploymentDescription;
+import org.apache.airavata.model.appcatalog.appinterface.proto.ApplicationInterfaceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.BatchQueue;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionInterface;
+import org.apache.airavata.model.appcatalog.computeresource.proto.JobSubmissionProtocol;
+import org.apache.airavata.model.appcatalog.computeresource.proto.LOCALSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.proto.ResourceJobManager;
+import org.apache.airavata.model.appcatalog.computeresource.proto.SSHJobSubmission;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.GatewayResourceProfile;
+import org.apache.airavata.model.appcatalog.gatewayprofile.proto.StoragePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ComputeResourceReservation;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.EnvironmentSpecificPreferences;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.GroupResourceProfile;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ResourceType;
+import org.apache.airavata.model.appcatalog.storageresource.proto.StorageResourceDescription;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserResourceProfile;
+import org.apache.airavata.model.appcatalog.userresourceprofile.proto.UserStoragePreference;
+import org.apache.airavata.model.application.io.proto.DataType;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.data.movement.proto.DataMovementInterface;
+import org.apache.airavata.model.data.movement.proto.DataMovementProtocol;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.job.proto.JobModel;
+import org.apache.airavata.model.process.proto.ProcessModel;
+import org.apache.airavata.model.scheduling.proto.ComputationalResourceSchedulingModel;
+import org.apache.airavata.model.status.proto.ProcessState;
+import org.apache.airavata.model.status.proto.ProcessStatus;
+import org.apache.airavata.model.status.proto.TaskState;
+import org.apache.airavata.model.status.proto.TaskStatus;
+import org.apache.airavata.model.task.proto.TaskModel;
+import org.apache.airavata.model.user.proto.UserProfile;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.airavata.security.profile.user.core.repositories.UserProfileRepository;
-import org.apache.thrift.TException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -221,7 +221,7 @@ public class TaskContext {
         if (this.groupResourceProfile == null) {
             try {
                 gatewayResourceProfile = registryClient.getGatewayResourceProfile(gatewayId);
-            } catch (TException e) {
+            } catch (Exception e) {
                 logger.error("Failed to fetch gateway resource profile for gateway {}", gatewayId);
                 throw e;
             }
@@ -237,7 +237,7 @@ public class TaskContext {
         if (groupResourceProfile == null) {
             try {
                 groupResourceProfile = registryClient.getGroupResourceProfile(processModel.getGroupResourceProfileId());
-            } catch (TException e) {
+            } catch (Exception e) {
                 logger.error(
                         "Failed to find a group resource proifle with id {}", processModel.getGroupResourceProfileId());
                 throw e;
@@ -256,7 +256,7 @@ public class TaskContext {
             try {
                 groupComputeResourcePreference = registryClient.getGroupComputeResourcePreference(
                         processModel.getComputeResourceId(), processModel.getGroupResourceProfileId());
-            } catch (TException e) {
+            } catch (Exception e) {
                 logger.error(
                         "Failed to find group compute resource preference for compute  {}, and group resource profile {}",
                         processModel.getComputeResourceId(),
@@ -281,10 +281,10 @@ public class TaskContext {
 
     public UserResourceProfile getUserResourceProfile() throws Exception {
 
-        if (userResourceProfile == null && processModel.isUseUserCRPref()) {
+        if (userResourceProfile == null && processModel.getUseUserCRPref()) {
             try {
                 this.userResourceProfile = registryClient.getUserResourceProfile(processModel.getUserName(), gatewayId);
-            } catch (TException e) {
+            } catch (Exception e) {
                 logger.error(
                         "Failed to fetch user resource profile for user {} in gateway {}",
                         processModel.getUserName(),
@@ -301,11 +301,11 @@ public class TaskContext {
     }
 
     private UserComputeResourcePreference getUserComputeResourcePreference() throws Exception {
-        if (this.userComputeResourcePreference == null && processModel.isUseUserCRPref()) {
+        if (this.userComputeResourcePreference == null && processModel.getUseUserCRPref()) {
             try {
                 this.userComputeResourcePreference = registryClient.getUserComputeResourcePreference(
                         processModel.getUserName(), gatewayId, processModel.getComputeResourceId());
-            } catch (TException e) {
+            } catch (Exception e) {
                 logger.error(
                         "Failed to fetch user compute resource preference for user {} compute resource {} in gateway {}",
                         processModel.getUserName(),
@@ -339,7 +339,7 @@ public class TaskContext {
         if (this.gatewayStorageResourcePreference == null) {
             try {
                 GatewayResourceProfile gatewayProfile = getGatewayResourceProfile();
-                List<StoragePreference> storagePreferences = gatewayProfile.getStoragePreferences();
+                List<StoragePreference> storagePreferences = gatewayProfile.getStoragePreferencesList();
 
                 if (storagePreferences == null || storagePreferences.isEmpty()) {
                     throw new Exception("No storage preferences found for gateway " + gatewayId);
@@ -364,7 +364,7 @@ public class TaskContext {
                             "Using gateway-specific storage preference: {}",
                             this.gatewayStorageResourcePreference.getStorageResourceId());
                 }
-            } catch (TException e) {
+            } catch (Exception e) {
                 logger.error("Failed to fetch gateway storage preference for gateway {}", gatewayId, e);
                 throw e;
             }
@@ -392,7 +392,7 @@ public class TaskContext {
             try {
                 this.applicationDeploymentDescription =
                         registryClient.getApplicationDeployment(processModel.getApplicationDeploymentId());
-            } catch (TException e) {
+            } catch (Exception e) {
                 logger.error(
                         "Failed to fetch application deployment with id {}",
                         processModel.getApplicationDeploymentId(),
@@ -412,7 +412,7 @@ public class TaskContext {
             try {
                 this.applicationInterfaceDescription =
                         registryClient.getApplicationInterface(processModel.getApplicationInterfaceId());
-            } catch (TException e) {
+            } catch (Exception e) {
                 logger.error(
                         "Failed to fetch application interface with id {}",
                         processModel.getApplicationInterfaceId(),
@@ -511,7 +511,7 @@ public class TaskContext {
         if (jobSubmissionProtocol == null) {
             // Take highest priority one
             List<JobSubmissionInterface> jobSubmissionInterfaces =
-                    getComputeResourceDescription().getJobSubmissionInterfaces();
+                    getComputeResourceDescription().getJobSubmissionInterfacesList();
             Collections.sort(
                     jobSubmissionInterfaces, Comparator.comparingInt(JobSubmissionInterface::getPriorityOrder));
             jobSubmissionProtocol = jobSubmissionInterfaces.get(0).getJobSubmissionProtocol();
@@ -527,7 +527,7 @@ public class TaskContext {
         if (dataMovementProtocol == null) {
             // Take highest priority one
             List<DataMovementInterface> dataMovementInterfaces =
-                    getComputeResourceDescription().getDataMovementInterfaces();
+                    getComputeResourceDescription().getDataMovementInterfacesList();
             Collections.sort(dataMovementInterfaces, Comparator.comparingInt(DataMovementInterface::getPriorityOrder));
             dataMovementProtocol = dataMovementInterfaces.get(0).getDataMovementProtocol();
         }
@@ -546,7 +546,7 @@ public class TaskContext {
         if (taskList == null) {
             synchronized (TaskModel.class) {
                 if (taskList == null) {
-                    taskList = getProcessModel().getTasks();
+                    taskList = getProcessModel().getTasksList();
                 }
             }
         }
@@ -577,10 +577,11 @@ public class TaskContext {
 
     public JobModel getJobModel() throws Exception {
         if (jobModel == null) {
-            jobModel = new JobModel();
-            jobModel.setProcessId(processId);
-            jobModel.setWorkingDir(getWorkingDir());
-            jobModel.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
+            jobModel = JobModel.newBuilder()
+                    .setProcessId(processId)
+                    .setWorkingDir(getWorkingDir())
+                    .setCreationTime(AiravataUtils.getCurrentTimestamp().getTime())
+                    .build();
         }
         return jobModel;
     }
@@ -590,9 +591,9 @@ public class TaskContext {
     }
 
     public ProcessState getProcessState() {
-        if (processModel.getProcessStatuses() != null
-                && processModel.getProcessStatuses().size() > 0)
-            return processModel.getProcessStatuses().get(0).getState();
+        if (processModel.getProcessStatusesList() != null
+                && processModel.getProcessStatusesList().size() > 0)
+            return processModel.getProcessStatusesList().get(0).getState();
         else return null;
     }
 
@@ -604,29 +605,30 @@ public class TaskContext {
                     processId,
                     getProcessState().name(),
                     status.getState().name());
-            List<ProcessStatus> processStatuses = new ArrayList<>();
-            processStatuses.add(status);
-            processModel.setProcessStatuses(processStatuses);
+            processModel = processModel.toBuilder()
+                    .clearProcessStatuses()
+                    .addProcessStatuses(status)
+                    .build();
         }
     }
 
     public ProcessStatus getProcessStatus() {
-        if (processModel.getProcessStatuses() != null)
-            return processModel.getProcessStatuses().get(0);
+        if (processModel.getProcessStatusesCount() > 0)
+            return processModel.getProcessStatusesList().get(0);
         else return null;
     }
 
     public TaskState getTaskState() {
-        if (getCurrentTaskModel() != null && getCurrentTaskModel().getTaskStatuses() != null) {
-            return getCurrentTaskModel().getTaskStatuses().get(0).getState();
+        if (getCurrentTaskModel() != null && getCurrentTaskModel().getTaskStatusesList() != null) {
+            return getCurrentTaskModel().getTaskStatusesList().get(0).getState();
         } else {
             return null;
         }
     }
 
     public TaskStatus getTaskStatus() {
-        if (getCurrentTaskModel().getTaskStatuses() != null)
-            return getCurrentTaskModel().getTaskStatuses().get(0);
+        if (getCurrentTaskModel().getTaskStatusesList() != null)
+            return getCurrentTaskModel().getTaskStatusesList().get(0);
         else return null;
     }
 
@@ -733,7 +735,7 @@ public class TaskContext {
     }
 
     public boolean isUseUserCRPref() {
-        return getProcessModel().isUseUserCRPref();
+        return getProcessModel().getUseUserCRPref();
     }
 
     public boolean isSetGroupResourceProfile() {
@@ -779,7 +781,7 @@ public class TaskContext {
         String inputStorageId = getInputStorageResourceId();
         try {
             return registryClient.getGatewayStoragePreference(gatewayId, inputStorageId);
-        } catch (TException e) {
+        } catch (Exception e) {
             logger.error(
                     "Failed to fetch gateway storage preference for input storage {} in gateway {}",
                     inputStorageId,
@@ -801,7 +803,7 @@ public class TaskContext {
         String outputStorageId = getOutputStorageResourceId();
         try {
             return registryClient.getGatewayStoragePreference(gatewayId, outputStorageId);
-        } catch (TException e) {
+        } catch (Exception e) {
             logger.error(
                     "Failed to fetch gateway storage preference for output storage {} in gateway {}",
                     outputStorageId,
@@ -922,7 +924,7 @@ public class TaskContext {
         } else if (isValid(processModel.getProcessResourceSchedule().getQueueName())) {
             return processModel.getProcessResourceSchedule().getQueueName();
         } else {
-            Optional<BatchQueue> defaultQueue = getComputeResourceDescription().getBatchQueues().stream()
+            Optional<BatchQueue> defaultQueue = getComputeResourceDescription().getBatchQueuesList().stream()
                     .filter(q -> q.isIsDefaultQueue())
                     .findFirst();
             if (defaultQueue.isPresent()) {
@@ -936,7 +938,7 @@ public class TaskContext {
 
     public List<String> getQueueSpecificMacros() throws Exception {
         String queueName = getProcessCRSchedule().getQueueName();
-        Optional<BatchQueue> queue = getComputeResourceDescription().getBatchQueues().stream()
+        Optional<BatchQueue> queue = getComputeResourceDescription().getBatchQueuesList().stream()
                 .filter(x -> x.getQueueName().equals(queueName))
                 .findFirst();
         if (queue.isPresent()) {
@@ -951,7 +953,7 @@ public class TaskContext {
     public JobSubmissionInterface getPreferredJobSubmissionInterface() throws Exception {
         JobSubmissionProtocol preferredJobSubmissionProtocol = getJobSubmissionProtocol();
         ComputeResourceDescription resourceDescription = getComputeResourceDescription();
-        List<JobSubmissionInterface> jobSubmissionInterfaces = resourceDescription.getJobSubmissionInterfaces();
+        List<JobSubmissionInterface> jobSubmissionInterfaces = resourceDescription.getJobSubmissionInterfacesList();
         Map<JobSubmissionProtocol, List<JobSubmissionInterface>> orderedInterfaces = new HashMap<>();
         List<JobSubmissionInterface> interfaces = new ArrayList<>();
         if (jobSubmissionInterfaces != null && !jobSubmissionInterfaces.isEmpty()) {
@@ -990,7 +992,7 @@ public class TaskContext {
         return getTaskMap().get(taskId);
     }
 
-    public Object getSubTaskModel() throws TException {
+    public Object getSubTaskModel() throws Exception {
         if (subTaskModel == null) {
             subTaskModel = ThriftUtils.getSubTaskModel(getCurrentTaskModel());
         }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/TaskFactory.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/TaskFactory.java
index 30e212e8f3..5f32aed20b 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/TaskFactory.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/TaskFactory.java
@@ -21,7 +21,7 @@ package org.apache.airavata.execution.orchestrator;
 
 import java.util.EnumMap;
 import java.util.Map;
-import org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType;
+import org.apache.airavata.model.appcatalog.groupresourceprofile.proto.ResourceType;
 
 public class TaskFactory {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/WorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/WorkflowManager.java
index 76488a228b..26f89b90d6 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/WorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/orchestrator/WorkflowManager.java
@@ -30,12 +30,12 @@ import org.apache.airavata.messaging.service.MessageContext;
 import org.apache.airavata.messaging.service.MessagingFactory;
 import org.apache.airavata.messaging.service.Publisher;
 import org.apache.airavata.messaging.service.Type;
-import org.apache.airavata.model.messaging.event.MessageType;
-import org.apache.airavata.model.messaging.event.ProcessIdentifier;
-import org.apache.airavata.model.messaging.event.ProcessStatusChangeEvent;
-import org.apache.airavata.model.process.ProcessWorkflow;
-import org.apache.airavata.model.status.ProcessState;
-import org.apache.airavata.model.status.ProcessStatus;
+import org.apache.airavata.model.messaging.event.proto.MessageType;
+import org.apache.airavata.model.messaging.event.proto.ProcessIdentifier;
+import org.apache.airavata.model.messaging.event.proto.ProcessStatusChangeEvent;
+import org.apache.airavata.model.process.proto.ProcessWorkflow;
+import org.apache.airavata.model.status.proto.ProcessState;
+import org.apache.airavata.model.status.proto.ProcessStatus;
 import org.apache.airavata.registry.api.RegistryService;
 import org.apache.helix.manager.zk.ZKHelixAdmin;
 import org.apache.helix.zookeeper.api.client.RealmAwareZkClient.RealmMode;
@@ -121,9 +121,10 @@ public class WorkflowManager {
     public void publishProcessStatus(String processId, String experimentId, String gatewayId, ProcessState state)
             throws AiravataException {
 
-        ProcessStatus status = new ProcessStatus();
-        status.setState(state);
-        status.setTimeOfStateChange(Calendar.getInstance().getTimeInMillis());
+        ProcessStatus status = ProcessStatus.newBuilder()
+                .setState(state)
+                .setTimeOfStateChange(Calendar.getInstance().getTimeInMillis())
+                .build();
 
         try {
             registryHandler.updateProcessStatus(status, processId);
@@ -131,8 +132,10 @@ public class WorkflowManager {
             logger.error("Failed to update process status " + processId, e);
         }
 
-        ProcessIdentifier identifier = new ProcessIdentifier(processId, experimentId, gatewayId);
-        ProcessStatusChangeEvent processStatusChangeEvent = new ProcessStatusChangeEvent(status.getState(), identifier);
+        ProcessIdentifier identifier = ProcessIdentifier.newBuilder()
+                .setProcessId(processId).setExperimentId(experimentId).setGatewayId(gatewayId).build();
+        ProcessStatusChangeEvent processStatusChangeEvent = ProcessStatusChangeEvent.newBuilder()
+                .setState(status.getState()).setProcessIdentity(identifier).build();
         MessageContext msgCtx = new MessageContext(
                 processStatusChangeEvent,
                 MessageType.PROCESS,
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentErrorRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentErrorRepository.java
index 285e1da414..bf1d42f891 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentErrorRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentErrorRepository.java
@@ -26,8 +26,8 @@ import org.apache.airavata.execution.model.ExperimentErrorPK;
 import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
 import org.apache.airavata.execution.util.cpi.RegistryException;
-import org.apache.airavata.model.commons.ErrorModel;
-import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.commons.proto.ErrorModel;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -79,6 +79,6 @@ public class ExperimentErrorRepository
     public List<ErrorModel> getExperimentErrors(String experimentId) throws RegistryException {
         ExperimentRepository experimentRepository = new ExperimentRepository();
         ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
-        return experimentModel.getErrors();
+        return experimentModel.getErrorsList();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentInputRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentInputRepository.java
index d5d213030f..728e7a28ef 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentInputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentInputRepository.java
@@ -25,8 +25,8 @@ import org.apache.airavata.execution.model.ExperimentInputEntity;
 import org.apache.airavata.execution.model.ExperimentInputPK;
 import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.cpi.RegistryException;
-import org.apache.airavata.model.application.io.InputDataObjectType;
-import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.application.io.proto.InputDataObjectType;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,6 +77,6 @@ public class ExperimentInputRepository
     public List<InputDataObjectType> getExperimentInputs(String experimentId) throws RegistryException {
         ExperimentRepository experimentRepository = new ExperimentRepository();
         ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
-        return experimentModel.getExperimentInputs();
+        return experimentModel.getExperimentInputsList();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentOutputRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentOutputRepository.java
index 5c9f6b7568..315afe55ba 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentOutputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentOutputRepository.java
@@ -25,8 +25,8 @@ import org.apache.airavata.execution.model.ExperimentOutputEntity;
 import org.apache.airavata.execution.model.ExperimentOutputPK;
 import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.cpi.RegistryException;
-import org.apache.airavata.model.application.io.OutputDataObjectType;
-import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.application.io.proto.OutputDataObjectType;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,6 +77,6 @@ public class ExperimentOutputRepository
     public List<OutputDataObjectType> getExperimentOutputs(String experimentId) throws RegistryException {
         ExperimentRepository experimentRepository = new ExperimentRepository();
         ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
-        return experimentModel.getExperimentOutputs();
+        return experimentModel.getExperimentOutputsList();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentRepository.java
index c3468c4c7c..182e2e3f3c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentRepository.java
@@ -31,10 +31,10 @@ import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.execution.util.cpi.ResultOrderType;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.experiment.UserConfigurationDataModel;
-import org.apache.airavata.model.status.ExperimentState;
-import org.apache.airavata.model.status.ExperimentStatus;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.experiment.proto.UserConfigurationDataModel;
+import org.apache.airavata.model.status.proto.ExperimentState;
+import org.apache.airavata.model.status.proto.ExperimentStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,18 +63,18 @@ public class ExperimentRepository extends AbstractRepository<ExperimentModel, Ex
     protected ExperimentEntity saveExperiment(ExperimentModel experimentModel) throws RegistryException {
         String experimentId = experimentModel.getExperimentId();
 
-        if (experimentModel.getExperimentStatus() != null) {
+        if (experimentModel.getExperimentStatusList() != null) {
             logger.debug("Populating the status id of ExperimentStatus objects for the Experiment");
-            experimentModel.getExperimentStatus().forEach(experimentStatusEntity -> {
+            experimentModel.getExperimentStatusList().forEach(experimentStatusEntity -> {
                 if (experimentStatusEntity.getStatusId() == null) {
                     experimentStatusEntity.setStatusId(AiravataUtils.getId("EXPERIMENT_STATE"));
                 }
             });
         }
 
-        if (experimentModel.getProcesses() != null) {
+        if (experimentModel.getProcessesList() != null) {
             logger.debug("Populating the Process objects' Experiment ID for the Experiment");
-            experimentModel.getProcesses().forEach(processModel -> processModel.setExperimentId(experimentId));
+            experimentModel.getProcessesList().forEach(processModel -> processModel.setExperimentId(experimentId));
         }
 
         if (!isExperimentExist(experimentId)) {
@@ -97,31 +97,31 @@ public class ExperimentRepository extends AbstractRepository<ExperimentModel, Ex
             }
         }
 
-        if (experimentEntity.getExperimentInputs() != null) {
+        if (experimentEntity.getExperimentInputsList() != null) {
             logger.debug("Populating the Primary Key of ExperimentInput objects for the Experiment");
             experimentEntity
-                    .getExperimentInputs()
+                    .getExperimentInputsList()
                     .forEach(experimentInputEntity -> experimentInputEntity.setExperimentId(experimentId));
         }
 
-        if (experimentEntity.getExperimentOutputs() != null) {
+        if (experimentEntity.getExperimentOutputsList() != null) {
             logger.debug("Populating the Primary Key of ExperimentOutput objects for the Experiment");
             experimentEntity
-                    .getExperimentOutputs()
+                    .getExperimentOutputsList()
                     .forEach(experimentOutputEntity -> experimentOutputEntity.setExperimentId(experimentId));
         }
 
-        if (experimentEntity.getExperimentStatus() != null) {
+        if (experimentEntity.getExperimentStatusList() != null) {
             logger.debug("Populating the Primary Key of ExperimentStatus objects for the Experiment");
             experimentEntity
-                    .getExperimentStatus()
+                    .getExperimentStatusList()
                     .forEach(experimentStatusEntity -> experimentStatusEntity.setExperimentId(experimentId));
         }
 
-        if (experimentEntity.getErrors() != null) {
+        if (experimentEntity.getErrorsList() != null) {
             logger.debug("Populating the Primary Key of ExperimentError objects for the Experiment");
             experimentEntity
-                    .getErrors()
+                    .getErrorsList()
                     .forEach(experimentErrorEntity -> experimentErrorEntity.setExperimentId(experimentId));
         }
         return execute(entityManager -> entityManager.merge(experimentEntity));
@@ -129,14 +129,16 @@ public class ExperimentRepository extends AbstractRepository<ExperimentModel, Ex
 
     public String addExperiment(ExperimentModel experimentModel) throws RegistryException {
 
-        ExperimentStatus experimentStatus = new ExperimentStatus();
-        experimentStatus.setState(ExperimentState.CREATED);
-        experimentStatus.setTimeOfStateChange(
-                AiravataUtils.getCurrentTimestamp().getTime());
-        experimentModel.addToExperimentStatus(experimentStatus);
+        ExperimentStatus experimentStatus = ExperimentStatus.newBuilder()
+                .setState(ExperimentState.CREATED)
+                .setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime())
+                .build();
         String expName = experimentModel.getExperimentName();
         // This is to avoid overflow of experiment id size. Total experiment id length is <= 50 + UUID
-        experimentModel.setExperimentId(AiravataUtils.getId(expName.substring(0, Math.min(expName.length(), 50))));
+        experimentModel = experimentModel.toBuilder()
+                .addExperimentStatus(experimentStatus)
+                .setExperimentId(AiravataUtils.getId(expName.substring(0, Math.min(expName.length(), 50))))
+                .build();
 
         return saveExperimentModelData(experimentModel);
     }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentStatusRepository.java
index 9566969d35..bcf5aa082f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentStatusRepository.java
@@ -28,9 +28,9 @@ import org.apache.airavata.execution.model.ExperimentStatusPK;
 import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
 import org.apache.airavata.execution.util.cpi.RegistryException;
-import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.status.ExperimentState;
-import org.apache.airavata.model.status.ExperimentStatus;
+import org.apache.airavata.model.experiment.proto.ExperimentModel;
+import org.apache.airavata.model.status.proto.ExperimentState;
+import org.apache.airavata.model.status.proto.ExperimentStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -97,7 +97,7 @@ public class ExperimentStatusRepository
     public ExperimentStatus getExperimentStatus(String experimentId) throws RegistryException {
         ExperimentRepository experimentRepository = new ExperimentRepository();
         ExperimentModel experimentModel = experimentRepository.getExperiment(experimentId);
-        List<ExperimentStatus> experimentStatusList = experimentModel.getExperimentStatus();
+        List<ExperimentStatus> experimentStatusList = experimentModel.getExperimentStatusList();
 
         if (experimentStatusList.size() == 0) {
             logger.debug("ExperimentStatus list is empty");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentSummaryRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentSummaryRepository.java
index 659d572516..a70d2ca318 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentSummaryRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExperimentSummaryRepository.java
@@ -34,9 +34,9 @@ import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.execution.util.cpi.ResultOrderType;
-import org.apache.airavata.model.experiment.ExperimentStatistics;
-import org.apache.airavata.model.experiment.ExperimentSummaryModel;
-import org.apache.airavata.model.status.ExperimentState;
+import org.apache.airavata.model.experiment.proto.ExperimentStatistics;
+import org.apache.airavata.model.experiment.proto.ExperimentSummaryModel;
+import org.apache.airavata.model.status.proto.ExperimentState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/GatewayRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/GatewayRepository.java
index cd923fe828..23a51d4ac9 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/GatewayRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/GatewayRepository.java
@@ -31,7 +31,7 @@ import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
-import org.apache.airavata.model.workspace.Gateway;
+import org.apache.airavata.model.workspace.proto.Gateway;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/GatewayUsageReportingCommandRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/GatewayUsageReportingCommandRepository.java
index 038ac439e7..86dad234ad 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/GatewayUsageReportingCommandRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/GatewayUsageReportingCommandRepository.java
@@ -24,7 +24,7 @@ import org.apache.airavata.execution.model.GatewayUsageReportingCommandEntity;
 import org.apache.airavata.execution.model.GatewayUsageReportingPK;
... 2114 lines suppressed ...